Release new version (#365)
diff --git a/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md b/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md
index 7360d39..20c29d5 100644
--- a/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md
+++ b/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid.md
@@ -5,6 +5,7 @@
'date': '2023-06-01',
'author': 'Heyu Dou, Xinxin Wang',
'tags': ['Best Practice'],
+ "image": '/images/ab-testing-was-a-handful-until-we-found-the-replacement-for-druid.png'
}
---
diff --git a/blog/Annoucing.md b/blog/Annoucing.md
index f998fa7..df1b3f7 100644
--- a/blog/Annoucing.md
+++ b/blog/Annoucing.md
@@ -5,6 +5,7 @@
'date': '2022-06-16',
'author': 'morningman',
'tags': ['Top News'],
+ "image": '/images/live-streaming.png'
}
---
diff --git a/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md b/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md
index 833e35e..e0f4da6 100644
--- a/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md
+++ b/blog/Auto-Synchronization-of-an-Entire-MySQL-Database-for-Data-Analysis.md
@@ -5,6 +5,7 @@
'date': '2023-08-16',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/BestPractice_Kwai.md b/blog/BestPractice_Kwai.md
index ff79bb5..56021d7 100644
--- a/blog/BestPractice_Kwai.md
+++ b/blog/BestPractice_Kwai.md
@@ -5,7 +5,8 @@
'summary': "This article mainly focuses on the practice of Apache Doris on Elasticsearch (DOE) in Kwai's business.Kwai’s commercial report engine provides advertisers with real-time query service for multi-dimensional analysis reports. And it also provides query service for multi-dimensional analysis reports for internal users. The engine is committed to dealing with high-performance, high-concurrency, and high-stability query problems in multi-dimensional analysis report cases. After using Doris, query becomes simple. We only need to synchronize the fact table and dim-table on a daily basis and Join while querying. By replacing Druid and Clickhouse with Doris, Doris basically covers all scenarios when we use Druid. In this way, Kwai's commercial report engine greatly improves the aggregation and analysis capabilities of massive data. During the use of Apache Doris, we also found some unexpected benefits: For example, the import method of Routine Load and Broker Load is relatively simple, which improves the query speed; The data occupation is greatly reduced; Doris supports the MySQL protocol, which is much easier for data analyst to fetch data and make charts.",
'date': '2022-12-14',
'author': 'Xiang He',
- 'tags': ['Best Practice']
+ 'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md b/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md
index 8b7ece7..7954ad9 100644
--- a/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md
+++ b/blog/Building-A-Log-Analytics-Solution-10-Times-More-Cost-Effective-Than-Elasticsearch.md
@@ -5,6 +5,7 @@
'date': '2023-05-26',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/building-a-log-analytics-solution-10-times-more-cost-effective-than-es.jpg'
}
---
diff --git a/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md b/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md
index 03352a6..f33ebe0 100644
--- a/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md
+++ b/blog/Building-a-Data-Warehouse-for-Traditional-Industry.md
@@ -5,6 +5,7 @@
'date': '2023-05-12',
'author': 'Herman Seah',
'tags': ['Best Practice'],
+ "image": '/images/building-a-data-warehouse-for-traditional-industry.png'
}
---
diff --git a/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md b/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md
index b12c6cf..bb38773 100644
--- a/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md
+++ b/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance.md
@@ -5,6 +5,7 @@
'date': '2023-03-14',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/building-the-next-generation-data-lakehouse.jpg'
}
---
diff --git a/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md b/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md
index 13bc1e6..75d50fe 100644
--- a/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md
+++ b/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider.md
@@ -5,6 +5,7 @@
'date': '2023-08-17',
'author': 'Jianbo Liu',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md b/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md
index fc98db5..54c7f8c 100644
--- a/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md
+++ b/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented.md
@@ -5,6 +5,7 @@
'date': '2023-07-16',
'author': 'Rong Hou',
'tags': ['Best Practice'],
+ "image": '/images/how-fast-data-queries-are-implemented.png'
}
---
diff --git a/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md b/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md
index 5b3fe7e..8d9f3aa 100644
--- a/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md
+++ b/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess.md
@@ -5,6 +5,7 @@
'date': '2023-08-05',
'author': 'Hou Lan',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Flink-realtime-write.md b/blog/Flink-realtime-write.md
index 1e37a43..eeb443a 100644
--- a/blog/Flink-realtime-write.md
+++ b/blog/Flink-realtime-write.md
@@ -5,6 +5,7 @@
'date': '2022-07-29',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md b/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md
index 75b88fa..7162d3d 100644
--- a/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md
+++ b/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture.md
@@ -5,6 +5,7 @@
'date': '2023-07-31',
'author': 'Zhenwei Liu',
'tags': ['Best Practice'],
+ "image": '/images/how-to-build-a-simple-but-solid-data-architecture.png'
}
---
diff --git a/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md b/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md
index b41b193..ecd33d7 100644
--- a/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md
+++ b/blog/How-We-Increased-Database-Query-Concurrency-by-20-Times.md
@@ -5,6 +5,7 @@
'date': '2023-04-14',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/how-we-increased-database-query-concurrency-by-20-times.jpg'
}
---
diff --git a/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md b/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md
index ac7fffd..1033c3c 100644
--- a/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md
+++ b/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data.md
@@ -5,6 +5,7 @@
'date': '2023-02-27',
'author': 'Junfei Liu',
'tags': ['Best Practice'],
+ "image": '/images/best-practice-in-duyansoft.png'
}
---
diff --git a/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md b/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md
index 6e7bed6..e3841ab 100644
--- a/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md
+++ b/blog/Is-Your-Latest-Data-Really-the-Latest-Check-the-Data-Update-Mechanism-of-Your-Database.md
@@ -5,6 +5,7 @@
'date': '2023-07-24',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/check-the-data-update-mechanism-of-your-database.jpg'
}
---
diff --git a/blog/JD_OLAP.md b/blog/JD_OLAP.md
index bb9bf30..bd7f31d 100644
--- a/blog/JD_OLAP.md
+++ b/blog/JD_OLAP.md
@@ -5,6 +5,7 @@
'date': '2022-12-02',
'author': 'Li Zhe',
'tags': ['Best Practice'],
+ "image": '/images/user-jd.jpg'
}
---
diff --git a/blog/LY.md b/blog/LY.md
index 87da068..a41da6e 100644
--- a/blog/LY.md
+++ b/blog/LY.md
@@ -5,7 +5,8 @@
"summary" : "Established in 2015, LY Digital is a financial service platform for tourism industry under LY. Com. In 2020, LY Digital introduced Apache Doris to build a data warehouse because of its rich data import methods, excellent parallel computing capabilities, and low maintenance costs. This article describes the evolution of data warehouse in LY Digital and why we switch to Apache Doris. ",
"date": "2022-12-19",
'author': 'Xing Wang',
- 'tags': ['Best Practice']
+ 'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md b/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md
index 4e67311..95c6e02 100644
--- a/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md
+++ b/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins.md
@@ -5,6 +5,7 @@
'date': '2023-07-10',
'author': 'Baoming Zhang',
'tags': ['Best Practice'],
+ "image": '/images/listen-to-that-poor-bi-engineer.png'
}
diff --git a/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md b/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md
index d87b520..13bc553 100644
--- a/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md
+++ b/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second.md
@@ -5,6 +5,7 @@
'date': '2023-09-16',
'author': 'Yuqi Liu',
'tags': ['Best Practice'],
+ "image": '/images/china-unicom.png'
}
---
diff --git a/blog/NIO.md b/blog/NIO.md
index 8d5b7ef..fe9d77c 100644
--- a/blog/NIO.md
+++ b/blog/NIO.md
@@ -6,6 +6,7 @@
'date': '2022-11-28',
'author': 'Huaidong Tang',
'tags': ['Best Practice'],
+ "image": '/images/nio.png'
}
---
diff --git a/blog/Netease.md b/blog/Netease.md
index 95e5988..5d2296d 100644
--- a/blog/Netease.md
+++ b/blog/Netease.md
@@ -5,6 +5,7 @@
'date': '2022-11-30',
'author': 'Xiaodong Liu',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md b/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md
index 2d07e64..e65f961 100644
--- a/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md
+++ b/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris.md
@@ -5,6 +5,7 @@
'date': '2023-07-01',
'author': 'Tao Wang',
'tags': ['Best Practice'],
+ "image": '/images/replacing-apache-hive-es-and-postgresql-with-apache-doris.png'
}
---
diff --git a/blog/Say-Goodbye-to-OOM-Crashes.md b/blog/Say-Goodbye-to-OOM-Crashes.md
index 89cc3ca..81c39eb 100644
--- a/blog/Say-Goodbye-to-OOM-Crashes.md
+++ b/blog/Say-Goodbye-to-OOM-Crashes.md
@@ -5,6 +5,7 @@
'date': '2023-06-16',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/say-goodbye-to-oom-crashes.jpg'
}
diff --git a/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md b/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md
index a00ace8..3469acfa 100644
--- a/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md
+++ b/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart.md
@@ -5,6 +5,7 @@
'date': '2023-04-20',
'author': 'Jacob Chow',
'tags': ['Best Practice'],
+ "image": '/images/step-by-step-guide-to-building-a-high-performing-risk-data-mart.png'
}
---
diff --git a/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md b/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md
index 828d15f..3860417 100644
--- a/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md
+++ b/blog/Tencent-Data-Engineers-Why-We-Went-from-ClickHouse-to-Apache-Doris.md
@@ -5,6 +5,7 @@
'date': '2023-03-07',
'author': 'Jun Zhang & Kai Dai',
'tags': ['Best Practice'],
+ "image": '/images/tencent-data-engineer.png'
}
---
diff --git a/blog/Tencent-LLM.md b/blog/Tencent-LLM.md
index 9fd14fe..9cc27dd 100644
--- a/blog/Tencent-LLM.md
+++ b/blog/Tencent-LLM.md
@@ -5,6 +5,9 @@
'date': '2023-08-29',
'author': 'Jun Zhang & Lei Luo',
'tags': ['Best Practice'],
+ 'picked': "true",
+ 'order': "3",
+ "image": '/images/tme.png'
}
---
diff --git a/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md b/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md
index 10dbf39..1df76bb 100644
--- a/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md
+++ b/blog/Tiered-Storage-for-Hot-and-Cold-Data-What-Why-and-How.md
@@ -5,6 +5,7 @@
'date': '2023-06-23',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tiered-storage-for-hot-and-cold-cata.jpg'
}
---
diff --git a/blog/Understanding-Data-Compaction-in-3-Minutes.md b/blog/Understanding-Data-Compaction-in-3-Minutes.md
index 718c3b9..e7972fc 100644
--- a/blog/Understanding-Data-Compaction-in-3-Minutes.md
+++ b/blog/Understanding-Data-Compaction-in-3-Minutes.md
@@ -5,6 +5,7 @@
'date': '2023-06-09',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/understanding-data-compaction-in-3-minutes.jpg'
}
---
diff --git a/blog/Use-Apache-Doris-with-AI-chatbots.md b/blog/Use-Apache-Doris-with-AI-chatbots.md
index 18a43c8..d8c7020 100644
--- a/blog/Use-Apache-Doris-with-AI-chatbots.md
+++ b/blog/Use-Apache-Doris-with-AI-chatbots.md
@@ -5,6 +5,7 @@
'date': '2022-11-24',
'author': 'Zhao Wei',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md b/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md
index 04c7514..b7654b0 100644
--- a/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md
+++ b/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance.md
@@ -5,6 +5,7 @@
'date': '2023-05-05',
'author': 'Tongyang Han',
'tags': ['Best Practice'],
+ "image": '/images/zipping-up-the-lambda-architecture-for-40-percent-faster-performance.png'
}
---
diff --git a/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md b/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md
index f80d49b..09f1f4d 100644
--- a/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md
+++ b/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse.md
@@ -5,6 +5,9 @@
'date': '2023-11-10',
'author': 'Apache Doris',
'tags': ['Top News'],
+ 'picked': "true",
+ 'order': "1",
+ "image": '/images/doris-summit-asia.png'
}
---
diff --git a/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md b/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md
index 7c2ac87..378569f 100644
--- a/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md
+++ b/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time.md
@@ -5,6 +5,7 @@
'date': '2023-10-30',
'author': 'He Gong',
'tags': ['Best Practice'],
+ "image": '/images/live-streaming.png'
}
---
diff --git a/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md b/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md
index 7ea61bf..ff47782 100644
--- a/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md
+++ b/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis.md
@@ -5,6 +5,7 @@
'date': '2023-12-07',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
diff --git a/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md b/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md
index e52e824..bb951f1 100644
--- a/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md
+++ b/blog/from-elasticsearch-to-apache-doris-upgrading-an-observability-platform.md
@@ -5,6 +5,7 @@
'date': '2023-12-14',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md b/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md
index 28799b0..409fca8 100644
--- a/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md
+++ b/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents.md
@@ -5,6 +5,7 @@
'date': '2023-11-29',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/Iov.png'
}
---
diff --git a/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md b/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md
index 176f42f..c45d888 100644
--- a/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md
+++ b/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse.md
@@ -5,6 +5,9 @@
'date': '2023-10-03',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ 'picked': "true",
+ 'order': "2",
+ "image": '/images/doris-intro.png'
}
---
diff --git a/blog/jd.md b/blog/jd.md
index 5d87c25..e5e6bce 100644
--- a/blog/jd.md
+++ b/blog/jd.md
@@ -5,6 +5,7 @@
'date': '2022-07-20',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/user-jd.jpg'
}
---
@@ -213,4 +214,4 @@
- In the business use, we also encountered problems such as task scheduling-related, import task configuration-related and query-related problems, which are driving the JD OLAP team to understand Doris more deeply. We plan to promote the use of materialized views to further improve the efficiency of queries; use Bitmap to support accurate de-duplication of UV and other metrics; use audit logs to make it easier to count large and slow queries; and solve the scheduling problem of real-time import tasks to make them more efficient and stable. In addition, we also plan to optimize table building, create high-quality Rollup or materialized views to improve the smoothness of the application, and accelerate more businesses to the OLAP platform to improve the impact of the application.
\ No newline at end of file
+ In the business use, we also encountered problems such as task scheduling-related, import task configuration-related and query-related problems, which are driving the JD OLAP team to understand Doris more deeply. We plan to promote the use of materialized views to further improve the efficiency of queries; use Bitmap to support accurate de-duplication of UV and other metrics; use audit logs to make it easier to count large and slow queries; and solve the scheduling problem of real-time import tasks to make them more efficient and stable. In addition, we also plan to optimize table building, create high-quality Rollup or materialized views to improve the smoothness of the application, and accelerate more businesses to the OLAP platform to improve the impact of the application.
diff --git a/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md b/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md
index 4451559..3ac7c9b 100644
--- a/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md
+++ b/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase.md
@@ -5,6 +5,7 @@
'date': '2023-11-22',
'author': 'CIGNA & CMB',
'tags': ['Best Practice'],
+ "image": '/images/cigna-cmb.png'
}
---
diff --git a/blog/linkedcare.md b/blog/linkedcare.md
index 575f1d8..f3713b5 100644
--- a/blog/linkedcare.md
+++ b/blog/linkedcare.md
@@ -6,6 +6,7 @@
'date': '2023-01-28',
'author': 'Yi Yang',
'tags': ['Best Practice'],
+ "image": '/images/clickhouse-kudu-to-doris.png'
}
---
diff --git a/blog/log-analysis-elasticsearch-vs-apache-doris.md b/blog/log-analysis-elasticsearch-vs-apache-doris.md
index e0a6668..1ed3e90 100644
--- a/blog/log-analysis-elasticsearch-vs-apache-doris.md
+++ b/blog/log-analysis-elasticsearch-vs-apache-doris.md
@@ -5,6 +5,9 @@
'date': '2023-09-28',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ 'picked': "true",
+ 'order': "3",
+ "image": '/images/es-vs-doris.png'
}
---
diff --git a/blog/meituan.md b/blog/meituan.md
index adcf4ec..30bb505 100644
--- a/blog/meituan.md
+++ b/blog/meituan.md
@@ -5,6 +5,7 @@
'date': '2022-07-20',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md b/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md
index effb5a3..44c7af9 100644
--- a/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md
+++ b/blog/migrating-from-clickhouse-to-apache-doris-what-happened.md
@@ -5,6 +5,7 @@
'date': '2023-10-11',
'author': 'Chuang Li',
'tags': ['Best Practice'],
+ "image": '/images/e-commerce.png'
}
---
diff --git a/blog/principle-of-Doris-SQL-parsing.md b/blog/principle-of-Doris-SQL-parsing.md
index 4161aed..3d96bce 100644
--- a/blog/principle-of-Doris-SQL-parsing.md
+++ b/blog/principle-of-Doris-SQL-parsing.md
@@ -1,10 +1,11 @@
---
{
-'title': 'Doris analysis: Doris SQL principle analysis',
-'summary': "This article mainly introduces the principle of Doris SQL parsing.Since there are many types of SQL, this article focuses on the analysis of query SQL. Doris's SQL analysis will be explained deeply in the algorithm principle and code implementation.",
-'date': '2022-08-25',
-'author': 'Apache Doris',
-'tags': ['Tech Sharing'],
+ 'title': 'Doris analysis: Doris SQL principle analysis',
+ 'summary': "This article mainly introduces the principle of Doris SQL parsing.Since there are many types of SQL, this article focuses on the analysis of query SQL. Doris's SQL analysis will be explained deeply in the algorithm principle and code implementation.",
+ 'date': '2022-08-25',
+ 'author': 'Apache Doris',
+ 'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/principle-of-Doris-Stream-Load.md b/blog/principle-of-Doris-Stream-Load.md
index 6512779..731fa4c 100644
--- a/blog/principle-of-Doris-Stream-Load.md
+++ b/blog/principle-of-Doris-Stream-Load.md
@@ -5,6 +5,7 @@
'date': '2022-09-08',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+"image": '/images/tech-sharing.png'
}
---
diff --git a/blog/release-2.0.2.md b/blog/release-2.0.2.md
index 6918f4f..712a5f3 100644
--- a/blog/release-2.0.2.md
+++ b/blog/release-2.0.2.md
@@ -5,6 +5,7 @@
'date': '2023-10-13',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/2.0.2.png'
}
---
diff --git a/blog/release-note-0.15.0.md b/blog/release-note-0.15.0.md
index cafb40d..5803342 100644
--- a/blog/release-note-0.15.0.md
+++ b/blog/release-note-0.15.0.md
@@ -5,6 +5,7 @@
'date': '2021-11-29',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.0.0.md b/blog/release-note-1.0.0.md
index c35933d..c737a52 100644
--- a/blog/release-note-1.0.0.md
+++ b/blog/release-note-1.0.0.md
@@ -5,6 +5,7 @@
'date': '2022-04-18',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.0.md b/blog/release-note-1.1.0.md
index 8c5879f..013dadd 100644
--- a/blog/release-note-1.1.0.md
+++ b/blog/release-note-1.1.0.md
@@ -5,6 +5,7 @@
'date': '2022-07-14',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.1.md b/blog/release-note-1.1.1.md
index 48d9f41..0e1ec36 100644
--- a/blog/release-note-1.1.1.md
+++ b/blog/release-note-1.1.1.md
@@ -5,6 +5,7 @@
'date': '2022-09-13',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.2.md b/blog/release-note-1.1.2.md
index edba045..ee9b3c2 100644
--- a/blog/release-note-1.1.2.md
+++ b/blog/release-note-1.1.2.md
@@ -5,6 +5,7 @@
'date': '2022-09-13',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.3.md b/blog/release-note-1.1.3.md
index fb7bdbe..7c7cd1e 100644
--- a/blog/release-note-1.1.3.md
+++ b/blog/release-note-1.1.3.md
@@ -5,6 +5,7 @@
'date': '2022-10-17',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.4.md b/blog/release-note-1.1.4.md
index 80f1385..eb7c48c 100644
--- a/blog/release-note-1.1.4.md
+++ b/blog/release-note-1.1.4.md
@@ -5,6 +5,7 @@
'date': '2022-11-11',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.1.5.md b/blog/release-note-1.1.5.md
index e1b1111..b18ec0c 100644
--- a/blog/release-note-1.1.5.md
+++ b/blog/release-note-1.1.5.md
@@ -5,6 +5,7 @@
'date': '2022-12-19',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.2.0.md b/blog/release-note-1.2.0.md
index 2365582..64ef54d 100644
--- a/blog/release-note-1.2.0.md
+++ b/blog/release-note-1.2.0.md
@@ -5,6 +5,7 @@
'date': '2022-12-7',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-1.2.1.md b/blog/release-note-1.2.1.md
index 4aefe31..c07399e 100644
--- a/blog/release-note-1.2.1.md
+++ b/blog/release-note-1.2.1.md
@@ -5,6 +5,7 @@
'date': '2023-01-04',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.1-release.png'
}
---
diff --git a/blog/release-note-1.2.2.md b/blog/release-note-1.2.2.md
index 0f029d2..7be8c43 100644
--- a/blog/release-note-1.2.2.md
+++ b/blog/release-note-1.2.2.md
@@ -5,6 +5,7 @@
'date': '2023-02-15',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.2-release.png'
}
---
@@ -249,4 +250,4 @@
@zhannngchen
-@zy-kkk
\ No newline at end of file
+@zy-kkk
diff --git a/blog/release-note-1.2.3.md b/blog/release-note-1.2.3.md
index ec6a109..f2427e1 100644
--- a/blog/release-note-1.2.3.md
+++ b/blog/release-note-1.2.3.md
@@ -5,6 +5,7 @@
'date': '2023-03-19',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.3-release.png'
}
---
diff --git a/blog/release-note-1.2.4.md b/blog/release-note-1.2.4.md
index a78753a..d8a9719 100644
--- a/blog/release-note-1.2.4.md
+++ b/blog/release-note-1.2.4.md
@@ -5,6 +5,7 @@
'date': '2023-06-05',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.4-release.png'
}
---
diff --git a/blog/release-note-1.2.5.md b/blog/release-note-1.2.5.md
index 4ed497b..8c0bd6a 100644
--- a/blog/release-note-1.2.5.md
+++ b/blog/release-note-1.2.5.md
@@ -5,6 +5,7 @@
'date': '2023-06-18',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.5-release.png'
}
---
diff --git a/blog/release-note-1.2.6.md b/blog/release-note-1.2.6.md
index ccd3514..0858a4f 100644
--- a/blog/release-note-1.2.6.md
+++ b/blog/release-note-1.2.6.md
@@ -5,6 +5,7 @@
'date': '2023-07-17',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.6-release.png'
}
---
diff --git a/blog/release-note-1.2.7.md b/blog/release-note-1.2.7.md
index e5e173b..107701a 100644
--- a/blog/release-note-1.2.7.md
+++ b/blog/release-note-1.2.7.md
@@ -5,6 +5,7 @@
'date': '2023-09-04',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/1.2.7.png'
}
---
diff --git a/blog/release-note-2.0.0.md b/blog/release-note-2.0.0.md
index c30f2a2..c1caf40 100644
--- a/blog/release-note-2.0.0.md
+++ b/blog/release-note-2.0.0.md
@@ -5,6 +5,7 @@
'date': '2023-08-16',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/release-note-2.0.1.md b/blog/release-note-2.0.1.md
index b23b7fa..0245f78 100644
--- a/blog/release-note-2.0.1.md
+++ b/blog/release-note-2.0.1.md
@@ -5,6 +5,7 @@
'date': '2023-09-04',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/2.0.1.png'
}
---
diff --git a/blog/release-note-2.0.3.md b/blog/release-note-2.0.3.md
index 4e62d49..c7044ea 100644
--- a/blog/release-note-2.0.3.md
+++ b/blog/release-note-2.0.3.md
@@ -5,6 +5,7 @@
'date': '2023-12-14',
'author': 'Apache Doris',
'tags': ['Release Notes'],
+ "image": '/images/release-notes.png'
}
---
diff --git a/blog/ssb.md b/blog/ssb.md
index 9689cb3..9f98b14 100644
--- a/blog/ssb.md
+++ b/blog/ssb.md
@@ -5,6 +5,7 @@
'date': '2022-11-22',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/summit.md b/blog/summit.md
index 8c89a36..a39dba2 100644
--- a/blog/summit.md
+++ b/blog/summit.md
@@ -6,6 +6,7 @@
'date': '2023-01-19',
'author': 'Mingyu Chen',
'tags': ['Top News'],
+ "image": '/images/a-glimpse-of-the-next-generation-analytical-database.png'
}
---
diff --git a/blog/tpch.md b/blog/tpch.md
index 4fc1809..f9f77b8 100644
--- a/blog/tpch.md
+++ b/blog/tpch.md
@@ -5,6 +5,7 @@
'date': '2022-11-22',
'author': 'Apache Doris',
'tags': ['Tech Sharing'],
+ "image": '/images/tech-sharing.png'
}
---
diff --git a/blog/xiaomi.md b/blog/xiaomi.md
index 219d6ee..4bc70e0 100644
--- a/blog/xiaomi.md
+++ b/blog/xiaomi.md
@@ -5,6 +5,7 @@
'date': '2022-07-20',
'author': 'Apache Doris',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/blog/xiaomi_vector.md b/blog/xiaomi_vector.md
index e8bc45f..37063b0 100644
--- a/blog/xiaomi_vector.md
+++ b/blog/xiaomi_vector.md
@@ -5,6 +5,7 @@
'date': '2022-12-08',
'author': 'ZuoWei',
'tags': ['Best Practice'],
+ "image": '/images/best-practice.png'
}
---
diff --git a/cspell.json b/cspell.json
index 0e83637..1d009de 100644
--- a/cspell.json
+++ b/cspell.json
@@ -5,7 +5,9 @@
"dictionaries": [],
"words": [
"Moka",
- "releasenotes"
+ "releasenotes",
+ "swiper",
+ "Velo"
],
"ignoreWords": [],
"import": []
diff --git a/docusaurus.config.js b/docusaurus.config.js
index dfb74a0..d6c2bd4 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -6,27 +6,27 @@
const VERSIONS = require('./versions.json');
function getDocsVersions() {
- const result = {}
+ const result = {};
VERSIONS.map(version => {
- if (version === "current") {
- result[version] = {
- label: 'dev',
+ if (version === 'current') {
+ result[version] = {
+ label: 'Dev',
path: 'dev',
banner: 'unreleased',
badge: false,
- }
+ };
} else {
result[version] = {
banner: 'none',
badge: false,
- }
+ };
}
- })
+ });
return result;
}
function getLatestVersion() {
- return VERSIONS.includes('2.0') ? '2.0' : VERSIONS[0]
+ return VERSIONS.includes('2.0') ? '2.0' : VERSIONS[0];
}
/** @type {import('@docusaurus/types').Config} */
@@ -45,7 +45,7 @@
locales: ['en', 'zh-CN'],
localeConfigs: {
en: {
- label: 'EN',
+ label: 'English',
htmlLang: 'en-US',
},
'zh-CN': {
@@ -56,11 +56,12 @@
},
// scripts: ['/js/redirect.js'],
stylesheets: [
- 'https://fonts.googleapis.com/css?family=Montserrat:500',
- 'https://fonts.googleapis.com/css?family=Noto+Sans+SC:400',
+ 'https://cdn-font.hyperos.mi.com/font/css?family=MiSans:100,200,300,400,450,500,600,650,700,900:Chinese_Simplify,Latin&display=swap',
+ 'https://cdn-font.hyperos.mi.com/font/css?family=MiSans_Latin:100,200,300,400,450,500,600,650,700,900:Latin&display=swap',
],
organizationName: 'apache/doris-website', // Usually your GitHub org/user name.
projectName: 'apache/doris-website', // Usually your repo name.
+ customFields: {},
plugins: [
'docusaurus-plugin-sass',
versionsPlugin,
@@ -133,6 +134,17 @@
],
},
],
+ async function tailwindcssPlugin(context, options) {
+ return {
+ name: 'docusaurus-tailwindcss',
+ configurePostCss(postcssOptions) {
+ // Appends TailwindCSS and AutoPrefixer.
+ postcssOptions.plugins.push(require('tailwindcss'));
+ postcssOptions.plugins.push(require('autoprefixer'));
+ return postcssOptions;
+ },
+ };
+ },
[
'@docusaurus/plugin-client-redirects',
{
@@ -197,6 +209,8 @@
docsRouteBasePath: '/',
indexBlog: false,
explicitSearchResultPath: true,
+ searchBarShortcut: true,
+ searchBarShortcutHint: true,
},
],
],
@@ -205,7 +219,7 @@
({
announcementBar: {
id: 'support_us',
- content: `<a href="https://github.com/apache/doris" target="_blank" style="display: flex; width: 100%; align-items: center; justify-content: center; margin-left: 4px; text-decoration: none; color: white">Do you like Apache Doris?Give us a 🌟 on GitHub
+ content: `<a href="https://github.com/apache/doris" target="_blank" style="display: flex; width: 100%; align-items: center; justify-content: center; margin-left: 4px; text-decoration: none; color: white">Do you ❤️ Doris? Give us a 🌟 on GitHub
<img style="width: 1.2rem; height: 1.2rem; margin-left: 0.4rem;" src="/images/github-white-icon.svg">
</a>`,
backgroundColor: '#3C2FD4',
@@ -219,74 +233,42 @@
src: 'https://cdnd.selectdb.com/images/logo.svg',
},
items: [
- { to: '/', label: 'Home', position: 'left', exact: true },
+ // { to: '/', label: 'Home', position: 'left', exact: true },
{
- type: 'dropdown',
position: 'left',
label: 'Docs',
to: '/docs/get-starting/quick-start',
- items: [
- {
- label: 'Getting Started',
- to: '/docs/get-starting/quick-start',
- align: 'left',
- },
- {
- label: 'Install and Deploy',
- to: '/docs/install/standard-deployment',
- align: 'left',
- },
- {
- label: 'FAQ',
- to: '/docs/faq/install-faq',
- align: 'left',
- },
- // {
- // label: 'More Docs',
- // to: '/docs/dev/get-starting/',
- // align: 'left',
- // }
- ],
},
- { to: '/blog', label: 'Blogs', position: 'left' },
+ { to: '/blog', label: 'Blog', position: 'left' },
+ { to: '/users', label: 'Users', position: 'left' },
{
- label: 'Community',
- type: 'dropdown',
- to: '/community/join-community',
+ label: 'Discussions',
+ to: 'https://github.com/apache/doris/discussions',
position: 'left',
- // docsPluginId: 'community',
- items: [
- {
- label: 'Join Community',
- to: '/community/join-community',
- align: 'left',
- },
- {
- label: 'Doris Team',
- to: '/community/team',
- align: 'left',
- },
- {
- label: 'How to Contribute',
- to: '/community/how-to-contribute/',
- align: 'left',
- },
- {
- label: 'Developer Guide',
- to: '/community/developer-guide/debug-tool',
- align: 'left',
- },
- ],
},
- { to: '/users', label: 'User Stories', position: 'left' },
{
- type: 'docsVersionDropdown',
+ label: 'Ecosystem',
+ to: '/ecosystem/cluster-management',
+ position: 'left',
+ },
+ // {
+ // label: 'Community',
+ // to: '/community/join-community',
+ // position: 'left',
+ // },
+ {
+ type: 'search',
position: 'right',
+ className: 'docs-search',
},
{
type: 'localeDropdown',
position: 'right',
},
+ {
+ type: 'docsVersionDropdown',
+ position: 'right',
+ },
// {
// href: 'https://github.com/apache/doris',
// className: 'header-right-button-github',
@@ -344,39 +326,44 @@
href: '/learning',
},
{
- label: 'Blogs',
+ label: 'Blog',
href: '/blog',
},
{
- label: 'User Stories',
+ label: 'Ecosystem',
+ href: '/ecosystem/cluster-management',
+ },
+ {
+ label: 'Users',
href: '/users',
},
- // {
- // label: 'Courses (coming soon)',
- // href: '/courses',
- // },
+ {
+ label: 'Discussions',
+ href: 'https://github.com/apache/doris/discussions',
+ },
],
},
{
- title: 'Community Support',
+ title: 'Community',
items: [
{
- label: 'Doris Team',
- href: '/community/team',
- },
- {
- label: 'How to Contribute',
+ label: 'How to contribute',
href: '/community/how-to-contribute/',
},
{
- label: 'Source Code',
+ label: 'Source code',
href: 'https://github.com/apache/doris/',
},
+
{
- label: 'Improvement Proposal',
+ label: 'Improvement proposal',
href: 'https://github.com/apache/doris/discussions',
},
{
+ label: 'Doris team',
+ href: '/community/team',
+ },
+ {
label: 'Roadmap',
href: 'https://github.com/apache/doris/issues/16392',
},
diff --git a/package.json b/package.json
index 22a8fbf..fc4391f 100644
--- a/package.json
+++ b/package.json
@@ -25,14 +25,18 @@
"@docusaurus/preset-classic": "^2.4.1",
"@easyops-cn/docusaurus-search-local": "^0.30.2",
"@mdx-js/react": "^1.6.22",
+ "antd": "^5.12.2",
+ "autoprefixer": "^10.4.16",
"clsx": "^1.1.1",
"docusaurus-plugin-sass": "^0.2.3",
+ "postcss": "^8.4.32",
"prism-react-renderer": "^2.0.4",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-github-button": "^0.1.11",
"sass": "^1.63.2",
"swiper": "^9.0.5",
+ "tailwindcss": "^3.3.6",
"vitpress-generate-pdf": "^1.1.4"
},
"devDependencies": {
diff --git a/src/components/Icons/arrow-down-icon.tsx b/src/components/Icons/arrow-down-icon.tsx
new file mode 100644
index 0000000..577be0a
--- /dev/null
+++ b/src/components/Icons/arrow-down-icon.tsx
@@ -0,0 +1,24 @@
+import React from 'react';
+
+interface ArrowDownIconProps {
+ className?: string;
+}
+export function ArrowDownIcon(props: ArrowDownIconProps) {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width="1em"
+ height="1em"
+ viewBox="0 0 16 16"
+ fill="none"
+ className={props.className}
+ >
+ <path
+ d="M4 6L7.57574 9.57574C7.81005 9.81005 8.18995 9.81005 8.42426 9.57574L12 6"
+ stroke="currentColor"
+ strokeWidth="1.2"
+ strokeLinecap="round"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/arrow-right-icon.tsx b/src/components/Icons/arrow-right-icon.tsx
new file mode 100644
index 0000000..4f1d908
--- /dev/null
+++ b/src/components/Icons/arrow-right-icon.tsx
@@ -0,0 +1,24 @@
+import React from 'react';
+
+interface ArrowRightIconProps {
+ className?: string;
+}
+export function ArrowRightIcon(props: ArrowRightIconProps) {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width="1em"
+ height="1em"
+ viewBox="0 0 16 16"
+ fill="none"
+ className={props.className}
+ >
+ <path
+ d="M6 4.00024L9.57574 7.57598C9.81005 7.8103 9.81005 8.19019 9.57574 8.42451L6 12.0002"
+ stroke="currentColor"
+ strokeWidth="1.2"
+ strokeLinecap="round"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/arrow.tsx b/src/components/Icons/arrow.tsx
index 9e4f1d8..fec1b7f 100644
--- a/src/components/Icons/arrow.tsx
+++ b/src/components/Icons/arrow.tsx
@@ -2,22 +2,21 @@
export default function ArrowIcon() {
return (
- <svg width="1rem" height="1rem" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
- <g clipPath="url(#clip0_424_3506)">
- <path
- d="M13.0662 7.23986C13.1278 7.17546 13.1628 7.08866 13.1628 6.99906C13.1628 6.90946 13.1278 6.82266 13.0662 6.75826M13.0662 6.75686L6.85865 0.274863C6.58565 -0.0107372 6.13205 0.00746314 5.86044 0.291663C5.58884 0.575863 5.58745 1.03506 5.85905 1.31926L11.291 6.99766L5.85905 12.6747C5.58605 12.9603 5.58885 13.4195 5.86045 13.7023C6.13065 13.9879 6.58565 14.0061 6.85725 13.7205L13.0648 7.23846L13.0648 6.75686L13.0662 6.75686Z"
- fill="currentColor"
- />
- <path
- d="M8.24886 7.24361C8.31046 7.17921 8.34406 7.09241 8.34406 7.00281C8.34406 6.91321 8.30906 6.82641 8.24886 6.76201M8.24886 6.76061L2.04126 0.278611C1.76826 -0.00698851 1.31466 0.011211 1.04306 0.295411C0.771462 0.579611 0.770062 1.03881 1.04166 1.32301L6.47366 7.00141L1.04166 12.6798C0.768663 12.9654 0.771463 13.4246 1.04306 13.7074C1.31466 13.9916 1.76966 14.0098 2.04126 13.7242L8.24886 7.24221L8.24886 6.76061V6.76061Z"
- fill="currentColor"
- />
- </g>
- <defs>
- <clipPath id="clip0_424_3506">
- <rect width="14" height="14" fill="currentColor" transform="translate(0 14) rotate(-90)" />
- </clipPath>
- </defs>
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
+ <path
+ d="M10.1251 13.5L14.625 9L10.1251 4.5"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M3.37506 9.00049L14.6251 9.00049"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
</svg>
);
}
diff --git a/src/components/Icons/checked-icon.tsx b/src/components/Icons/checked-icon.tsx
new file mode 100644
index 0000000..9842908
--- /dev/null
+++ b/src/components/Icons/checked-icon.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+
+export function CheckedIcon() {
+ return (
+ <span>
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
+ <rect width="16" height="16" fill="white" />
+ <path
+ d="M1.5 8.19781L2.81207 6.84098L6.14286 10.2844L13.1861 3L14.5 4.35875L6.14286 13L1.5 8.19781Z"
+ fill="#0065FD"
+ />
+ </svg>
+ </span>
+ );
+}
diff --git a/src/components/Icons/external-link-arrow-icon.tsx b/src/components/Icons/external-link-arrow-icon.tsx
new file mode 100644
index 0000000..b57e244
--- /dev/null
+++ b/src/components/Icons/external-link-arrow-icon.tsx
@@ -0,0 +1,33 @@
+import React from 'react';
+
+interface ExternalLinkArrowIconProps {
+ className?: string;
+}
+
+export function ExternalLinkArrowIcon(props: ExternalLinkArrowIconProps) {
+ return (
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ className="transition-slide"
+ width="16"
+ height="14"
+ viewBox="0 0 16 14"
+ fill="none"
+ >
+ <path
+ d="M9.37549 12.3542L14.8755 6.85419L9.37549 1.35419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M1.12549 6.85419L14.8755 6.85419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/external-link-icon.tsx b/src/components/Icons/external-link-icon.tsx
new file mode 100644
index 0000000..96f5a13
--- /dev/null
+++ b/src/components/Icons/external-link-icon.tsx
@@ -0,0 +1,23 @@
+import React from 'react';
+
+export function ExternalLinkIcon() {
+ return (
+ <svg width="1rem" height="1rem" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path
+ d="M14.8497 8.99993L14.8497 14.5349C14.8497 14.8332 14.6079 15.0749 14.3097 15.0749H3.68966C3.39142 15.0749 3.14966 14.8332 3.14966 14.5349V3.46493C3.14966 3.16669 3.39142 2.92493 3.68966 2.92493H8.53166"
+ stroke="currentColor"
+ strokeWidth="1.5"
+ strokeLinecap="round"
+ strokeLinejoin="round"
+ />
+ <path
+ d="M11.4746 2.92493H14.3096C14.6078 2.92493 14.8496 3.16669 14.8496 3.46493V6.29993"
+ stroke="currentColor"
+ strokeWidth="1.5"
+ strokeLinecap="round"
+ strokeLinejoin="round"
+ />
+ <path d="M13.9944 3.82495L8.90322 8.91612" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/mail.tsx b/src/components/Icons/mail.tsx
index bf98a4b..06f459c 100644
--- a/src/components/Icons/mail.tsx
+++ b/src/components/Icons/mail.tsx
@@ -2,9 +2,9 @@
export function MailIcon() {
return (
- <svg width="2em" height="2em" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" viewBox="0 0 32 32" fill="none">
<path
- d="M5.6003 6H26.3997C27.8186 6 28.982 7.10964 29 8.46946L16.0045 15.454L3.01202 8.47829C3.02405 7.11258 4.1784 6 5.6003 6ZM3.01202 11.1508L3 23.5011C3 24.8756 4.16938 26 5.6003 26H26.3997C27.8306 26 29 24.8756 29 23.5011V11.145L16.3111 17.8028C16.1157 17.9058 15.8813 17.9058 15.6889 17.8028L3.01202 11.1508V11.1508Z"
+ d="M5.6003 6H26.3997C27.8186 6 28.982 7.10964 29 8.46946L16.0045 15.454L3.01202 8.47829C3.02405 7.11258 4.1784 6 5.6003 6ZM3.01202 11.1508L3 23.5011C3 24.8756 4.16938 26 5.6003 26H26.3997C27.8306 26 29 24.8756 29 23.5011V11.145L16.3111 17.8028C16.1157 17.9058 15.8813 17.9058 15.6889 17.8028L3.01202 11.1508Z"
fill="currentColor"
/>
</svg>
diff --git a/src/components/Icons/medium.tsx b/src/components/Icons/medium.tsx
new file mode 100644
index 0000000..893aac2
--- /dev/null
+++ b/src/components/Icons/medium.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+
+export function MediumIcon() {
+ return (
+ <svg width="2em" height="2em" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <g id="Frame">
+ <path
+ id="Vector"
+ d="M17.7967 16.5385C17.8029 18.53 16.9746 20.4425 15.4937 21.8559C14.0128 23.2693 12.0004 24.0681 9.89836 24.0769C7.79633 24.0681 5.78391 23.2693 4.30302 21.8559C2.82212 20.4425 1.99383 18.53 2.00003 16.5385C1.99383 14.5469 2.82212 12.6344 4.30302 11.221C5.78391 9.80759 7.79633 9.00878 9.89836 9C12.0004 9.00878 14.0128 9.80759 15.4937 11.221C16.9746 12.6344 17.8029 14.5469 17.7967 16.5385ZM26.4533 16.5385C26.4533 20.4514 24.6917 23.6348 22.51 23.6348C20.3283 23.6348 18.555 20.4514 18.555 16.5385C18.555 12.6255 20.3283 9.44214 22.51 9.44214C24.6917 9.44214 26.4533 12.6255 26.4533 16.5385ZM30 16.5385C30 20.0424 29.3817 22.8942 28.6117 22.8942C27.8417 22.8942 27.2233 20.0424 27.2233 16.5385C27.2233 13.0345 27.8417 10.1827 28.6117 10.1827C29.3817 10.1827 30 13.0345 30 16.5385Z"
+ fill="currentColor"
+ />
+ </g>
+ </svg>
+ );
+}
diff --git a/src/components/Icons/new-icon.tsx b/src/components/Icons/new-icon.tsx
new file mode 100644
index 0000000..4cb1e37
--- /dev/null
+++ b/src/components/Icons/new-icon.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+export function NewIcon(props: any) {
+ return (
+ <svg {...props} width="43" height="23" viewBox="0 0 43 23" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path
+ d="M2 22.9092C0.895431 22.9092 -1.06778e-08 22.0137 -2.38494e-08 20.9092L-2.49335e-07 2.00009C-2.62507e-07 0.895518 0.89543 8.96347e-05 2 8.96215e-05L37.1011 8.9203e-05C37.9412 8.91929e-05 38.6917 0.525021 38.9798 1.3141L42.38 10.626C42.4577 10.8387 42.4609 11.0715 42.389 11.2863L38.9569 21.5438C38.684 22.3594 37.9202 22.9092 37.0602 22.9092L2 22.9092Z"
+ fill="#23C343"
+ />
+ <path
+ d="M6.98 5.45859H8.52L13.63 12.8926H13.686V5.45859H15.212V15.4546H13.728L8.562 7.93659H8.506V15.4546H6.98V5.45859ZM20.1052 8.02059C21.2812 8.02059 22.1912 8.41259 22.8072 9.22459C23.3672 9.95259 23.6612 10.9606 23.6752 12.2486H18.1872C18.2432 12.9486 18.4252 13.4946 18.7612 13.8726C19.0972 14.2366 19.5592 14.4326 20.1472 14.4326C20.6652 14.4326 21.0852 14.3066 21.4072 14.0686C21.6592 13.8726 21.8692 13.5506 22.0652 13.1306H23.5492C23.3812 13.8026 23.0592 14.3766 22.5552 14.8246C21.9252 15.3706 21.1272 15.6506 20.1612 15.6506C19.0972 15.6506 18.2432 15.3146 17.6272 14.6566C16.9552 13.9566 16.6192 13.0186 16.6192 11.8286C16.6192 10.7506 16.9272 9.85459 17.5712 9.12659C18.1872 8.38459 19.0412 8.02059 20.1052 8.02059ZM20.1472 9.23859C19.5872 9.23859 19.1532 9.39259 18.8172 9.72859C18.5092 10.0506 18.2992 10.5126 18.2152 11.1286H22.1212C21.9812 9.86859 21.3232 9.23859 20.1472 9.23859ZM24.1716 8.21659H25.8096L27.3356 13.6906L28.8196 8.21659H30.1916L31.6756 13.6906L33.2016 8.21659H34.8396L32.3896 15.4546H31.0176L29.5056 10.0366L27.9936 15.4546H26.6216L24.1716 8.21659Z"
+ fill="white"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/Icons/twitter.tsx b/src/components/Icons/twitter.tsx
index 1b8b788..3166cd7 100644
--- a/src/components/Icons/twitter.tsx
+++ b/src/components/Icons/twitter.tsx
@@ -2,14 +2,14 @@
export function TwitterIcon() {
return (
- <svg width="2rem" height="2rem" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" viewBox="0 0 32 32" fill="none">
<path
- d="M3 3H10.6067L29 29H21.3933L3 3ZM6.31485 4.69302L22.3127 27.307H25.6852L9.68727 4.69302H6.31485Z"
- fill="white"
+ d="M4.625 4.625H11.2809L27.375 27.375H20.7191L4.625 4.625ZM7.52549 6.10639L21.5236 25.8936H24.4746L10.4764 6.10639H7.52549Z"
+ fill="currentColor"
/>
<path
- d="M14.202 18.8346L5.18225 29H3L13.2092 17.4314L14.202 18.8346ZM18.4342 14.0647L28.2518 3H25.9448L17.4314 12.6471L18.4342 14.0647Z"
- fill="white"
+ d="M14.4268 18.4803L6.53447 27.375H4.625L13.5581 17.2525L14.4268 18.4803ZM18.1299 14.3066L26.7203 4.625H24.7017L17.2525 13.0662L18.1299 14.3066Z"
+ fill="currentColor"
/>
</svg>
);
diff --git a/src/components/Icons/youtube.tsx b/src/components/Icons/youtube.tsx
index ed32f46..5682bc2 100644
--- a/src/components/Icons/youtube.tsx
+++ b/src/components/Icons/youtube.tsx
@@ -2,18 +2,11 @@
export function YoutubeIcon() {
return (
- <svg width="2rem" height="2rem" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
- <g clipPath="url(#clip0_3462_1106)">
- <path
- d="M30.3048 7.66776C30.7927 8.14769 31.1465 8.74331 31.3319 9.39705C31.7949 11.91 32.0182 14.46 31.9988 17.0138C32.0164 19.558 31.7931 22.0982 31.3319 24.6017C31.1465 25.2554 30.7927 25.851 30.3048 26.3309C29.8169 26.8109 29.2115 27.1589 28.5469 27.3413C26.026 28 16.0142 28 16.0142 28C16.0142 28 5.97317 28 3.48158 27.3413C2.81702 27.1589 2.21154 26.8109 1.72366 26.3309C1.23579 25.851 0.882017 25.2554 0.696547 24.6017C0.22555 22.0991 -0.00754264 19.5589 0.000288097 17.0138C-0.00936809 14.4591 0.223732 11.9091 0.696547 9.39705C0.882017 8.74331 1.23579 8.14769 1.72366 7.66776C2.21154 7.18784 2.81702 6.83983 3.48158 6.65738C6.00118 5.9869 16.0142 6.00002 16.0142 6.00002C16.0142 6.00002 26.0526 6.00002 28.5469 6.65738C29.2115 6.83983 29.8169 7.18784 30.3048 7.66776ZM12 23L22 17.0092L12 11V23Z"
- fill="white"
- />
- </g>
- <defs>
- <clipPath id="clip0_3462_1106">
- <rect width="32" height="32" fill="white" />
- </clipPath>
- </defs>
+ <svg xmlns="http://www.w3.org/2000/svg" width="2em" height="2em" viewBox="0 0 32 32" fill="none">
+ <path
+ d="M28.5167 7.83429C28.9436 8.25423 29.2532 8.77539 29.4154 9.34742C29.8205 11.5462 30.0159 13.7775 29.999 16.0121C30.0144 18.2382 29.819 20.4609 29.4154 22.6515C29.2532 23.2235 28.9436 23.7446 28.5167 24.1645C28.0898 24.5845 27.5601 24.889 26.9785 25.0486C24.7728 25.625 16.0124 25.625 16.0124 25.625C16.0124 25.625 7.22652 25.625 5.04638 25.0486C4.46489 24.889 3.9351 24.5845 3.5082 24.1645C3.08132 23.7446 2.77176 23.2235 2.60948 22.6515C2.19736 20.4617 1.9934 18.239 2.00025 16.0121C1.9918 13.7767 2.19577 11.5455 2.60948 9.34742C2.77176 8.77539 3.08132 8.25423 3.5082 7.83429C3.9351 7.41436 4.46489 7.10985 5.04638 6.95021C7.25103 6.36354 16.0124 6.37502 16.0124 6.37502C16.0124 6.37502 24.796 6.37502 26.9785 6.95021C27.5601 7.10985 28.0898 7.41436 28.5167 7.83429ZM12.5 21.25L21.25 16.008L12.5 10.75V21.25Z"
+ fill="currentColor"
+ />
</svg>
);
}
diff --git a/src/components/More/index.tsx b/src/components/More/index.tsx
index f9fe552..af8cbfc 100644
--- a/src/components/More/index.tsx
+++ b/src/components/More/index.tsx
@@ -1,17 +1,18 @@
import Link from '@docusaurus/Link';
import Translate from '@docusaurus/Translate';
-import React, { ReactNode } from 'react';
+import React, { CSSProperties, ReactNode } from 'react';
import ArrowIcon from '../Icons/arrow';
import './styles.scss';
interface MoreProps {
link: string;
text?: ReactNode;
+ style?: CSSProperties;
}
export default function More(props: MoreProps) {
- const { link, text = <Translate id="learnmore">Learn More</Translate> } = props;
+ const { link, text = <Translate id="learnmore">Learn More</Translate>, style } = props;
return (
- <div className="more">
+ <div style={style} className="more">
<Link to={link}>
{text}
<ArrowIcon />
diff --git a/src/components/Newsletter/style.scss b/src/components/Newsletter/style.scss
index da1aab2..2c892d5 100644
--- a/src/components/Newsletter/style.scss
+++ b/src/components/Newsletter/style.scss
@@ -25,7 +25,6 @@
gap: 8px;
align-self: stretch;
color: #252734;
- font-family: PingFang SC;
font-size: 0.75rem;
margin-bottom: 1.2rem;
font-style: normal;
@@ -35,7 +34,6 @@
.newsletter-title {
color: #484954;
- font-family: PingFang SC;
font-size: 1rem;
font-style: normal;
font-weight: 500;
diff --git a/src/components/PageBanner/index.tsx b/src/components/PageBanner/index.tsx
index c5b982d..9129b54 100644
--- a/src/components/PageBanner/index.tsx
+++ b/src/components/PageBanner/index.tsx
@@ -38,6 +38,28 @@
key={index}
>
{btn.label}
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width="19"
+ height="18"
+ viewBox="0 0 19 18"
+ fill="none"
+ >
+ <path
+ d="M10.6251 13.5L15.125 9L10.6251 4.5"
+ stroke="currentColor"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M3.87506 9.00055L15.1251 9.00055"
+ stroke="currentColor"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
</Link>
) : (
<div
@@ -46,14 +68,34 @@
key={index}
>
{btn.label}
+ <svg
+ style={{ display: 'inline-block' }}
+ xmlns="http://www.w3.org/2000/svg"
+ width="19"
+ height="18"
+ viewBox="0 0 19 18"
+ fill="none"
+ >
+ <path
+ d="M10.6251 13.5L15.125 9L10.6251 4.5"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M3.87506 9.00055L15.1251 9.00055"
+ stroke="#444FD9"
+ stroke-width="1.5"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
</div>
),
)}
</div>
</div>
- <div className="banner-img-wrap">
- <img className="banner-img" src={bannerImg} alt="" />
- </div>
</div>
</section>
);
diff --git a/src/components/PageBanner/styles.scss b/src/components/PageBanner/styles.scss
index c03ce61..07e9c29 100644
--- a/src/components/PageBanner/styles.scss
+++ b/src/components/PageBanner/styles.scss
@@ -1,23 +1,19 @@
.banner-section {
- height: calc(100vh - var(--global-header-height) - 10rem);
+ // height: calc(100vh - var(--global-header-height) - 10rem);
.banner-container {
height: 100%;
width: 100%;
- display: flex;
- align-items: center;
- justify-content: space-between;
.banner-info {
- margin-top: -2rem;
+ margin-top: var(--ifm-navbar-height);
}
.banner-title-wrap {
- max-width: 72rem;
- text-align: left;
}
.banner-sub-title {
+ text-align: center;
font-size: 1.25rem;
line-height: 1.5;
color: var(--global-colors-text);
@@ -27,21 +23,29 @@
.banner-title {
font-size: var(--global-font-size-bigger);
- font-weight: 700;
- line-height: 1;
+ font-weight: 500;
+ line-height: 4rem;
+ text-align: center;
color: var(--global-colors-text-black);
+ .highlight {
+ color: var(--ifm-color-primary);
+ }
}
.banner-buttons {
display: flex;
+ justify-content: center;
align-items: center;
- margin-top: 2.5rem;
+ margin-top: 4rem;
.button {
+ display: flex;
+ gap: 0.25rem;
+ align-items: center;
padding: 0.75rem 2.4rem;
font-size: var(--global-font-size-default);
border: none;
- transition: all .3s;
+ transition: all 0.3s;
font-weight: 500;
border: 1px solid transparent;
@@ -49,8 +53,8 @@
// box-shadow: 10px 16px 18px rgba(195, 203, 235, 0.2);
}
- &+.button {
- margin-left: 0.7rem;
+ & + .button {
+ margin-left: 2rem;
}
&.primary {
@@ -63,7 +67,7 @@
}
&.default {
- background-color: #F0F1FC;
+ background-color: #f0f1fc;
color: var(--ifm-color-primary);
&:hover {
@@ -93,14 +97,13 @@
@media screen and (min-width: 1300px) and (max-width: 1600px) {
.banner-section {
- height: calc(100vh - var(--global-header-height) - 10rem);
+ // height: calc(100vh - var(--global-header-height) - 10rem);
}
}
@media (max-width: 1299px) {
.banner-section {
height: auto;
- padding: 10rem 5rem;
}
}
@@ -122,7 +125,24 @@
.banner-info {
margin-top: 3rem;
margin-bottom: 5rem;
+ .banner-title {
+ font-size: 2.25rem;
+ line-height: 1.5;
+ font-weight: 500;
+ }
+ .banner-sub-title {
+ font-size: 1rem;
+ margin-top: 1.2rem;
+ font-weight: 400;
+ }
+ }
+ .banner-buttons {
+ .button {
+ padding: 0.45rem 1.2rem;
+ font-size: 1rem;
+ font-weight: normal;
+ }
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/components/PageColumn/index.tsx b/src/components/PageColumn/index.tsx
index b541e05..c41ceb9 100644
--- a/src/components/PageColumn/index.tsx
+++ b/src/components/PageColumn/index.tsx
@@ -1,5 +1,5 @@
import clsx from 'clsx';
-import React, { ComponentProps, JSXElementConstructor, ReactNode } from 'react';
+import React, { CSSProperties, ComponentProps, JSXElementConstructor, ReactNode } from 'react';
import './styles.scss';
interface PageColumnProps extends ComponentProps<JSXElementConstructor<any>> {
@@ -7,11 +7,12 @@
title: string | ReactNode;
footer?: ReactNode;
subTitle?: string | ReactNode;
+ wrapperStyle?: CSSProperties;
}
export default function PageColumn(props: PageColumnProps): JSX.Element {
- const { align = 'center', title, footer, children, subTitle } = props;
+ const { align = 'center', title, footer, children, subTitle, wrapperStyle, className } = props;
return (
- <div className={clsx('page-column', align, footer && 'has-footer')}>
+ <div style={wrapperStyle} className={clsx('page-column', className, align, footer && 'has-footer')}>
<h1 className="page-column-title">
<div className="container">{title}</div>
</h1>
diff --git a/src/components/PageColumn/styles.scss b/src/components/PageColumn/styles.scss
index b432c4c..59e4cc1 100644
--- a/src/components/PageColumn/styles.scss
+++ b/src/components/PageColumn/styles.scss
@@ -2,8 +2,13 @@
padding: 6.25rem 0;
font-size: 1.25rem;
color: var(--global-colors-text-primary);
- line-height: 2.0;
+ line-height: 2;
+ .page-column-title {
+ font-size: 44px;
+ font-weight: 540;
+ line-height: 70px;
+ }
&.left {
text-align: left;
@@ -47,13 +52,13 @@
@media (max-width: 996px) {
.page-column {
&-title {
- font-size: var(--global-font-size-larger)
+ font-size: var(--global-font-size-larger);
}
.col {
- &+.col {
+ & + .col {
margin-top: 1rem;
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/components/PageHeader/index.tsx b/src/components/PageHeader/index.tsx
new file mode 100644
index 0000000..fbf0603
--- /dev/null
+++ b/src/components/PageHeader/index.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import './style.scss';
+
+interface PageHeaderProps {
+ title: string;
+ subtitle?: string;
+ extra?: any;
+ [any: string]: any;
+ className?: string;
+}
+
+export default function PageHeader(props: PageHeaderProps) {
+ return (
+ <div className={`page-header bg-[#F7F9FE] pt-10 pb-20 ${props.className}`}>
+ <h1 className="title">{props.title}</h1>
+ <div className="subtitle mt-4">{props.subtitle}</div>
+ {props?.extra && props?.extra}
+ </div>
+ );
+}
diff --git a/src/components/PageHeader/style.scss b/src/components/PageHeader/style.scss
new file mode 100644
index 0000000..4a1d596
--- /dev/null
+++ b/src/components/PageHeader/style.scss
@@ -0,0 +1,18 @@
+.page-header {
+ .title {
+ color: var(--n-1, #1d1d1d);
+ text-align: center;
+ font-size: 44px;
+ font-style: normal;
+ font-weight: 540;
+ letter-spacing: 0.88px;
+ }
+ .subtitle {
+ color: var(--1, #252734);
+ text-align: center;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 330;
+ line-height: 28px; /* 155.556% */
+ }
+}
diff --git a/src/components/ReadMore/index.tsx b/src/components/ReadMore/index.tsx
new file mode 100644
index 0000000..cb09e9f
--- /dev/null
+++ b/src/components/ReadMore/index.tsx
@@ -0,0 +1,43 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+
+interface ReadMoreProps {
+ to: string;
+ className?: string;
+}
+
+export default function ReadMore(props: ReadMoreProps) {
+ return (
+ <Link
+ className={`flex group text-primary items-center cursor-pointer hover:no-underline ${props?.className}`}
+ to={props.to}
+ >
+ <span className="mr-2 ">Read more</span>
+ <span className="transition-slide">
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ className="transition-slide"
+ width="16"
+ height="14"
+ viewBox="0 0 16 14"
+ fill="none"
+ >
+ <path
+ d="M9.37549 12.3542L14.8755 6.85419L9.37549 1.35419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M1.12549 6.85419L14.8755 6.85419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ </span>
+ </Link>
+ );
+}
diff --git a/src/components/VersionsDoc/styles.scss b/src/components/VersionsDoc/styles.scss
index f6f8d69..10f645b 100644
--- a/src/components/VersionsDoc/styles.scss
+++ b/src/components/VersionsDoc/styles.scss
@@ -3,6 +3,12 @@
display: inline-block;
margin-bottom: 1rem;
max-width: 100%;
+ &.paragraph {
+ margin-left: 1rem;
+ .version-tags {
+ margin-bottom: 0;
+ }
+ }
&.paragraph:before {
content: '';
position: absolute;
diff --git a/src/components/achievement-banner/achievement-banner.data.ts b/src/components/achievement-banner/achievement-banner.data.ts
new file mode 100644
index 0000000..1ee1fd0
--- /dev/null
+++ b/src/components/achievement-banner/achievement-banner.data.ts
@@ -0,0 +1,6 @@
+export const AchievementBannerItemsData = [
+ { title: '10K+', content: 'Github stars' },
+ { title: '4000+', content: 'Enterprise users at scale' },
+ { title: '600+', content: 'Total contributors' },
+ { title: '120+', content: 'Monthly active contributors' },
+];
diff --git a/src/components/achievement-banner/achievement-banner.scss b/src/components/achievement-banner/achievement-banner.scss
new file mode 100644
index 0000000..741c03a
--- /dev/null
+++ b/src/components/achievement-banner/achievement-banner.scss
@@ -0,0 +1,22 @@
+.achievement-banner-wrapper {
+ display: flex;
+ gap: 24px;
+ margin-bottom: 5rem;
+ margin-top: 7.5rem;
+
+ .achievement-banner-item {
+ width: 282px;
+ text-align: center;
+ color: var(--global-colors-text-secondary);
+ font-size: 1.25rem;
+ line-height: 1.6;
+ div ~ div {
+ margin-top: 0.25rem;
+ }
+ .highlight {
+ color: var(--ifm-color-primary);
+ font-weight: 540;
+ font-size: 2.5rem;
+ }
+ }
+}
diff --git a/src/components/achievement-banner/achievement-banner.tsx b/src/components/achievement-banner/achievement-banner.tsx
new file mode 100644
index 0000000..2d8824f
--- /dev/null
+++ b/src/components/achievement-banner/achievement-banner.tsx
@@ -0,0 +1,19 @@
+import React from 'react';
+import { AchievementBannerItemsData } from './achievement-banner.data';
+import './achievement-banner.scss';
+
+export function AchievementBanner() {
+ return (
+ <section
+ className="container achievement-banner-wrapper flex-col lg:flex-row items-center lg:mt-[7.5rem];
+ "
+ >
+ {AchievementBannerItemsData.map(({ title, content }) => (
+ <div className="achievement-banner-item" key={title}>
+ <div className="highlight">{title}</div>
+ <div>{content}</div>
+ </div>
+ ))}
+ </section>
+ );
+}
diff --git a/src/components/blogs/components/head-blogs.tsx b/src/components/blogs/components/head-blogs.tsx
new file mode 100644
index 0000000..77c5d12
--- /dev/null
+++ b/src/components/blogs/components/head-blogs.tsx
@@ -0,0 +1,50 @@
+import React from 'react';
+import { IBlog } from '../blogs.type';
+import BlogItem from './blog-item';
+import BlogListItem from '@site/src/theme/BlogListItem';
+
+function getHeadData() {
+ return {
+ data: [],
+ };
+}
+
+export default function HeadBlogs(props) {
+ const blogs = props.blogs;
+ const topNews = blogs.filter(blog => +blog.frontMatter.order === 1)[0];
+ const news = blogs.filter(blog => blog.frontMatter.title !== topNews.frontMatter.title);
+ return (
+ <>
+ <div className="flex lg:flex-row flex-col lg:max-w-7xl">
+ <div className="mb-4 lg:mb-0 lg:flex-1 lg:pr-6">
+ <BlogListItem
+ large={true}
+ headBlog={true}
+ frontMatter={topNews.frontMatter}
+ assets={topNews.assets}
+ metadata={topNews.metadata}
+ truncated={topNews.metadata.truncated}
+ />
+ </div>
+ <ul className="space-y-4 lg:flex-1">
+ {news
+ .filter(BlogPostContent => BlogPostContent.frontMatter.picked)
+ .sort((a, b) => +a.frontMatter.order - +b.frontMatter.order)
+ .map((BlogPostContent, i) => (
+ <BlogListItem
+ headBlog={true}
+ large={false}
+ key={BlogPostContent.metadata.permalink + i}
+ frontMatter={BlogPostContent.frontMatter}
+ assets={BlogPostContent.assets}
+ metadata={BlogPostContent.metadata}
+ truncated={BlogPostContent.metadata.truncated}
+ >
+ <BlogPostContent />
+ </BlogListItem>
+ ))}
+ </ul>
+ </div>
+ </>
+ );
+}
diff --git a/src/components/collapse-box/collapse-box-header.tsx b/src/components/collapse-box/collapse-box-header.tsx
new file mode 100644
index 0000000..705d833
--- /dev/null
+++ b/src/components/collapse-box/collapse-box-header.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { useState } from 'react';
+import { ArrowDownIcon } from '../Icons/arrow-down-icon';
+
+export function CollapseBoxHeader({
+ title,
+ defaultExpand = true,
+ disabled = false,
+}: {
+ title: string;
+ defaultExpand?: boolean;
+ disabled?: boolean;
+}) {
+ const [expand, setExpand] = useState<boolean>(defaultExpand);
+ return (
+ <div
+ onClick={() => {
+ if (disabled) return;
+ setExpand(!expand);
+ }}
+ className={`peer flex cursor-pointer items-center justify-between rounded-t-lg bg-[#F7F9FE] px-[1rem] py-[0.75rem] lg:px-[3rem] lg:py-[1.5rem] text-2xl font-medium leading-[2.5rem] font-misans ${
+ disabled ? 'cursor-default' : 'cursor-pointer'
+ } ${expand ? 'expand' : ' rounded-b-lg'}`}
+ >
+ {title}
+ {!disabled && (
+ <ArrowDownIcon className={`text-[#0065FD] text-3xl lg:text-2xl ${expand ? 'rotate-180' : ''}`} />
+ )}
+ </div>
+ );
+}
diff --git a/src/components/collapse-box/collapse-box.tsx b/src/components/collapse-box/collapse-box.tsx
new file mode 100644
index 0000000..92a8eec
--- /dev/null
+++ b/src/components/collapse-box/collapse-box.tsx
@@ -0,0 +1,64 @@
+import React, { ReactNode } from 'react';
+import { CheckedIcon } from '../Icons/checked-icon';
+import { CollapseBoxHeader } from './collapse-box-header';
+
+interface CollapseBoxProps {
+ title: string;
+ description: string | React.ReactNode;
+ characteristic?: string[];
+ rightContent?: ReactNode;
+ newLink?: ReactNode;
+ moreLink?: ReactNode;
+ showListIcon?: boolean;
+ notes?: string | ReactNode;
+ expand?: boolean;
+ className?: string;
+ disabledExpand?: boolean;
+}
+
+export default function CollapseBox({
+ title,
+ description,
+ characteristic = [],
+ rightContent,
+ newLink,
+ moreLink,
+ showListIcon = true,
+ notes,
+ expand,
+ className,
+ disabledExpand = false,
+}: CollapseBoxProps) {
+ return (
+ <div className={`mt-[5.5rem] w-full rounded-lg border border-[#DFE5F0] ${className}`}>
+ <CollapseBoxHeader title={title} defaultExpand={expand} disabled={disabledExpand} />
+ <div className="grid grid-rows-[0fr] overflow-hidden transition-all peer-[.expand]:grid-rows-[1fr]">
+ <div className="min-h-0 ">
+ <div className="flex flex-col flex-wrap items-center justify-between p-4 sm:p-[3rem] lg:flex-row lg:items-start">
+ <div className="w-full lg:mr-32 lg:flex-1">
+ {newLink}
+ {description && (
+ <div className={`text-base leading-[1.625rem] text-[#1D1D1D]`}>{description}</div>
+ )}
+ {characteristic?.length > 0 && (
+ <div className="flex">
+ <ul>
+ {characteristic?.map(e => (
+ <li key={e} className="mt-4 flex items-center space-x-2">
+ {showListIcon && <CheckedIcon />}
+ <div className="text-[#5F6368]">{e}</div>
+ </li>
+ ))}
+ </ul>
+ </div>
+ )}
+ {moreLink && <div className="flex mt-6 items-center">{moreLink}</div>}
+ {notes && <div className="mt-8 text-[#8592A6] text-xs leading-5">{notes}</div>}
+ </div>
+ <div className="w-full pt-8 lg:w-[27.25rem] lg:pt-0">{rightContent}</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ );
+}
diff --git a/src/components/core-capabilities-card/core-capabilities-card.tsx b/src/components/core-capabilities-card/core-capabilities-card.tsx
new file mode 100644
index 0000000..e4b5bde
--- /dev/null
+++ b/src/components/core-capabilities-card/core-capabilities-card.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+import './style.scss';
+
+export function CoreCapabilitiesCard({ title, content, icon }: { title: string; content: string; icon: any }) {
+ return (
+ <div>
+ <div className="core-capabilities-icon">{icon}</div>
+ <div className="core-capabilities-card">
+ <div className="title">{title}</div>
+ <div className="content">{content}</div>
+ </div>
+ </div>
+ );
+}
diff --git a/src/components/core-capabilities-card/style.scss b/src/components/core-capabilities-card/style.scss
new file mode 100644
index 0000000..cf7d5e7
--- /dev/null
+++ b/src/components/core-capabilities-card/style.scss
@@ -0,0 +1,36 @@
+.core-capabilities-card {
+ background-color: var(--global-colors-white);
+ padding: 2.5rem 2rem 3.375rem;
+ border-radius: 8px;
+ height: calc(100% - 5rem);
+ text-align: left;
+
+ .title {
+ font-size: 1.25rem;
+ font-weight: 450;
+ line-height: 1.6;
+ margin-bottom: 0.75rem;
+ }
+
+ .content {
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.875;
+ }
+}
+
+.core-capabilities-icon {
+ width: 4rem;
+ height: 4rem;
+ background-color: var(--global-colors-white);
+ position: relative;
+ transform: translateY(50%);
+ border-radius: 50%;
+ left: 1.5rem;
+ svg {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+}
diff --git a/src/components/download-form/download-form-simple.tsx b/src/components/download-form/download-form-simple.tsx
new file mode 100644
index 0000000..8e7e39b
--- /dev/null
+++ b/src/components/download-form/download-form-simple.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import { Form } from 'antd';
+import { Option } from '@site/src/constant/download.data';
+import FormSelect from '../form-select/form-select';
+import { useForm } from 'antd/es/form/Form';
+interface DownloadFormSimpleProps {
+ versions: Option[];
+}
+export default function DownloadFormSimple(props: DownloadFormSimpleProps) {
+ const { versions } = props;
+ const [form] = useForm();
+
+ const getVersionLinkByKeys = (version: string[]) => {
+ const versionNode = versions.find(({ value }) => value === version[0]);
+ const node = versionNode?.children.find(({ value }) => value === version[1]);
+ return node?.source || null;
+ };
+
+ return (
+ <div className="rounded-lg border border-b-[0.375rem] border-[#0065FD] px-8 pt-[3.125rem] pb-[2.1875rem]">
+ <div className="mb-8 text-xl font-medium">Downloads</div>
+ <Form
+ form={form}
+ onFinish={val => {
+ window.open(getVersionLinkByKeys(val.version), '_blank');
+ return;
+ }}
+ initialValues={{
+ version: [versions[0].value, versions[0].children[0].value],
+ }}
+ >
+ <Form.Item name="version" rules={[{ required: true }]}>
+ <FormSelect
+ placeholder="Version"
+ label="version"
+ isCascader={true}
+ displayRender={label => {
+ return label.length > 0 ? label[label.length - 1] : '';
+ }}
+ options={versions}
+ />
+ </Form.Item>
+ <Form.Item style={{ marginBottom: 0 }} colon={false}>
+ <button type="submit" className="button-primary w-full text-lg">
+ Download
+ </button>
+ </Form.Item>
+ </Form>
+ </div>
+ );
+}
diff --git a/src/components/download-form/download-form.tsx b/src/components/download-form/download-form.tsx
new file mode 100644
index 0000000..46044b7
--- /dev/null
+++ b/src/components/download-form/download-form.tsx
@@ -0,0 +1,96 @@
+import React, { useEffect, useState } from 'react';
+import { Form } from 'antd';
+import { Option } from '@site/src/constant/download.data';
+import FormSelect from '../form-select/form-select';
+import { useForm, useWatch } from 'antd/es/form/Form';
+import { ExternalLinkArrowIcon } from '../Icons/external-link-arrow-icon';
+
+interface DownloadFormProps {
+ versions: Option[];
+}
+export default function DownloadForm(props: DownloadFormProps) {
+ const { versions } = props;
+ const [form] = useForm();
+ const version = useWatch('version', form);
+ const architecture = useWatch('architecture', form);
+
+ const getOptions = (version: string) => {
+ const options = versions.find(item => item.value === version);
+ return options.children;
+ };
+
+ const getVersionLinkByKeys = (version, cpu, type) => {
+ const versionNode = versions.find(item => item.value === version);
+ const node = versionNode.children.find(item => item.value === cpu);
+ return node?.[type] || null;
+ };
+
+ useEffect(() => {
+ const currentVersion = versions.find(item => form.getFieldValue('version') === item.value).children;
+ form.setFieldValue('architecture', currentVersion[0].value);
+ }, [version]);
+
+ return (
+ <div className="rounded-lg border border-b-[0.375rem] border-[#444FD9] px-8 pt-[3.125rem] pb-[2.1875rem]">
+ <div className="mb-8 text-xl font-medium">Available downloads</div>
+ <Form
+ form={form}
+ onFinish={val => {
+ window.open(getVersionLinkByKeys(val.version, val.architecture, 'gz'), '_blank');
+ return;
+ }}
+ initialValues={{
+ version: versions[0].value,
+ }}
+ >
+ <Form.Item name="version" rules={[{ required: true }]}>
+ <FormSelect placeholder="Version" label="version" isCascader={false} options={versions} />
+ </Form.Item>
+ <Form.Item noStyle shouldUpdate>
+ {({ getFieldValue }) => (
+ <Form.Item name="architecture" rules={[{ required: true }]}>
+ <FormSelect
+ placeholder="Architecture"
+ label="Architecture"
+ isCascader={false}
+ options={getOptions(getFieldValue('version'))}
+ />
+ </Form.Item>
+ )}
+ </Form.Item>
+
+ <Form.Item style={{ marginBottom: 0 }} colon={false}>
+ <button type="submit" className="button-primary w-full text-lg">
+ Download
+ </button>
+ </Form.Item>
+ <div className="flex justify-center mt-[1.5rem]">
+ <div
+ className="inline-flex items-center text-[#444FD9] cursor-pointer hover:underline"
+ onClick={() => {
+ window.open(getVersionLinkByKeys(version, architecture, 'asc'), '_blank');
+ }}
+ >
+ asc
+ </div>
+ <div
+ className="inline-flex items-center ml-[4.375rem] text-[#444FD9] cursor-pointer hover:underline"
+ onClick={() => {
+ window.open(getVersionLinkByKeys(version, architecture, 'sha512'), '_blank');
+ }}
+ >
+ sha512
+ </div>
+ <div
+ className="inline-flex items-center ml-[4.375rem] text-[#444FD9] cursor-pointer hover:underline"
+ onClick={() => {
+ window.open(getVersionLinkByKeys(version, architecture, 'source'), '_blank');
+ }}
+ >
+ source code
+ </div>
+ </div>
+ </Form>
+ </div>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/icons/cluster-management-icon.tsx b/src/components/ecomsystem/ecomsystem-category/components/icons/cluster-management-icon.tsx
new file mode 100644
index 0000000..4489f9c
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/icons/cluster-management-icon.tsx
@@ -0,0 +1,12 @@
+import React from 'react';
+
+export function ClusterManagementIcon() {
+ return (
+ <svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect width="54" height="54" rx="6.75" fill="white" />
+ <path d="M27 6L37 11.5V22.5L27 28L17 22.5V11.5L27 6Z" fill="#444FD9" />
+ <path d="M16 25L26 30.5V41.5L16 47L6 41.5V30.5L16 25Z" fill="#444FD9" />
+ <path d="M48 30.5L38 25L28 30.5V41.5L38 47L48 41.5V30.5Z" fill="#444FD9" />
+ </svg>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/icons/connectors-icon.tsx b/src/components/ecomsystem/ecomsystem-category/components/icons/connectors-icon.tsx
new file mode 100644
index 0000000..18ac059
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/icons/connectors-icon.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+
+export function ConnectorsIcon() {
+ return (
+ <svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect width="54" height="54" fill="white" />
+ <path
+ d="M33.9239 11.8825C40.7908 14.6313 45.6413 21.347 45.6413 29.1956C45.6413 30.4391 45.5195 31.6542 45.2872 32.8296C47.0243 34.1033 48.1521 36.1591 48.1521 38.4782C48.1521 42.3442 45.0181 45.4782 41.1521 45.4782C39.8622 45.4782 38.6537 45.1293 37.616 44.5207C34.6034 46.6116 30.9448 47.8369 26.9999 47.8369C23.0551 47.8369 19.3965 46.6116 16.3839 44.5207C15.3461 45.1293 14.1377 45.4782 12.8478 45.4782C8.98179 45.4782 5.84778 42.3442 5.84778 38.4782C5.84778 36.1591 6.97558 34.1033 8.71265 32.8296C8.4804 31.6542 8.35864 30.4391 8.35864 29.1956C8.35864 21.3468 13.2093 14.631 20.0764 11.8824C20.1563 11.3454 20.299 10.8161 20.5039 10.3055C21.1096 8.7965 22.2217 7.54543 23.6494 6.76708C25.077 5.98874 26.731 5.73167 28.3276 6.04002C29.9241 6.34837 31.3634 7.20289 32.3986 8.45689C33.2132 9.44375 33.7374 10.6296 33.9239 11.8825ZM12.0367 31.5247C12.3028 31.494 12.5734 31.4782 12.8478 31.4782C16.7138 31.4782 19.8478 34.6122 19.8478 38.4782C19.8478 39.7591 19.5038 40.9596 18.9031 41.9924C21.2448 43.4772 24.022 44.3369 26.9999 44.3369C29.9779 44.3369 32.7551 43.4772 35.0968 41.9924C34.4961 40.9596 34.1521 39.7591 34.1521 38.4782C34.1521 34.6122 37.2861 31.4782 41.1521 31.4782C41.4264 31.4782 41.6971 31.494 41.9632 31.5247C42.0804 30.7655 42.1413 29.9876 42.1413 29.1956C42.1413 23.1598 38.6096 17.9489 33.5 15.5166C33.1641 16.3544 32.671 17.1121 32.0569 17.7533C30.9326 18.9279 29.4344 19.6745 27.8195 19.8649C26.2047 20.0552 24.5739 19.6774 23.2073 18.7964C21.9837 18.0076 21.0401 16.8594 20.5019 15.5156C15.3912 17.9475 11.8586 23.159 11.8586 29.1956C11.8586 29.9876 11.9195 30.7655 12.0367 31.5247Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M32.4402 12.1033L32.567 12.9551L33.3664 13.2751C39.6835 15.8037 44.1413 21.9809 44.1413 29.1956C44.1413 30.341 44.0291 31.4587 43.8157 32.5388L43.6307 33.4749L44.4002 34.0392C45.7685 35.0426 46.6521 36.6571 46.6521 38.4782C46.6521 41.5158 44.1897 43.9782 41.1521 43.9782C40.1361 43.9782 39.1887 43.7041 38.3748 43.2268L37.5481 42.742L36.7608 43.2884C33.9912 45.2106 30.6294 46.3369 26.9999 46.3369C23.3705 46.3369 20.0087 45.2106 17.2391 43.2884L16.4518 42.742L15.625 43.2268C14.8112 43.7041 13.8638 43.9782 12.8478 43.9782C9.81021 43.9782 7.34778 41.5158 7.34778 38.4782C7.34778 36.6571 8.23134 35.0426 9.59967 34.0392L10.3692 33.4749L10.1842 32.5388C9.97077 31.4587 9.85864 30.341 9.85864 29.1956C9.85864 21.9808 14.3166 15.8035 20.6338 13.275L21.4333 12.955L21.5601 12.1032C21.6228 11.6813 21.7349 11.2655 21.8959 10.8642C22.3718 9.67861 23.2457 8.69562 24.3674 8.08407C25.4891 7.47251 26.7887 7.27053 28.0431 7.5128C29.2975 7.75508 30.4285 8.42649 31.2417 9.41177C31.8818 10.1871 32.2937 11.1189 32.4402 12.1033ZM10.5542 31.7536L10.7745 33.1803L12.2086 33.0148C12.4178 32.9907 12.631 32.9782 12.8478 32.9782C15.8853 32.9782 18.3478 35.4406 18.3478 38.4782C18.3478 39.4871 18.0775 40.4283 17.6064 41.2383L16.8806 42.4862L18.0998 43.2592C20.6747 44.8918 23.7292 45.8369 26.9999 45.8369C30.2706 45.8369 33.3252 44.8918 35.9 43.2592L37.1192 42.4862L36.3935 41.2383C35.9224 40.4283 35.6521 39.4871 35.6521 38.4782C35.6521 35.4406 38.1145 32.9782 41.1521 32.9782C41.3689 32.9782 41.5821 32.9907 41.7913 33.0148L43.2254 33.1803L43.4457 31.7536C43.5745 30.9189 43.6413 30.0645 43.6413 29.1956C43.6413 22.5596 39.757 16.8338 34.1447 14.1622L32.7021 13.4755L32.1077 14.9585C31.8443 15.6155 31.457 16.211 30.9736 16.7158L30.9733 16.7161C30.0899 17.639 28.9127 18.2256 27.6439 18.3752C26.3751 18.5247 25.0938 18.2279 24.02 17.5357C23.0586 16.9159 22.3172 16.0137 21.8944 14.9579L21.3003 13.4745L19.8574 14.1611C14.2439 16.8323 10.3586 22.5587 10.3586 29.1956C10.3586 30.0645 10.4254 30.9189 10.5542 31.7536Z"
+ stroke="#444FD9"
+ strokeWidth="3"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/icons/distributions-packaging-icon.tsx b/src/components/ecomsystem/ecomsystem-category/components/icons/distributions-packaging-icon.tsx
new file mode 100644
index 0000000..e445f0c
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/icons/distributions-packaging-icon.tsx
@@ -0,0 +1,13 @@
+import React from 'react';
+
+export function DistributionsAndPackagingIcon() {
+ return (
+ <svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect width="54" height="54" fill="white" />
+ <path
+ d="M8.48254 16.7281L17.3847 21.1986L35.9022 11.8995L29.0641 8.46558C27.7647 7.81307 26.2353 7.81307 24.9359 8.46558L8.48254 16.7281ZM19.9648 22.4942L38.4822 13.1952L45.5175 16.7281L27 26.0272L19.9648 22.4942ZM47 18.5749L28.1538 28.039V47.0238L44.4487 38.8409C46.0123 38.0557 47 36.4506 47 34.6948V18.5749ZM25.8462 47.0238V28.039L7 18.5749V34.6948C7 36.4506 7.9877 38.0557 9.55132 38.8409L25.8462 47.0238Z"
+ fill="#444FD9"
+ />
+ </svg>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx b/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx
new file mode 100644
index 0000000..771ec17
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/components/tab-item.tsx
@@ -0,0 +1,34 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+import { ReactNode } from 'react';
+
+interface PriceTabProps {
+ title: string;
+ content: string;
+ icon: ReactNode;
+ active: boolean;
+ url: string;
+ setActive: () => void;
+}
+
+export function TabItem({ title, content, icon, active, setActive, url }: PriceTabProps) {
+ return (
+ <Link
+ to={url}
+ onClick={() => {
+ setActive();
+ }}
+ className={`lg:h-[7.75rem] w-full cursor-pointer rounded-lg bg-[#fff] px-4 lg:px-6 py-8 shadow-[0px_2px_8px_0px_rgba(49,77,136,0.16)] lg:flex-1 ${
+ active ? 'border-b-4 border-[#0065FD]' : ''
+ } hover:no-underline`}
+ >
+ <div className="flex items-center">
+ <div className={`pr-[0.75rem] text-[3.375rem] `}>{icon}</div>
+ <div>
+ <div className="text-base text-[#202124] font-misans sm:text-xl">{title}</div>
+ <div className=" pt-[0.3125rem] text-sm tracking-[-0.01rem] text-[#5F6368]">{content}</div>
+ </div>
+ </div>
+ </Link>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx b/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx
new file mode 100644
index 0000000..e49be97
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-category/ecomsystem-category.tsx
@@ -0,0 +1,54 @@
+import { useLocation } from '@docusaurus/router';
+import React, { useState } from 'react';
+import { EcomsystemCategoryEnum } from '../ecomsystem.data';
+import { ClusterManagementIcon } from './components/icons/cluster-management-icon';
+import { ConnectorsIcon } from './components/icons/connectors-icon';
+import { DistributionsAndPackagingIcon } from './components/icons/distributions-packaging-icon';
+import { TabItem } from './components/tab-item';
+
+export default function EcomsystemCategory() {
+ const location = useLocation();
+ const pathnames = location.pathname.split('/');
+
+ const current = pathnames.length > 0 ? pathnames[pathnames.length - 1] : '';
+ let currentActive: EcomsystemCategoryEnum = EcomsystemCategoryEnum.ClusterManagement;
+
+ if (current === EcomsystemCategoryEnum.ClusterManagement) {
+ currentActive = EcomsystemCategoryEnum.ClusterManagement;
+ } else if (current === EcomsystemCategoryEnum.Connectors) {
+ currentActive = EcomsystemCategoryEnum.Connectors;
+ } else {
+ currentActive = EcomsystemCategoryEnum.DistributionsAndPackaging;
+ }
+
+ const [active, setActive] = useState<EcomsystemCategoryEnum | string>(currentActive);
+
+ return (
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center gap-6 lg:flex-row -mt-[1.5rem]">
+ <TabItem
+ url={EcomsystemCategoryEnum.ClusterManagement}
+ setActive={() => setActive(EcomsystemCategoryEnum.ClusterManagement)}
+ active={active === EcomsystemCategoryEnum.ClusterManagement}
+ icon={<ClusterManagementIcon />}
+ title="Cluster management"
+ content="Easily deploy and maintain Doris clusters"
+ />
+ <TabItem
+ url={EcomsystemCategoryEnum.Connectors}
+ setActive={() => setActive(EcomsystemCategoryEnum.Connectors)}
+ active={active === EcomsystemCategoryEnum.Connectors}
+ icon={<ConnectorsIcon />}
+ title="Connectors"
+ content="Integrate with Flink, Spark, dbt and more"
+ />
+ <TabItem
+ url={EcomsystemCategoryEnum.DistributionsAndPackaging}
+ setActive={() => setActive(EcomsystemCategoryEnum.DistributionsAndPackaging)}
+ active={active === EcomsystemCategoryEnum.DistributionsAndPackaging}
+ icon={<DistributionsAndPackagingIcon />}
+ title={'Distributions'}
+ content="Complement Apache Doris"
+ />
+ </div>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout.tsx b/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout.tsx
new file mode 100644
index 0000000..5085a36
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout.tsx
@@ -0,0 +1,42 @@
+import { translate } from '@docusaurus/Translate';
+import React, { PropsWithChildren } from 'react';
+import PageHeader from '@site/src/components/PageHeader';
+import Layout from '@site/src/theme/Layout';
+import EcomsystemCategory from '@site/src/components/ecomsystem/ecomsystem-category/ecomsystem-category';
+import { ExternalLinkArrowIcon } from '../../Icons/external-link-arrow-icon';
+import GetStarted from '@site/src/components/get-started/get-started';
+import ExternalLink from '@site/src/components/external-link/external-link';
+
+export default function EcomsystemLayout(props: PropsWithChildren) {
+ const { children } = props;
+ return (
+ <Layout
+ title={translate({ id: 'ecosystem.title', message: 'Ecosystem' })}
+ // TODO update description
+ description={translate({
+ id: 'homepage.banner.subTitle',
+ message: 'An easy-to-use, high-performance and unified analytical database',
+ })}
+ wrapperClassName="ecosystem"
+ >
+ <PageHeader
+ title="Ecosystem"
+ subtitle="Break complexity in data integration and cluster management."
+ className="pt-20 px-4"
+ extra={
+ <div className="flex justify-center mt-5">
+ <ExternalLink
+ style={{ height: '3.25rem' }}
+ to="/docs/ecosystem/datax"
+ label="Explore more tools"
+ linkIcon={<ExternalLinkArrowIcon />}
+ ></ExternalLink>
+ </div>
+ }
+ />
+ <EcomsystemCategory />
+ {children}
+ <GetStarted />
+ </Layout>
+ );
+}
diff --git a/src/components/ecomsystem/ecomsystem.data.ts b/src/components/ecomsystem/ecomsystem.data.ts
new file mode 100644
index 0000000..5e8895c
--- /dev/null
+++ b/src/components/ecomsystem/ecomsystem.data.ts
@@ -0,0 +1,5 @@
+export enum EcomsystemCategoryEnum {
+ ClusterManagement = 'cluster-management',
+ Connectors = 'connectors',
+ DistributionsAndPackaging = 'distributions-and-packaging',
+}
diff --git a/src/components/external-link/external-link.scss b/src/components/external-link/external-link.scss
new file mode 100644
index 0000000..43fee41
--- /dev/null
+++ b/src/components/external-link/external-link.scss
@@ -0,0 +1,17 @@
+.external-link {
+ & + .external-link {
+ margin-left: 1.5rem;
+ }
+ > svg {
+ margin-left: 0.25rem;
+ margin-top: 1px;
+ }
+ &.primary-btn {
+ background: #444fd9;
+ color: #fff;
+ min-width: 10rem;
+ border-radius: 4px;
+ padding: 0 1.25rem;
+ height: 3rem;
+ }
+}
diff --git a/src/components/external-link/external-link.tsx b/src/components/external-link/external-link.tsx
new file mode 100644
index 0000000..fa28345
--- /dev/null
+++ b/src/components/external-link/external-link.tsx
@@ -0,0 +1,22 @@
+import Link, { Props } from '@docusaurus/Link';
+import React, { ReactNode } from 'react';
+import { ExternalLinkIcon } from '../Icons/external-link-icon';
+import './external-link.scss';
+
+interface ExternalLinkProps extends Props {
+ label: string | ReactNode;
+ linkIcon?: boolean | ReactNode;
+ className?: string;
+}
+export default function ExternalLink(props: ExternalLinkProps) {
+ const { className = 'primary-btn', label, linkIcon = <ExternalLinkIcon />, ...rest } = props;
+ return (
+ <Link
+ {...rest}
+ className={`flex group items-center justify-center hover:no-underline external-link ${className}`}
+ >
+ <span className="mr-2">{label}</span>
+ <span className="transition-slide">{linkIcon}</span>
+ </Link>
+ );
+}
diff --git a/src/components/form-select/form-select.scss b/src/components/form-select/form-select.scss
new file mode 100644
index 0000000..f23fb89
--- /dev/null
+++ b/src/components/form-select/form-select.scss
@@ -0,0 +1,82 @@
+.form-select {
+ .ant-select:not(.ant-select-customize-input) {
+ &.ant-select-focused {
+ .ant-select-selector {
+ box-shadow: none !important;
+ border-color: #444fd9 !important;
+ }
+ }
+ &:hover {
+ .ant-select-selector {
+ border-color: #444fd9 !important;
+ }
+ }
+ .ant-select-selector {
+ border-color: #dfe5f0;
+ }
+ .ant-select-arrow {
+ color: #4c576c;
+ font-size: 16px;
+ }
+ }
+}
+.form-select-select {
+ padding: 0.375rem 0;
+ border: 0.5px solid #dfe5f0;
+ box-shadow: 0px 2px 8px 0px rgba(49, 77, 136, 0.16);
+ &.ant-select-dropdown {
+ .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {
+ color: #444fd9;
+ font-weight: 400;
+ background-color: transparent;
+ &:hover {
+ background-color: #f7f9fe;
+ }
+ }
+ .ant-select-item {
+ border-radius: 0;
+ }
+ }
+}
+
+.form-cascader {
+ border: 0.5px solid #dfe5f0;
+ box-shadow: 0px 2px 8px 0px rgba(49, 77, 136, 0.16);
+ .ant-cascader-menus {
+ .ant-cascader-menu {
+ padding: 6px 0;
+ @media (min-width: 640px) {
+ &:first-child {
+ min-width: 180px;
+ }
+ &:last-child {
+ min-width: 192px;
+ }
+ }
+
+ li.ant-cascader-menu-item-active {
+ color: #444fd9;
+ font-weight: 400;
+ background-color: transparent;
+ &:hover {
+ background-color: #f7f9fe;
+ }
+ .ant-cascader-menu-item-expand-icon {
+ color: #444fd9;
+ }
+ }
+ }
+ li.ant-cascader-menu-item {
+ .ant-cascader-menu-item-content {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ &:hover {
+ color: #1d1d1d;
+ background-color: #f7f9fe;
+ border-radius: 0;
+ }
+ }
+ }
+}
diff --git a/src/components/form-select/form-select.tsx b/src/components/form-select/form-select.tsx
new file mode 100644
index 0000000..9c6d707
--- /dev/null
+++ b/src/components/form-select/form-select.tsx
@@ -0,0 +1,61 @@
+import { Cascader, Select } from 'antd';
+import React, { ReactNode } from 'react';
+import { ArrowDownIcon } from '../Icons/arrow-down-icon';
+import { Option } from '@site/src/constant/download.data';
+import './form-select.scss';
+
+export interface FormSelectProps {
+ value?: string | string[];
+ onChange?: (value: string | string[]) => void;
+ placeholder: string;
+ label: string;
+ options: Option[];
+ isCascader?: boolean;
+ displayRender?: (label, selectedOptions) => ReactNode;
+}
+
+export default function FormSelect({
+ value = '',
+ onChange,
+ label,
+ placeholder,
+ options,
+ isCascader = false,
+ displayRender = label => {
+ return label.length > 0 ? label[0] : '';
+ },
+}: FormSelectProps) {
+ return (
+ <div className="group relative z-0 w-full form-select">
+ {isCascader ? (
+ <Cascader
+ displayRender={displayRender}
+ suffixIcon={<ArrowDownIcon />}
+ allowClear={false}
+ value={value as string[]}
+ onChange={e => {
+ return onChange && onChange(e as string[]);
+ }}
+ options={options}
+ className={`peer block h-[3.5rem] w-full appearance-none rounded-lg bg-transparent text-sm text-[#1D1D1D] focus:border-blue-600 focus:outline-none focus:ring-0 dark:border-gray-600 dark:text-white dark:focus:border-blue-500`}
+ popupClassName="form-cascader"
+ />
+ ) : (
+ <Select
+ suffixIcon={<ArrowDownIcon />}
+ popupClassName="form-select-select"
+ value={value}
+ onChange={e => onChange && onChange(e || '')}
+ className={`peer block h-[3.5rem] w-full appearance-none rounded-lg bg-transparent text-sm text-[#1D1D1D] focus:border-blue-600 focus:outline-none focus:ring-0 dark:border-gray-600 dark:text-white dark:focus:border-blue-500`}
+ options={options}
+ />
+ )}
+ <label
+ htmlFor={label}
+ className="absolute left-2 top-5 z-10 origin-[0] -translate-y-7 scale-75 transform bg-[#fff] px-1 text-sm text-[#8592A6] duration-300 peer-placeholder-shown:translate-y-0 peer-placeholder-shown:scale-100 peer-hover:text-blue peer-focus:-translate-y-7 peer-focus:scale-75 peer-focus:font-medium peer-focus:text-blue-600 peer-[.ant-input-status-error]:text-[#ff4d4f] peer-[.ant-select-open]:text-blue-500 dark:text-gray-400"
+ >
+ {placeholder}
+ </label>
+ </div>
+ );
+}
diff --git a/src/components/get-started/get-started.data.ts b/src/components/get-started/get-started.data.ts
new file mode 100644
index 0000000..7f3a684
--- /dev/null
+++ b/src/components/get-started/get-started.data.ts
@@ -0,0 +1,17 @@
+export const GET_STARTED_DATA = {
+ title: 'Start a real-time analytical journey with Apache Doris',
+ description: '',
+ buttons: [
+ {
+ to: '/download',
+ text: 'Download',
+ className: 'w-[10.5rem] h-[3rem] bg-white rounded-lg text-[#444FD9]',
+ },
+ {
+ to: '/download#runAnywhere',
+ text: 'Run anywhere',
+ className:
+ 'w-[10.5rem] bg-transparent h-[3rem] rounded-lg text-white border-white border-[0.5px] border-solid hover:text-white',
+ },
+ ],
+};
diff --git a/src/components/get-started/get-started.tsx b/src/components/get-started/get-started.tsx
new file mode 100644
index 0000000..0c6099d
--- /dev/null
+++ b/src/components/get-started/get-started.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import ExternalLink from '../external-link/external-link';
+import { ExternalLinkArrowIcon } from '../Icons/external-link-arrow-icon';
+import { GET_STARTED_DATA } from './get-started.data';
+
+export default function GetStarted() {
+ const data = GET_STARTED_DATA;
+ return (
+ <div className="relative overflow-hidden py-[5.5rem] bg-center bg-cover bg-[url(@site/static/images/ecomsystem/download-bg.png)]">
+ {/* <div className="border-[rgba(255, 255, 255, 0.63)] absolute top-0 h-[40rem] w-[40rem] -translate-x-2/3 -translate-y-2/3 transform rounded-full border-[20rem] bg-transparent opacity-10"></div>
+ <div className="border-[rgba(255, 255, 255, 0.63)] absolute bottom-0 right-0 h-[40rem] w-[40rem] translate-x-1/2 translate-y-1/2 transform rounded-full border-[20rem] bg-transparent opacity-10"></div> */}
+ <div className="container mx-auto">
+ <h2 className="text-center text-[2.75rem] font-[540] text-white lg:text-title-md">{data.title}</h2>
+ {data?.description && <div className="mt-4 text-center text-white">{data.description}</div>}
+ <div className="relative z-[1] mt-12 flex justify-center space-x-4 lg:space-x-10">
+ {data.buttons.map((item, index) => {
+ return (
+ <ExternalLink
+ label={item.text}
+ key={index}
+ {...item}
+ linkIcon={<ExternalLinkArrowIcon />}
+ />
+ );
+ })}
+ </div>
+ </div>
+ </div>
+ );
+}
diff --git a/src/components/link-arrow/index.tsx b/src/components/link-arrow/index.tsx
new file mode 100644
index 0000000..1d5688e
--- /dev/null
+++ b/src/components/link-arrow/index.tsx
@@ -0,0 +1,44 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+
+interface ReadMoreProps {
+ to: string;
+ className?: string;
+ text: string | React.ReactNode;
+}
+
+export default function LinkWithArrow(props: ReadMoreProps) {
+ return (
+ <Link
+ className={`flex group text-primary items-center text-base cursor-pointer hover:no-underline ${props?.className}`}
+ to={props.to}
+ >
+ <span className="mr-2">{props.text}</span>
+ <span className="transition-slide">
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ className="transition-slide"
+ width="16"
+ height="14"
+ viewBox="0 0 16 14"
+ fill="none"
+ >
+ <path
+ d="M9.37549 12.3542L14.8755 6.85419L9.37549 1.35419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M1.12549 6.85419L14.8755 6.85419"
+ stroke="currentColor"
+ stroke-width="1.65"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ </span>
+ </Link>
+ );
+}
diff --git a/src/components/progress/progress.tsx b/src/components/progress/progress.tsx
new file mode 100644
index 0000000..79d8cf4
--- /dev/null
+++ b/src/components/progress/progress.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export function Progress({ percent }: { percent: number }) {
+ return (
+ <div className="h-0.5 w-[calc(100%-1.5rem)] bg-neutral-200 dark:bg-neutral-600 progress">
+ <div className="h-0.5 bg-primary" style={{ width: `${percent}%` }}></div>
+ </div>
+ );
+}
diff --git a/src/constant/core-capabilities.data.tsx b/src/constant/core-capabilities.data.tsx
new file mode 100644
index 0000000..fa5b640
--- /dev/null
+++ b/src/constant/core-capabilities.data.tsx
@@ -0,0 +1,133 @@
+import React from 'react';
+
+export const CoreCapabilitiesData = [
+ {
+ title: 'Real-time ingestion and storage',
+ content:
+ 'Push-based micro-batch and pull-based streaming data ingestion within a second. Storage engine with real-time upsert, append and pre-aggregation.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM22.6666 29.3337L18.6666 25.3337L11.9999 25.3337C11.9999 25.3337 12.7333 21.2937 14.6666 20.0004C16.8266 18.5604 21.3333 20.0004 21.3333 20.0004L21.1748 20.3173C21.2272 20.2336 21.28 20.1502 21.3333 20.067C22.8868 17.583 25.0501 15.5377 27.6173 14.1258C30.1844 12.7138 33.0702 11.9822 35.9999 12.0003C35.9999 15.627 34.9599 22.0003 27.9999 26.667C27.9999 26.667 29.4399 31.1737 27.9999 33.3337C26.7066 35.267 22.6666 36.0003 22.6666 36.0003L22.6666 29.3337Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M14.9332 29.2177C12.9332 30.8977 12.2665 35.8844 12.2665 35.8844C12.2665 35.8844 17.2532 35.2177 18.9332 33.2177C19.8799 32.0977 19.8665 30.3777 18.8132 29.3377C18.2949 28.8431 17.6123 28.5572 16.8962 28.5351C16.1801 28.5129 15.481 28.756 14.9332 29.2177Z"
+ fill="#DFE0F7"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Lightning-fast query',
+ content:
+ 'Optimize for high-concurrency and high-throughput queries with columnar storage engine, MPP architecture, cost based query optimizer, vectorized execution engine.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <g clip-path="url(#clip0_1665_614)">
+ <path
+ d="M26.9393 20.9393C27.5251 20.3536 28.4748 20.3536 29.0606 20.9393C29.6464 21.5251 29.6464 22.4749 29.0606 23.0607L25.0606 27.0607C24.4748 27.6464 23.5251 27.6464 22.9393 27.0607C22.3535 26.4749 22.3535 25.5251 22.9393 24.9393L26.9393 20.9393Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24ZM23.9999 15C17.6487 15 12.4999 20.1487 12.4999 26.5C12.4999 32.8513 17.6487 38 23.9999 38C30.3512 38 35.4999 32.8513 35.4999 26.5C35.4999 20.1487 30.3512 15 23.9999 15Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M20 9.5C19.1716 9.5 18.5 10.1716 18.5 11C18.5 11.8284 19.1716 12.5 20 12.5H22.5001V15.0969C22.991 15.033 23.4916 15 24 15C24.5084 15 25.0091 15.033 25.5001 15.0969V12.5H28C28.8284 12.5 29.5 11.8284 29.5 11C29.5 10.1716 28.8284 9.5 28 9.5H20Z"
+ fill="#C0C3F1"
+ />
+ <path
+ d="M35.1546 14.0334C34.5649 13.4561 33.6195 13.4636 33.039 14.0502C32.4585 14.6369 32.461 15.5823 33.0446 16.1659L34.9393 18.0607C35.5251 18.6464 36.4749 18.6464 37.0607 18.0607C37.6464 17.4749 37.6464 16.5251 37.0607 15.9393L36.2598 15.1385C36.2154 15.0799 36.1662 15.0238 36.112 14.9708L35.1546 14.0334Z"
+ fill="#C0C3F1"
+ />
+ </g>
+ <defs>
+ <clipPath id="clip0_1665_614">
+ <rect width="48" height="48" fill="white" />
+ </clipPath>
+ </defs>
+ </svg>
+ ),
+ },
+ {
+ title: 'Federated querying',
+ content:
+ 'Federated querying of data lakes such as Hive, Iceberg and Hudi, and databases such as MySQL and PostgreSQL.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM14.9999 13H28.9999C30.1045 13 30.9999 13.8954 30.9999 15V29C30.9999 30.1046 30.1045 31 28.9999 31H14.9999C13.8954 31 12.9999 30.1046 12.9999 29V15C12.9999 13.8954 13.8954 13 14.9999 13Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M16.9999 31V33C16.9999 34.1046 17.8954 35 18.9999 35H32.9999C34.1045 35 34.9999 34.1046 34.9999 33V19C34.9999 17.8954 34.1045 17 32.9999 17H30.9999V29C30.9999 30.1046 30.1045 31 28.9999 31H16.9999Z"
+ fill="#C0C3F1"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Semi-structured data',
+ content:
+ 'Compound data types such as Array, Map and JSON. Variant data type to support auto data type inference of JSON data. NGram bloomfilter and inverted index for text searches.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24ZM9.99994 15C9.99994 13.8954 10.8954 13 11.9999 13H35.9999C37.1045 13 37.9999 13.8954 37.9999 15V24H36.7852V19.4688H35.1562V24H34.7232L32.4551 19.4688H30.8203V24H29.5723V23.0723C29.5723 22.4551 29.498 21.916 29.3496 21.4551C29.2051 20.9902 28.9961 20.6035 28.7227 20.2949C28.4492 19.9824 28.125 19.748 27.75 19.5918C27.375 19.4316 26.959 19.3516 26.502 19.3516C26.0449 19.3516 25.6289 19.4316 25.2539 19.5918C24.8789 19.748 24.5547 19.9824 24.2812 20.2949C24.0078 20.6035 23.7988 20.9902 23.6543 21.4551C23.5098 21.916 23.4375 22.4551 23.4375 23.0723V24H21.7901C21.5951 23.7844 21.3552 23.5904 21.0703 23.418C20.7734 23.2344 20.4316 23.0664 20.0449 22.9141C19.8457 22.8359 19.6621 22.7559 19.4941 22.6738C19.3301 22.5918 19.1875 22.5078 19.0664 22.4219C18.9453 22.332 18.8496 22.2324 18.7793 22.123C18.7129 22.0098 18.6797 21.8828 18.6797 21.7422C18.6797 21.5547 18.7129 21.3867 18.7793 21.2383C18.8496 21.0859 18.9551 20.9668 19.0957 20.8809C19.2402 20.791 19.4219 20.7461 19.6406 20.7461C19.875 20.7461 20.0664 20.7988 20.2148 20.9043C20.3633 21.0098 20.4707 21.1562 20.5371 21.3438C20.6074 21.5273 20.6426 21.7402 20.6426 21.9824H22.3535C22.3535 21.4707 22.2422 21.0176 22.0195 20.623C21.8008 20.2285 21.4902 19.918 21.0879 19.6914C20.6895 19.4648 20.2168 19.3516 19.6699 19.3516C19.2676 19.3516 18.9023 19.4082 18.5742 19.5215C18.25 19.6348 17.9668 19.7969 17.7246 20.0078C17.4824 20.2148 17.2949 20.4648 17.1621 20.7578C17.0332 21.0508 16.9688 21.377 16.9688 21.7363C16.9688 22.1035 17.0371 22.4238 17.1738 22.6973C17.3145 22.9668 17.5039 23.2012 17.7422 23.4004C17.9805 23.5996 18.248 23.7754 18.5449 23.9277C18.5935 23.952 18.6424 23.9761 18.6915 24H15.7324V19.4688H14.0215V24H9.99994V15ZM27.8672 24H25.1426V23.0605C25.1426 22.6543 25.1699 22.3086 25.2246 22.0234C25.2832 21.7344 25.3691 21.498 25.4824 21.3145C25.5996 21.1309 25.7422 20.9961 25.9102 20.9102C26.082 20.8242 26.2793 20.7812 26.502 20.7812C26.7246 20.7812 26.9199 20.8242 27.0879 20.9102C27.2559 20.9961 27.3984 21.1309 27.5156 21.3145C27.6328 21.498 27.7207 21.7344 27.7793 22.0234C27.8379 22.3086 27.8672 22.6543 27.8672 23.0605V24ZM32.4492 24H33.1204L32.4492 22.6621V24Z"
+ fill="#444FD9"
+ />
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M20.6661 25.3384C20.6934 25.4634 20.7071 25.6021 20.7071 25.7544C20.7071 25.938 20.6778 26.1021 20.6192 26.2466C20.5606 26.3911 20.463 26.5063 20.3262 26.5923C20.1934 26.6782 20.0137 26.7212 19.7872 26.7212C19.588 26.7212 19.4102 26.6958 19.254 26.645C19.1016 26.5903 18.9727 26.5103 18.8672 26.4048C18.7618 26.2954 18.6837 26.1509 18.6329 25.9712C18.5821 25.7876 18.5567 25.5669 18.5567 25.3091H16.8399C16.8399 25.7935 16.9161 26.2134 17.0684 26.5688C17.2208 26.9204 17.4297 27.2114 17.6954 27.4419C17.9649 27.6685 18.2755 27.8384 18.627 27.9517C18.9786 28.061 19.3516 28.1157 19.7462 28.1157C20.1524 28.1157 20.5196 28.0591 20.8477 27.9458C21.1797 27.8325 21.463 27.6724 21.6973 27.4653C21.9317 27.2544 22.1094 27.0044 22.2305 26.7153C22.3555 26.4224 22.418 26.0981 22.418 25.7427C22.418 25.3833 22.3672 25.063 22.2657 24.7817C22.1641 24.5005 22.0137 24.2485 21.8145 24.0259C21.8065 24.0167 21.7983 24.0076 21.7901 23.9985H23.4376V24.4946C23.4376 25.0962 23.5118 25.6235 23.6602 26.0767C23.8087 26.5259 24.0176 26.9028 24.2872 27.2075C24.5606 27.5083 24.8848 27.7349 25.2598 27.8872C25.6387 28.0396 26.0567 28.1157 26.5137 28.1157C26.9708 28.1157 27.3868 28.0396 27.7618 27.8872C28.1407 27.7349 28.463 27.5083 28.7286 27.2075C28.9981 26.9028 29.2051 26.5259 29.3497 26.0767C29.4981 25.6235 29.5723 25.0962 29.5723 24.4946V23.9985H30.8204V27.9985H32.4493V23.9985H33.1204L35.127 27.9985H36.7852V23.9985H38V32.9985C38 34.1031 37.1046 34.9985 36 34.9985H12C10.8954 34.9985 10 34.1031 10 32.9985V23.9985H14.0215V25.3677C14.0215 25.6489 13.9922 25.8892 13.9337 26.0884C13.8751 26.2837 13.7891 26.4341 13.6758 26.5396C13.5665 26.645 13.4317 26.6978 13.2715 26.6978C13.1231 26.6978 12.9903 26.6587 12.8731 26.5806C12.7598 26.5024 12.6719 26.3755 12.6094 26.1997C12.5469 26.0239 12.5157 25.7837 12.5157 25.479H10.793C10.793 26.0806 10.9005 26.5767 11.1153 26.9673C11.3301 27.354 11.6231 27.6431 11.9942 27.8345C12.3692 28.022 12.795 28.1157 13.2715 28.1157C13.7364 28.1157 14.1544 28.0063 14.5255 27.7876C14.8965 27.5688 15.1895 27.2544 15.4044 26.8442C15.6231 26.4302 15.7325 25.9399 15.7325 25.3735V23.9985H18.6916C18.9425 24.1205 19.2003 24.2371 19.4649 24.3481C19.7305 24.4614 19.9454 24.5708 20.1094 24.6763C20.2774 24.7817 20.4044 24.8872 20.4903 24.9927C20.5801 25.0981 20.6387 25.2134 20.6661 25.3384ZM35.1563 23.9985H34.7232L35.1563 24.8638V23.9985ZM25.1426 23.9985H27.8672V24.4946C27.8672 24.8853 27.838 25.2192 27.7794 25.4966C27.7208 25.7739 27.6348 26.0005 27.5215 26.1763C27.4083 26.3521 27.2657 26.4829 27.0938 26.5688C26.9258 26.6509 26.7325 26.6919 26.5137 26.6919C26.2911 26.6919 26.0938 26.6509 25.9219 26.5688C25.754 26.4829 25.6114 26.3521 25.4942 26.1763C25.377 26.0005 25.2891 25.7739 25.2305 25.4966C25.1719 25.2192 25.1426 24.8853 25.1426 24.4946V23.9985Z"
+ fill="#DFE0F7"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Elastic architecture',
+ content:
+ 'Distributed design for linear scalability. Workload isolation and tiered storage for efficient resource management. Supports shared-nothing clusters as well as separation of storage and compute.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM12.8707 14.7307C14.6213 15.8848 18.5703 18 23.9999 18C29.4296 18 33.3786 15.8848 35.1292 14.7307C35.7319 14.3334 36.5033 14.3838 36.805 15.0396C37.3401 16.2026 37.9999 18.5408 37.9999 23C37.9999 27.4592 37.3401 29.7974 36.805 30.9604C36.5033 31.6162 35.7319 31.6666 35.1292 31.2693C33.3786 30.1152 29.4296 28 23.9999 28C18.5703 28 14.6213 30.1152 12.8707 31.2693C12.268 31.6666 11.4966 31.6162 11.1949 30.9604C10.6598 29.7974 9.99994 27.4592 9.99994 23C9.99994 18.5408 10.6598 16.2026 11.1949 15.0396C11.4966 14.3838 12.268 14.3334 12.8707 14.7307Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M12.8708 13.7308C14.6214 14.8849 18.5704 17.0001 24 17.0001C29.4296 17.0001 33.3786 14.8849 35.1292 13.7308C35.7319 13.3335 36.5033 13.384 36.8051 14.0397C37.3401 15.2027 38 17.5409 38 22.0001C38 26.4593 37.3401 28.7975 36.8051 29.9605C36.5033 30.6163 35.7319 30.6667 35.1292 30.2694C33.3786 29.1153 29.4296 27.0001 24 27.0001C18.5704 27.0001 14.6214 29.1153 12.8708 30.2694C12.2681 30.6667 11.4967 30.6163 11.1949 29.9605C10.6599 28.7975 10 26.4593 10 22.0001C10 17.5409 10.6599 15.2027 11.1949 14.0397C11.4967 13.384 12.2681 13.3335 12.8708 13.7308Z"
+ fill="white"
+ />
+ <path
+ d="M10.0007 22.25C10.0002 22.3327 10 22.416 10 22.5001C10 27.4153 11.2026 31.2568 12.0315 33.3208C12.3553 34.127 13.4296 34.2488 14.0796 33.6725C15.7504 32.1912 19.0572 30.0001 24 30.0001C28.9428 30.0001 32.2496 32.1912 33.9204 33.6725C34.5704 34.2488 35.6447 34.127 35.9685 33.3208C36.7974 31.2568 38 27.4153 38 22.5001C38 22.416 37.9998 22.3327 37.9993 22.25C37.9752 26.547 37.33 28.8194 36.8051 29.9605C36.5033 30.6163 35.7319 30.6667 35.1292 30.2694C33.3786 29.1153 29.4296 27.0001 24 27.0001C18.5704 27.0001 14.6214 29.1153 12.8708 30.2694C12.2681 30.6667 11.4967 30.6163 11.1949 29.9605C10.67 28.8194 10.0248 26.547 10.0007 22.25Z"
+ fill="#C0C3F1"
+ />
+ </svg>
+ ),
+ },
+ {
+ title: 'Open ecosystem',
+ content:
+ 'Compatible with MySQL protocol and ANSI SQL, easily integrated with BI tools. Provide open data API to be accessible for external compute engines like Spark, Flink and ML/AI.',
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24ZM24.2579 24.9953C24.1724 24.9984 24.0864 25 24.0001 25C20.1341 25 17.0001 21.866 17.0001 18C17.0001 14.134 20.1341 11 24.0001 11C27.8661 11 31.0001 14.134 31.0001 18C31.0001 19.4893 30.535 20.8699 29.7421 22.0047C29.8277 22.0016 29.9137 22 30 22C33.866 22 37 25.134 37 29C37 32.866 33.866 36 30 36C26.134 36 23 32.866 23 29C23 27.5107 23.4651 26.1301 24.2579 24.9953Z"
+ fill="#444FD9"
+ />
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M24 25.3924C23.3652 26.446 23 27.6803 23 29C23 30.3197 23.3652 31.554 24 32.6076C22.7751 34.6404 20.5463 36 18 36C14.134 36 11 32.866 11 29C11 25.134 14.134 22 18 22C20.5463 22 22.7751 23.3596 24 25.3924Z"
+ fill="#C0C3F1"
+ />
+ </svg>
+ ),
+ },
+];
diff --git a/src/constant/download-archive.data.ts b/src/constant/download-archive.data.ts
new file mode 100644
index 0000000..78f1e2a
--- /dev/null
+++ b/src/constant/download-archive.data.ts
@@ -0,0 +1,700 @@
+interface item {
+ label: string;
+ links: {
+ source: string;
+ signature: string;
+ sha512: string;
+ };
+}
+export interface DownloadLinkProps {
+ id: string;
+ sh?: item;
+ items: item[];
+}
+
+const APACHE_LINK = 'https://www.apache.org/dyn/mirrors/mirrors.cgi?action=download&filename=';
+const APACHE_DOWNLOAD_LINK = 'https://downloads.apache.org/';
+const CHINA_MIRROR_LINK = 'https://mirrors.tuna.tsinghua.edu.cn/apache/';
+
+const FLINK_CONNECTOR_LINK = 'https://dist.apache.org/repos/dist/release/';
+const CHINA_FLINK_CONNECTOR_MIRROR_LINK = CHINA_MIRROR_LINK;
+
+const SPARK_CONNECTOR_LINK = 'https://dist.apache.org/repos/dist/release/';
+const CHINA_SPARK_CONNECTOR_MIRROR_LINK = CHINA_MIRROR_LINK;
+
+const ALL_RELEASE_LINK = 'https://archive.apache.org/dist/';
+// There is no mirror site for archieve in China, so use same link.
+const CHINA_ALL_RELEASE_MIRROR_LINK = 'https://archive.apache.org/dist/';
+
+const ORIGIN = 'https://apache-doris-releases.oss-accelerate.aliyuncs.com/';
+
+const APACHE_ARCHIVE = 'https://archive.apache.org/dist/';
+
+export function getAllDownloadLinks(locale: string) {
+ const sources = locale.toLocaleUpperCase() === 'EN' ? APACHE_LINK : CHINA_MIRROR_LINK;
+ const shSource = locale.toLocaleUpperCase() === 'EN' ? 'apache' : 'tsinghua';
+ return [
+ {
+ id: '2.0.3-intel-avx2-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.3-bin-x64.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.3-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.3-intel-noavx2-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.3-bin-x64-noavx2.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.3-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.3-arm-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.3-bin-arm64.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.3-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.2-intel-avx2-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.2-bin-x64.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.2-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.2-intel-noavx2-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.2-bin-x64-noavx2.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.2-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.2-arm-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.2-bin-arm64.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.2-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.1.1-intel-avx2-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.1.1-bin-x64.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.1.1-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.1.1-intel-noavx2-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.1.1-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '2.0.1.1-arm-jdk8',
+ sh: {
+ label: 'apache-doris-2.0.1.1-bin-arm64.tar.gz',
+ links: {
+ source: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
+ signature: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-2.0.1.1-src.tar.gz',
+ links: {
+ source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
+ signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
+ sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '1.2.7.1-intel-avx2-jdk8',
+ sh: {
+ label: 'apache-doris-1.2.7.1-bin-x64.tar.xz',
+ links: {
+ source: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
+ signature: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-1.2.7.1-src.tar.gz',
+ links: {
+ source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '1.2.7.1-intel-noavx2-jdk8',
+ sh: {
+ label: 'apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz',
+ links: {
+ source: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
+ signature: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-1.2.7.1-src.tar.gz',
+ links: {
+ source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '1.2.7.1-arm-jdk8',
+ sh: {
+ label: 'apache-doris-1.2.7.1-bin-arm64.tar.xz',
+ links: {
+ source: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
+ signature: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.sha512`,
+ },
+ },
+ items: [
+ {
+ label: 'apache-doris-1.2.7.1-src.tar.gz',
+ links: {
+ source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '1.1.5-intel-avx2-jdk8',
+ items: [
+ {
+ label: 'apache-doris-fe-1.1.5-bin.tar.gz',
+ links: {
+ source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
+ },
+ },
+ {
+ label: 'apache-doris-be-1.1.5-bin-x86_64.tar.gz',
+ links: {
+ source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '1.1.5-intel-noavx2-jdk8',
+ items: [
+ {
+ label: 'apache-doris-fe-1.1.5-bin.tar.gz',
+ links: {
+ source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
+ },
+ },
+ {
+ label: 'apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz',
+ links: {
+ source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ {
+ id: '1.1.5-arm-jdk8',
+ items: [
+ {
+ label: 'apache-doris-fe-1.1.5-bin.tar.gz',
+ links: {
+ source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
+ },
+ },
+ {
+ label: 'apache-doris-1.1.5-bin-arm.tar.gz ',
+ links: {
+ source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz`,
+ signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz.asc`,
+ sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz.sha512`,
+ },
+ },
+ ],
+ },
+ ];
+}
+
+export function getAllFlinkConnectorDownloadLinks(locale: string) {
+ const sources = locale.toLocaleUpperCase() === 'EN' ? FLINK_CONNECTOR_LINK : CHINA_FLINK_CONNECTOR_MIRROR_LINK;
+ return [
+ {
+ version: '1.4.0',
+ date: '2023-06-16',
+ flink: '1.17',
+ scala: '2.12, 2.11',
+ doris: '1.0+',
+ download: `${sources}doris/flink-connector/1.4.0/`,
+ github: 'https://github.com/apache/doris-flink-connector',
+ },
+ {
+ version: '1.3.0',
+ date: '2022-12-07',
+ flink: '1.16',
+ scala: '2.12, 2.11',
+ doris: '1.0+',
+ download: `${sources}doris/flink-connector/1.3.0/`,
+ github: 'https://github.com/apache/doris-flink-connector',
+ },
+ {
+ version: '1.2.1',
+ date: '2022-12-07',
+ flink: '1.15',
+ scala: '2.12, 2.11',
+ doris: '1.0+',
+ download: `${sources}doris/flink-connector/1.2.1/`,
+ github: 'https://github.com/apache/doris-flink-connector',
+ },
+ {
+ version: '1.1.1',
+ date: '2021-12-07',
+ flink: '1.14',
+ scala: '2.12, 2.11',
+ doris: '1.0+',
+ download: `${sources}doris/flink-connector/1.1.1/`,
+ github: 'https://github.com/apache/doris-flink-connector',
+ },
+ {
+ version: '1.2.0',
+ date: '2022-08-15',
+ flink: '1.15',
+ scala: '2.12, 2.11',
+ doris: '1.0+',
+ download: `${sources}doris/flink-connector/1.2.0/`,
+ github: 'https://github.com/apache/doris-flink-connector',
+ },
+ {
+ version: '1.1.0',
+ date: '2022-07-11',
+ flink: '1.14',
+ scala: '2.12, 2.11',
+ doris: '0.15+',
+ download: `${sources}doris/flink-connector/1.1.0/`,
+ github: 'https://github.com/apache/doris-flink-connector',
+ },
+ {
+ version: '1.0.3',
+ date: '2021-03-18',
+ flink: '1.14, 1.13, 1.12, 1.11',
+ scala: '2.12, 2.11',
+ doris: '0.15+',
+ download: `${sources}doris/flink-connector/1.0.3/`,
+ github: 'https://github.com/apache/doris-flink-connector',
+ },
+ ];
+}
+export function getAllSparkConnectorDownloadLinks(locale: string) {
+ const sources = locale.toLocaleUpperCase() === 'EN' ? SPARK_CONNECTOR_LINK : CHINA_SPARK_CONNECTOR_MIRROR_LINK;
+ return [
+ {
+ version: '1.1.0',
+ date: '2022-07-11',
+ spark: '3.2, 3.1, 2.3',
+ scala: '2.12, 2.11',
+ doris: '0.15+',
+ download: `${sources}doris/spark-connector/1.1.0/`,
+ github: 'https://github.com/apache/doris-spark-connector',
+ },
+ {
+ version: '1.0.1',
+ date: '2021-03-18',
+ spark: '3.1, 2.3',
+ scala: '2.12, 2.11',
+ doris: '0.15+',
+ download: `${sources}doris/spark-connector/1.0.1/`,
+ github: 'https://github.com/apache/doris-spark-connector',
+ },
+ ];
+}
+
+export function getAllRelease(locale: string) {
+ const sources = locale.toLocaleUpperCase() === 'EN' ? ALL_RELEASE_LINK : CHINA_ALL_RELEASE_MIRROR_LINK;
+ return [
+ {
+ version: '2.0.3 ( Latest )',
+ date: '2023-12-14',
+ note: '/docs/releasenotes/release-2.0.3/',
+ download: [
+ {
+ cpu: 'X64 ( avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
+ },
+ {
+ cpu: 'X64 ( no avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
+ },
+ {
+ cpu: 'ARM64',
+ binary: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
+ }
+ ]
+ },
+ {
+ version: '2.0.2',
+ date: '2023-10-07',
+ note: '/docs/dev/releasenotes/release-2.0.2',
+ download: [
+ {
+ cpu: 'X64 ( avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
+ },
+ {
+ cpu: 'X64 ( no avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
+ },
+ {
+ cpu: 'ARM64',
+ binary: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
+ }
+ ]
+ },
+ {
+ version: '2.0.1',
+ date: '2023-09-26',
+ note: '/docs/dev/releasenotes/release-2.0.1',
+ download: [
+ {
+ cpu: 'X64 ( avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
+ },
+ {
+ cpu: 'X64 ( no avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
+ },
+ {
+ cpu: 'ARM64',
+ binary: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
+ }
+ ]
+ },
+ {
+ version: '2.0.0',
+ date: '2023-08-11',
+ note: '/docs/dev/releasenotes/release-2.0.1',
+ download: [
+ {
+ cpu: 'X64 ( avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.1/apache-doris-2.0.0-src.tar.gz`,
+ },
+ {
+ cpu: 'X64 ( no avx2 )',
+ binary: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.0/apache-doris-2.0.0-src.tar.gz`,
+ },
+ {
+ cpu: 'ARM64',
+ binary: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz`,
+ source: `https://downloads.apache.org/doris/2.0/2.0.0/apache-doris-2.0.0-src.tar.gz`,
+ }
+ ]
+ },
+ {
+ version: '1.2.7.1',
+ date: '2023-09-04',
+ note: '/docs/dev/releasenotes/release-1.2.7.1',
+ download: [
+ {
+ cpu: 'X64 ( avx2 )',
+ binary: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
+ source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
+ },
+ {
+ cpu: 'X64 ( no avx2 )',
+ binary: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
+ source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
+ },
+ {
+ cpu: 'ARM64',
+ binary: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
+ source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
+ }
+ ]
+ },
+ {
+ version: '1.2.6',
+ date: '2023-07-17',
+ note: '/docs/dev/releasenotes/release-1.2.6',
+ download: [
+ {
+ cpu: 'X64 ( avx2 )',
+ binary: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz`,
+ source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
+ },
+ {
+ cpu: 'X64 ( no avx2 )',
+ binary: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz`,
+ source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
+ },
+ {
+ cpu: 'ARM64',
+ binary: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz`,
+ source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
+ }
+ ]
+ },
+ {
+ version: '1.2.4',
+ date: '2023-04-27',
+ note: '/docs/dev/releasenotes/release-1.2.4',
+ download: [
+ {
+ cpu: 'X64 ( avx2 )',
+ binary: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64.tar.xz`,
+ source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
+ },
+ {
+ cpu: 'X64 ( no avx2 )',
+ binary: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64-noavx2.tar.xz`,
+ source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
+ },
+ {
+ cpu: 'ARM64',
+ binary: `${ORIGIN}apache-doris-1.2.4.1-bin-aarch64.tar.xz`,
+ source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
+ }
+ ]
+ },
+ {
+ version: '1.2.3',
+ date: '2023-03-20',
+ note: '/docs/dev/releasenotes/release-1.2.3',
+ download: `${sources}doris/1.2/1.2.3-rc02/`,
+ },
+ {
+ version: '1.2.2 ',
+ date: '2023-02-14',
+ note: '/docs/dev/releasenotes/release-1.2.2',
+ download: `${sources}doris/1.2/1.2.2-rc01/`,
+ },
+ {
+ version: '1.2.1',
+ date: '2023-01-04',
+ note: '/docs/dev/releasenotes/release-1.2.1',
+ download: `${sources}doris/1.2/1.2.1-rc01/`,
+ },
+ {
+ version: '1.1.5',
+ date: '2022-12-20',
+ note: '/docs/dev/releasenotes/release-1.1.5',
+ download: `${sources}doris/1.1/1.1.5-rc02/`,
+ },
+ {
+ version: '1.1.4',
+ date: '2022-11-11',
+ note: '/docs/dev/releasenotes/release-1.1.4',
+ download: `${sources}doris/1.1/1.1.4-rc01/`,
+ },
+ {
+ version: '1.1.3',
+ date: '2022-10-17',
+ note: '/docs/dev/releasenotes/release-1.1.3',
+ download: `${sources}doris/1.1/1.1.3-rc02/`,
+ },
+ {
+ version: '1.1.2',
+ date: '2022-09-13',
+ note: '/docs/dev/releasenotes/release-1.1.2',
+ download: `${sources}doris/1.1/1.1.2-rc05/`,
+ },
+ {
+ version: '1.1.1',
+ date: '2022-07-29',
+ note: '/docs/dev/releasenotes/release-1.1.1',
+ download: `${sources}doris/1.1/1.1.1/`,
+ },
+ {
+ version: '1.1.0',
+ date: '2022-07-14',
+ note: '/docs/dev/releasenotes/release-1.1.0',
+ download: `${sources}doris/1.1/1.1.0-rc05/`,
+ },
+ {
+ version: '0.15.0',
+ date: '2021-11-29',
+ note: 'https://github.com/apache/doris/issues/6806',
+ download: `${sources}doris/0.15.0-incubating/`,
+ },
+ {
+ version: '0.14.0',
+ date: '2021-05-26',
+ note: 'https://github.com/apache/doris/issues/5374',
+ download: `${sources}doris/0.14.0-incubating/`,
+ },
+ {
+ version: '0.13.0',
+ date: '2020-10-24',
+ note: 'https://github.com/apache/doris/issues/4370',
+ download: `${sources}doris/0.13.0-incubating/`,
+ },
+ ];
+}
+
+export enum VersionEnum {
+ Latest = '2.0.3',
+ Prev = '1.2.7.1',
+ Earlier = '1.1.5',
+}
+
+export enum CPUEnum {
+ IntelAvx2 = 'intel-avx2',
+ IntelNoAvx2 = 'intel-noavx2',
+ ARM = 'arm',
+}
+
+export enum CPUDownloadEnum {
+ IntelAvx2 = 'x86_64',
+ IntelNoAvx2 = 'x86_64-noavx2',
+ ARM = 'arm',
+}
+
+export enum JDKEnum {
+ JDK8 = 'jdk8',
+ JDK11 = 'jdk11',
+}
diff --git a/src/constant/download.data.ts b/src/constant/download.data.ts
index 78f1e2a..2948bc8 100644
--- a/src/constant/download.data.ts
+++ b/src/constant/download.data.ts
@@ -1,700 +1,374 @@
-interface item {
+export interface Option {
label: string;
- links: {
- source: string;
- signature: string;
- sha512: string;
- };
-}
-export interface DownloadLinkProps {
- id: string;
- sh?: item;
- items: item[];
-}
-
-const APACHE_LINK = 'https://www.apache.org/dyn/mirrors/mirrors.cgi?action=download&filename=';
-const APACHE_DOWNLOAD_LINK = 'https://downloads.apache.org/';
-const CHINA_MIRROR_LINK = 'https://mirrors.tuna.tsinghua.edu.cn/apache/';
-
-const FLINK_CONNECTOR_LINK = 'https://dist.apache.org/repos/dist/release/';
-const CHINA_FLINK_CONNECTOR_MIRROR_LINK = CHINA_MIRROR_LINK;
-
-const SPARK_CONNECTOR_LINK = 'https://dist.apache.org/repos/dist/release/';
-const CHINA_SPARK_CONNECTOR_MIRROR_LINK = CHINA_MIRROR_LINK;
-
-const ALL_RELEASE_LINK = 'https://archive.apache.org/dist/';
-// There is no mirror site for archieve in China, so use same link.
-const CHINA_ALL_RELEASE_MIRROR_LINK = 'https://archive.apache.org/dist/';
-
-const ORIGIN = 'https://apache-doris-releases.oss-accelerate.aliyuncs.com/';
-
-const APACHE_ARCHIVE = 'https://archive.apache.org/dist/';
-
-export function getAllDownloadLinks(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? APACHE_LINK : CHINA_MIRROR_LINK;
- const shSource = locale.toLocaleUpperCase() === 'EN' ? 'apache' : 'tsinghua';
- return [
- {
- id: '2.0.3-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.3-bin-x64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.3-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.3-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.3-bin-x64-noavx2.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.3-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.3-arm-jdk8',
- sh: {
- label: 'apache-doris-2.0.3-bin-arm64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.3-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.2-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.2-bin-x64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.2-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.2-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.2-bin-x64-noavx2.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.2-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.2-arm-jdk8',
- sh: {
- label: 'apache-doris-2.0.2-bin-arm64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.2-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.1.1-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.1.1-bin-x64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.1.1-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.1.1-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.1.1-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '2.0.1.1-arm-jdk8',
- sh: {
- label: 'apache-doris-2.0.1.1-bin-arm64.tar.gz',
- links: {
- source: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
- signature: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.asc`,
- sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-2.0.1.1-src.tar.gz',
- links: {
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- signature: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.asc`,
- sha512: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.2.7.1-intel-avx2-jdk8',
- sh: {
- label: 'apache-doris-1.2.7.1-bin-x64.tar.xz',
- links: {
- source: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
- signature: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.asc`,
- sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-1.2.7.1-src.tar.gz',
- links: {
- source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.2.7.1-intel-noavx2-jdk8',
- sh: {
- label: 'apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz',
- links: {
- source: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
- signature: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.asc`,
- sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-1.2.7.1-src.tar.gz',
- links: {
- source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.2.7.1-arm-jdk8',
- sh: {
- label: 'apache-doris-1.2.7.1-bin-arm64.tar.xz',
- links: {
- source: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
- signature: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.asc`,
- sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.sha512`,
- },
- },
- items: [
- {
- label: 'apache-doris-1.2.7.1-src.tar.gz',
- links: {
- source: `${APACHE_ARCHIVE}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.1.5-intel-avx2-jdk8',
- items: [
- {
- label: 'apache-doris-fe-1.1.5-bin.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
- },
- },
- {
- label: 'apache-doris-be-1.1.5-bin-x86_64.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.1.5-intel-noavx2-jdk8',
- items: [
- {
- label: 'apache-doris-fe-1.1.5-bin.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
- },
- },
- {
- label: 'apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-x86_64-noavx2.tar.gz.sha512`,
- },
- },
- ],
- },
- {
- id: '1.1.5-arm-jdk8',
- items: [
- {
- label: 'apache-doris-fe-1.1.5-bin.tar.gz',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-fe-1.1.5-bin.tar.gz.sha512`,
- },
- },
- {
- label: 'apache-doris-1.1.5-bin-arm.tar.gz ',
- links: {
- source: `${sources}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz`,
- signature: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz.asc`,
- sha512: `${APACHE_DOWNLOAD_LINK}doris/1.1/1.1.5-rc02/apache-doris-be-1.1.5-bin-arm.tar.gz.sha512`,
- },
- },
- ],
- },
- ];
-}
-
-export function getAllFlinkConnectorDownloadLinks(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? FLINK_CONNECTOR_LINK : CHINA_FLINK_CONNECTOR_MIRROR_LINK;
- return [
- {
- version: '1.4.0',
- date: '2023-06-16',
- flink: '1.17',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.4.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.3.0',
- date: '2022-12-07',
- flink: '1.16',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.3.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.2.1',
- date: '2022-12-07',
- flink: '1.15',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.2.1/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.1.1',
- date: '2021-12-07',
- flink: '1.14',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.1.1/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.2.0',
- date: '2022-08-15',
- flink: '1.15',
- scala: '2.12, 2.11',
- doris: '1.0+',
- download: `${sources}doris/flink-connector/1.2.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.1.0',
- date: '2022-07-11',
- flink: '1.14',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/flink-connector/1.1.0/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- {
- version: '1.0.3',
- date: '2021-03-18',
- flink: '1.14, 1.13, 1.12, 1.11',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/flink-connector/1.0.3/`,
- github: 'https://github.com/apache/doris-flink-connector',
- },
- ];
-}
-export function getAllSparkConnectorDownloadLinks(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? SPARK_CONNECTOR_LINK : CHINA_SPARK_CONNECTOR_MIRROR_LINK;
- return [
- {
- version: '1.1.0',
- date: '2022-07-11',
- spark: '3.2, 3.1, 2.3',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/spark-connector/1.1.0/`,
- github: 'https://github.com/apache/doris-spark-connector',
- },
- {
- version: '1.0.1',
- date: '2021-03-18',
- spark: '3.1, 2.3',
- scala: '2.12, 2.11',
- doris: '0.15+',
- download: `${sources}doris/spark-connector/1.0.1/`,
- github: 'https://github.com/apache/doris-spark-connector',
- },
- ];
-}
-
-export function getAllRelease(locale: string) {
- const sources = locale.toLocaleUpperCase() === 'EN' ? ALL_RELEASE_LINK : CHINA_ALL_RELEASE_MIRROR_LINK;
- return [
- {
- version: '2.0.3 ( Latest )',
- date: '2023-12-14',
- note: '/docs/releasenotes/release-2.0.3/',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.3/apache-doris-2.0.3-src.tar.gz`,
- }
- ]
- },
- {
- version: '2.0.2',
- date: '2023-10-07',
- note: '/docs/dev/releasenotes/release-2.0.2',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.2-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.2-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.2-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.2/apache-doris-2.0.2-src.tar.gz`,
- }
- ]
- },
- {
- version: '2.0.1',
- date: '2023-09-26',
- note: '/docs/dev/releasenotes/release-2.0.1',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1.1/apache-doris-2.0.1.1-src.tar.gz`,
- }
- ]
- },
- {
- version: '2.0.0',
- date: '2023-08-11',
- note: '/docs/dev/releasenotes/release-2.0.1',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.1/apache-doris-2.0.0-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.0/apache-doris-2.0.0-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz`,
- source: `https://downloads.apache.org/doris/2.0/2.0.0/apache-doris-2.0.0-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.7.1',
- date: '2023-09-04',
- note: '/docs/dev/releasenotes/release-1.2.7.1',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.7.1/apache-doris-1.2.7.1-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.6',
- date: '2023-07-17',
- note: '/docs/dev/releasenotes/release-1.2.6',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz`,
- source: `https://downloads.apache.org/doris/1.2/1.2.6-rc03/apache-doris-1.2.6-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.4',
- date: '2023-04-27',
- note: '/docs/dev/releasenotes/release-1.2.4',
- download: [
- {
- cpu: 'X64 ( avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64.tar.xz`,
- source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
- },
- {
- cpu: 'X64 ( no avx2 )',
- binary: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64-noavx2.tar.xz`,
- source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
- },
- {
- cpu: 'ARM64',
- binary: `${ORIGIN}apache-doris-1.2.4.1-bin-aarch64.tar.xz`,
- source: `${sources}doris/1.2/1.2.4.1-rc01/apache-doris-1.2.4.1-src.tar.gz`,
- }
- ]
- },
- {
- version: '1.2.3',
- date: '2023-03-20',
- note: '/docs/dev/releasenotes/release-1.2.3',
- download: `${sources}doris/1.2/1.2.3-rc02/`,
- },
- {
- version: '1.2.2 ',
- date: '2023-02-14',
- note: '/docs/dev/releasenotes/release-1.2.2',
- download: `${sources}doris/1.2/1.2.2-rc01/`,
- },
- {
- version: '1.2.1',
- date: '2023-01-04',
- note: '/docs/dev/releasenotes/release-1.2.1',
- download: `${sources}doris/1.2/1.2.1-rc01/`,
- },
- {
- version: '1.1.5',
- date: '2022-12-20',
- note: '/docs/dev/releasenotes/release-1.1.5',
- download: `${sources}doris/1.1/1.1.5-rc02/`,
- },
- {
- version: '1.1.4',
- date: '2022-11-11',
- note: '/docs/dev/releasenotes/release-1.1.4',
- download: `${sources}doris/1.1/1.1.4-rc01/`,
- },
- {
- version: '1.1.3',
- date: '2022-10-17',
- note: '/docs/dev/releasenotes/release-1.1.3',
- download: `${sources}doris/1.1/1.1.3-rc02/`,
- },
- {
- version: '1.1.2',
- date: '2022-09-13',
- note: '/docs/dev/releasenotes/release-1.1.2',
- download: `${sources}doris/1.1/1.1.2-rc05/`,
- },
- {
- version: '1.1.1',
- date: '2022-07-29',
- note: '/docs/dev/releasenotes/release-1.1.1',
- download: `${sources}doris/1.1/1.1.1/`,
- },
- {
- version: '1.1.0',
- date: '2022-07-14',
- note: '/docs/dev/releasenotes/release-1.1.0',
- download: `${sources}doris/1.1/1.1.0-rc05/`,
- },
- {
- version: '0.15.0',
- date: '2021-11-29',
- note: 'https://github.com/apache/doris/issues/6806',
- download: `${sources}doris/0.15.0-incubating/`,
- },
- {
- version: '0.14.0',
- date: '2021-05-26',
- note: 'https://github.com/apache/doris/issues/5374',
- download: `${sources}doris/0.14.0-incubating/`,
- },
- {
- version: '0.13.0',
- date: '2020-10-24',
- note: 'https://github.com/apache/doris/issues/4370',
- download: `${sources}doris/0.13.0-incubating/`,
- },
- ];
-}
-
-export enum VersionEnum {
- Latest = '2.0.3',
- Prev = '1.2.7.1',
- Earlier = '1.1.5',
+ value: string;
+ gz?: string;
+ asc?: string;
+ sha512?: string;
+ source?: string;
+ children?: Option[];
+ majorVersion?: string;
}
export enum CPUEnum {
- IntelAvx2 = 'intel-avx2',
- IntelNoAvx2 = 'intel-noavx2',
- ARM = 'arm',
+ X64 = 'x64 (avx2)',
+ X64NoAvx2 = 'x64 (no avx2)',
+ ARM64 = 'arm64',
}
-export enum CPUDownloadEnum {
- IntelAvx2 = 'x86_64',
- IntelNoAvx2 = 'x86_64-noavx2',
- ARM = 'arm',
+export enum SuffixEnum {
+ GZ = '.tar.gz',
+ ASC = '.tar.gz.asc',
+ SHA512 = '.tar.gz.sha512',
}
-export enum JDKEnum {
- JDK8 = 'jdk8',
- JDK11 = 'jdk11',
-}
+const ORIGIN = 'https://apache-doris-releases.oss-accelerate.aliyuncs.com/';
+
+export const DORIS_VERSIONS: Option[] = [
+ {
+ label: '2.0.3',
+ value: '2.0.3',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.3/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.3/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.3-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.3/',
+ },
+ ],
+ },
+ {
+ label: '2.0.2',
+ value: '2.0.2',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.2.1-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.2.1-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2.1-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.2.1/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.2.1-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.2.1-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2.1-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.2.1/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.2.1-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.2.1-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.2.1-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.2.1/',
+ },
+ ],
+ },
+ {
+ label: '2.0.1',
+ value: '2.0.1',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.1.1/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.1.1/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.1.1-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.1.1/',
+ },
+ ],
+ },
+ {
+ label: '2.0.0',
+ value: '2.0.0',
+ majorVersion: '2.0',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.0-bin-x64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.0/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.0-bin-x64-noavx2.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.0/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz`,
+ asc: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz.asc`,
+ sha512: `${ORIGIN}apache-doris-2.0.0-bin-arm64.tar.gz.sha512`,
+ source: 'https://downloads.apache.org/doris/2.0/2.0.0/',
+ },
+ ],
+ },
+ {
+ label: '1.2.7',
+ value: '1.2.7',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.7.1/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-x64-noavx2.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.7.1/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.7.1-bin-arm64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.7.1/',
+ },
+ ],
+ },
+ {
+ label: '1.2.6',
+ value: '1.2.6',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.6-bin-x64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.6-rc03/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.6-bin-x64-noavx2.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.6-rc03/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.6-bin-arm64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.6-rc03/',
+ },
+ ],
+ },
+ {
+ label: '1.2.5',
+ value: '1.2.5',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-x86_64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.5-bin-x86_64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.5-bin-x86_64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.5-rc01/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.5-rc01/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz`,
+ asc: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz.asc`,
+ sha512: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz.sha512`,
+ source: 'https://downloads.apache.org/doris/1.2/1.2.5-rc01/',
+ },
+ ],
+ },
+ {
+ label: '1.2.4',
+ value: '1.2.4',
+ majorVersion: '1.2',
+ children: [
+ {
+ label: CPUEnum.X64,
+ value: CPUEnum.X64,
+ gz: `${ORIGIN}apache-doris-1.2.4.1-bin-x86_64.tar.xz`,
+ asc: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ sha512: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ source: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ },
+ {
+ label: CPUEnum.X64NoAvx2,
+ value: CPUEnum.X64NoAvx2,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-x86_64-noavx2.tar.xz`,
+ asc: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ sha512: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ source: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ },
+ {
+ label: CPUEnum.ARM64,
+ value: CPUEnum.ARM64,
+ gz: `${ORIGIN}apache-doris-1.2.5-bin-aarch64.tar.xz`,
+ asc: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ sha512: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ source: 'https://downloads.apache.org/doris/1.2/1.2.4.1-rc01/',
+ },
+ ],
+ },
+];
+
+export const OLD_VERSIONS: Option[] = [
+ {
+ label: '1.2',
+ value: '1.2',
+ children: [
+ {
+ label: '1.2.3',
+ value: '1.2.3',
+ source: 'https://archive.apache.org/dist/doris/1.2/1.2.3-rc02/',
+ },
+ {
+ label: '1.2.2',
+ value: '1.2.2',
+ source: 'https://archive.apache.org/dist/doris/1.2/1.2.2-rc01/',
+ },
+ {
+ label: '1.2.1',
+ value: '1.2.1',
+ source: 'https://archive.apache.org/dist/doris/1.2/1.2.1-rc01/',
+ },
+ ],
+ },
+ {
+ label: '1.1',
+ value: '1.1',
+ children: [
+ {
+ label: '1.1.5',
+ value: '1.1.5',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.5-rc02/',
+ },
+ {
+ label: '1.1.4',
+ value: '1.1.4',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.4-rc01/',
+ },
+ {
+ label: '1.1.3',
+ value: '1.1.3',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.3-rc02/',
+ },
+ {
+ label: '1.1.2',
+ value: '1.1.2',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.2-rc05/',
+ },
+ {
+ label: '1.1.1',
+ value: '1.1.1',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.1-rc03/',
+ },
+ {
+ label: '1.1.0',
+ value: '1.1.0',
+ source: 'https://archive.apache.org/dist/doris/1.1/1.1.0-rc05/',
+ },
+ ],
+ },
+ {
+ label: '0.x',
+ value: '0.x',
+ children: [
+ {
+ label: '0.15.0',
+ value: '0.15.0',
+ source: 'https://archive.apache.org/dist/doris/0.15.0-incubating/',
+ },
+ {
+ label: '0.14.0',
+ value: '0.14.0',
+ source: 'https://archive.apache.org/dist/doris/0.14.0-incubating/',
+ },
+ {
+ label: '0.13.0',
+ value: '0.13.0',
+ source: 'https://archive.apache.org/dist/doris/0.13.0-incubating/',
+ },
+ ],
+ },
+];
+
+export const RUN_ANYWHERE = [
+ {
+ title: 'Doris on bare metal',
+ description: 'A platform for visualized cluster deployment on bare metal or VM.',
+ link: 'https://doris.apache.org/docs/install/standard-deployment',
+ },
+ {
+ title: 'Doris on K8s',
+ description: 'Create, configure and manage Doris clusters on Kubernetes',
+ link: 'https://doris.apache.org/docs/install/k8s-deploy',
+ },
+ {
+ title: 'Doris on AWS',
+ description: 'Deploy Doris on AWS with CloudFormation templates',
+ link: 'https://doris-cf-template.s3.amazonaws.com/cloudformation_doris.template.yaml',
+ },
+];
diff --git a/src/constant/generate-user.mjs b/src/constant/generate-user.mjs
new file mode 100644
index 0000000..6e35e7e
--- /dev/null
+++ b/src/constant/generate-user.mjs
@@ -0,0 +1,20 @@
+import USERS_JSON from './users.json' assert { type: "json" };
+
+import fs from 'fs';
+function generateUser() {
+ const USERS = USERS_JSON.map((user, index) => {
+ const newUser = {};
+ newUser.story = user['公司介绍'];
+ newUser.name = user['英文名字'].trim();
+ newUser.category = user['行业分类'];
+ newUser.category = user['行业分类'];
+ newUser.logo = user['英文名字'].trim();
+ newUser.order = index;
+ newUser.to = user['博客链接'];
+ newUser.image = `/images/user-logo/${newUser.category}/${newUser.name}.jpg`;
+ return newUser;
+ });
+ fs.writeFileSync('./src/constant/users.data.json', JSON.stringify(USERS))
+}
+
+generateUser();
\ No newline at end of file
diff --git a/src/constant/newsletter.data.ts b/src/constant/newsletter.data.ts
index 2c4642c..a3109a7 100644
--- a/src/constant/newsletter.data.ts
+++ b/src/constant/newsletter.data.ts
@@ -1,18 +1,32 @@
export const NEWSLETTER_DATA = [
{
- tag: 'Best Practice',
- title: 'Empowering cyber security by enabling 7 times faster log analysis',
- to: 'blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis',
- },
- {
- tag: 'Release Notes',
- title: 'Apache Doris 2.0.3 just released ',
- to: 'https://doris.apache.org/blog/release-note-2.0.3',
- hot: true,
+ tags: ['Top News'],
+ title: 'Apache Doris Summit Asia 2023: what can you expect from Apache Doris as a data warehouse?',
+ content:
+ 'When it is cranberry and pumpkin season, we had the unforgettable Apache Doris Summit Asia 2023 with our remarkable committers, users, and community partners, to honor what we have achieved in the past year, and provide a preview of where we are going next.',
+ to: '/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse',
+ image: 'newsletter-1.png',
},
{
- tag: 'Top News',
- title: `Apache Doris Summit Asia 2023: What can you expect from Apache Doris as a data warehouse?`,
- to: '/blog/apache-doris-summit-asia-2023-what-can-you-expect-from-apache-doris-as-a-data-warehouse',
+ tags: ['Tech Sharing'],
+ title: 'Introduction to Apache Doris: a next-generation real-time data warehouse',
+ content:
+ 'This is a technical overview of Apache Doris, introducing how it enables fast query performance with its architectural design, features, and mechanisms.',
+ to: '/blog/introduction-to-apache-doris-a-next-generation-real-time-data-warehouse',
+ image: 'newsletter-2.png',
+ },
+ {
+ tags: ['Tech Sharing'],
+ title: 'Log analysis: Elasticsearch vs Apache Doris',
+ content: `As a major part of a company's data asset, logs brings values to businesses in three aspects: system observability, cyber security, and data analysis. They are your first resort for troubleshooting, your reference for improving system security, and your data mine where you can extract information that points to business growth.`,
+ to: '/blog/log-analysis-elasticsearch-vs-apache-doris',
+ image: 'newsletter-3.png',
+ },
+ {
+ tags: ['Best Practice'],
+ title: 'LLM-powered OLAP: the Tencent application with Apache Doris',
+ content: `The exploration of a LLM+OLAP solution is a bumpy journey, but phew, it now works well for the Tencent case, and they're writing down every lesson learned to share with you.`,
+ to: '/blog/Tencent-LLM',
+ image: 'newsletter-4.jpeg',
},
];
diff --git a/src/constant/user.data.tsx b/src/constant/user.data.tsx
new file mode 100644
index 0000000..3bcb2a5
--- /dev/null
+++ b/src/constant/user.data.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+
+export const USER_STORIES_CATEGORIES = [
+ 'All',
+ 'Finance',
+ 'Technology',
+ 'Media & Entertainment',
+ 'Telecom & Manufacturing',
+ 'FMCG & Logistics',
+ 'Commercial Distribution',
+];
+
+export const USER_STORIES = [
+ {
+ title: '“Processing 10 billions rows of data every day with 10,000 QPS and achieve a query latency of just 150ms”',
+ author: {
+ name: 'Li Zhe',
+ title: 'Senior software engineer, JD.com',
+ },
+ to: 'blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents',
+ image: 'user-jd.jpg',
+ },
+ {
+ title: '“Reducing costs and increasing service availability, large language models empower Doris-based OLAP service”',
+ author: {
+ name: 'Jun Zhang, Lei Luo',
+ title: 'Senior software engineer, Tencent',
+ },
+ to: 'blog/Tencent-LLM',
+ image: 'tme.png',
+ },
+ {
+ title: '“Digest 15 billion logs per day and keep big queries within 1 second. We use Doris to deploy multiple petabyte scale clusters on dozens of machines”',
+ author: {
+ name: 'Yuqi Liu',
+ title: 'Senior software engineer, China Unicom',
+ },
+ to: 'blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second',
+ image: 'china-unicom.png',
+ },
+];
diff --git a/src/constant/users.data.json b/src/constant/users.data.json
new file mode 100644
index 0000000..5da0aec
--- /dev/null
+++ b/src/constant/users.data.json
@@ -0,0 +1,1334 @@
+[
+ {
+ "story": "Amazon Web Services (AWS) is a leading cloud computing platform that offers a wide range of scalable and reliable cloud services. AWS for Apache Doris is coming soon, enabling businesses to effortlessly scale their data analytics capabilities to handle massive workloads.",
+ "name": "AWS",
+ "category": "Commercial Distribution",
+ "logo": "AWS",
+ "order": 0,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/AWS.jpg"
+ },
+ {
+ "story": "Powered by Apache Doris, VeloDB is a modern data warehouse designed for swift analytics on large-scale real-time data. VeloDB Inc, the commercial company of Apache Doris, delivers real-time analytics products and solutions to enterprise users worldwide.",
+ "name": "VeloDB",
+ "category": "Commercial Distribution",
+ "logo": "VeloDB",
+ "order": 1,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/VeloDB.jpg"
+ },
+ {
+ "story": "SelectDB is a modern data warehouse for lightning-fast analytics on real-time data at scale, offering fully managed cloud-native data warehouse services and self-managed software on premises, VMs, or Kubernetes.",
+ "name": "SelectDB",
+ "category": "Commercial Distribution",
+ "logo": "SelectDB",
+ "order": 2,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/SelectDB.jpg"
+ },
+ {
+ "story": "Tencent Cloud House-D is a fully-managed cloud data warehouse service built on Apache Doris.",
+ "name": "Tencent Cloud",
+ "category": "Commercial Distribution",
+ "logo": "Tencent Cloud",
+ "order": 3,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/Tencent Cloud.jpg"
+ },
+ {
+ "story": "Alibaba Cloud is a global leader in cloud computing and artificial intelligence, offering a fully managed service built on Apache Doris for real-time analytics.",
+ "name": "Alibaba Cloud",
+ "category": "Commercial Distribution",
+ "logo": "Alibaba Cloud",
+ "order": 4,
+ "to": null,
+ "image": "/images/user-logo/Commercial Distribution/Alibaba Cloud.jpg"
+ },
+ {
+ "story": "A global phenomenon, where users create and share short videos, showcasing their talent and connecting with a vibrant community. With Doris, the platform process data efficiently and enhance user experiences",
+ "name": "TikTok",
+ "category": "Media & Entertainment",
+ "logo": "TikTok",
+ "order": 5,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/TikTok.jpg"
+ },
+ {
+ "story": "Huawei is a leading global communications technology company that provides comprehensive digital solutions including 5G, cloud computing, and artificial intelligence. Huawei uses Apache Doris to process and analyze real-time data to improve business efficiency and competitiveness.",
+ "name": "Huawei",
+ "category": "Technology",
+ "logo": "Huawei",
+ "order": 6,
+ "to": null,
+ "image": "/images/user-logo/Technology/Huawei.jpg"
+ },
+ {
+ "story": "Tencent is the largest internet company in the world and one of the highest grossing multimedia companies in the world. Tencent has multiple businesses using Apache Doris to perform real-time analysis on user behavior data, better supporting business analysis and decision-making.",
+ "name": "Tencent",
+ "category": "Technology",
+ "logo": "Tencent",
+ "order": 7,
+ "to": null,
+ "image": "/images/user-logo/Technology/Tencent.jpg"
+ },
+ {
+ "story": "Alibaba is a leading global Internet technology company with a wide range of business activities, including e-commerce, cloud computing, digital media and entertainment. Within Alibaba, multiple businesses are already using Apache Doris to support business strategies and product optimization through real-time data analysis.",
+ "name": "Alibaba.com",
+ "category": "Technology",
+ "logo": "Alibaba.com",
+ "order": 8,
+ "to": null,
+ "image": "/images/user-logo/Technology/Alibaba.com.jpg"
+ },
+ {
+ "story": "As a top-tier supply chain-based technology and service provider, JD.com uses Apache Doris for multi-dimensional analysis of real-time and offline data to empower their customer service.",
+ "name": "JD.com",
+ "category": "Technology",
+ "logo": "JD.com",
+ "order": 9,
+ "to": "https://doris.apache.org/blog/JD_OLAP",
+ "image": "/images/user-logo/Technology/JD.com.jpg"
+ },
+ {
+ "story": "Xiaomi, one of the world's biggest smartphone and consumer electronics manufacturer has applied Apache Doris to multiple aspects of its business, from dashboarding, A/B testing, to user behavior and business growth analytics.",
+ "name": "Xiaomi",
+ "category": "Technology",
+ "logo": "Xiaomi",
+ "order": 10,
+ "to": "https://doris.apache.org/blog/xiaomi_vector",
+ "image": "/images/user-logo/Technology/Xiaomi.jpg"
+ },
+ {
+ "story": "A leading tech giant renowned for its expertise in artificial intelligence, cloud computing, and search engine technologies and dedicated to innovations in internet-related services.",
+ "name": "Baidu",
+ "category": "Technology",
+ "logo": "Baidu",
+ "order": 11,
+ "to": null,
+ "image": "/images/user-logo/Technology/Baidu.jpg"
+ },
+ {
+ "story": "ByteDance is a technology company focusing on mobile information, social entertainment and social platforms. ByteDance uses Apache Doris to conduct real-time analysis and processing of real-time data streams to provide real-time business support",
+ "name": "ByteDance",
+ "category": "Technology",
+ "logo": "ByteDance",
+ "order": 12,
+ "to": null,
+ "image": "/images/user-logo/Technology/ByteDance.jpg"
+ },
+ {
+ "story": "The Bank of China is one of the largest commercial banks in China, using Apache Doris to enhance its business reporting analysis capabilities and improve the efficiency of business decision-making.",
+ "name": "Bank of China",
+ "category": "Finance",
+ "logo": "Bank of China",
+ "order": 13,
+ "to": null,
+ "image": "/images/user-logo/Finance/Bank of China.jpg"
+ },
+ {
+ "story": "Postal Savings Bank of China has built a real-time anti-fraud platform based on Apache Doris, which greatly improves the timeliness of data, and the query of business reports takes only a few seconds, reducing storage costs by 70%.",
+ "name": "Postal Savings Bank of China",
+ "category": "Finance",
+ "logo": "Postal Savings Bank of China",
+ "order": 14,
+ "to": null,
+ "image": "/images/user-logo/Finance/Postal Savings Bank of China.jpg"
+ },
+ {
+ "story": "WeLab is one of the fastest-growing pan-Asian fintech platforms, with over 60 million individual users and over 700 enterprise customers. Apache Doris plays a crucial role in WeLab's real-time big data platform, effectively supporting important scenarios such as real-time self-service BI reporting and user behavior analysis.",
+ "name": "WeLab",
+ "category": "Finance",
+ "logo": "WeLab",
+ "order": 15,
+ "to": null,
+ "image": "/images/user-logo/Finance/WeLab.jpg"
+ },
+ {
+ "story": "Fuse is the largest insurance technology company in Indonesia, using Apache Doris to accelerate insurance BI reporting and real-time data analytics capabilities.",
+ "name": "FUSE",
+ "category": "Finance",
+ "logo": "FUSE",
+ "order": 16,
+ "to": null,
+ "image": "/images/user-logo/Finance/FUSE.jpg"
+ },
+ {
+ "story": "Citic Securities has built a real-time data warehouse using Apache Doris, replacing Impala and Greenplum, and upgraded multiple data applications such as Adhoc, reporting, and cockpit.",
+ "name": "CITIC Securities",
+ "category": "Finance",
+ "logo": "CITIC Securities",
+ "order": 17,
+ "to": null,
+ "image": "/images/user-logo/Finance/CITIC Securities.jpg"
+ },
+ {
+ "story": "One of the largest state-owned oil and gas companies in the world. Engaged in exploration, production, refining, and marketing, CNPC plays a pivotal role in China's energy industry.",
+ "name": "CNPC",
+ "category": "Telecom & Manufacturing",
+ "logo": "CNPC",
+ "order": 18,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/CNPC.jpg"
+ },
+ {
+ "story": "China Mobile is the largest telecommunication company in China. With an extensive network coverage and a wide range of services, it provides mobile voice and data services to millions of customers in China.",
+ "name": "China Mobile",
+ "category": "Telecom & Manufacturing",
+ "logo": "China Mobile",
+ "order": 19,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/China Mobile.jpg"
+ },
+ {
+ "story": "China Unicom, one of the world's biggest telecommunication service providers, uses Apache Doris for log analytics and ensures stable data digestion of 15 billion logs per day and queries on super large datasets to be executed within one second. ",
+ "name": "China Unicom",
+ "category": "Telecom & Manufacturing",
+ "logo": "China Unicom",
+ "order": 20,
+ "to": "https://doris.apache.org/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second",
+ "image": "/images/user-logo/Telecom & Manufacturing/China Unicom.jpg"
+ },
+ {
+ "story": "Glodwind is a leading wind turbine manufacturer and renewable energy solutions provider, specializing in design, manufacturing and installation.",
+ "name": "Goldwind",
+ "category": "Telecom & Manufacturing",
+ "logo": "Goldwind",
+ "order": 21,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Goldwind.jpg"
+ },
+ {
+ "story": "An online programming platform that help software engineers and students enhance their coding skills and prepare them for technical interviews.",
+ "name": "Leetcode",
+ "category": "Technology",
+ "logo": "Leetcode",
+ "order": 22,
+ "to": null,
+ "image": "/images/user-logo/Technology/Leetcode.jpg"
+ },
+ {
+ "story": "miHoYo is a leading interactive entertainment company, known for their popular games like Genshin Impact, Honkai Impact 3rd, and Tears of Themis.",
+ "name": "miHoYo",
+ "category": "Media & Entertainment",
+ "logo": "miHoYo",
+ "order": 23,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/miHoYo.jpg"
+ },
+ {
+ "story": "NetEase introduces Apache Doris into its data management platform and gains improved performance and simpler tag management for its e-commerce business.",
+ "name": "NetEase",
+ "category": "Media & Entertainment",
+ "logo": "NetEase",
+ "order": 24,
+ "to": "https://doris.apache.org/blog/Netease",
+ "image": "/images/user-logo/Media & Entertainment/NetEase.jpg"
+ },
+ {
+ "story": "Temu provides one-stop destination for affordable items, perfect for home decor, electronic, pet supplies, sports and toy selections. ",
+ "name": "Temu",
+ "category": "Media & Entertainment",
+ "logo": "Temu",
+ "order": 25,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Temu.jpg"
+ },
+ {
+ "story": "Online media and technology company that operates platforms such as Sina Weibo and Sina.com, providing news, entertainment, social networking, and e-commerce services to a vast user base",
+ "name": "Sina",
+ "category": "Media & Entertainment",
+ "logo": "Sina",
+ "order": 26,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Sina.jpg"
+ },
+ {
+ "story": "Tencent Music, a music streaming service provider with 800 million monthly active users, has transitioned from ClickHouse to Apache Doris and benefited from the convenience of partial column updates, lower storage costs, and easier maintenance.",
+ "name": "TME",
+ "category": "Media & Entertainment",
+ "logo": "TME",
+ "order": 27,
+ "to": "https://doris.apache.org/blog/Tencent-LLM",
+ "image": "/images/user-logo/Media & Entertainment/TME.jpg"
+ },
+ {
+ "story": "A premier online brand that is indispensable in the daily lives of millions of users, providing a network of web properties and community-based/web 2.0 products.",
+ "name": "Sohu.com",
+ "category": "Media & Entertainment",
+ "logo": "Sohu.com",
+ "order": 28,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Sohu.com.jpg"
+ },
+ {
+ "story": "Trusted by 45M users and growing , NewsBreak is one of the best local & breaking news source in the US, featuring local weather, alerts, deals, events and more.",
+ "name": "NewsBreak",
+ "category": "Media & Entertainment",
+ "logo": "NewsBreak",
+ "order": 29,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/NewsBreak.jpg"
+ },
+ {
+ "story": "A popular dating app, known for its user-friendly interface and innovative features that facilitate meaningful connections and relationships.",
+ "name": "Tantan",
+ "category": "Media & Entertainment",
+ "logo": "Tantan",
+ "order": 30,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Tantan.jpg"
+ },
+ {
+ "story": "A mobile application focused on personal well-being and self-improvement, offering features like mindfulness exercises and personal development resources.",
+ "name": "Soul App",
+ "category": "Media & Entertainment",
+ "logo": "Soul App",
+ "order": 31,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Soul App.jpg"
+ },
+ {
+ "story": "A fitness app that offers a wide range of workout programs, personalized training plans, and a supportive community to help users achieve their fitness goals.",
+ "name": "Keep",
+ "category": "Media & Entertainment",
+ "logo": "Keep",
+ "order": 32,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Keep.jpg"
+ },
+ {
+ "story": "Kwai, a social network for short videos, uses Apache Doris in replacement of the \"Druid + ClickHouse\" solution and thus increases efficiency in aggregated analysis of large datasets.",
+ "name": "Kwai",
+ "category": "Media & Entertainment",
+ "logo": "Kwai",
+ "order": 33,
+ "to": "https://doris.apache.org/blog/BestPractice_Kwai",
+ "image": "/images/user-logo/Media & Entertainment/Kwai.jpg"
+ },
+ {
+ "story": "a prominent gaming company known for developing and publishing high-quality mobile games. With a diverse portfolio and a large user base, offering immersive gaming experiences to players worldwide.",
+ "name": "37 Interactive Entertainment",
+ "category": "Media & Entertainment",
+ "logo": "37 Interactive Entertainment",
+ "order": 34,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/37 Interactive Entertainment.jpg"
+ },
+ {
+ "story": "HUYA Inc. is a prominent live streaming platform, offering a diverse range of content including gaming, esports, and entertainment.",
+ "name": "HUYA Inc",
+ "category": "Media & Entertainment",
+ "logo": "HUYA Inc",
+ "order": 35,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/HUYA Inc.jpg"
+ },
+ {
+ "story": "This electric vehicle manufacturer tried a fair share of OLAP systems and settled on Apache Doris after considering performance, semantics, system compatibility, and maintenance costs.",
+ "name": "NIO",
+ "category": "Telecom & Manufacturing",
+ "logo": "NIO",
+ "order": 36,
+ "to": "https://doris.apache.org/blog/NIO",
+ "image": "/images/user-logo/Telecom & Manufacturing/NIO.jpg"
+ },
+ {
+ "story": "A renowned Japanese automobile manufacturer known for its diverse range of cars, motorcycles, and outboard motors. With a reputation for reliability and innovation, Suzuki vehicles are popular worldwide.\n",
+ "name": "Suzuki",
+ "category": "Telecom & Manufacturing",
+ "logo": "Suzuki",
+ "order": 37,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Suzuki.jpg"
+ },
+ {
+ "story": "A renowned automotive company that has been manufacturing and selling vehicles, known for its innovation and quality, Ford offers a wide range of cars, trucks, and SUVs globally.",
+ "name": "Ford",
+ "category": "Telecom & Manufacturing",
+ "logo": "Ford",
+ "order": 38,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Ford.jpg"
+ },
+ {
+ "story": "A coffee company and coffeehouse chain that rapidly expanded in a short period. Known for its convenient mobile ordering and delivery services, Luckin Coffee offers a variety of coffee beverages and snacks to customers across China.",
+ "name": "Luckin Coffee",
+ "category": "FMCG & Logistics",
+ "logo": "Luckin Coffee",
+ "order": 39,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Luckin Coffee.jpg"
+ },
+ {
+ "story": "JD Logistics, a subsidiary of JD.com, is a leading logistics company with an extensive network and advanced technology. It offers efficient warehousing, transportation, and supply chain solutions, enabling seamless e-commerce operations across industries.\n",
+ "name": "JD Logistics",
+ "category": "FMCG & Logistics",
+ "logo": "JD Logistics",
+ "order": 40,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/JD Logistics.jpg"
+ },
+ {
+ "story": "Anta as a sportswear company renowned for its innovative designs and high-performance athletic footwear and apparel. With a focus on quality and style, Anta caters to athletes and fitness enthusiasts worldwide.",
+ "name": "Anta",
+ "category": "FMCG & Logistics",
+ "logo": "Anta",
+ "order": 41,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Anta.jpg"
+ },
+ {
+ "story": "Cabbeen is a fashion brand known for its contemporary and trendy clothing designs, with a focus on blending traditional elements with modern aesthetics.",
+ "name": "Cabbeen",
+ "category": "FMCG & Logistics",
+ "logo": "Cabbeen",
+ "order": 42,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Cabbeen.jpg"
+ },
+ {
+ "story": "Semi is a modern lifestyle brand for adults committed to developing innovative, and affordable fashion.",
+ "name": "Semi",
+ "category": "FMCG & Logistics",
+ "logo": "Semi",
+ "order": 43,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Semi.jpg"
+ },
+ {
+ "story": "A fashion brand to present lifestyles of contemporary successful men and echo the spirit of successful men in various fields.",
+ "name": "Septwolves",
+ "category": "FMCG & Logistics",
+ "logo": "Septwolves",
+ "order": 44,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Septwolves.jpg"
+ },
+ {
+ "story": "Yonghui Superstores is a Chinese reatail chain known for its comprehensive selection of groceries and household products, providing a convenient and pleasant shopping experience for consumers.",
+ "name": "Yonghui Superstores",
+ "category": "FMCG & Logistics",
+ "logo": "Yonghui Superstores",
+ "order": 45,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Yonghui Superstores.jpg"
+ },
+ {
+ "story": "A leading restaurant company in China, operatin popular barnds such as KFC, Pizza Hut, and Taco Bell. With a focus on delivering delicious and convenient dining experiences, Yum China has become a trusted choice for Chinese consumers.",
+ "name": "YumChina",
+ "category": "FMCG & Logistics",
+ "logo": "YumChina",
+ "order": 46,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/YumChina.jpg"
+ },
+ {
+ "story": "An international dairy company based in the Netherlands, specializing in the production and distribution of infant and toddler nutrition products, Ausnutria ensures high-quality and safe nutritional solutions for babies and young children worldwide.",
+ "name": "Ausnutria",
+ "category": "FMCG & Logistics",
+ "logo": "Ausnutria",
+ "order": 47,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Ausnutria.jpg"
+ },
+ {
+ "story": "AfterShip is a leading shipment tracking platform that enables businesses and consumers to track and monitor their packages from various courier services in real-time. It provides transparency and convenience in package delivery management.",
+ "name": "Aftership",
+ "category": "FMCG & Logistics",
+ "logo": "Aftership",
+ "order": 48,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Aftership.jpg"
+ },
+ {
+ "story": "SF Express is a leading logistics and courier services company, providing efficient and reliable domestic and international shipping solutions while serving businesses and individuals worldwide.",
+ "name": "SF Express",
+ "category": "FMCG & Logistics",
+ "logo": "SF Express",
+ "order": 49,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/SF Express.jpg"
+ },
+ {
+ "story": "Uda Express aims to provide safe, convenient, efficient and integrated global logistic services for worldwide e-commerce platforms, buyers or sellers, traders or dealers and final consumers.\n",
+ "name": "Uda Express",
+ "category": "FMCG & Logistics",
+ "logo": "Uda Express",
+ "order": 50,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Uda Express.jpg"
+ },
+ {
+ "story": "A leading Chinese logistics company specializing in express delivery services, provides reliable and fast delivery solutions for businesses and consumers across China.",
+ "name": "ZTO Express",
+ "category": "FMCG & Logistics",
+ "logo": "ZTO Express",
+ "order": 51,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/ZTO Express.jpg"
+ },
+ {
+ "story": "YT Express understands the high demand for fresh and medical products specific cold chain equipment and the timeliness and efficiency of transportation.\n\n\n",
+ "name": "YT Express",
+ "category": "FMCG & Logistics",
+ "logo": "YT Express",
+ "order": 52,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/YT Express.jpg"
+ },
+ {
+ "story": "An education platform, Koolearn, offers a wide range of courses and study materials for students and adult learners, providing interactive and personalized learning experiences.",
+ "name": "Koolearn",
+ "category": "Media & Entertainment",
+ "logo": "Koolearn",
+ "order": 53,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Koolearn.jpg"
+ },
+ {
+ "story": "VIPKid platform connects paying students with teachers in the United States and Canada. Its online-classroom portal enables students to receive 25-minute English language lessons from fluent English-speaking teachers.",
+ "name": "vipkid",
+ "category": "Media & Entertainment",
+ "logo": "vipkid",
+ "order": 54,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/vipkid.jpg"
+ },
+ {
+ "story": "This leading local life service platform uses Apache Doris as a high-performance OLAP engine to address challenges in its real-time and offline data processing.",
+ "name": "Meituan",
+ "category": "Media & Entertainment",
+ "logo": "Meituan",
+ "order": 55,
+ "to": "https://doris.apache.org/blog/meituan",
+ "image": "/images/user-logo/Media & Entertainment/Meituan.jpg"
+ },
+ {
+ "story": "Homeware solutions helps you enjoy a genuine, comfortable life. Lifewit specializes in creating innovative products for the home, travel, and organization to enhance everyday living experiences.",
+ "name": "Lifewit",
+ "category": "Media & Entertainment",
+ "logo": "Lifewit",
+ "order": 56,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Lifewit.jpg"
+ },
+ {
+ "story": "Lenovo is a global technology leader that designs, develops, and manufactures innovative products, including laptops, tablets, smartphones, and servers. Lenovo serves customers across the global.",
+ "name": "Lenovo",
+ "category": "Telecom & Manufacturing",
+ "logo": "Lenovo",
+ "order": 57,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Lenovo.jpg"
+ },
+ {
+ "story": "Volvo, as automobile manufacturer, known for its commitment to safety, reliability. With a diverse lineup of cars, Volvo combines luxury with practicality to cater to discerning customers worldwide.",
+ "name": "Volvo",
+ "category": "Telecom & Manufacturing",
+ "logo": "Volvo",
+ "order": 58,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Volvo.jpg"
+ },
+ {
+ "story": "A leading global home appliance and HVAC solutions provider based in China. With a wide range of products including air conditioners, refrigerators, washing machines, and more. ",
+ "name": "Midea",
+ "category": "Telecom & Manufacturing",
+ "logo": "Midea",
+ "order": 59,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Midea.jpg"
+ },
+ {
+ "story": "Haidilao is a renowned Chinese hot pot restaurant chain known for its exceptional service, quality ingredients, and unwavering commitment to customer satisfaction",
+ "name": "Haidilao",
+ "category": "FMCG & Logistics",
+ "logo": "Haidilao",
+ "order": 60,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Haidilao.jpg"
+ },
+ {
+ "story": "Xtep caters to sports enthusiasts and athletes, offering stylish and functional sportswear options, specialized in designing and manufacturing athletic footwear, apparel, and accessories.",
+ "name": "Xtep",
+ "category": "FMCG & Logistics",
+ "logo": "Xtep",
+ "order": 61,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Xtep.jpg"
+ },
+ {
+ "story": "Taikang Insurance has established an insurance business analysis platform using Doris, providing tens of thousands of front-line users with insurance business data analysis, with query time taking only a few seconds.",
+ "name": "Taikang Insurance Group",
+ "category": "Finance",
+ "logo": "Taikang Insurance Group",
+ "order": 62,
+ "to": null,
+ "image": "/images/user-logo/Finance/Taikang Insurance Group.jpg"
+ },
+ {
+ "story": "With over 227 million retail customers and 693 million Internet users, Ping An is one of the largest financial services companies in the world. Currently, multiple businesses within Ping An Group are using Apache Doris, including life insurance, property insurance, and financial technology.",
+ "name": "Ping An Insurance Group",
+ "category": "Finance",
+ "logo": "Ping An Insurance Group",
+ "order": 63,
+ "to": null,
+ "image": "/images/user-logo/Finance/Ping An Insurance Group.jpg"
+ },
+ {
+ "story": "CIGNA & CMB, an insurance company, uses Apache Doris as an all-in-one OLAP platform to undertake their customer-facing, analyst-facing, and management-facing data analytics workloads.",
+ "name": "Cigna & CMB",
+ "category": "Finance",
+ "logo": "Cigna & CMB",
+ "order": 64,
+ "to": "https://doris.apache.org/blog/less-components-higher-performance-apache-doris-instead-of-clickhouse-mysql-presto-and-hbase",
+ "image": "/images/user-logo/Finance/Cigna & CMB.jpg"
+ },
+ {
+ "story": "China Everbright Bank is a large joint-stock commercial bank that has introduced Apache Doris into its data platform to accelerate queries on the data lake and enhance real-time report analysis efficiency.",
+ "name": "China Everbright Bank",
+ "category": "Finance",
+ "logo": "China Everbright Bank",
+ "order": 65,
+ "to": null,
+ "image": "/images/user-logo/Finance/China Everbright Bank.jpg"
+ },
+ {
+ "story": "Based on Apache Doris, Guangfa Securities has established a data metric service platform to accelerate the query speed of Hive data and provide data support for upper-level analysis applications.",
+ "name": "GF Securities",
+ "category": "Finance",
+ "logo": "GF Securities",
+ "order": 66,
+ "to": null,
+ "image": "/images/user-logo/Finance/GF Securities.jpg"
+ },
+ {
+ "story": "Bosera Fund has upgraded its data warehouse system using Apache Doris, replacing both Teradata and Oracle, and achieved significant improvement in ETL/batch data processing efficiency.",
+ "name": "Bosera Funds",
+ "category": "Finance",
+ "logo": "Bosera Funds",
+ "order": 67,
+ "to": null,
+ "image": "/images/user-logo/Finance/Bosera Funds.jpg"
+ },
+ {
+ "story": "Harvest Fund upgraded its original data warehouse system to Apache Doris to achieve more efficient data processing and analysis, resulting in better performance, lower costs, and higher reliability.",
+ "name": "Harvest Funds",
+ "category": "Finance",
+ "logo": "Harvest Funds",
+ "order": 68,
+ "to": null,
+ "image": "/images/user-logo/Finance/Harvest Funds.jpg"
+ },
+ {
+ "story": "With Apache Doris, this fintech service provider is able to handle 10,000 active financial metrics in 10,000 dashboards with 30% less ETL efforts, and reduced the query response time on tables of 100 million rows from 5s to 63ms.",
+ "name": "OneConnect",
+ "category": "Finance",
+ "logo": "OneConnect",
+ "order": 69,
+ "to": "https://doris.apache.org/blog/Database-in-Fintech-How-to-Support-ten-thousand-Dashboards-Without-Causing-a-Mess",
+ "image": "/images/user-logo/Finance/OneConnect.jpg"
+ },
+ {
+ "story": "An AI-driven fintech service provider utilizes Apache Doris for big data processing and analytics and thus benefits from enhanced performance, flexible workload management, high service availability, and effortless maintenance.",
+ "name": "Qifu Technology",
+ "category": "Finance",
+ "logo": "Qifu Technology",
+ "order": 70,
+ "to": null,
+ "image": "/images/user-logo/Finance/Qifu Technology.jpg"
+ },
+ {
+ "story": "An AI-driven technology company in Asia-Pacific committed to providing fintech products and services for consumers, enterprises and merchants.",
+ "name": "Advance Intelligence Group",
+ "category": "Technology",
+ "logo": "Advance Intelligence Group",
+ "order": 71,
+ "to": null,
+ "image": "/images/user-logo/Technology/Advance Intelligence Group.jpg"
+ },
+ {
+ "story": "The cyber security service provider builds its log storage and analysis system and realizes 3X data writing speed, 7X query execution speed, and visualized management.",
+ "name": "QAX-Cyber Security Services",
+ "category": "Technology",
+ "logo": "QAX-Cyber Security Services",
+ "order": 72,
+ "to": "https://doris.apache.org/blog/empowering-cyber-security-by-enabling-seven-times-faster-log-analysis",
+ "image": "/images/user-logo/Technology/QAX-Cyber Security Services.jpg"
+ },
+ {
+ "story": "The due diligence platform replaces Apache Hive, Elasticsearch, and PostgreSQL with Apache Doris and achieves higher speed in ad-hoc analysis and user segmentation. ",
+ "name": "Tianyancha",
+ "category": "Technology",
+ "logo": "Tianyancha",
+ "order": 73,
+ "to": "https://doris.apache.org/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris",
+ "image": "/images/user-logo/Technology/Tianyancha.jpg"
+ },
+ {
+ "story": "A cloud-based transportation management system designed to streamline and optimize logistics operations. It offers comprehensive solutions for planning, execution, and monitoring of shipments, enhancing efficiency and visibility throughout the supply chain.",
+ "name": "TMS",
+ "category": "FMCG & Logistics",
+ "logo": "TMS",
+ "order": 74,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/TMS.jpg"
+ },
+ {
+ "story": "Orange Connex provides digital supply chain solutions for e-commerce worldwide. After putting Apache Doris into production, it reduces its data computation latency from 2 hours to 3 minutes.",
+ "name": "Orange Connex",
+ "category": "FMCG & Logistics",
+ "logo": "Orange Connex",
+ "order": 75,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Orange Connex.jpg"
+ },
+ {
+ "story": "A SaaS provider that offers inventory management, membership marketing, and cashier services for retailers including supermarkets, fresh produce stores, and clothing stores.",
+ "name": "Zhonglun Network",
+ "category": "Technology",
+ "logo": "Zhonglun Network",
+ "order": 76,
+ "to": null,
+ "image": "/images/user-logo/Technology/Zhonglun Network.jpg"
+ },
+ {
+ "story": "The SaaS provider adopts Apache Doris as a solution to improve data processing efficiency, particularly addressing multi-dimensional table maintenance and high-concurrency queries. ",
+ "name": "Duyan Soft",
+ "category": "Technology",
+ "logo": "Duyan Soft",
+ "order": 77,
+ "to": "https://doris.apache.org/blog/Improving-Query-Speed-to-Make-the-Most-out-of-Your-Data",
+ "image": "/images/user-logo/Technology/Duyan Soft.jpg"
+ },
+ {
+ "story": "The conversational AI services and natural language interaction solutions provider unifies their real-time and offline analytics workloads with Apache Doris, which empowers their chatbot services with its flexible functionalities and high performance.",
+ "name": "AISPEECH",
+ "category": "Technology",
+ "logo": "AISPEECH",
+ "order": 78,
+ "to": "https://doris.apache.org/blog/Use-Apache-Doris-with-AI-chatbots",
+ "image": "/images/user-logo/Technology/AISPEECH.jpg"
+ },
+ {
+ "story": "A publicly listed company that empowers logistics and delivery with internet technologies. It provides intelligent industrial logistics services and also engages in online industries including gaming.",
+ "name": "Boton",
+ "category": "Technology",
+ "logo": "Boton",
+ "order": 79,
+ "to": null,
+ "image": "/images/user-logo/Technology/Boton.jpg"
+ },
+ {
+ "story": "A full-stack cloud computing solution provider dedicated to secure and reliable cloud services, efficient resource management, and industry-specific cloud applications.",
+ "name": "Sugon",
+ "category": "Technology",
+ "logo": "Sugon",
+ "order": 80,
+ "to": null,
+ "image": "/images/user-logo/Technology/Sugon.jpg"
+ },
+ {
+ "story": "A prominent technology conglomerate dedicated to providing cutting-edge solutions in various industries, including artificial intelligence, cloud computing, big data analytics, and telecommunications.",
+ "name": "Wasu",
+ "category": "Technology",
+ "logo": "Wasu",
+ "order": 81,
+ "to": null,
+ "image": "/images/user-logo/Technology/Wasu.jpg"
+ },
+ {
+ "story": "A leading AI technology company based in China, specializing in AI chips and software, aims to empower various industries with innovative AI solutions and drive the development of intelligent systems.",
+ "name": "Horizon Robotics",
+ "category": "Telecom & Manufacturing",
+ "logo": "Horizon Robotics",
+ "order": 82,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Horizon Robotics.jpg"
+ },
+ {
+ "story": "Youdao Inc. focuses on language-related products and services. It offers language learning platforms, translation tools, and smart devices, aiming to enhance communication and knowledge acquisition for users.\n",
+ "name": "Youdao",
+ "category": "Media & Entertainment",
+ "logo": "Youdao",
+ "order": 83,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Youdao.jpg"
+ },
+ {
+ "story": "LY Digital provides fintech solution for the hospitality industry. It streamlines its data architecture by introducing the powerful and feature-rich Apache Doris, and thus benefits from faster data access and queries.",
+ "name": "LY Digit",
+ "category": "Finance",
+ "logo": "LY Digit",
+ "order": 84,
+ "to": "https://doris.apache.org/blog/LY",
+ "image": "/images/user-logo/Finance/LY Digit.jpg"
+ },
+ {
+ "story": "A messaging and communication app that allows users to engage in real-time conversations, coordinate strategies, and build camaraderie in the vibrant voice chat rooms.",
+ "name": "TTChat",
+ "category": "Media & Entertainment",
+ "logo": "TTChat",
+ "order": 85,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/TTChat.jpg"
+ },
+ {
+ "story": "The live streaming platform uses Apache Doris to unify its stream processing and batch processing pipelines to make its data architecture faster, simpler, and more cost-effective.",
+ "name": "DouYu",
+ "category": "Media & Entertainment",
+ "logo": "DouYu",
+ "order": 86,
+ "to": "https://doris.apache.org/blog/Zipping-up-the-Lambda-Architecture-for-40-Percent-Faster-Performance",
+ "image": "/images/user-logo/Media & Entertainment/DouYu.jpg"
+ },
+ {
+ "story": "This all-category Q&A website supports its data management platform with Apache Doris and benefits from fast data ingestion and fast query response.",
+ "name": "Zhihu Inc",
+ "category": "Media & Entertainment",
+ "logo": "Zhihu Inc",
+ "order": 87,
+ "to": "https://doris.apache.org/blog/Database-Dissection-How-Fast-Data-Queries-Are-Implemented",
+ "image": "/images/user-logo/Media & Entertainment/Zhihu Inc.jpg"
+ },
+ {
+ "story": "An online grocery platform offers convenient and fast delivery of fresh produce, groceries, and daily essentials. It aims to simplify shopping experience for customers.",
+ "name": "Dingdong",
+ "category": "Media & Entertainment",
+ "logo": "Dingdong",
+ "order": 88,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Dingdong.jpg"
+ },
+ {
+ "story": "This health technology SaaS software company details the evolution of its data service architecture from ClickHouse to Apache Doris.",
+ "name": "Linkedcare",
+ "category": "Technology",
+ "logo": "Linkedcare",
+ "order": 89,
+ "to": "https://doris.apache.org/blog/linkedcare",
+ "image": "/images/user-logo/Technology/Linkedcare.jpg"
+ },
+ {
+ "story": "LeTV specializes in internet-based services, smart devices, and content production. It offers a range of products including smartphones, smart TVs, and streaming services.",
+ "name": "LeTV",
+ "category": "Media & Entertainment",
+ "logo": "LeTV",
+ "order": 90,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/LeTV.jpg"
+ },
+ {
+ "story": "An online recruitment platform promotes instant direct chats between Bosses and job seekers, delivers accurate recommendation results, and is powered by proprietary AI algorithms and big data insights.",
+ "name": "Boss Zhipin",
+ "category": "Media & Entertainment",
+ "logo": "Boss Zhipin",
+ "order": 91,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Boss Zhipin.jpg"
+ },
+ {
+ "story": "An cosmetic surgery platform listed on Nasdaq. Its social media-style credit evaluation system gains a strong user trust. ",
+ "name": "Soyoung",
+ "category": "Media & Entertainment",
+ "logo": "Soyoung",
+ "order": 92,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Soyoung.jpg"
+ },
+ {
+ "story": "Jiyue is Geely Holding;s next-generation automotive robocar brand, positioned as premium intelligent, committed to building leading intelligent automotive robots. ",
+ "name": "Jiyue Auto",
+ "category": "Telecom & Manufacturing",
+ "logo": "Jiyue Auto",
+ "order": 93,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Jiyue Auto.jpg"
+ },
+ {
+ "story": "Wuling Motors specializes in producing affordable and practical vehicles, known for its compact cars and commercial vehicles, it has gained popularity in both domestic and international markets.",
+ "name": "Wuling Motors",
+ "category": "Telecom & Manufacturing",
+ "logo": "Wuling Motors",
+ "order": 94,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Wuling Motors.jpg"
+ },
+ {
+ "story": "This is a car manufacturer who connects 4 million cars together and has to process 100 billion pieces of CAN data every day. Apache Doris ensures real-time data analytics performance for it.",
+ "name": "Chang'an Automobile",
+ "category": "Telecom & Manufacturing",
+ "logo": "Chang'an Automobile",
+ "order": 95,
+ "to": "https://doris.apache.org/blog/how-big-data-is-saving-lives-in-real-time-iov-data-analytics-helps-prevent-accidents",
+ "image": "/images/user-logo/Telecom & Manufacturing/Chang'an Automobile.jpg"
+ },
+ {
+ "story": "Lotus as a renowned British automotive manufacturer, producing high-performance sports cars and racing vehicles.",
+ "name": "LOTUS",
+ "category": "Telecom & Manufacturing",
+ "logo": "LOTUS",
+ "order": 96,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/LOTUS.jpg"
+ },
+ {
+ "story": "Great Wall Motors is a prominent Chinese automobile manufacturer specializing in SUVs, pickup trucks, and electric vehicles.",
+ "name": "Great Wall",
+ "category": "Telecom & Manufacturing",
+ "logo": "Great Wall",
+ "order": 97,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Great Wall.jpg"
+ },
+ {
+ "story": "Chery is recognized for its wide range of vehicles, including sedans, SUVs, and electric cars. With a focus on innovation and quality, Chery has established itself as a prominent player in the global automotive market.",
+ "name": "Chery",
+ "category": "Telecom & Manufacturing",
+ "logo": "Chery",
+ "order": 98,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Chery.jpg"
+ },
+ {
+ "story": "Envision Energy is dedicated to advancing clean and sustainable energy worldwide, with expertise in wind turbines, energy management software, and smart grid solutions",
+ "name": "Envision Energy",
+ "category": "Telecom & Manufacturing",
+ "logo": "Envision Energy",
+ "order": 99,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Envision Energy.jpg"
+ },
+ {
+ "story": "A leading provider of custom, end-to-end network, cloud and data center services for China, APAC and beyond.",
+ "name": "China Telecom",
+ "category": "Telecom & Manufacturing",
+ "logo": "China Telecom",
+ "order": 100,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/China Telecom.jpg"
+ },
+ {
+ "story": "CTYun is a cloud computing and infrastructure service provider. With a portfolio of cloud solutions, CTYun empowers businesses with secure, scalable, and reliable cloud computing capabilities",
+ "name": "CTYun",
+ "category": "Telecom & Manufacturing",
+ "logo": "CTYun",
+ "order": 101,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/CTYun.jpg"
+ },
+ {
+ "story": "Cisco is a multinational technology conglomerate specialized in networking solutions. It enables seamless connectivity, digital transformation and secure communications for businesses and organizations worldwide.",
+ "name": "Cisco",
+ "category": "Telecom & Manufacturing",
+ "logo": "Cisco",
+ "order": 102,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Cisco.jpg"
+ },
+ {
+ "story": "ZTE expertise in 5G technology, networking and mobile devices, offering innovative solutions that drive connectivity and digital transformation in the telecommunications industry.",
+ "name": "ZTE",
+ "category": "Telecom & Manufacturing",
+ "logo": "ZTE",
+ "order": 103,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/ZTE.jpg"
+ },
+ {
+ "story": "Huolala operates as cargo service platforms, providing intelligent freight information sharing, personal goods transportation, enterprise freight, and other cargo services. Huolala offers its services worldwide.\n\n",
+ "name": "HuoLaLa",
+ "category": "FMCG & Logistics",
+ "logo": "HuoLaLa",
+ "order": 104,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/HuoLaLa.jpg"
+ },
+ {
+ "story": "Deppon Express, as a logistics company providing comprehensive express delivery and supply chain solutions, ensuring reliable and efficient delivery services for businesses and individuals.",
+ "name": "Deppon Express",
+ "category": "FMCG & Logistics",
+ "logo": "Deppon Express",
+ "order": 105,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Deppon Express.jpg"
+ },
+ {
+ "story": "A fintech company that leverage leading technologies to provide financial service including digital payment, small-scale loans, investment and wealth managements.",
+ "name": "Du Xiaoman Financial",
+ "category": "Finance",
+ "logo": "Du Xiaoman Financial",
+ "order": 106,
+ "to": null,
+ "image": "/images/user-logo/Finance/Du Xiaoman Financial.jpg"
+ },
+ {
+ "story": "Xingye Bank is a large joint-stock commercial bank that has introduced Apache Doris into its big data platform to accelerate real-time data analysis efficiency and provide data support for business operations and management decisions.",
+ "name": "Industrial Bank",
+ "category": "Finance",
+ "logo": "Industrial Bank",
+ "order": 107,
+ "to": null,
+ "image": "/images/user-logo/Finance/Industrial Bank.jpg"
+ },
+ {
+ "story": "A leading provider of electronic payment and financial technology solutions that focuses on building a global payment ecosystem and offering secure and convenient online payment services for both merchants and consumers.",
+ "name": "UMS",
+ "category": "Finance",
+ "logo": "UMS",
+ "order": 108,
+ "to": null,
+ "image": "/images/user-logo/Finance/UMS.jpg"
+ },
+ {
+ "story": "Caitong Securities has used Apache Doris to summarize and analyze real-time data, quickly generating various reports, providing strong support for business development and decision-making.",
+ "name": "Caitong Securities",
+ "category": "Finance",
+ "logo": "Caitong Securities",
+ "order": 109,
+ "to": null,
+ "image": "/images/user-logo/Finance/Caitong Securities.jpg"
+ },
+ {
+ "story": "A listed digital payment services provider that also offers cash, business, and supply chain management solutions for retailers, banks, and e-commerce companies.",
+ "name": "Lakala",
+ "category": "Finance",
+ "logo": "Lakala",
+ "order": 110,
+ "to": null,
+ "image": "/images/user-logo/Finance/Lakala.jpg"
+ },
+ {
+ "story": "An electronic payment services provider that focuses on comprehensive payment solutions that cater to the needs of travelers, encompassing air travel, accommodation, and retail purchases. ",
+ "name": "Easy Pay",
+ "category": "Finance",
+ "logo": "Easy Pay",
+ "order": 111,
+ "to": null,
+ "image": "/images/user-logo/Finance/Easy Pay.jpg"
+ },
+ {
+ "story": "A consumer financing company that focuses on the small and medium financing services beyond the coverage of traditional bank services to achieve inclusive finance.",
+ "name": "Mucfc.com",
+ "category": "Finance",
+ "logo": "Mucfc.com",
+ "order": 112,
+ "to": null,
+ "image": "/images/user-logo/Finance/Mucfc.com.jpg"
+ },
+ {
+ "story": "A digital insurance provider that offers innovative insurance products for all walks of life and enhances its own operation efficiency and risk control effectiveness by cutting-edge technologies.",
+ "name": "ZhongAn Insurance",
+ "category": "Finance",
+ "logo": "ZhongAn Insurance",
+ "order": 113,
+ "to": null,
+ "image": "/images/user-logo/Finance/ZhongAn Insurance.jpg"
+ },
+ {
+ "story": "A fintech service provider that focuses on comprehensive, scenario-based digital solutions from financing, marketing, to event and customer management.",
+ "name": "InRice.com",
+ "category": "Finance",
+ "logo": "InRice.com",
+ "order": 114,
+ "to": null,
+ "image": "/images/user-logo/Finance/InRice.com.jpg"
+ },
+ {
+ "story": "A financial risk control and marketing services provider that leverages the power of artificial intelligence to empower decision-making for various industries. ",
+ "name": "Bairong Inc",
+ "category": "Finance",
+ "logo": "Bairong Inc",
+ "order": 115,
+ "to": null,
+ "image": "/images/user-logo/Finance/Bairong Inc.jpg"
+ },
+ {
+ "story": "The SaaS provider utilizes Apache Doris to support self-service BI by enabling fast join queries. It also helps in improving efficiency of privileged queries.",
+ "name": "Moka",
+ "category": "Technology",
+ "logo": "Moka",
+ "order": 116,
+ "to": "https://doris.apache.org/blog/Listen-to-That-Poor-BI-Engineer-We-Need-Fast-Joins",
+ "image": "/images/user-logo/Technology/Moka.jpg"
+ },
+ {
+ "story": "Apache Doris ensures quick computation and high data integrity for A/B testing on a big real-time data size with millions of operations per second. Each operation involves around 20 data tags and over a dozen dimensions.",
+ "name": "360 Security",
+ "category": "Technology",
+ "logo": "360 Security",
+ "order": 117,
+ "to": "https://doris.apache.org/blog/AB-Testing-was-a-Handful-Until-we-Found-the-Replacement-for-Druid",
+ "image": "/images/user-logo/Technology/360 Security.jpg"
+ },
+ {
+ "story": "A tech-driven intelligent retail service provider uses Apache Doris for resource isolation and high-concurrency data queries and realizes faster query speed and lower storage costs.",
+ "name": "HuiCe",
+ "category": "Technology",
+ "logo": "HuiCe",
+ "order": 118,
+ "to": null,
+ "image": "/images/user-logo/Technology/HuiCe.jpg"
+ },
+ {
+ "story": "A generative AI solution provider that focuses on the development of SOTA, integrated generative AI product suites with independent intellectual property rights.",
+ "name": "JiaoLong Cloud",
+ "category": "Technology",
+ "logo": "JiaoLong Cloud",
+ "order": 119,
+ "to": null,
+ "image": "/images/user-logo/Technology/JiaoLong Cloud.jpg"
+ },
+ {
+ "story": "IGG is best known for formerly publishing various massively multiplayer online games in North America. \"Lords Mobile\" as IGG’s first cross-platform, real-time game has approximately 320 million registered users worldwide. ",
+ "name": "IGOTGAMES",
+ "category": "Media & Entertainment",
+ "logo": "IGOTGAMES",
+ "order": 120,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/IGOTGAMES.jpg"
+ },
+ {
+ "story": "Electronic Soul is one of the top leading game developers and publishers based in Asia, providing high-quality digital contents crossing Mobile, PC, and consoles.",
+ "name": "Electronic Soul",
+ "category": "Media & Entertainment",
+ "logo": "Electronic Soul",
+ "order": 121,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Electronic Soul.jpg"
+ },
+ {
+ "story": "Leveraging advanced technologies and analytics, Haohan Data empowers businesses with comprehensive data solutions, enabling users to make informed decisions.",
+ "name": "Haohan Data",
+ "category": "Telecom & Manufacturing",
+ "logo": "Haohan Data",
+ "order": 122,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Haohan Data.jpg"
+ },
+ {
+ "story": "Aima Tech, an electric vehicle manufacturer, is committed to revolutionizing the way we commute and reducing carbon emissions.\n",
+ "name": "Aima Tech",
+ "category": "Telecom & Manufacturing",
+ "logo": "Aima Tech",
+ "order": 123,
+ "to": null,
+ "image": "/images/user-logo/Telecom & Manufacturing/Aima Tech.jpg"
+ },
+ {
+ "story": "Known for contemporary and trendy clothing designs, Peacebird offers stylish and eco-friendly fashion choices for customers.",
+ "name": "Peacebird",
+ "category": "FMCG & Logistics",
+ "logo": "Peacebird",
+ "order": 124,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Peacebird.jpg"
+ },
+ {
+ "story": "Full Truck Alliance is a leading digital freight platform connecting shippers and truck drivers. It offers efficient and transparent trucking services, optimizing logistics operations and facilitating freight transportation across China.",
+ "name": "Full Truck Alliance",
+ "category": "FMCG & Logistics",
+ "logo": "Full Truck Alliance",
+ "order": 125,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Full Truck Alliance.jpg"
+ },
+ {
+ "story": "CaiNiao is a logistics platform owned by Alibaba Group, specializing in end-to-end supply chain management and delivery services. It connects merchants, warehouses, and couriers to streamline operations and ensure efficient and timely order fulfillment.",
+ "name": "CaiNiao",
+ "category": "FMCG & Logistics",
+ "logo": "CaiNiao",
+ "order": 126,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/CaiNiao.jpg"
+ },
+ {
+ "story": "Umetrip is a leading provider of information technology solutions for the aviation and travel industry in China, offering comprehensive services for airline reservation systems, passenger services, and aviation data management.",
+ "name": "Umetrip",
+ "category": "FMCG & Logistics",
+ "logo": "Umetrip",
+ "order": 127,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Umetrip.jpg"
+ },
+ {
+ "story": "Yurun Group is a renowned Chinese food processing and distribution company operating a vertically integrated business model, encompassing farming, processing, and retail, to deliver premium meats to consumers.",
+ "name": "Yurun Group",
+ "category": "FMCG & Logistics",
+ "logo": "Yurun Group",
+ "order": 128,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Yurun Group.jpg"
+ },
+ {
+ "story": "Bondex serves various import and export trade clients, offering tailored supply chain solutions and standardized logistics services specialized in cross-border operations, including planning, design, and implementation.",
+ "name": "Bondex",
+ "category": "FMCG & Logistics",
+ "logo": "Bondex",
+ "order": 129,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Bondex.jpg"
+ },
+ {
+ "story": "Zongteng Group, a large China-based provider of cross-border warehousing and logistics services for e-commerce sellers",
+ "name": "Zongteng Group",
+ "category": "FMCG & Logistics",
+ "logo": "Zongteng Group",
+ "order": 130,
+ "to": null,
+ "image": "/images/user-logo/FMCG & Logistics/Zongteng Group.jpg"
+ },
+ {
+ "story": "The fintech company includes Apache Doris in their credit assessment and risk control solution to speed up queries on large datasets with little engineering and maintenance efforts.",
+ "name": "Techsight",
+ "category": "Finance",
+ "logo": "Techsight",
+ "order": 131,
+ "to": "https://doris.apache.org/blog/Choosing-an-OLAP-Engine-for-Financial-Risk-Management-What-to-Consider",
+ "image": "/images/user-logo/Finance/Techsight.jpg"
+ },
+ {
+ "story": "Zuoyebang is a leading online education platform, providing a wide range of educational resources, live classes, tutoring services, and personalized learning experiences for students of all ages.\n",
+ "name": "Zuoyebang",
+ "category": "Media & Entertainment",
+ "logo": "Zuoyebang",
+ "order": 132,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Zuoyebang.jpg"
+ },
+ {
+ "story": "Atguigu as a learning platform, offers comprehensive training programs and resources to help individuals build technical skills and advance their careers in the technology industry.",
+ "name": "Atguigu",
+ "category": "Media & Entertainment",
+ "logo": "Atguigu",
+ "order": 133,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Atguigu.jpg"
+ },
+ {
+ "story": "ITCast is a comprehensive online learning platform that offers a diverse range of IT and programming courses.",
+ "name": "ITCast",
+ "category": "Media & Entertainment",
+ "logo": "ITCast",
+ "order": 134,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/ITCast.jpg"
+ },
+ {
+ "story": "An online education platform offers a wide array of courses and programs taught by industry experts to help individuals acquire new skills and excel in their chosen fields.",
+ "name": "Kaikeba",
+ "category": "Media & Entertainment",
+ "logo": "Kaikeba",
+ "order": 135,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Kaikeba.jpg"
+ },
+ {
+ "story": "Lizhiweike, a popular online platform for live audio broadcasting, allows users to create and share live audio content, including podcasts, radio shows, and interactive discussions, fostering a vibrant audio community.",
+ "name": "Lizhiweike",
+ "category": "Media & Entertainment",
+ "logo": "Lizhiweike",
+ "order": 136,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Lizhiweike.jpg"
+ },
+ {
+ "story": "TenClass is an innovative education company that focuses on empowering individuals through digital skills, video editing, data analysis, and more.",
+ "name": "Tenclass",
+ "category": "Media & Entertainment",
+ "logo": "Tenclass",
+ "order": 137,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Tenclass.jpg"
+ },
+ {
+ "story": "A state-owned bank that leverages Apache Doris to propel its digitalization and refined management of marketing, risk control, and customer services.",
+ "name": "Wuxi Xishang Bank",
+ "category": "Finance",
+ "logo": "Wuxi Xishang Bank",
+ "order": 138,
+ "to": null,
+ "image": "/images/user-logo/Finance/Wuxi Xishang Bank.jpg"
+ },
+ {
+ "story": "The consumer financing company uses Apache Doris as a unified query gateway for its risk management platform, leveraging the Multi Catalog feature of Doris to unify the heterogenous data sources.",
+ "name": "HYXJ",
+ "category": "Finance",
+ "logo": "HYXJ",
+ "order": 139,
+ "to": "https://doris.apache.org/blog/Step-by-step-Guide-to-Building-a-High-Performing-Risk-Data-Mart",
+ "image": "/images/user-logo/Finance/HYXJ.jpg"
+ },
+ {
+ "story": "A consumer financing tech services provider that extensively utilizes Apache Doris for its internal business and operations and thus realizes much faster data query performance and improved data quality.",
+ "name": "HCFC",
+ "category": "Finance",
+ "logo": "HCFC",
+ "order": 140,
+ "to": null,
+ "image": "/images/user-logo/Finance/HCFC.jpg"
+ },
+ {
+ "story": "Autohome is a leading automotive online platform, offering comprehensive information, reviews, and services related to cars. It serves as a one-stop destination for car enthusiasts, buyers, and owners.\n",
+ "name": "Autohome",
+ "category": "Media & Entertainment",
+ "logo": "Autohome",
+ "order": 141,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Autohome.jpg"
+ },
+ {
+ "story": "JJ World is a leading chess and card game developer, offering internet services such as the JJ-Dota battle platform, 3399 mini-game platform, and mobile applications.",
+ "name": "JJ World",
+ "category": "Media & Entertainment",
+ "logo": "JJ World",
+ "order": 142,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/JJ World.jpg"
+ },
+ {
+ "story": "Q1.com is dedicated to providing a superior user experience in the field of online gaming and entertainment.\n",
+ "name": "Q1.com",
+ "category": "Media & Entertainment",
+ "logo": "Q1.com",
+ "order": 143,
+ "to": null,
+ "image": "/images/user-logo/Media & Entertainment/Q1.com.jpg"
+ },
+ {
+ "story": "This live streaming service provider with 800 million end users adopts Apache Doris for its analytic solution to simplify its data components. They ends up with faster tag queries, quick disaster recovery, and the convenience of data visualization.",
+ "name": "Xiaoe Tech",
+ "category": "Media & Entertainment",
+ "logo": "Xiaoe Tech",
+ "order": 144,
+ "to": "https://doris.apache.org/blog/data-analysis-for-live-streaming-what-happens-in-real-time-is-analyzed-in-real-time",
+ "image": "/images/user-logo/Media & Entertainment/Xiaoe Tech.jpg"
+ },
+ {
+ "story": "An e-commerce SaaS provider migrates from ClickHouse to Apache Doris and increases its SQL query performance by 250%. Apache Doris outperforms ClickHouse in the join query tests of all data sizes. ",
+ "name": "Youzan",
+ "category": "Media & Entertainment",
+ "logo": "Youzan",
+ "order": 145,
+ "to": "https://doris.apache.org/blog/migrating-from-clickhouse-to-apache-doris-what-happened",
+ "image": "/images/user-logo/Media & Entertainment/Youzan.jpg"
+ },
+ {
+ "story": "A real-estate giants builds its data warehouse solution easily and quickly with Apache Doris and thus benefits from low query latency, easy maintenance, and low storage resource consumption. ",
+ "name": "Midland Realty",
+ "category": "FMCG & Logistics",
+ "logo": "Midland Realty",
+ "order": 146,
+ "to": "https://doris.apache.org/blog/Building-a-Data-Warehouse-for-Traditional-Industry",
+ "image": "/images/user-logo/FMCG & Logistics/Midland Realty.jpg"
+ },
+ {
+ "story": "A blockchain data analytics solutions provider that allows users to customize their data dashboards within 10 seconds and extract valuable insights from data.",
+ "name": "Footprint Analytics",
+ "category": "Technology",
+ "logo": "Footprint Analytics",
+ "order": 147,
+ "to": null,
+ "image": "/images/user-logo/Technology/Footprint Analytics.jpg"
+ }
+]
diff --git a/src/constant/various-analytics.data.tsx b/src/constant/various-analytics.data.tsx
new file mode 100644
index 0000000..324ddd8
--- /dev/null
+++ b/src/constant/various-analytics.data.tsx
@@ -0,0 +1,143 @@
+import React from 'react';
+
+export const VariousAnalyticsData = [
+ {
+ title: 'Real-time analytics',
+ content:
+ 'From traditional batch reporting to real-time reporting and dashboards. From internal-facing analytics like traditional BI to customer-facing analytics. From decision support analytics to algorithm-driven real-time decision-making.',
+ links: [{ content: 'Read JD.com story ', to: '/blog/JD_OLAP' }],
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M53 57C55.2091 57 57 55.2091 57 53L57 27C57 24.7909 55.2091 23 53 23L27 23C24.7909 23 23 24.7909 23 27L23 53C23 55.2091 24.7909 57 27 57L53 57Z"
+ fill="#C0C3F1"
+ />
+ <path d="M30.0001 30H50.0001" stroke="white" stroke-width="3" stroke-linecap="round" />
+ <path d="M30.0001 37H50.0001" stroke="white" stroke-width="3" stroke-linecap="round" />
+ <circle cx="47" cy="47" r="10" fill="#444FD9" />
+ <path
+ d="M51.279 45.0771L45.9586 50.7201L42.5728 47.5279"
+ stroke="white"
+ stroke-width="3"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </svg>
+ ),
+ backgroundClassName: 'cases-bg-real-time',
+ },
+ {
+ title: 'Ad-hoc analysis',
+ content: `According to Forbes, 78% of organizations consider ad-hoc analysis to be a critical or very important feature in business intelligence adoption. Interactive ad-hoc analysis is replacing predefined data reporting, allowing a wider range of people to perform self-service analysis. Doris' high performance can provide fast response to any query, making it an invaluable tool for organizations that need to quickly analyze data and make informed decisions.`,
+ links: [{ content: 'Read Xiaomi story', to: '/blog/xiaomi_vector' }],
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M53 55C55.2091 55 57 53.2091 57 51L57 25C57 22.7909 55.2091 21 53 21L27 21C24.7909 21 23 22.7909 23 25L23 51C23 53.2091 24.7909 55 27 55L53 55Z"
+ fill="#444FD9"
+ />
+ <path
+ d="M28.7998 38H33.3527C33.5052 38 33.6457 37.9174 33.7198 37.784L37.1361 31.6347C37.3136 31.3152 37.7862 31.3591 37.9017 31.7058L42.0979 44.2943C42.2134 44.641 42.686 44.6849 42.8635 44.3654L46.2798 38.2161C46.3539 38.0827 46.4944 38 46.6469 38H51.1998"
+ stroke="white"
+ stroke-width="3"
+ stroke-linecap="round"
+ />
+ </svg>
+ ),
+ backgroundClassName: 'cases-bg-ad-hoc',
+ },
+ {
+ title: 'Data lake analytics',
+ content: `Doris as a high-performance federated query engine provides a powerful way to directly map external data lakes and databases to Doris' databases and tables. This combination of the openness of data lakes and the high performance of data warehouses offers enterprises a unified and efficient way to access, analyze, and manage their data.`,
+ links: [
+ {
+ content: 'Deep dive',
+ to: '/blog/Building-the-Next-Generation-Data-Lakehouse-10X-Performance',
+ },
+ ],
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <rect x="23.9999" y="34" width="32" height="10" rx="2" fill="#444FD9" />
+ <path
+ d="M23.9999 42H25.3333C25.766 42 26.1871 42.1404 26.5333 42.4L27.5209 43.1407C28.9803 44.2352 30.9952 44.2038 32.4197 43.0642L32.5012 42.999C33.962 41.8303 36.0391 41.8313 37.4999 43C38.9608 44.1687 41.0391 44.1687 42.4999 43C43.9608 41.8313 46.0378 41.8303 47.4987 42.999L47.5802 43.0642C49.0046 44.2038 51.0196 44.2352 52.479 43.1407L53.4666 42.4C53.8128 42.1404 54.2339 42 54.6666 42H55.9999V54C55.9999 55.1046 55.1045 56 53.9999 56H25.9999C24.8954 56 23.9999 55.1046 23.9999 54V42Z"
+ fill="#C0C3F1"
+ />
+ <rect x="27.9999" y="37.5" width="6" height="3" rx="1.5" fill="white" />
+ <rect x="23.9999" y="22" width="32" height="10" rx="2" fill="#444FD9" />
+ <rect x="27.9999" y="25.5" width="6" height="3" rx="1.5" fill="white" />
+ </svg>
+ ),
+ backgroundClassName: 'cases-bg-datalake',
+ },
+ {
+ title: 'ELT data processing',
+ content: `As data warehouses become more powerful, there is indeed a shift from ETL (Extract, Transform, Load) processes that rely on external systems to ELT (Extract, Load, Transform) methods that are performed within the database itself. Doris, with its high-performance computing engine, supports complex large queries and incremental data reading, making it an excellent choice for ELT data processing.`,
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ fill-rule="evenodd"
+ clip-rule="evenodd"
+ d="M56.9999 53C56.9999 55.2091 55.2091 57 52.9999 57H27C24.7908 57 23 55.2091 23 53L22.9999 27C22.9999 24.7909 24.7908 23 26.9999 23L52.9999 23C55.209 23 56.9999 24.7909 56.9999 27L56.9999 53ZM44.5964 30.6236C45.3565 30.953 45.7057 31.8362 45.3763 32.5963L38.8763 47.5963C38.5469 48.3564 37.6637 48.7056 36.9035 48.3762C36.1434 48.0468 35.7942 47.1636 36.1236 46.4035L42.6236 31.4035C42.953 30.6434 43.8362 30.2942 44.5964 30.6236ZM34.0606 38.8607C34.6464 38.2749 34.6464 37.3252 34.0606 36.7394C33.4748 36.1536 32.5251 36.1536 31.9393 36.7394L29.3635 39.3151C28.5434 40.1352 28.5434 41.4649 29.3635 42.285L31.9393 44.8607C32.5251 45.4465 33.4748 45.4465 34.0606 44.8607C34.6464 44.2749 34.6464 43.3252 34.0606 42.7394L32.1213 40.8001L34.0606 38.8607ZM45.9393 39.0607C45.3535 38.4749 45.3535 37.5251 45.9393 36.9393C46.5251 36.3536 47.4748 36.3536 48.0606 36.9393L50.6363 39.5151C51.4564 40.3352 51.4564 41.6648 50.6363 42.4849L48.0606 45.0607C47.4748 45.6464 46.5251 45.6464 45.9393 45.0607C45.3535 44.4749 45.3535 43.5251 45.9393 42.9393L47.8786 41L45.9393 39.0607Z"
+ fill="#444FD9"
+ />
+ </svg>
+ ),
+ links: [
+ {
+ content: 'Read use case',
+ to: '/blog/For-Entry-Level-Data-Engineers-How-to-Build-a-Simple-but-Solid-Data-Architecture',
+ },
+ ],
+ backgroundClassName: 'cases-bg-ELT',
+ },
+ {
+ title: 'Log analytics',
+ content: `Store business, system, or IoT-related log data as structured, semi-structured, or raw text to establish a unified log storage and analytics platform. Doris offers efficient handling of high-volume log data and provides high-performance log retrieval and analytics capabilities at a highly cost-effective rate.`,
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M56.9999 30L22.9999 30L22.9999 27C22.9999 24.7909 24.7908 23 26.9999 23L52.9999 23C55.2091 23 56.9999 24.7909 56.9999 27L56.9999 30Z"
+ fill="#C0C3F1"
+ />
+ <path
+ d="M57.0002 32H23.0002V51C23.0002 53.2091 24.791 55 27.0002 55H53.0002C55.2093 55 57.0002 53.2091 57.0002 51V32ZM49.1999 39.9001L43.3383 47.7156C42.7176 48.5432 41.5077 48.6292 40.7762 47.8977L37.1243 44.2458L34.1712 47.9371C33.6537 48.584 32.7098 48.6889 32.0629 48.1714C31.416 47.6539 31.3111 46.7099 31.8286 46.063L35.689 41.2375C36.322 40.4463 37.5021 40.381 38.2186 41.0974L41.8376 44.7165L46.7999 38.1001C47.297 37.4373 48.2372 37.303 48.8999 37.8001C49.5627 38.2971 49.697 39.2373 49.1999 39.9001Z"
+ fill="#444FD9"
+ />
+ </svg>
+ ),
+ links: [
+ { content: 'Deep dive', to: '/blog/log-analysis-elasticsearch-vs-apache-doris' },
+ {
+ content: 'Read China Unicom story',
+ to: '/blog/Log-Analysis-How-to-Digest-15-Billion-Logs-Per-Day-and-Keep-Big-Queries-Within-1-Second',
+ },
+ ],
+ backgroundClassName: 'cases-bg-log',
+ },
+ {
+ title: 'Customer data platform',
+ content: `Gather user-specific attributes and behavioral data, construct a comprehensive user data platform, perform in-depth analysis of user behaviors including engagement, retention, and conversion rates, and conduct precise audience analysis covering insights and segmentation.`,
+ icon: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80" fill="none">
+ <path
+ d="M54.6379 50.5263V55.9879C54.6379 56.4799 54.2801 56.8987 53.7942 56.9757L35.8443 59.817C35.2372 59.9131 34.688 59.4439 34.688 58.8293V57.9046C34.688 56.7561 33.7229 55.8435 32.5761 55.9077L28.6335 56.1285C27.5499 56.1891 26.6157 55.377 26.5233 54.2957C26.2995 51.6756 25.9077 47.3169 25.767 47.1782C24.8484 46.2722 20.2012 46.2722 21.1195 44.4603C22.0377 42.6485 24.8484 37.3684 24.8484 37.3684C25.4608 35.8585 24.8484 34.8574 24.8484 32.6831C24.8484 29.9653 30.3599 20 41.3829 20C52.4059 20 57.3268 26.4224 58.836 35.401C59.8522 41.4471 55.8627 46.9026 54.6379 50.5263Z"
+ fill="#C0C3F1"
+ />
+ <circle cx="42" cy="36" r="13" fill="#444FD9" />
+ <path
+ d="M39 31V37H42V43C42 43 43.6926 40.6557 44.5 39C45.2312 37.5005 46 35 46 35H43L44 31H39Z"
+ fill="white"
+ stroke="white"
+ stroke-linejoin="round"
+ />
+ </svg>
+ ),
+ links: [
+ {
+ content: 'Read use case',
+ to: '/blog/Replacing-Apache-Hive-Elasticsearch-and-PostgreSQL-with-Apache-Doris/',
+ },
+ ],
+ backgroundClassName: 'cases-bg-customer',
+ },
+];
diff --git a/src/hooks/use-animation-frame.ts b/src/hooks/use-animation-frame.ts
new file mode 100644
index 0000000..17bb09b
--- /dev/null
+++ b/src/hooks/use-animation-frame.ts
@@ -0,0 +1,26 @@
+import React from 'react';
+
+export const useAnimationFrame = (callback, stop) => {
+ // Use useRef for mutable variables that we want to persist
+ // without triggering a re-render on their change
+ const requestRef = React.useRef<any>();
+ const previousTimeRef = React.useRef<any>();
+ /**
+ * The callback function is automatically passed a timestamp indicating
+ * the precise time requestAnimationFrame() was called.
+ */
+
+ React.useEffect(() => {
+ console.log(stop);
+ const animate = time => {
+ if (previousTimeRef.current !== undefined) {
+ const deltaTime = time - previousTimeRef.current;
+ if (!stop) callback(deltaTime);
+ }
+ previousTimeRef.current = time;
+ requestRef.current = requestAnimationFrame(animate);
+ };
+ requestRef.current = requestAnimationFrame(animate);
+ return () => cancelAnimationFrame(requestRef.current);
+ }, [stop]); // Make sure the effect runs only once
+};
diff --git a/src/pages/_download/index.scss b/src/pages/_download/index.scss
new file mode 100644
index 0000000..85d3b8e
--- /dev/null
+++ b/src/pages/_download/index.scss
@@ -0,0 +1,308 @@
+.download {
+ margin: 3rem 0;
+
+ a {
+ transition: all 0.3s;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+
+ .page-column {
+ padding: 1.875rem 0;
+ }
+
+ .maven {
+ .page-column-title {
+ font-size: 1.5rem;
+ }
+ }
+ .downlaod-document {
+ color: var(--ifm-color-primary);
+ cursor: pointer;
+ padding-left: 0.4rem;
+ display: flex;
+ align-items: center;
+ }
+
+ &-box {
+ padding: 3.125rem;
+ box-shadow: 10px 12px 38px rgba(33, 39, 116, 0.07);
+ border-radius: 4px;
+ background-color: var(--global-colors-white);
+
+ .download-type {
+ display: flex;
+ align-items: center;
+
+ & + .download-type {
+ margin-top: 1rem;
+ }
+
+ &.way {
+ align-items: start;
+ }
+
+ label {
+ font-size: var(--global-font-size-default);
+ font-weight: 600;
+ color: var(--global-colors-text-primary);
+ margin-right: 2.125rem;
+ flex-shrink: 0;
+ width: 9.0625rem;
+ }
+
+ .tabs-radio {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ border-radius: 2px;
+
+ .radio {
+ border: var(--ifm-color-primary) solid 1px;
+ flex: 1;
+ text-align: center;
+ font-size: var(--global-font-size-medium);
+ color: var(--global-colors-text-primary);
+ min-height: 3.125rem;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+
+ &.disabled {
+ background-color: var(--global-colors-background);
+ cursor: not-allowed;
+ border-color: var(--global-colors-split);
+ color: var(--global-colors-text);
+ }
+
+ &.checked {
+ background-color: var(--ifm-color-primary);
+ color: var(--global-colors-white);
+ }
+
+ & + .radio {
+ margin-left: -1px;
+ }
+ & + .disabled {
+ border-left: none;
+ margin-left: 0;
+ }
+
+ .inner {
+ margin: 0.3125rem;
+ background-color: #f7faff;
+ width: calc(100% - 0.625rem);
+ color: var(--ifm-color-primary);
+
+ & + .inner {
+ margin-top: 0;
+ }
+ }
+ }
+ }
+ }
+ .download-way {
+ display: none;
+ &.show {
+ display: block;
+ width: 100%;
+ }
+ &.all-in-one {
+ .theme-code-block {
+ font-size: 0.875rem ;
+ padding-left: 2rem;
+ position: relative;
+ &:before {
+ content: '$';
+ position: absolute;
+ left: 1rem;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 1rem;
+ }
+ }
+ }
+ }
+
+ .tips {
+ margin-top: 1rem;
+ .title {
+ color: #556986;
+ font-weight: 600;
+ font-size: var(--global-font-size-smaller);
+ }
+ .notice-text {
+ font-size: var(--global-font-size-smaller);
+ font-weight: 600;
+ color: #556986;
+ a {
+ margin: 0 0.3125rem;
+ }
+ }
+ .notice-dir {
+ display: flex;
+ // margin-bottom: 0.5rem;
+ .notice-dir-name {
+ min-width: 10rem;
+ padding-left: 3.5rem;
+ &.md {
+ position: relative;
+ &:before {
+ position: absolute;
+ left: 0.8rem;
+ content: '';
+ width: 0;
+ height: 100%;
+ border-left: 1.5px solid #556986;
+ }
+ &:after {
+ position: absolute;
+ left: 0.8rem;
+ top: 50%;
+ content: '';
+ width: 2rem;
+ height: 0;
+ border-top: 1.5px solid #556986;
+ }
+ }
+ &.end {
+ position: relative;
+ &:before {
+ position: absolute;
+ left: 0.8rem;
+ content: '';
+ width: 0;
+ height: 50%;
+ border-left: 1.5px solid #556986;
+ }
+ &:after {
+ position: absolute;
+ left: 0.8rem;
+ top: 50%;
+ content: '';
+ width: 2rem;
+ height: 0;
+ border-top: 1.5px solid #556986;
+ }
+ }
+ }
+ .notice-dir-val {
+ margin-left: 1rem;
+ }
+ }
+ ul {
+ margin: 0;
+ padding: 0;
+ padding-left: 0.9375rem;
+ li {
+ color: #556986;
+ font-size: var(--global-font-size-smaller);
+ line-height: 1.5;
+ font-weight: 600;
+ margin-top: 0.3125rem;
+
+ code {
+ border-radius: 0.125rem;
+ border-width: 1px;
+ padding: 0.125rem 0.3125rem;
+ margin: 0 0.3125rem;
+ }
+ a {
+ margin: 0 0.3125rem;
+ }
+ }
+ }
+ }
+ }
+
+ @media screen and (max-width: 996px) {
+ &-box {
+ padding: 0;
+ box-shadow: none;
+
+ .download-type {
+ flex-direction: column;
+ align-items: flex-start;
+
+ label {
+ width: 100%;
+ }
+
+ .tabs-radio {
+ width: 100%;
+ }
+ }
+
+ .intr {
+ margin-left: 0;
+ }
+
+ .tips {
+ margin-left: 0;
+ }
+ }
+ }
+
+ .table-content {
+ .content {
+ overflow: auto;
+ }
+
+ table {
+ width: 100%;
+ display: table;
+ margin-bottom: 0;
+
+ thead {
+ tr {
+ background-color: #f7faff;
+ border-bottom: none;
+ border-top: none;
+
+ th {
+ font-size: var(--global-font-size-default);
+ color: var(--global-colors-text-primary);
+ font-weight: 700;
+ border-color: #dbe4f3;
+ line-height: 1.9;
+ white-space: nowrap;
+ }
+ }
+ }
+
+ tbody {
+ tr {
+ td {
+ border-color: #dbe4f3;
+ font-size: var(--global-font-size-medium);
+ white-space: nowrap;
+
+ a + a {
+ margin-left: 1.25rem;
+ }
+ }
+ }
+ }
+ }
+
+ .more {
+ margin-top: 2.5rem;
+
+ @media screen and (max-width: 996px) {
+ margin-top: 1.5rem;
+ }
+ }
+ }
+
+ .verify {
+ font-size: var(--global-font-size-smaller);
+
+ .page-column {
+ line-height: 1.8;
+ }
+ }
+}
diff --git a/src/pages/_download/index.tsx b/src/pages/_download/index.tsx
new file mode 100644
index 0000000..4a591ff
--- /dev/null
+++ b/src/pages/_download/index.tsx
@@ -0,0 +1,606 @@
+import clsx from 'clsx';
+import CodeBlock from '@theme/CodeBlock';
+import Layout from '../../theme/Layout';
+import Link from '@docusaurus/Link';
+import More from '@site/src/components/More';
+import PageColumn from '@site/src/components/PageColumn';
+import React, { useEffect, useState } from 'react';
+import Translate, { translate } from '@docusaurus/Translate';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import './index.scss';
+import {
+ CPUEnum,
+ DownloadLinkProps,
+ JDKEnum,
+ VersionEnum,
+ getAllDownloadLinks,
+ getAllFlinkConnectorDownloadLinks,
+ getAllSparkConnectorDownloadLinks,
+ getAllRelease,
+} from '@site/src/constant/download.data';
+import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
+
+const BINARY_VERSION = [
+ { label: `${VersionEnum.Latest} ( Latest )`, value: VersionEnum.Latest },
+ { label: `${VersionEnum.Prev} ( Stable )`, value: VersionEnum.Prev },
+ { label: `${VersionEnum.Earlier} ( Stable )`, value: VersionEnum.Earlier },
+];
+
+const JDK = [
+ { label: 'JDK 8', value: JDKEnum.JDK8 },
+ { label: 'JDK 11', value: JDKEnum.JDK11 },
+];
+
+export default function Download(): JSX.Element {
+ const {
+ siteConfig,
+ i18n: { currentLocale, locales, localeConfigs },
+ } = useDocusaurusContext();
+
+ const [version, setVersion] = useState<string>(VersionEnum.Latest);
+ const [cpus, setCpus] = useState<any[]>([]);
+ const [cpu, setCPU] = useState<string>(CPUEnum.IntelAvx2);
+ const [jdk, setJDK] = useState<string>(JDKEnum.JDK8);
+ const [current, setCurrent] = useState<DownloadLinkProps>();
+ const [downloadWay, setDownloadWay] = useState<string>('all-in-one');
+
+ const FLINK_CONNECTOR = getAllFlinkConnectorDownloadLinks(currentLocale);
+ const SPARK_CONNECTOR = getAllSparkConnectorDownloadLinks(currentLocale);
+ const ALL_RELEASE = getAllRelease(currentLocale);
+ let ALL_RELEASE_VERSION = {};
+ ALL_RELEASE.forEach(item => {
+ const info: any = Array.isArray(item.download) ? item.download.find(item => item.cpu === 'X64 ( avx2 )') : {};
+ ALL_RELEASE_VERSION[item.version] = {
+ cpu: CPUEnum.IntelAvx2,
+ binary: info.binary,
+ source: info.source,
+ };
+ });
+ const [releaseUrls, setReleaseUrls] = useState(ALL_RELEASE_VERSION);
+
+ const changeVersion = (val: string) => {
+ setVersion(val);
+ };
+ const changeCPU = (val: string) => {
+ setCPU(val);
+ };
+ const changeJDK = (val: string) => {
+ // if (version === VersionEnum.Latest && val !== JDKEnum.JDK8) return;
+ if (val !== JDKEnum.JDK8) return;
+ setJDK(val);
+ };
+
+ const getDownloadLinks = () => {
+ const text = `${version}-${cpu}-${jdk}`;
+ const linkObj = getAllDownloadLinks(currentLocale).find(item => item.id === text);
+ setCurrent(linkObj);
+ if (linkObj && !linkObj.sh) {
+ setDownloadWay('download');
+ }
+ };
+
+ function downloadFile(url: string) {
+ const a = document.createElement('a');
+ a.download = url;
+ a.href = url;
+ a.target = '_blank';
+ const clickEvt = new MouseEvent('click', {
+ view: window,
+ bubbles: true,
+ cancelable: true,
+ });
+ a.dispatchEvent(clickEvt);
+ a.remove();
+ }
+
+ const downloadDocument = () => {
+ const url =
+ currentLocale === 'en'
+ ? 'https://cdnd.selectdb.com/assets/files/Apache Doris Docs (English).pdf'
+ : 'https://cdnd.selectdb.com/assets/files/Apache Doris Docs (中文).pdf';
+ downloadFile(url);
+ };
+
+ const CPU = [
+ { label: 'X64 ( avx2 )', value: CPUEnum.IntelAvx2 },
+ { label: 'X64 ( no avx2 )', value: CPUEnum.IntelNoAvx2 },
+ { label: 'ARM64', value: CPUEnum.ARM },
+ ];
+
+ const getCpus = version => {
+ const currentCpus = [];
+ getAllDownloadLinks(currentLocale).forEach(item => {
+ if (item.id.includes(version)) {
+ const matchCpu = CPU.find(cpu => item.id.includes(cpu.value));
+ currentCpus.push(matchCpu);
+ }
+ });
+ return currentCpus;
+ };
+
+ useEffect(() => {
+ getDownloadLinks();
+ }, [version, cpu, jdk]);
+
+ useEffect(() => {
+ const currentCpus = getCpus(version);
+ setCpus(currentCpus);
+ setCPU(CPUEnum.IntelAvx2);
+ setJDK(JDKEnum.JDK8);
+ }, [version]);
+
+ function handleCPUChange(cpu: any, currentVersionInfo: any) {
+ const info = currentVersionInfo.download.find(item => item.cpu === cpu);
+ setReleaseUrls({
+ ...releaseUrls,
+ [currentVersionInfo.version]: {
+ binary: info.binary,
+ source: info.source,
+ },
+ });
+ }
+
+ return (
+ <Layout
+ title={translate({ id: 'download.title', message: 'Download' })}
+ description={translate({
+ id: 'homepage.banner.subTitle',
+ message: 'An easy-to-use, high-performance and unified analytical database',
+ })}
+ wrapperClassName="download"
+ >
+ <section className="quick-download">
+ <PageColumn
+ align="left"
+ title={
+ <Translate id="download.quick.download" description="Quick Download">
+ Quick Download
+ </Translate>
+ }
+ >
+ <div className="download-box">
+ <div className="download-type">
+ <label>
+ <Translate id="download.version" description="Binary Version">
+ Version
+ </Translate>
+ </label>
+ <div className="tabs-radio">
+ {BINARY_VERSION.map(item => (
+ <div
+ className={clsx('radio', {
+ checked: version === item.value,
+ })}
+ key={item.value}
+ onClick={() => changeVersion(item.value)}
+ >
+ {item.label}
+ </div>
+ ))}
+ </div>
+ </div>
+ <div className="download-type">
+ <label>
+ <Translate id="download.cpu.model" description="CPU Model">
+ CPU Model
+ </Translate>
+ </label>
+ <div className="tabs-radio">
+ {cpus.map(item => (
+ <div
+ className={clsx('radio', {
+ checked: cpu === item.value,
+ })}
+ key={item.value}
+ onClick={() => changeCPU(item.value)}
+ >
+ {item.label}
+ </div>
+ ))}
+ </div>
+ </div>
+ {/* <div className="download-type">
+ <label>
+ <Translate id="download.jdk.version" description="JDK Version">
+ JDK Version
+ </Translate>
+ </label>
+ <div className="tabs-radio">
+ {JDK.map(item => (
+ <div
+ className={clsx('radio', {
+ checked: jdk === item.value,
+ // disabled: version === VersionEnum.Latest && item.value !== JDKEnum.JDK8,
+ disabled: item.value !== JDKEnum.JDK8,
+ })}
+ key={item.value}
+ onClick={() => changeJDK(item.value)}
+ >
+ {item.label}
+ </div>
+ ))}
+ </div>
+ </div> */}
+ {current && current?.sh && (
+ <div className="download-type">
+ <label>
+ <Translate id="download.download.link" description="Download">
+ Download
+ </Translate>
+ </label>
+ <div className="tabs-radio">
+ <div
+ onClick={() => setDownloadWay('all-in-one')}
+ className={clsx('radio', {
+ checked: downloadWay === 'all-in-one',
+ })}
+ >
+ <span>Binary</span>
+ </div>
+
+ <div
+ onClick={() => setDownloadWay('download')}
+ className={clsx('radio', {
+ checked: downloadWay === 'download',
+ })}
+ >
+ <span>Source</span>
+ </div>
+ </div>
+ </div>
+ )}
+
+ <div className="download-type way">
+ <label>
+ {!current?.sh && (
+ <Translate id="download.download.link" description="Download">
+ Download
+ </Translate>
+ )}
+ </label>
+ <div
+ className={clsx('download-way all-in-one', {
+ show: downloadWay === 'all-in-one',
+ })}
+ >
+ {current && current.sh && (
+ <div className="tabs-radio">
+ <div className="radio">
+ <div className="inner" key={current.sh?.label}>
+ <Link to={current.sh?.links.source}>{current.sh?.label}</Link>
+ <span> ( </span>
+ <Link to={current.sh?.links.signature}>asc</Link>,{' '}
+ <Link to={current.sh?.links.sha512}>sha512</Link>
+ <span> )</span>
+ </div>
+ </div>
+ </div>
+ )}
+ {version === VersionEnum.Latest && (
+ <div className="tips">
+ <div className="title">
+ <Translate id="Notice">Notice:</Translate>
+ </div>
+ <div className="notice-text">
+ For detailed upgrade precautions, please refer to the
+ <Link to="https://github.com/apache/doris/issues/27909">2.0.3</Link>
+ and the
+ <Link to="/docs/dev/install/standard-deployment">deployment</Link> and
+ cluster
+ <Link to="/docs/dev/admin-manual/cluster-management/upgrade">upgrade</Link>
+ manual.
+ </div>
+ </div>
+ )}
+ </div>
+ <div
+ className={clsx('download-way', {
+ show: downloadWay === 'download',
+ })}
+ >
+ <div className="tabs-radio">
+ <div className="radio">
+ {current?.items.map(item => (
+ <div className="inner" key={item.label}>
+ <Link to={item?.links.source}>{item?.label}</Link>
+ <span> ( </span>
+ <Link to={item?.links.signature}>asc</Link>,{' '}
+ <Link to={item?.links.sha512}>sha512</Link>
+ <span> )</span>
+ </div>
+ ))}
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </PageColumn>
+ </section>
+ <section className="table-content">
+ <PageColumn
+ align="left"
+ title={<Translate id="download.release">All Releases</Translate>}
+ footer={
+ <More
+ text={<Translate id="download.release.more">More</Translate>}
+ link="https://archive.apache.org/dist/doris/"
+ />
+ }
+ >
+ <div className="content">
+ <table>
+ <thead>
+ <tr>
+ <th>
+ <Translate id="download.all.release.version">Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.all.release.date">Release Date</Translate>
+ </th>
+ <th>
+ <Translate id="download.cpu.model">CPU Model</Translate>
+ </th>
+ <th>
+ <Translate id="download.all.release.download">Download</Translate>
+ </th>
+ <th>
+ <Translate id="download.all.release.note">Release Notes</Translate>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ {ALL_RELEASE.map((item, index) => (
+ <tr key={index}>
+ <td>{item.version}</td>
+ <td>{item.date}</td>
+ <td>
+ {/* <DropdownNavbarItem items={item.download} />, */}
+
+ {Array.isArray(item.download) ? (
+ <select
+ style={{ height: 30 }}
+ onChange={e => handleCPUChange(e.target.value, item)}
+ >
+ {item.download.map(item => (
+ <option key={item.cpu} value={item.cpu}>
+ {item.cpu}
+ </option>
+ ))}
+ </select>
+ ) : (
+ <></>
+ )}
+ </td>
+ <td>
+ {Array.isArray(item.download) ? (
+ <div>
+ <Link to={releaseUrls[item.version].source}>
+ <Translate id="download.source">Source</Translate>
+ </Link>
+ <span style={{ padding: '0 0.28rem' }}>/</span>
+ <Link to={releaseUrls[item.version].binary}>
+ <Translate id="download.all.binary">Binary</Translate>
+ </Link>
+ </div>
+ ) : (
+ <Link to={item.download}>
+ <Translate id="download.source.binary">Source / Binary</Translate>
+ </Link>
+ )}
+ </td>
+ <td>
+ <Link to={item.note}>Release Notes</Link>
+ </td>
+ </tr>
+ ))}
+ </tbody>
+ </table>
+ </div>
+ </PageColumn>
+ </section>
+ <section className="table-content">
+ <PageColumn
+ align="left"
+ title={
+ <Translate id="download.flink.connector" description="Flink Doris Connector">
+ Flink Doris Connector
+ </Translate>
+ }
+ >
+ <div className="content">
+ <table>
+ <thead>
+ <tr>
+ <th>
+ <Translate id="download.flink.connector.version">Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.flink.release.date">Release Date</Translate>
+ </th>
+ <th>
+ <Translate id="download.flink.version">Flink Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.flink.scala.version">Scala Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.flink.doris.version">Doris Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.source">Source</Translate>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ {FLINK_CONNECTOR.map((item, index) => (
+ <tr key={index}>
+ <td>{item.version}</td>
+ <td>{item.date}</td>
+ <td>{item.flink}</td>
+ <td>{item.scala}</td>
+ <td>{item.doris}</td>
+ <td>
+ <Link to={item.download}>
+ <Translate id="download">Download</Translate>
+ </Link>
+ <Link to={item.github}>GitHub</Link>
+ </td>
+ </tr>
+ ))}
+ </tbody>
+ </table>
+ </div>
+ </PageColumn>
+ </section>
+ <section className="maven">
+ <PageColumn
+ align="left"
+ title={
+ <Translate id="download.maven" description="Maven">
+ Maven
+ </Translate>
+ }
+ >
+ <CodeBlock language="xml" title="" showLineNumbers>
+ {`<dependency>
+ <groupId>org.apache.doris</groupId>
+ <artifactId>flink-doris-connector-1.14_2.12</artifactId>
+ <!--artifactId>flink-doris-connector-1.13_2.12</artifactId-->
+ <!--artifactId>flink-doris-connector-1.12_2.12</artifactId-->
+ <!--artifactId>flink-doris-connector-1.11_2.12</artifactId-->
+ <!--version>1.0.3</version-->
+ <version>1.1.0</version>
+</dependency>`}
+ </CodeBlock>
+ </PageColumn>
+ </section>
+ <section className="table-content">
+ <PageColumn
+ align="left"
+ title={
+ <Translate id="download.spark.connector" description="Spark Doris Connector">
+ Spark Doris Connector
+ </Translate>
+ }
+ >
+ <div className="content">
+ <table>
+ <thead>
+ <tr>
+ <th>
+ <Translate id="download.spark.connector.version">Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.spark.release.date">Release Date</Translate>
+ </th>
+ <th>
+ <Translate id="download.spark.version">Spark Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.spark.scala.version">Scala Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.spark.doris.version">Doris Version</Translate>
+ </th>
+ <th>
+ <Translate id="download.source">Source</Translate>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ {SPARK_CONNECTOR.map((item, index) => (
+ <tr key={index}>
+ <td>{item.version}</td>
+ <td>{item.date}</td>
+ <td>{item.spark}</td>
+ <td>{item.scala}</td>
+ <td>{item.doris}</td>
+ <td>
+ <Link to={item.download}>
+ <Translate id="download">Download</Translate>
+ </Link>
+ <Link to={item.github}>GitHub</Link>
+ </td>
+ </tr>
+ ))}
+ </tbody>
+ </table>
+ </div>
+ </PageColumn>
+ </section>
+ <section className="maven">
+ <PageColumn
+ align="left"
+ title={
+ <Translate id="download.maven" description="Maven">
+ Maven
+ </Translate>
+ }
+ >
+ <CodeBlock language="xml" title="" showLineNumbers>
+ {`<dependency>
+ <groupId>org.apache.doris</groupId>
+ <artifactId>spark-doris-connector-3.2_2.12</artifactId>
+ <!--artifactId>spark-doris-connector-3.1_2.12</artifactId-->
+ <!--artifactId>spark-doris-connector-2.3_2.11</artifactId-->
+ <!--version>1.0.1</version-->
+ <version>1.1.0</version>
+</dependency>`}
+ </CodeBlock>
+ </PageColumn>
+ </section>
+ {/* <section className="table-content">
+ <PageColumn
+ align="left"
+ title={
+ <Translate id="download.document" description="文档">
+ Document
+ </Translate>
+ }
+ >
+ <div className="content">
+ <p style={{ display: 'flex', alignItems: 'center' }}>
+ Click to download the latest
+ <span className="downlaod-document" onClick={downloadDocument}>
+ offline documents{' '}
+ <img
+ style={{ width: '1.2rem', height: '1.2rem', paddingLeft: '0.2rem' }}
+ src={require('@site/static/images/icon/download.png').default}
+ alt=""
+ />
+ </span>
+ </p>
+ </div>
+ </PageColumn>
+ </section> */}
+ <section className="verify">
+ <PageColumn
+ align="left"
+ title={
+ <Translate id="download.verify" description="Verify">
+ Verify
+ </Translate>
+ }
+ >
+ <Translate id="download.verify.w1">To verify the downloaded files, please read</Translate>
+ <Link to="/community/release-and-verify/release-verify">
+ <Translate id="download.verify.w2"> Verify Apache Release </Translate>
+ </Link>
+ <Translate id="download.verify.w3"> and using these </Translate>
+ <Link to="https://downloads.apache.org/doris/KEYS">
+ <Translate id="download.verify.w4"> Keys</Translate>
+ </Link>
+ <Translate id="download.verify.w5">. After verification, please read</Translate>
+ <Link to="/docs/install/source-install/compilation">
+ <Translate id="download.verify.w6"> Compilation </Translate>
+ </Link>
+ <Translate id="download.verify.w7"> and </Translate>
+ <Link to="/docs/install/install-deploy">
+ <Translate id="download.verify.w8"> Installation and Deployment </Translate>
+ </Link>
+ <Translate id="download.verify.w9"> to compile and install Doris.</Translate>
+ </PageColumn>
+ </section>
+ </Layout>
+ );
+}
diff --git a/src/pages/download/index.scss b/src/pages/download/index.scss
index d74074d..4d62a46 100644
--- a/src/pages/download/index.scss
+++ b/src/pages/download/index.scss
@@ -1,308 +1,3 @@
-.download {
- margin: 3rem 0;
-
- a {
- transition: all 0.3s;
-
- &:hover {
- text-decoration: underline;
- }
- }
-
- .page-column {
- padding: 1.875rem 0;
- }
-
- .maven {
- .page-column-title {
- font-size: 1.5rem;
- }
- }
- .downlaod-document {
- color: var(--ifm-color-primary);
- cursor: pointer;
- padding-left: 0.4rem;
- display: flex;
- align-items: center;
- }
-
- &-box {
- padding: 3.125rem;
- box-shadow: 10px 12px 38px rgba(33, 39, 116, 0.07);
- border-radius: 4px;
- background-color: var(--global-colors-white);
-
- .download-type {
- display: flex;
- align-items: center;
-
- & + .download-type {
- margin-top: 1rem;
- }
-
- &.way {
- align-items: start;
- }
-
- label {
- font-size: var(--global-font-size-default);
- font-weight: 600;
- color: var(--global-colors-text-primary);
- margin-right: 2.125rem;
- flex-shrink: 0;
- width: 9.0625rem;
- }
-
- .tabs-radio {
- flex: 1;
- display: flex;
- align-items: center;
- border-radius: 2px;
-
- .radio {
- border: var(--ifm-color-primary) solid 1px;
- flex: 1;
- text-align: center;
- font-size: var(--global-font-size-medium);
- color: var(--global-colors-text-primary);
- min-height: 3.125rem;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- cursor: pointer;
-
- &.disabled {
- background-color: var(--global-colors-background);
- cursor: not-allowed;
- border-color: var(--global-colors-split);
- color: var(--global-colors-text);
- }
-
- &.checked {
- background-color: var(--ifm-color-primary);
- color: var(--global-colors-white);
- }
-
- & + .radio {
- margin-left: -1px;
- }
- & + .disabled {
- border-left: none;
- margin-left: 0;
- }
-
- .inner {
- margin: 0.3125rem;
- background-color: #f7faff;
- width: calc(100% - 0.625rem);
- color: var(--ifm-color-primary);
-
- & + .inner {
- margin-top: 0;
- }
- }
- }
- }
- }
- .download-way {
- display: none;
- &.show {
- display: block;
- width: 100%;
- }
- &.all-in-one {
- .theme-code-block {
- font-size: 1rem;
- padding-left: 2rem;
- position: relative;
- &:before {
- content: '$';
- position: absolute;
- left: 1rem;
- top: 50%;
- transform: translateY(-50%);
- font-size: 1rem;
- }
- }
- }
- }
-
- .tips {
- margin-top: 1rem;
- .title {
- color: #556986;
- font-weight: 600;
- font-size: var(--global-font-size-smaller);
- }
- .notice-text {
- font-size: var(--global-font-size-smaller);
- font-weight: 600;
- color: #556986;
- a {
- margin: 0 0.3125rem;
- }
- }
- .notice-dir {
- display: flex;
- // margin-bottom: 0.5rem;
- .notice-dir-name {
- min-width: 10rem;
- padding-left: 3.5rem;
- &.md {
- position: relative;
- &:before {
- position: absolute;
- left: 0.8rem;
- content: '';
- width: 0;
- height: 100%;
- border-left: 1.5px solid #556986;
- }
- &:after {
- position: absolute;
- left: 0.8rem;
- top: 50%;
- content: '';
- width: 2rem;
- height: 0;
- border-top: 1.5px solid #556986;
- }
- }
- &.end {
- position: relative;
- &:before {
- position: absolute;
- left: 0.8rem;
- content: '';
- width: 0;
- height: 50%;
- border-left: 1.5px solid #556986;
- }
- &:after {
- position: absolute;
- left: 0.8rem;
- top: 50%;
- content: '';
- width: 2rem;
- height: 0;
- border-top: 1.5px solid #556986;
- }
- }
- }
- .notice-dir-val {
- margin-left: 1rem;
- }
- }
- ul {
- margin: 0;
- padding: 0;
- padding-left: 0.9375rem;
- li {
- color: #556986;
- font-size: var(--global-font-size-smaller);
- line-height: 1.5;
- font-weight: 600;
- margin-top: 0.3125rem;
-
- code {
- border-radius: 0.125rem;
- border-width: 1px;
- padding: 0.125rem 0.3125rem;
- margin: 0 0.3125rem;
- }
- a {
- margin: 0 0.3125rem;
- }
- }
- }
- }
- }
-
- @media screen and (max-width: 996px) {
- &-box {
- padding: 0;
- box-shadow: none;
-
- .download-type {
- flex-direction: column;
- align-items: flex-start;
-
- label {
- width: 100%;
- }
-
- .tabs-radio {
- width: 100%;
- }
- }
-
- .intr {
- margin-left: 0;
- }
-
- .tips {
- margin-left: 0;
- }
- }
- }
-
- .table-content {
- .content {
- overflow: auto;
- }
-
- table {
- width: 100%;
- display: table;
- margin-bottom: 0;
-
- thead {
- tr {
- background-color: #f7faff;
- border-bottom: none;
- border-top: none;
-
- th {
- font-size: var(--global-font-size-default);
- color: var(--global-colors-text-primary);
- font-weight: 700;
- border-color: #dbe4f3;
- line-height: 1.9;
- white-space: nowrap;
- }
- }
- }
-
- tbody {
- tr {
- td {
- border-color: #dbe4f3;
- font-size: var(--global-font-size-medium);
- white-space: nowrap;
-
- a + a {
- margin-left: 1.25rem;
- }
- }
- }
- }
- }
-
- .more {
- margin-top: 2.5rem;
-
- @media screen and (max-width: 996px) {
- margin-top: 1.5rem;
- }
- }
- }
-
- .verify {
- font-size: var(--global-font-size-smaller);
-
- .page-column {
- line-height: 1.8;
- }
- }
+.run-anywhere {
+ background: #F7F9FE;
}
diff --git a/src/pages/download/index.tsx b/src/pages/download/index.tsx
index 4a591ff..fabec89 100644
--- a/src/pages/download/index.tsx
+++ b/src/pages/download/index.tsx
@@ -1,145 +1,20 @@
-import clsx from 'clsx';
-import CodeBlock from '@theme/CodeBlock';
-import Layout from '../../theme/Layout';
+import { translate } from '@docusaurus/Translate';
+import React from 'react';
+import PageHeader from '@site/src/components/PageHeader';
+import Layout from '@site/src/theme/Layout';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import { NewIcon } from '@site/src/components/Icons/new-icon';
+import DownloadForm from '@site/src/components/download-form/download-form';
+import { DORIS_VERSIONS, OLD_VERSIONS, RUN_ANYWHERE } from '@site/src/constant/download.data';
+import { ExternalLinkArrowIcon } from '@site/src/components/Icons/external-link-arrow-icon';
+import DownloadFormSimple from '@site/src/components/download-form/download-form-simple';
import Link from '@docusaurus/Link';
-import More from '@site/src/components/More';
-import PageColumn from '@site/src/components/PageColumn';
-import React, { useEffect, useState } from 'react';
-import Translate, { translate } from '@docusaurus/Translate';
-import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import './index.scss';
-import {
- CPUEnum,
- DownloadLinkProps,
- JDKEnum,
- VersionEnum,
- getAllDownloadLinks,
- getAllFlinkConnectorDownloadLinks,
- getAllSparkConnectorDownloadLinks,
- getAllRelease,
-} from '@site/src/constant/download.data';
-import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
+import ReadMore from '@site/src/components/ReadMore';
+import LinkWithArrow from '../../components/link-arrow';
-const BINARY_VERSION = [
- { label: `${VersionEnum.Latest} ( Latest )`, value: VersionEnum.Latest },
- { label: `${VersionEnum.Prev} ( Stable )`, value: VersionEnum.Prev },
- { label: `${VersionEnum.Earlier} ( Stable )`, value: VersionEnum.Earlier },
-];
-
-const JDK = [
- { label: 'JDK 8', value: JDKEnum.JDK8 },
- { label: 'JDK 11', value: JDKEnum.JDK11 },
-];
-
-export default function Download(): JSX.Element {
- const {
- siteConfig,
- i18n: { currentLocale, locales, localeConfigs },
- } = useDocusaurusContext();
-
- const [version, setVersion] = useState<string>(VersionEnum.Latest);
- const [cpus, setCpus] = useState<any[]>([]);
- const [cpu, setCPU] = useState<string>(CPUEnum.IntelAvx2);
- const [jdk, setJDK] = useState<string>(JDKEnum.JDK8);
- const [current, setCurrent] = useState<DownloadLinkProps>();
- const [downloadWay, setDownloadWay] = useState<string>('all-in-one');
-
- const FLINK_CONNECTOR = getAllFlinkConnectorDownloadLinks(currentLocale);
- const SPARK_CONNECTOR = getAllSparkConnectorDownloadLinks(currentLocale);
- const ALL_RELEASE = getAllRelease(currentLocale);
- let ALL_RELEASE_VERSION = {};
- ALL_RELEASE.forEach(item => {
- const info: any = Array.isArray(item.download) ? item.download.find(item => item.cpu === 'X64 ( avx2 )') : {};
- ALL_RELEASE_VERSION[item.version] = {
- cpu: CPUEnum.IntelAvx2,
- binary: info.binary,
- source: info.source,
- };
- });
- const [releaseUrls, setReleaseUrls] = useState(ALL_RELEASE_VERSION);
-
- const changeVersion = (val: string) => {
- setVersion(val);
- };
- const changeCPU = (val: string) => {
- setCPU(val);
- };
- const changeJDK = (val: string) => {
- // if (version === VersionEnum.Latest && val !== JDKEnum.JDK8) return;
- if (val !== JDKEnum.JDK8) return;
- setJDK(val);
- };
-
- const getDownloadLinks = () => {
- const text = `${version}-${cpu}-${jdk}`;
- const linkObj = getAllDownloadLinks(currentLocale).find(item => item.id === text);
- setCurrent(linkObj);
- if (linkObj && !linkObj.sh) {
- setDownloadWay('download');
- }
- };
-
- function downloadFile(url: string) {
- const a = document.createElement('a');
- a.download = url;
- a.href = url;
- a.target = '_blank';
- const clickEvt = new MouseEvent('click', {
- view: window,
- bubbles: true,
- cancelable: true,
- });
- a.dispatchEvent(clickEvt);
- a.remove();
- }
-
- const downloadDocument = () => {
- const url =
- currentLocale === 'en'
- ? 'https://cdnd.selectdb.com/assets/files/Apache Doris Docs (English).pdf'
- : 'https://cdnd.selectdb.com/assets/files/Apache Doris Docs (中文).pdf';
- downloadFile(url);
- };
-
- const CPU = [
- { label: 'X64 ( avx2 )', value: CPUEnum.IntelAvx2 },
- { label: 'X64 ( no avx2 )', value: CPUEnum.IntelNoAvx2 },
- { label: 'ARM64', value: CPUEnum.ARM },
- ];
-
- const getCpus = version => {
- const currentCpus = [];
- getAllDownloadLinks(currentLocale).forEach(item => {
- if (item.id.includes(version)) {
- const matchCpu = CPU.find(cpu => item.id.includes(cpu.value));
- currentCpus.push(matchCpu);
- }
- });
- return currentCpus;
- };
-
- useEffect(() => {
- getDownloadLinks();
- }, [version, cpu, jdk]);
-
- useEffect(() => {
- const currentCpus = getCpus(version);
- setCpus(currentCpus);
- setCPU(CPUEnum.IntelAvx2);
- setJDK(JDKEnum.JDK8);
- }, [version]);
-
- function handleCPUChange(cpu: any, currentVersionInfo: any) {
- const info = currentVersionInfo.download.find(item => item.cpu === cpu);
- setReleaseUrls({
- ...releaseUrls,
- [currentVersionInfo.version]: {
- binary: info.binary,
- source: info.source,
- },
- });
- }
-
+export default function Download() {
return (
<Layout
title={translate({ id: 'download.title', message: 'Download' })}
@@ -149,458 +24,149 @@
})}
wrapperClassName="download"
>
- <section className="quick-download">
- <PageColumn
- align="left"
- title={
- <Translate id="download.quick.download" description="Quick Download">
- Quick Download
- </Translate>
+ <PageHeader
+ className="lg:pt-[7.5rem] g-white"
+ title="Quick Download & Easy Deployment"
+ subtitle="Download the latest version and enjoy effortless deployment for your big data analytics needs."
+ />
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="Apache Doris 2.0"
+ disabledExpand={true}
+ newLink={
+ <div className="flex items-center space-x-2 pb-8 text-[#0065FD]">
+ <NewIcon />
+ <ExternalLink
+ linkIcon={false}
+ to="/docs/releasenotes/release-2.0.3"
+ label="The latest version 2.0.3 is available now !"
+ className="bg-white p-0 text-[#444FD9]"
+ ></ExternalLink>
+ </div>
}
- >
- <div className="download-box">
- <div className="download-type">
- <label>
- <Translate id="download.version" description="Binary Version">
- Version
- </Translate>
- </label>
- <div className="tabs-radio">
- {BINARY_VERSION.map(item => (
- <div
- className={clsx('radio', {
- checked: version === item.value,
- })}
- key={item.value}
- onClick={() => changeVersion(item.value)}
- >
- {item.label}
- </div>
- ))}
- </div>
+ description="Apache Doris 2.0 milestone has merged over 4100 pull requests, representing a 70% increase from version 1.2 last year."
+ characteristic={[
+ '10 times faster data query',
+ 'Enhanced log analytics and federated query capabilities',
+ 'More efficient data writing and updates',
+ 'Improved multi-tenant and resource isolation mechanisms',
+ ]}
+ rightContent={
+ <DownloadForm versions={DORIS_VERSIONS.filter(item => item.majorVersion === '2.0')} />
+ }
+ moreLink={
+ <LinkWithArrow to="/docs/releasenotes/release-2.0.0" text="Learn more from release note" />
+ }
+ notes={
+ <>
+ Note: For detailed upgrade precautions, please refer to the{' '}
+ <Link className="text-primary underline" to="/docs/install/standard-deployment">
+ deployment
+ </Link>{' '}
+ manual and cluster{' '}
+ <Link className="text-primary underline" to="/docs/admin-manual/cluster-management/upgrade">
+ upgrade
+ </Link>{' '}
+ manual.
+ </>
+ }
+ />
+ <CollapseBox
+ title="Apache Doris 1.2 ( Stable )"
+ disabledExpand={true}
+ newLink={
+ <div className="flex items-center space-x-2 pb-8 text-[#0065FD]">
+ <NewIcon />
+ <ExternalLink
+ linkIcon={false}
+ to="/docs/releasenotes/release-1.2.7"
+ label="The latest version 1.2.7 is available now !"
+ className="bg-white p-0 text-[#444FD9]"
+ ></ExternalLink>
</div>
- <div className="download-type">
- <label>
- <Translate id="download.cpu.model" description="CPU Model">
- CPU Model
- </Translate>
- </label>
- <div className="tabs-radio">
- {cpus.map(item => (
- <div
- className={clsx('radio', {
- checked: cpu === item.value,
- })}
- key={item.value}
- onClick={() => changeCPU(item.value)}
- >
- {item.label}
- </div>
- ))}
- </div>
+ }
+ description="Apache Doris 1.2 enhance its functionality, performance, and reliability."
+ characteristic={[
+ 'Full vectorized execution engine, 3-11 times faster data query',
+ 'Merge-on-write on Unique Key Model',
+ 'Multi-Catalog to enhance data lake analytics',
+ 'Light schema change at millisecond-level and DDL auto-synchronization',
+ ]}
+ rightContent={
+ <DownloadForm versions={DORIS_VERSIONS.filter(item => item.majorVersion === '1.2')} />
+ }
+ moreLink={
+ <ExternalLink
+ to="/docs/releasenotes/release-1.2.0"
+ className="bg-white p-0 text-[#444FD9]"
+ label="Learn more from release note"
+ linkIcon={<ExternalLinkArrowIcon />}
+ ></ExternalLink>
+ }
+ notes={
+ <>
+ Note: For detailed upgrade precautions, please refer to the{' '}
+ <Link className="text-primary underline" to="/docs/install/standard-deployment">
+ deployment
+ </Link>{' '}
+ manual and cluster{' '}
+ <Link className="text-primary underline" to="/docs/admin-manual/cluster-management/upgrade">
+ upgrade
+ </Link>{' '}
+ manual.
+ </>
+ }
+ />
+ <CollapseBox
+ expand={false}
+ title="Archived releases"
+ description={
+ <div>
+ <p>
+ We have collected all the code and binaries available from previous releases. For more
+ information on the latest release, please refer to the Docs.
+ </p>
+ <p className="mt-6">
+ Kindly note that older releases are provided for archival purposes only, and are no
+ longer supported.
+ </p>
</div>
- {/* <div className="download-type">
- <label>
- <Translate id="download.jdk.version" description="JDK Version">
- JDK Version
- </Translate>
- </label>
- <div className="tabs-radio">
- {JDK.map(item => (
- <div
- className={clsx('radio', {
- checked: jdk === item.value,
- // disabled: version === VersionEnum.Latest && item.value !== JDKEnum.JDK8,
- disabled: item.value !== JDKEnum.JDK8,
- })}
- key={item.value}
- onClick={() => changeJDK(item.value)}
- >
- {item.label}
+ }
+ rightContent={<DownloadFormSimple versions={OLD_VERSIONS} />}
+ // moreLink={<ReadMore to="/docs/releasenotes/release-2.0.3" />}
+ />
+ </div>
+ <a id="runAnywhere" className="scroll-mt-20"></a>
+ <div className="run-anywhere bg-[#F7F9FE] pt-[5.5rem] pb-[7.5rem]">
+ <div className="container mx-auto">
+ <h3 className="text-center text-[#1D1D1D] text-[2.5rem] font-medium">Run anywhere</h3>
+ <ul className="mt-10 grid gap-x-6 gap-y-3 lg:grid-cols-3 lg:gap-y-0">
+ {RUN_ANYWHERE.map(item =>
+ item.title !== 'Doris on AWS' ? (
+ <Link
+ href={item.link}
+ key={item.title}
+ className="relative bg-white flex cursor-pointer flex-col items-center justify-center overflow-hidden rounded-lg border-b-4 border-b-[#444FD9] py-[2rem] px-4 lg:px-[1.5rem] shadow-[inset_0_0_0_1px_#444FD9] hover:no-underline"
+ >
+ <div className="text-2xl text-[#1D1D1D]">{item.title}</div>
+ <div className="mt-4 text-base text-center text-[#4C576C]">{item.description}</div>
+ <div className="flex items-center mt-4 text-[#444FD9]">
+ <LinkWithArrow to={item.link} text="Learn more" />
</div>
- ))}
- </div>
- </div> */}
- {current && current?.sh && (
- <div className="download-type">
- <label>
- <Translate id="download.download.link" description="Download">
- Download
- </Translate>
- </label>
- <div className="tabs-radio">
- <div
- onClick={() => setDownloadWay('all-in-one')}
- className={clsx('radio', {
- checked: downloadWay === 'all-in-one',
- })}
- >
- <span>Binary</span>
- </div>
-
- <div
- onClick={() => setDownloadWay('download')}
- className={clsx('radio', {
- checked: downloadWay === 'download',
- })}
- >
- <span>Source</span>
+ </Link>
+ ) : (
+ <div className="relative bg-white flex cursor-pointer flex-col items-center justify-center overflow-hidden rounded-lg border-b-4 border-b-[#444FD9] py-[2rem] px-4 lg:px-[1.5rem] shadow-[inset_0_0_0_1px_#444FD9] hover:no-underline">
+ <div className="text-2xl text-[#1D1D1D]">{item.title}</div>
+ <div className="mt-4 text-base text-center text-[#4C576C]">{item.description}</div>
+ <div className="flex items-center mt-4">
+ <span>Coming soon</span>
</div>
</div>
- </div>
+ ),
)}
-
- <div className="download-type way">
- <label>
- {!current?.sh && (
- <Translate id="download.download.link" description="Download">
- Download
- </Translate>
- )}
- </label>
- <div
- className={clsx('download-way all-in-one', {
- show: downloadWay === 'all-in-one',
- })}
- >
- {current && current.sh && (
- <div className="tabs-radio">
- <div className="radio">
- <div className="inner" key={current.sh?.label}>
- <Link to={current.sh?.links.source}>{current.sh?.label}</Link>
- <span> ( </span>
- <Link to={current.sh?.links.signature}>asc</Link>,{' '}
- <Link to={current.sh?.links.sha512}>sha512</Link>
- <span> )</span>
- </div>
- </div>
- </div>
- )}
- {version === VersionEnum.Latest && (
- <div className="tips">
- <div className="title">
- <Translate id="Notice">Notice:</Translate>
- </div>
- <div className="notice-text">
- For detailed upgrade precautions, please refer to the
- <Link to="https://github.com/apache/doris/issues/27909">2.0.3</Link>
- and the
- <Link to="/docs/dev/install/standard-deployment">deployment</Link> and
- cluster
- <Link to="/docs/dev/admin-manual/cluster-management/upgrade">upgrade</Link>
- manual.
- </div>
- </div>
- )}
- </div>
- <div
- className={clsx('download-way', {
- show: downloadWay === 'download',
- })}
- >
- <div className="tabs-radio">
- <div className="radio">
- {current?.items.map(item => (
- <div className="inner" key={item.label}>
- <Link to={item?.links.source}>{item?.label}</Link>
- <span> ( </span>
- <Link to={item?.links.signature}>asc</Link>,{' '}
- <Link to={item?.links.sha512}>sha512</Link>
- <span> )</span>
- </div>
- ))}
- </div>
- </div>
- </div>
- </div>
- </div>
- </PageColumn>
- </section>
- <section className="table-content">
- <PageColumn
- align="left"
- title={<Translate id="download.release">All Releases</Translate>}
- footer={
- <More
- text={<Translate id="download.release.more">More</Translate>}
- link="https://archive.apache.org/dist/doris/"
- />
- }
- >
- <div className="content">
- <table>
- <thead>
- <tr>
- <th>
- <Translate id="download.all.release.version">Version</Translate>
- </th>
- <th>
- <Translate id="download.all.release.date">Release Date</Translate>
- </th>
- <th>
- <Translate id="download.cpu.model">CPU Model</Translate>
- </th>
- <th>
- <Translate id="download.all.release.download">Download</Translate>
- </th>
- <th>
- <Translate id="download.all.release.note">Release Notes</Translate>
- </th>
- </tr>
- </thead>
- <tbody>
- {ALL_RELEASE.map((item, index) => (
- <tr key={index}>
- <td>{item.version}</td>
- <td>{item.date}</td>
- <td>
- {/* <DropdownNavbarItem items={item.download} />, */}
-
- {Array.isArray(item.download) ? (
- <select
- style={{ height: 30 }}
- onChange={e => handleCPUChange(e.target.value, item)}
- >
- {item.download.map(item => (
- <option key={item.cpu} value={item.cpu}>
- {item.cpu}
- </option>
- ))}
- </select>
- ) : (
- <></>
- )}
- </td>
- <td>
- {Array.isArray(item.download) ? (
- <div>
- <Link to={releaseUrls[item.version].source}>
- <Translate id="download.source">Source</Translate>
- </Link>
- <span style={{ padding: '0 0.28rem' }}>/</span>
- <Link to={releaseUrls[item.version].binary}>
- <Translate id="download.all.binary">Binary</Translate>
- </Link>
- </div>
- ) : (
- <Link to={item.download}>
- <Translate id="download.source.binary">Source / Binary</Translate>
- </Link>
- )}
- </td>
- <td>
- <Link to={item.note}>Release Notes</Link>
- </td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- </PageColumn>
- </section>
- <section className="table-content">
- <PageColumn
- align="left"
- title={
- <Translate id="download.flink.connector" description="Flink Doris Connector">
- Flink Doris Connector
- </Translate>
- }
- >
- <div className="content">
- <table>
- <thead>
- <tr>
- <th>
- <Translate id="download.flink.connector.version">Version</Translate>
- </th>
- <th>
- <Translate id="download.flink.release.date">Release Date</Translate>
- </th>
- <th>
- <Translate id="download.flink.version">Flink Version</Translate>
- </th>
- <th>
- <Translate id="download.flink.scala.version">Scala Version</Translate>
- </th>
- <th>
- <Translate id="download.flink.doris.version">Doris Version</Translate>
- </th>
- <th>
- <Translate id="download.source">Source</Translate>
- </th>
- </tr>
- </thead>
- <tbody>
- {FLINK_CONNECTOR.map((item, index) => (
- <tr key={index}>
- <td>{item.version}</td>
- <td>{item.date}</td>
- <td>{item.flink}</td>
- <td>{item.scala}</td>
- <td>{item.doris}</td>
- <td>
- <Link to={item.download}>
- <Translate id="download">Download</Translate>
- </Link>
- <Link to={item.github}>GitHub</Link>
- </td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- </PageColumn>
- </section>
- <section className="maven">
- <PageColumn
- align="left"
- title={
- <Translate id="download.maven" description="Maven">
- Maven
- </Translate>
- }
- >
- <CodeBlock language="xml" title="" showLineNumbers>
- {`<dependency>
- <groupId>org.apache.doris</groupId>
- <artifactId>flink-doris-connector-1.14_2.12</artifactId>
- <!--artifactId>flink-doris-connector-1.13_2.12</artifactId-->
- <!--artifactId>flink-doris-connector-1.12_2.12</artifactId-->
- <!--artifactId>flink-doris-connector-1.11_2.12</artifactId-->
- <!--version>1.0.3</version-->
- <version>1.1.0</version>
-</dependency>`}
- </CodeBlock>
- </PageColumn>
- </section>
- <section className="table-content">
- <PageColumn
- align="left"
- title={
- <Translate id="download.spark.connector" description="Spark Doris Connector">
- Spark Doris Connector
- </Translate>
- }
- >
- <div className="content">
- <table>
- <thead>
- <tr>
- <th>
- <Translate id="download.spark.connector.version">Version</Translate>
- </th>
- <th>
- <Translate id="download.spark.release.date">Release Date</Translate>
- </th>
- <th>
- <Translate id="download.spark.version">Spark Version</Translate>
- </th>
- <th>
- <Translate id="download.spark.scala.version">Scala Version</Translate>
- </th>
- <th>
- <Translate id="download.spark.doris.version">Doris Version</Translate>
- </th>
- <th>
- <Translate id="download.source">Source</Translate>
- </th>
- </tr>
- </thead>
- <tbody>
- {SPARK_CONNECTOR.map((item, index) => (
- <tr key={index}>
- <td>{item.version}</td>
- <td>{item.date}</td>
- <td>{item.spark}</td>
- <td>{item.scala}</td>
- <td>{item.doris}</td>
- <td>
- <Link to={item.download}>
- <Translate id="download">Download</Translate>
- </Link>
- <Link to={item.github}>GitHub</Link>
- </td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- </PageColumn>
- </section>
- <section className="maven">
- <PageColumn
- align="left"
- title={
- <Translate id="download.maven" description="Maven">
- Maven
- </Translate>
- }
- >
- <CodeBlock language="xml" title="" showLineNumbers>
- {`<dependency>
- <groupId>org.apache.doris</groupId>
- <artifactId>spark-doris-connector-3.2_2.12</artifactId>
- <!--artifactId>spark-doris-connector-3.1_2.12</artifactId-->
- <!--artifactId>spark-doris-connector-2.3_2.11</artifactId-->
- <!--version>1.0.1</version-->
- <version>1.1.0</version>
-</dependency>`}
- </CodeBlock>
- </PageColumn>
- </section>
- {/* <section className="table-content">
- <PageColumn
- align="left"
- title={
- <Translate id="download.document" description="文档">
- Document
- </Translate>
- }
- >
- <div className="content">
- <p style={{ display: 'flex', alignItems: 'center' }}>
- Click to download the latest
- <span className="downlaod-document" onClick={downloadDocument}>
- offline documents{' '}
- <img
- style={{ width: '1.2rem', height: '1.2rem', paddingLeft: '0.2rem' }}
- src={require('@site/static/images/icon/download.png').default}
- alt=""
- />
- </span>
- </p>
- </div>
- </PageColumn>
- </section> */}
- <section className="verify">
- <PageColumn
- align="left"
- title={
- <Translate id="download.verify" description="Verify">
- Verify
- </Translate>
- }
- >
- <Translate id="download.verify.w1">To verify the downloaded files, please read</Translate>
- <Link to="/community/release-and-verify/release-verify">
- <Translate id="download.verify.w2"> Verify Apache Release </Translate>
- </Link>
- <Translate id="download.verify.w3"> and using these </Translate>
- <Link to="https://downloads.apache.org/doris/KEYS">
- <Translate id="download.verify.w4"> Keys</Translate>
- </Link>
- <Translate id="download.verify.w5">. After verification, please read</Translate>
- <Link to="/docs/install/source-install/compilation">
- <Translate id="download.verify.w6"> Compilation </Translate>
- </Link>
- <Translate id="download.verify.w7"> and </Translate>
- <Link to="/docs/install/install-deploy">
- <Translate id="download.verify.w8"> Installation and Deployment </Translate>
- </Link>
- <Translate id="download.verify.w9"> to compile and install Doris.</Translate>
- </PageColumn>
- </section>
+ </ul>
+ </div>
+ </div>
</Layout>
);
}
diff --git a/src/pages/ecosystem/cluster-management/index.tsx b/src/pages/ecosystem/cluster-management/index.tsx
new file mode 100644
index 0000000..8fc739e
--- /dev/null
+++ b/src/pages/ecosystem/cluster-management/index.tsx
@@ -0,0 +1,65 @@
+import React from 'react';
+import EcomsystemLayout from '@site/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import '../index.scss';
+
+export default function ClusterManagement() {
+ return (
+ <EcomsystemLayout>
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="Cluster Manager for Apache Doris"
+ description="One-stop database cluster management tool, developed by VeloDB."
+ characteristic={[
+ 'Create, start, stop, upgrade, and scale clusters',
+ 'Cluster inspection',
+ 'Monitoring and alerting',
+ 'Auditing',
+ ]}
+ rightContent={
+ <img src={require(`@site/static/images/ecomsystem/cluster-manage.png`).default} alt="" />
+ }
+ moreLink={
+ <>
+ <ExternalLink
+ href="https://www.velodb.io/download/enterprise#core"
+ label="Download"
+ ></ExternalLink>
+ <ExternalLink
+ href="https://docs.velodb.io/enterprise/velodb-enterprise-overview"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ <CollapseBox
+ title="Doris Operator"
+ description="Run Apache Doris on K8s, developed by VeloDB."
+ characteristic={[
+ 'Diverse PV management',
+ 'Pod deployment configuration ',
+ 'Separation of config files and services',
+ 'Smooth service upgrade',
+ 'Auto-scaling',
+ 'Support for Helm',
+ ]}
+ rightContent={
+ <img src={require(`@site/static/images/ecomsystem/doris-operator.png`).default} alt="" />
+ }
+ moreLink={
+ <>
+ <ExternalLink href="https://www.velodb.io/download/tools" label="Download"></ExternalLink>
+ <ExternalLink
+ href="https://github.com/apache/doris/blob/master/docs/en/docs/install/k8s-deploy.md"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ </div>
+ </EcomsystemLayout>
+ );
+}
diff --git a/src/pages/ecosystem/connectors/index.tsx b/src/pages/ecosystem/connectors/index.tsx
new file mode 100644
index 0000000..3609904
--- /dev/null
+++ b/src/pages/ecosystem/connectors/index.tsx
@@ -0,0 +1,79 @@
+import React from 'react';
+import EcomsystemLayout from '@site/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import '../index.scss';
+
+export default function Connectors() {
+ return (
+ <EcomsystemLayout>
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="Flink Doris Connector"
+ description="Read, insert, modify and delete data stored in Doris through Flink."
+ characteristic={[
+ 'Support reading and writing via DataStream and SQL',
+ 'Ensure exactly-once semantics in data ingestion',
+ 'Support data updates and deletions for Doris Unique table',
+ 'Implements multi-table and entire database data synchronization for MySQL, PostgreSQL, Oracle and other databases through Flink CDC',
+ ]}
+ rightContent={<img src={require(`@site/static/images/ecomsystem/flink.png`).default} alt="" />}
+ moreLink={
+ <>
+ <ExternalLink
+ href="https://github.com/apache/doris-flink-connector"
+ label="Download"
+ ></ExternalLink>
+ <ExternalLink
+ href="https://doris.apache.org/docs/ecosystem/flink-doris-connector"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ <CollapseBox
+ title="Spark Doris Connector"
+ description="Read data stored in Doris and write data to Doris through Spark."
+ characteristic={[
+ 'Access Doris by SparkSQL, DataFrame, RDD, PySpark',
+ 'Support distributed reading data from Doris at scale',
+ ]}
+ rightContent={<img src={require(`@site/static/images/ecomsystem/spark.png`).default} alt="" />}
+ moreLink={
+ <>
+ <ExternalLink
+ href="https://github.com/apache/doris-spark-connector"
+ label="Download"
+ ></ExternalLink>
+ <ExternalLink
+ href="https://doris.apache.org/docs/ecosystem/spark-doris-connector"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ <CollapseBox
+ title="dbt Doris Adapter"
+ description="An Extract, Load, Transform (ELT) component."
+ characteristic={[
+ 'Dedicated to data transforming in ELT. ',
+ 'Support three materialization methods: View, Table and Incremental',
+ ]}
+ rightContent={<img src={require(`@site/static/images/ecomsystem/dbt.png`).default} alt="" />}
+ moreLink={
+ <>
+ <ExternalLink href="https://github.com/selectdb/dbt-doris" label="Download"></ExternalLink>
+ <ExternalLink
+ href="https://doris.apache.org/docs/ecosystem/dbt-doris-adapter"
+ className="sub-btn"
+ label="Docs"
+ ></ExternalLink>
+ </>
+ }
+ />
+ </div>
+ </EcomsystemLayout>
+ );
+}
diff --git a/src/pages/ecosystem/distributions-and-packaging/index.tsx b/src/pages/ecosystem/distributions-and-packaging/index.tsx
new file mode 100644
index 0000000..110c199
--- /dev/null
+++ b/src/pages/ecosystem/distributions-and-packaging/index.tsx
@@ -0,0 +1,62 @@
+import React from 'react';
+import EcomsystemLayout from '@site/src/components/ecomsystem/ecomsystem-layout/ecomsystem-layout';
+import ExternalLink from '@site/src/components/external-link/external-link';
+import CollapseBox from '@site/src/components/collapse-box/collapse-box';
+import '../index.scss';
+
+export default function DistributionsAndPackaging() {
+ return (
+ <EcomsystemLayout>
+ <div className="container mx-auto flex flex-col flex-wrap items-center justify-center mb-[5.5rem] lg:flex-row">
+ <CollapseBox
+ title="VeloDB"
+ description={
+ <>
+ <p>
+ VeloDB is a modern data warehouse built on Apache Doris. It is designed to provide
+ lightning-fast performance for large-scale real-time data processing.{' '}
+ </p>
+ <p className="mt-6">
+ With cloud-native services and self-managed software on-premises, VeloDB offers a
+ powerful solution developed by VeloDB Inc., a leading technology company headquartered
+ in Singapore.
+ </p>
+ <p className="mt-6">
+ Businesses can leverage VeloDB to unlock invaluable insights from data with unparalleled
+ efficiency.
+ </p>
+ </>
+ }
+ rightContent={<img src={require(`@site/static/images/ecomsystem/velodb.png`).default} alt="" />}
+ moreLink={
+ <ExternalLink
+ href="https://www.velodb.io"
+ className="sub-btn"
+ label="Learn more"
+ ></ExternalLink>
+ }
+ showListIcon={false}
+ />
+ <CollapseBox
+ showListIcon={false}
+ title="SelectDB"
+ description={
+ <p>
+ SelectDB is a modern data warehouse built on Apache Doris. It is designed to deliver
+ exceptional speed and performance for processing real-time data at scale, offering
+ cloud-native services and self-managed software on-premises.{' '}
+ </p>
+ }
+ rightContent={<img src={require(`@site/static/images/ecomsystem/selectdb.png`).default} alt="" />}
+ moreLink={
+ <ExternalLink
+ href="https://www.selectdb.com"
+ className="sub-btn"
+ label="Learn more"
+ ></ExternalLink>
+ }
+ />
+ </div>
+ </EcomsystemLayout>
+ );
+}
diff --git a/src/pages/ecosystem/index.scss b/src/pages/ecosystem/index.scss
new file mode 100644
index 0000000..1a6bda7
--- /dev/null
+++ b/src/pages/ecosystem/index.scss
@@ -0,0 +1,8 @@
+.ecosystem {
+ .sub-btn {
+ height: auto;
+ color: #444fd9;
+ min-width: auto;
+ padding: 0;
+ }
+}
diff --git a/src/pages/ecosystem/index.tsx b/src/pages/ecosystem/index.tsx
new file mode 100644
index 0000000..94e937eb
--- /dev/null
+++ b/src/pages/ecosystem/index.tsx
@@ -0,0 +1,4 @@
+import React from 'react';
+export default function Ecosystem() {
+ return <></>;
+}
diff --git a/src/pages/index.scss b/src/pages/index.scss
index 7094b72..2099314 100644
--- a/src/pages/index.scss
+++ b/src/pages/index.scss
@@ -1,5 +1,5 @@
.news-section {
- background-color: #F6F8FF;
+ background-color: #f6f8ff;
.news-wrap {
height: 5rem;
@@ -45,7 +45,6 @@
justify-content: center;
.row {
-
.col:nth-child(5),
.col:nth-child(6) {
.core-feature-item {
@@ -69,7 +68,7 @@
.core-feature-title {
font-size: 1.25rem;
- font-weight: 500;
+ font-weight: 540;
color: var(--global-colors-text-black);
text-align: left;
}
@@ -116,10 +115,11 @@
}
.ready-start-wrap {
- background: url('@site/static/images/start-bg.png') no-repeat center;
+ background: url('@site/static/images/start-bg.jpg') no-repeat center;
background-size: cover;
- height: 15rem;
- padding-top: 2rem;
+
+ padding-top: 5.5rem;
+ padding-bottom: 5.5rem;
.start-title {
text-align: center;
@@ -130,7 +130,7 @@
.start-buttons {
display: flex;
justify-content: center;
-
+ margin-top: 3rem;
.start-btn {
color: var(--global-colors-white);
min-width: 8.75rem;
@@ -138,7 +138,6 @@
text-align: center;
font-size: var(--global-font-size-default);
border-radius: 4px;
- margin-top: 1.3rem;
cursor: pointer;
text-decoration: none;
@@ -152,14 +151,10 @@
margin-left: 1.2rem;
}
}
-
}
}
-
.ready-start {
- margin-bottom: 5rem;
- margin-top: -3rem;
}
@media (max-width: 996px) {
@@ -187,7 +182,7 @@
.page-column {
.communitys {
.col {
- &+.col {
+ & + .col {
margin-top: 0;
}
}
@@ -209,5 +204,182 @@
font-size: 2rem;
}
}
+}
-}
\ No newline at end of file
+.core-capabilities-group {
+ gap: 5rem 1.5rem;
+}
+
+.various-analytics-group {
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+
+ display: flex;
+ line-height: 1.6;
+ & + .various-analytics-group {
+ border-top: 1px solid #ccd4e2;
+ }
+ .items-title {
+ display: flex;
+ align-items: center;
+ margin-right: 5rem;
+ font-weight: 450;
+ font-size: 1.25rem;
+ }
+ .items-content {
+ flex: 1;
+ text-align: start;
+ font-size: 1rem;
+ line-height: 1.625;
+ font-weight: 400;
+ .links {
+ display: flex;
+ margin-top: 1.5rem;
+ gap: 2rem;
+ }
+ }
+}
+
+.swiper-button-next:active,
+.swiper-button-prev:active {
+ color: #00b1fd;
+}
+
+.swiper-pagination-bullet {
+ background: #d9d9d9;
+ margin: 0 0.5rem !important;
+}
+
+.swiper-pagination-bullet-active {
+ background: var(--ifm-color-primary);
+}
+
+.firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ left: 155px;
+ top: 150px;
+ width: auto;
+ .swiper-pagination-bullet {
+ background-color: white;
+ opacity: 80%;
+ height: 0.25rem;
+ width: 0.25rem;
+ }
+ .swiper-pagination-bullet-active {
+ width: 2.5rem;
+ border-radius: 0.375rem;
+ }
+ }
+}
+
+@media (max-width: 1280px) {
+ .firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ top: 35%;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+}
+
+@media (max-width: 1024px) {
+ .firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ top: 38%;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+}
+
+@media (max-width: 640px) {
+ .firstPageSwiper {
+ .swiper-pagination-bullets.swiper-pagination-horizontal {
+ top: 33%;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+}
+
+.cases-tabs {
+ .ant-tabs-ink-bar {
+ background-color: #444fd9;
+ }
+ .ant-tabs-nav {
+ .ant-tabs-tab {
+ width: 17.5rem;
+ font-size: 1.25rem;
+ line-height: 1.6;
+ position: relative;
+ margin-top: 0 !important;
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+ &:hover {
+ color: #444fd9;
+ }
+ &.ant-tabs-tab-active {
+ background: linear-gradient(270deg, rgba(223, 224, 247, 0.4) 0%, rgba(223, 224, 247, 0.02) 100%);
+ .ant-tabs-tab-btn {
+ color: #444fd9;
+ .progress {
+ display: block;
+ }
+ }
+ }
+ .ant-tabs-tab-btn {
+ flex: 1;
+ .progress {
+ display: none;
+ }
+ }
+ }
+ }
+ .ant-tabs-content-holder {
+ .ant-tabs-content {
+ height: 100%;
+ min-height: 300px;
+ .ant-tabs-tabpane {
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 300ms;
+ padding-left: 3.5rem;
+ height: 100%;
+ position: absolute;
+ .cases-bg-datalake {
+ background: url('/static/images/cases-bg-datalake.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-ad-hoc {
+ background: url('/static/images/cases-bg-ad-hoc.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-customer {
+ background: url('/static/images/cases-bg-customer.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-ELT {
+ background: url('/static/images/cases-bg-ELT.png') no-repeat center;
+ background-size: cover;
+ }
+ .cases-bg-log {
+ background: url('/static/images/cases-bg-log.png') no-repeat center;
+ background-size: cover;
+ }
+
+ .cases-bg-real-time {
+ background: url('/static/images/cases-bg-real-time.png') no-repeat center;
+ background-size: cover;
+ }
+
+ &.ant-tabs-tabpane-active {
+ opacity: 1;
+ }
+ &.ant-tabs-tabpane-hidden {
+ display: block;
+ opacity: 0;
+ }
+ }
+ }
+ }
+}
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 5589a2a..a6690fb 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -3,42 +3,92 @@
import Link from '@docusaurus/Link';
import More from '../components/More/index';
import PageBanner, { ButtonProps } from '../components/PageBanner';
+import { Progress } from '../components/progress/progress';
+
import PageColumn from '../components/PageColumn';
-import React from 'react';
+import React, { useCallback, useEffect, useState } from 'react';
import Translate, { translate } from '@docusaurus/Translate';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import usePhone from '../hooks/use-phone';
+import { useAnimationFrame } from '../hooks/use-animation-frame';
import './index.scss';
-import NewsLetter from '../components/Newsletter';
+import LinkWithArrow from '@site/src/components/link-arrow';
import { NEWSLETTER_DATA } from '../constant/newsletter.data';
+import { AchievementBanner } from '../components/achievement-banner/achievement-banner';
+import { CoreCapabilitiesData } from '../constant/core-capabilities.data';
+import { CoreCapabilitiesCard } from '../components/core-capabilities-card/core-capabilities-card';
+import { VariousAnalyticsData } from '../constant/various-analytics.data';
+import { Swiper, SwiperClass, SwiperSlide } from 'swiper/react';
+import { Pagination, Navigation } from 'swiper';
+import GetStarted from '@site/src/components/get-started/get-started';
+import { Tabs } from 'antd';
+import { Content } from 'antd/es/layout/layout';
+import ReadMore from '../components/ReadMore';
export default function Home(): JSX.Element {
const { siteConfig } = useDocusaurusContext();
const { isPhone } = usePhone();
+ const pagination = {
+ clickable: true,
+ renderBullet: function (index, className) {
+ return '<span class="' + className + '"></span>';
+ },
+ };
+ const modules = [Pagination];
+ const [swiperRef, setSwiperRef] = useState<SwiperClass>();
+
+ const [count, setCount] = useState<number>(0);
+ const [activeKey, setActiveKey] = useState<string>('0');
+ const [stop, setStop] = useState<boolean>(false);
+ const handlePrevious = useCallback(() => {
+ swiperRef?.slidePrev();
+ }, [swiperRef]);
+
+ const handleNext = useCallback(() => {
+ swiperRef?.slideNext();
+ }, [swiperRef]);
+
const buttons: ButtonProps[] = [
{
- label: 'GitHub',
- link: 'https://github.com/apache/doris',
+ label: 'Download',
+ link: '/download',
type: 'primary',
},
{
- label: <Translate id="homepage.banner.button1">Get Started</Translate>,
+ label: <Translate id="homepage.banner.button1">Get started</Translate>,
link: '/docs/get-starting/what-is-apache-doris',
type: 'ghost',
},
- {
- label: 'Slack',
- link: 'https://join.slack.com/t/apachedoriscommunity/shared_invite/zt-28il1o2wk-DD6LsLOz3v4aD92Mu0S0aQ',
- type: 'default',
- },
];
const banner = {
- title: <Translate id="homepage.banner.title">Real-Time Analytics Makes the Future</Translate>,
+ title: (
+ <div
+ className="lg:leading-[78px]"
+ style={{
+ fontWeight: 540,
+ }}
+ >
+ <p className="highlight">
+ <Translate id="homepage.banner.title">Open Source, Real-Time</Translate>
+ </p>
+ <p>
+ <Translate id="homepage.banner.highlightTitle">Data Warehouse</Translate>
+ </p>
+ </div>
+ ),
subTitle: (
- <Translate id="homepage.banner.subTitle">
- Apache Doris is a new-generation open-source real-time data warehouse based on MPP architecture, with
- easier use and higher performance for big data analytics.
- </Translate>
+ <div>
+ <p>
+ <Translate id="homepage.banner.subTitle-1">
+ Apache Doris is a modern data warehouse for real-time analytics.
+ </Translate>
+ </p>
+ <p>
+ <Translate id="homepage.banner.subTitle-2">
+ It delivers lightning-fast analytics on real-time data at scale.
+ </Translate>
+ </p>
+ </div>
),
bannerImg: require('@site/static/images/home-banner.png').default,
buttons,
@@ -110,36 +160,329 @@
const communitys = [
{
- title: <Translate id="community.title.c1">Mailing List</Translate>,
- img: require('@site/static/images/icon/community-1.png').default,
+ title: <Translate id="community.title.c1">Developer mailing list</Translate>,
+ img: (
+ <svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#00C2DD" />
+ <g opacity="0.6" filter="url(#filter0_f_1665_497)">
+ <ellipse cx="30" cy="47" rx="11" ry="3" fill="#00C2DD" />
+ </g>
+ <path
+ d="M14.8004 12H45.1996C47.2733 12 48.9736 13.6645 49 15.7042L30.0066 26.181L11.0176 15.7174C11.0351 13.6689 12.7223 12 14.8004 12ZM11.0176 19.7263L11 38.2517C11 40.3135 12.7091 42 14.8004 42H45.1996C47.2909 42 49 40.3135 49 38.2517V19.7174L30.4547 29.7042C30.1692 29.8587 29.8265 29.8587 29.5453 29.7042L11.0176 19.7263Z"
+ fill="#00BED9"
+ />
+ <path
+ d="M45.1996 12H14.8004C12.7223 12 11.0352 13.6689 11.0176 15.7174L30 26.5L49 15.7042C48.9736 13.6645 47.2733 12 45.1996 12Z"
+ fill="#00BED9"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1665_497"
+ x="9"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_497" />
+ </filter>
+ </defs>
+ </svg>
+ ),
href: '/community/subscribe-mail-list',
},
{
- title: <Translate id="community.title.c2">Discussion</Translate>,
- img: require('@site/static/images/icon/community-2.png').default,
+ title: <Translate id="community.title.c2">GitHub discussions</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="61" viewBox="0 0 60 61" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ <g opacity="0.6" filter="url(#filter0_f_1926_14560)">
+ <ellipse cx="30" cy="48" rx="11" ry="3" fill="#3078E5" />
+ </g>
+ <path
+ d="M30 10C19.7788 10 11.5 18.2589 11.5 28.4557C11.4979 32.3301 12.7188 36.1068 14.9895 39.2499C17.2602 42.393 20.4654 44.7431 24.1503 45.9665C25.0753 46.1271 25.4213 45.5734 25.4213 45.0881C25.4213 44.6507 25.3972 43.1982 25.3972 41.6516C20.75 42.5061 19.5475 40.5221 19.1775 39.483C18.9685 38.9515 18.0675 37.3145 17.2813 36.8752C16.6338 36.5301 15.7088 35.6756 17.2572 35.6535C18.715 35.6295 19.7547 36.9915 20.1025 37.5452C21.7675 40.3357 24.4278 39.5513 25.4897 39.0678C25.6525 37.8682 26.1372 37.0617 26.67 36.6003C22.5538 36.1389 18.2525 34.5461 18.2525 27.4868C18.2525 25.4788 18.9685 23.8197 20.1488 22.5259C19.9638 22.0645 19.3163 20.1728 20.3338 17.6351C20.3338 17.6351 21.8822 17.1516 25.4213 19.5287C26.9273 19.1117 28.4833 18.9018 30.0462 18.9049C31.6187 18.9049 33.1913 19.1116 34.6713 19.5269C38.2085 17.1276 39.7587 17.637 39.7587 17.637C40.7762 20.1746 40.1287 22.0664 39.9437 22.5278C41.1222 23.8197 41.84 25.4567 41.84 27.4868C41.84 34.5701 37.5165 36.1389 33.4003 36.6003C34.07 37.1761 34.649 38.2834 34.649 40.0146C34.649 42.4821 34.625 44.4661 34.625 45.0899C34.625 45.5734 34.9728 46.1493 35.8978 45.9647C39.5701 44.7278 42.7611 42.3732 45.0218 39.2323C47.2825 36.0914 48.499 32.3224 48.5 28.4557C48.5 18.2589 40.2212 10 30 10Z"
+ fill="black"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1926_14560"
+ x="9"
+ y="35"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1926_14560" />
+ </filter>
+ </defs>
+ </svg>
+ ),
href: 'https://github.com/apache/doris/discussions',
},
{
- title: <Translate id="community.title.c3">How to Contribute</Translate>,
- img: require('@site/static/images/icon/community-3.png').default,
- href: '/community/how-to-contribute/',
+ title: <Translate id="community.title.c3">Slack workspace</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#636CDF" />
+ <g opacity="0.6" filter="url(#filter0_f_1926_14564)">
+ <ellipse cx="29.667" cy="47" rx="11" ry="3" fill="#636CDF" />
+ </g>
+ <path
+ d="M21.6156 31.4787C21.6156 29.5059 23.2152 27.9062 25.1881 27.9062C27.1609 27.9062 28.7605 29.5059 28.7605 31.532V40.4365C28.7605 41.384 28.3842 42.2927 27.7142 42.9626C27.0442 43.6326 26.1356 44.009 25.1881 44.009C24.2406 44.009 23.3319 43.6326 22.662 42.9626C21.992 42.2927 21.6156 41.384 21.6156 40.4365V31.4787Z"
+ fill="#CE365C"
+ />
+ <path
+ d="M13.6508 34.0581C12.9809 33.3882 12.6045 32.4795 12.6045 31.532C12.6045 29.5059 14.2574 27.9062 16.2303 27.9596H19.7494V31.532C19.7494 32.4795 19.373 33.3882 18.7031 34.0581C18.0331 34.7281 17.1244 35.1045 16.177 35.1045C15.2295 35.1045 14.3208 34.7281 13.6508 34.0581Z"
+ fill="#CE365C"
+ />
+ <path
+ d="M34.1462 36.9174C36.119 36.9174 37.7187 38.517 37.7187 40.4898C37.7187 41.4373 37.3423 42.346 36.6723 43.016C36.0023 43.6859 35.0937 44.0623 34.1462 44.0623C33.1987 44.0623 32.29 43.6859 31.6201 43.016C30.9501 42.346 30.5737 41.4373 30.5737 40.4898V36.9174H34.1462Z"
+ fill="#E3B44C"
+ />
+ <path
+ d="M34.1462 27.9062H43.1573C45.1302 27.9062 46.7298 29.5059 46.6765 31.4787C46.6765 33.4516 45.0769 35.0512 43.104 35.0512H34.1462C33.1987 35.0512 32.29 34.6748 31.6201 34.0048C30.9501 33.3349 30.5737 32.4262 30.5737 31.4787C30.5737 30.5312 30.9501 29.6226 31.6201 28.9526C32.29 28.2826 33.1987 27.9062 34.1462 27.9062Z"
+ fill="#E3B44C"
+ />
+ <path
+ d="M39.5313 22.5211C39.5313 20.5482 41.1309 18.9486 43.1038 18.9486C44.0513 18.9486 44.9599 19.325 45.6299 19.995C46.2999 20.6649 46.6762 21.5736 46.6762 22.5211C46.6762 23.4686 46.2999 24.3772 45.6299 25.0472C44.9599 25.7172 44.0513 26.0936 43.1038 26.0936H39.5313V22.5211Z"
+ fill="#5BB381"
+ />
+ <path
+ d="M30.5735 22.5211V13.51C30.5735 12.5625 30.9499 11.6538 31.6199 10.9838C32.2898 10.3139 33.1985 9.9375 34.146 9.9375C35.0934 9.9375 36.0021 10.3139 36.6721 10.9838C37.342 11.6538 37.7184 12.5625 37.7184 13.51V22.5211C37.7184 23.4686 37.342 24.3772 36.6721 25.0472C36.0021 25.7172 35.0934 26.0936 34.146 26.0936C33.1985 26.0936 32.2898 25.7172 31.6199 25.0472C30.9499 24.3772 30.5735 23.4686 30.5735 22.5211Z"
+ fill="#5BB381"
+ />
+ <path
+ d="M22.662 10.9838C23.3319 10.3139 24.2406 9.9375 25.1881 9.9375C27.1609 9.9375 28.7605 11.5371 28.7605 13.51V17.0824H25.1881C24.2406 17.0824 23.3319 16.706 22.662 16.0361C21.992 15.3661 21.6156 14.4574 21.6156 13.51C21.6156 12.5625 21.992 11.6538 22.662 10.9838Z"
+ fill="#68BBDB"
+ />
+ <path
+ d="M25.1348 26.0936H16.177C15.2295 26.0936 14.3208 25.7172 13.6508 25.0472C12.9809 24.3772 12.6045 23.4686 12.6045 22.5211C12.6045 21.5736 12.9809 20.6649 13.6508 19.995C14.3208 19.325 15.2295 18.9486 16.177 18.9486H25.1348C26.0822 18.9486 26.9909 19.325 27.6609 19.995C28.3308 20.6649 28.7072 21.5736 28.7072 22.5211C28.7072 23.4686 28.3308 24.3772 27.6609 25.0472C26.9909 25.7172 26.0822 26.0936 25.1348 26.0936Z"
+ fill="#68BBDB"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1926_14564"
+ x="8.66699"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1926_14564" />
+ </filter>
+ </defs>
+ </svg>
+ ),
+ href: 'https://join.slack.com/t/apachedoriscommunity/shared_invite/zt-28il1o2wk-DD6LsLOz3v4aD92Mu0S0aQ',
},
{
- title: <Translate id="community.title.c4">Source Code</Translate>,
- img: require('@site/static/images/icon/community-4.png').default,
- href: 'https://github.com/apache/doris',
+ title: <Translate id="community.title.c4">Twitter</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ <g opacity="0.6" filter="url(#filter0_f_1665_513)">
+ <ellipse cx="30" cy="47" rx="11" ry="3" fill="#3078E5" />
+ </g>
+ <path
+ d="M18.1681 41.2188L28.0334 30.1003L26.9476 28.5656L15.7812 41.2188H18.1681Z"
+ fill="#1D1D1D"
+ />
+ <path
+ d="M43.4004 12.7812L32.6624 24.8833L31.5656 23.3328L40.8771 12.7812H43.4004Z"
+ fill="#1D1D1D"
+ />
+ <path
+ d="M24.1918 13H16L35.8082 41H44L24.1918 13ZM36.7983 39.1768L19.5698 14.8233H23.2017L40.4302 39.1768H36.7983Z"
+ fill="#1D1D1D"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1665_513"
+ x="9"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_513" />
+ </filter>
+ </defs>
+ </svg>
+ ),
+ href: 'https://twitter.com/doris_apache',
},
{
- title: <Translate id="community.title.c5">Improvement Proposals</Translate>,
- img: require('@site/static/images/icon/community-5.png').default,
- href: 'https://cwiki.apache.org/confluence/display/DORIS/Doris+Improvement+Proposals',
+ title: <Translate id="community.title.c5">LinkedIn</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="61" height="60" viewBox="0 0 61 60" fill="none">
+ <g clip-path="url(#clip0_1665_520)">
+ <g opacity="0.6" filter="url(#filter0_f_1665_520)">
+ <ellipse cx="30.5" cy="47" rx="11" ry="3" fill="#1460D4" />
+ </g>
+ <path
+ d="M12.9424 43.9994H20.8779V21.3502H12.9424V43.9994ZM39.3494 20.6359C36.0648 20.6359 34.2536 21.7356 32.1689 24.3993V21.3496H24.2461V43.9994H32.1683V31.6917C32.1683 29.0944 33.41 26.5539 36.3791 26.5539C39.3482 26.5539 40.0783 29.0938 40.0783 31.6299V44H47.9783V31.1246C47.9783 22.1788 42.6349 20.6359 39.3494 20.6359ZM16.9248 10C14.4801 10 12.5 11.7894 12.5 13.9981C12.5 16.2051 14.4801 17.9917 16.9248 17.9917C19.3673 17.9917 21.3474 16.2046 21.3474 13.9981C21.3474 11.7894 19.3673 10 16.9248 10Z"
+ fill="#1460D4"
+ />
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ </g>
+ <defs>
+ <filter
+ id="filter0_f_1665_520"
+ x="9.5"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_520" />
+ </filter>
+ <clipPath id="clip0_1665_520">
+ <rect width="60" height="60" fill="white" transform="translate(0.5)" />
+ </clipPath>
+ </defs>
+ </svg>
+ ),
+ href: 'https://www.linkedin.com/company/-apache',
},
{
- title: <Translate id="community.title.c6">Doris Team</Translate>,
- img: require('@site/static/images/icon/community-6.png').default,
- href: '/community/team.html',
+ title: <Translate id="community.title.c6">All video resources</Translate>,
+ img: (
+ <svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" fill="none">
+ <rect opacity="0.1" width="60" height="60" rx="10" fill="#3078E5" />
+ <g opacity="0.6" filter="url(#filter0_f_1665_524)">
+ <ellipse cx="30" cy="47" rx="11" ry="3" fill="#3078E5" />
+ </g>
+ <path
+ d="M35.5 27.866C36.1667 27.4811 36.1667 26.5189 35.5 26.134L28 21.8038C27.3333 21.4189 26.5 21.9001 26.5 22.6699L26.5 31.3301C26.5 32.0999 27.3333 32.5811 28 32.1962L35.5 27.866Z"
+ fill="black"
+ />
+ <path
+ d="M13 16C13 13.7909 14.7909 12 17 12H43C45.2091 12 47 13.7909 47 16V38C47 40.2091 45.2091 42 43 42H17C14.7909 42 13 40.2091 13 38V16ZM17 14C15.8954 14 15 14.8954 15 16V38C15 39.1046 15.8954 40 17 40H43C44.1046 40 45 39.1046 45 38V16C45 14.8954 44.1046 14 43 14H17Z"
+ fill="black"
+ />
+ <defs>
+ <filter
+ id="filter0_f_1665_524"
+ x="9"
+ y="34"
+ width="42"
+ height="26"
+ filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB"
+ >
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
+ <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
+ <feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_1665_524" />
+ </filter>
+ </defs>
+ </svg>
+ ),
+ href: 'https://www.youtube.com/@apachedoris/channels',
},
];
+
+ function renderSwiper() {
+ const modules = [Pagination];
+ // if (!isPhone) {
+ // modules.push(Navigation);
+ // }
+ return (
+ <div style={{ position: 'relative' }}>
+ {!isPhone && (
+ <div
+ onClick={handlePrevious}
+ className="swiper-button-prev invisible group-hover:visible"
+ style={{ position: 'absolute', top: 'calc(50% - 2rem)', left: '-3rem', zIndex: 99 }}
+ ></div>
+ )}
+
+ <Swiper
+ pagination={pagination}
+ spaceBetween={50}
+ slidesPerView={1}
+ navigation={false}
+ modules={modules}
+ loop={true}
+ className="firstPageSwiper"
+ // style={{ minHeight: 480 }}
+ onSlideChange={() => console.log('slide change')}
+ onSwiper={setSwiperRef}
+ >
+ {NEWSLETTER_DATA.map(newsletter => {
+ return (
+ <SwiperSlide key={newsletter.title}>
+ <div className=" row flex justify-center xl:justify-start flex-start pb-8 lg:pb-16">
+ <div className="w-full lg:w-auto flex justify-center ml-4">
+ <img
+ width={424}
+ src={`${require(`@site/static/images/${newsletter.image}`).default}`}
+ alt={newsletter.title}
+ />
+ </div>
+ <div className=" w-[48rem] ml-12 flex flex-col ">
+ <div className="flex gap-1 mb-1">
+ {newsletter.tags.map(value => (
+ <div className="color-[#4c576c] font-medium text-xs leading-5">
+ {value}
+ </div>
+ ))}
+ </div>
+ <h3 className="leading-[38px] text-2xl font-medium line-clamp-1 ">
+ {newsletter.title}
+ </h3>
+ <p className="pt-3 line-clamp-2 text-lg leading-8">{newsletter.content}</p>
+ <ReadMore to={newsletter.to} className="pt-6" />
+ </div>
+ </div>
+ </SwiperSlide>
+ );
+ })}
+ </Swiper>
+ {!isPhone && (
+ <div
+ onClick={handleNext}
+ className="swiper-button-next invisible group-hover:visible"
+ style={{ position: 'absolute', top: 'calc(50% - 2rem)', right: '-3rem', zIndex: 99 }}
+ ></div>
+ )}
+ </div>
+ );
+ }
+
+ useAnimationFrame(deltaTime => {
+ // Pass on a function to the setter of the state
+ // to make sure we always have the latest state
+
+ setCount(prevCount => {
+ if (prevCount >= 100) {
+ setActiveKey(activeKey => {
+ let nextKey = +activeKey + 1;
+ if (nextKey >= VariousAnalyticsData.length) {
+ nextKey = 0;
+ }
+ return nextKey.toString();
+ });
+ return 0;
+ }
+ return prevCount + 0.4;
+ });
+ }, stop);
+
return (
<Layout
title={translate({ id: 'homepage.title', message: 'Apache Doris: Open-Source Real-Time Data Warehouse' })}
@@ -151,44 +494,36 @@
showAnnouncementBar={true}
>
<PageBanner {...banner}></PageBanner>
- <NewsLetter newsList={NEWSLETTER_DATA} style={{ marginTop: '0' }} />
- {/* <section className="news-section">
- <div className="container">
- <div className="news-wrap">
- <div className="news-item">
- <span className="news-icon"></span>
- <Link to="/docs/dev/releasenotes/release-1.2.6" className="news-content">
- <Translate id="1.2.6" description="Apache Doris 1.2.6 is released now.">
- Apache Doris 1.2.6 is released now.
- </Translate>
- </Link>
- </div>
- </div>
- </div>
- </section> */}
+ <AchievementBanner />
+ <section style={{ backgroundColor: '#F7F9FE' }} className="group">
+ <div className="container pt-14">{renderSwiper()}</div>
+ </section>
<section className="apache-doris">
<PageColumn
+ wrapperStyle={{ paddingBottom: '7.5rem' }}
title={
<Translate id="homepage.what" description="What is Apache Doris">
What is Apache Doris?
</Translate>
}
footer={
- <More
- link="docs/get-starting/what-is-apache-doris"
- text={
- <Translate id="homepage.more" description="more link">
- More
- </Translate>
- }
- />
+ <div className="justify-center flex mt-9">
+ <LinkWithArrow
+ to="/docs/get-starting/what-is-apache-doris"
+ text={
+ <Translate id="homepage.more" description="more link">
+ Learn more
+ </Translate>
+ }
+ />
+ </div>
}
>
{isPhone ? (
- <img src={require('@site/static/images/what-is-doris-phone.png').default} alt="" />
+ <img src={require('@site/static/images/what-is-doris.png').default} alt="" />
) : (
<img
- style={{ maxWidth: '85%' }}
+ style={{ maxWidth: '85%', margin: 'auto' }}
src={require('@site/static/images/what-is-doris.png').default}
alt=""
/>
@@ -196,33 +531,100 @@
</PageColumn>
</section>
<PageColumn
+ wrapperStyle={{ paddingTop: '7.5rem', paddingBottom: '5.5rem', backgroundColor: '#F7F9FE' }}
title={
- <Translate id="homepage.features" description="Core Features">
- Core Features
+ <Translate id="homepage.capabilities" description="Core capabilities">
+ Core capabilities
</Translate>
}
footer={<></>}
>
- <div className="core-features">
- <div className="row">
- {coreFeatures.map((item, index) => (
- <div className="col col--6" key={index}>
- <div className="core-feature-item">
- <img src={item.img} className="core-feature-img" alt="" />
- <div className="core-feature-content">
- <div className="core-feature-title">{item.title}</div>
- <div className="core-feature-subtitle">{item.subTitle}</div>
- </div>
- </div>
- </div>
- ))}
- </div>
+ <div className="block lg:grid core-capabilities-group grid-cols-1 lg:grid-cols-3 ">
+ {CoreCapabilitiesData.map(props => (
+ <CoreCapabilitiesCard key={props.title} {...props} />
+ ))}
</div>
</PageColumn>
<PageColumn
title={
+ <div>
+ <p>
+ <Translate
+ id="homepage.unified"
+ description="Unified data warehouse
+ for various analytics use cases"
+ >
+ Unified data warehouse
+ </Translate>
+ </p>
+ <p>
+ <Translate id="homepage.analytics" description="for various analytics use cases">
+ for various analytics use cases
+ </Translate>
+ </p>
+ </div>
+ }
+ >
+ <div className="cases-tabs" onMouseEnter={() => setStop(true)} onMouseLeave={() => setStop(false)}>
+ {/* <Tabs
+ activeKey={activeKey}
+ onChange={activeKey => {
+ setCount(0);
+ setActiveKey(activeKey);
+ }}
+ tabPosition={isPhone ? 'top' : 'left'}
+ items={VariousAnalyticsData.map(({ content, title, links, backgroundClassName }, index) => {
+ return {
+ label: (
+ <div className="font-misans text-start">
+ <span>{title}</span>
+ <div className="absolute -bottom-0 w-full">
+ <Progress percent={count} />
+ </div>
+ </div>
+ ),
+ key: index.toString(),
+ children: (
+ <div
+ className={`font-misans text-start h-full ${backgroundClassName} py-14 pr-14 text-base`}
+ >
+ <div>{content}</div>
+
+ <div className="flex mt-14 gap-2">
+ {links.map(({ content, to }) => (
+ <More style={{ textAlign: 'left' }} link={to} text={content} />
+ ))}
+ </div>
+ </div>
+ ),
+ };
+ })}
+ /> */}
+ {VariousAnalyticsData.map(({ title, content, links, icon }) => (
+ <div className="various-analytics-group flex-col lg:flex-row">
+ <div className="items-title w-auto lg:w-[27.25rem] ">
+ <div>{icon}</div>
+ <div>{title}</div>
+ </div>
+ <div className="items-content px-6 lg:px-0">
+ <div>{content}</div>
+
+ <div className="links">
+ {links.map(({ content, to }) => (
+ <LinkWithArrow to={to} text={content} />
+ // <More style={{ textAlign: 'left' }} link={to} text={content} />
+ ))}
+ </div>
+ </div>
+ </div>
+ ))}
+ </div>
+ </PageColumn>
+ <PageColumn
+ className="bg-[#F7F9FE]"
+ title={
<Translate id="homepage.join" description="Join The Community">
- Join the Community
+ Connect with community
</Translate>
}
>
@@ -231,7 +633,7 @@
{communitys.map((item, index) => (
<div className={clsx('col', isPhone ? 'col--6' : 'col--4')} key={index}>
<Link to={item.href} className="community-item">
- <img src={item.img} alt="" className="community-img" />
+ {item.img}
<div className="community-title">{item.title}</div>
</Link>
</div>
@@ -239,25 +641,7 @@
</div>
</div>
</PageColumn>
- <div className="ready-start">
- <div className="container">
- <div className="ready-start-wrap">
- <div className="start-title">
- <Translate id="homepage.start.title">
- Start Your Journey in Real-Time with Apache Doris
- </Translate>
- </div>
- <div className="start-buttons">
- <Link className="start-btn download-btn" to="/download">
- <Translate id="homepage.start.downloadButton">Download</Translate>
- </Link>
- <Link className="start-btn docs-btn" to="/docs/get-starting/what-is-apache-doris">
- <Translate id="homepage.start.docsButton">Go to Docs</Translate>
- </Link>
- </div>
- </div>
- </div>
- </div>
+ <GetStarted />
</Layout>
);
}
diff --git a/src/pages/users/index.scss b/src/pages/users/index.scss
index 6494895..ca1891a 100644
--- a/src/pages/users/index.scss
+++ b/src/pages/users/index.scss
@@ -14,13 +14,14 @@
// bottom: -4rem !important;
// }
- .swiper-button-next, .swiper-button-prev {
+ .swiper-button-next,
+ .swiper-button-prev {
top: calc(50% - 2rem);
}
.users-wall-list {
- padding: 0 1rem;
- padding-bottom: 4rem;
+ // padding: 0 1rem;
+ // padding-bottom: 4rem;
.users-wall-item {
list-style: none;
@@ -32,6 +33,7 @@
img {
display: block;
+ width: 36.25rem;
}
}
@@ -48,7 +50,7 @@
}
.swiper-pagination-bullet-active {
- background: var(--ifm-color-primary);
+ background: #8592a6;
}
}
@@ -230,7 +232,7 @@
.users-wall-list {
flex-wrap: wrap;
- padding: 0;
+ // padding: 0;
.users-wall-item {
flex: 0 0 33.333% !important;
diff --git a/src/pages/users/index.tsx b/src/pages/users/index.tsx
index 66afb5d..c452ddd 100644
--- a/src/pages/users/index.tsx
+++ b/src/pages/users/index.tsx
@@ -1,27 +1,43 @@
import Layout from '../../theme/Layout';
-import React, { useCallback, useMemo, useState } from 'react';
+import React, { useCallback, useEffect, useMemo, useState } from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
-import Translate, { translate } from '@docusaurus/Translate';
+import { translate } from '@docusaurus/Translate';
import './index.scss';
-import Link from '@docusaurus/Link';
-import PageColumn from '@site/src/components/PageColumn';
import userCasesEn from '@site/userCases/en_US.json';
import { Swiper, SwiperClass, SwiperSlide } from 'swiper/react';
import 'swiper/css';
import 'swiper/css/pagination';
import 'swiper/css/navigation';
-import { Pagination, Navigation } from 'swiper';
+import { Pagination } from 'swiper';
import usePhone from '@site/src/hooks/use-phone';
+import PageHeader from '@site/src/components/PageHeader';
+import { USER_STORIES, USER_STORIES_CATEGORIES } from '@site/src/constant/user.data';
+import useIsBrowser from '@docusaurus/useIsBrowser';
+import UserItem from './user-item';
+import USERS from '../../constant/users.data.json';
+import ReadMore from '@site/src/components/ReadMore';
+
+const ALL_TEXT = 'All';
export default function Users(): JSX.Element {
const { i18n } = useDocusaurusContext();
const userCases = userCasesEn;
const { isPhone } = usePhone();
+ const isBrowser = useIsBrowser();
+ const [active, setActive] = useState(() => {
+ const tag = isBrowser ? sessionStorage.getItem('tag') : ALL_TEXT;
+ return tag || ALL_TEXT;
+ });
+ const [users, setUsers] = useState([...USERS].sort((a, b) => a.order - b.order));
const getUserLogos = (page: number = 1, total: number = 30) => {
const arr = new Array(total).fill('');
return arr.map((item, index) => require(`@site/static/images/user-logo-${page}/u-${index + 1}.png`).default);
};
+ useEffect(() => {
+ setActive(ALL_TEXT);
+ }, []);
+
const [swiperRef, setSwiperRef] = useState<SwiperClass>();
const theSlides = useMemo(() => ['slide one', 'slide two'], []);
@@ -41,6 +57,21 @@
},
};
+ function changeCategory(category: string) {
+ setActive(category);
+ let currentCategory = USER_STORIES_CATEGORIES.find(item => item === category);
+ const currentUsers = USERS.filter(user => user.category === category);
+ if (category === ALL_TEXT) {
+ setUsers([...USERS].sort((a, b) => a.order - b.order));
+ } else {
+ setUsers(currentUsers);
+ }
+ if (!currentCategory) {
+ setActive(ALL_TEXT);
+ currentCategory = USER_STORIES_CATEGORIES.find(item => item === ALL_TEXT);
+ }
+ }
+
function renderSwiper() {
const modules = [Pagination];
// if (!isPhone) {
@@ -68,33 +99,29 @@
onSlideChange={() => console.log('slide change')}
onSwiper={setSwiperRef}
>
- <SwiperSlide>
- <div className="users-wall-list row">
- <img
- className="users-wall-img"
- src={require(`@site/static/images/user-logos-1.jpg`).default}
- alt=""
- />
- </div>
- </SwiperSlide>
- <SwiperSlide>
- <div className="users-wall-list row">
- <img
- className="users-wall-img"
- src={require(`@site/static/images/user-logos-2.jpg`).default}
- alt=""
- />
- </div>
- </SwiperSlide>
- <SwiperSlide>
- <div className="users-wall-list row">
- <img
- className="users-wall-img"
- src={require(`@site/static/images/user-logos-3.png`).default}
- alt=""
- />
- </div>
- </SwiperSlide>
+ {USER_STORIES.map(userStory => {
+ return (
+ <SwiperSlide key={userStory.title}>
+ <div className="users-wall-list row flex flex-start pb-8 lg:pb-16">
+ <div>
+ <img
+ className="users-wall-img lg:w-[580px] lg:h-[248px]"
+ src={`${require(`@site/static/images/${userStory.image}`).default}`}
+ alt="users-wall-img"
+ />
+ </div>
+ <div className="w-[35.75rem] ml-4 lg:ml-12 flex flex-col py-4">
+ <h3 className="leading-[38px] text-2xl">{userStory.title}</h3>
+ <p className="my-6 text-base">
+ <strong className="font-normal">{userStory.author.name}</strong>
+ <span className="ml-6 text-[#4C576C]">{userStory.author.title}</span>
+ </p>
+ <ReadMore to={userStory.to} className="text-primary" />
+ </div>
+ </div>
+ </SwiperSlide>
+ );
+ })}
</Swiper>
{!isPhone && (
<div
@@ -114,56 +141,43 @@
message: 'An easy-to-use, high-performance and unified analytical database',
})}
>
- <section className="users-wall">
- <PageColumn
- align="left"
- title={
- <Translate id="user.logos" description="Companies That Trust Apache Doris">
- Companies That Trust Apache Doris
- </Translate>
- }
- >
- {renderSwiper()}
- </PageColumn>
- </section>
- <section className="story">
- <PageColumn
- align="left"
- title={
- <Translate id="user.user-case" description="Companies Powerd by Apache Doris">
- Companies Powerd by Apache Doris
- </Translate>
- }
- footer={
- <div className="share-story">
- <Link to="https://github.com/apache/doris/issues/10229" className="share-button">
- <Translate id="user.add..your.company" description="Add Your Company">
- Share Your Story
- </Translate>
- </Link>
- </div>
- }
- >
- <div style={{ fontSize: 16, marginTop: '-2rem', marginBottom: '-1rem' }}>
- <Translate
- id="user.case-description"
- description="There are more than 2,000 companies worldwide leveraging Apache Doris to build their unified
- data analytical database. Some of them are listed below:"
+ <PageHeader
+ className="lg:pt-[7.5rem] px-4"
+ title="Start Real-Time Journey with Innovators"
+ subtitle="Over 4000 global leaders and enterprises are powered by Apache Doris."
+ extra={
+ <div className="flex justify-center mt-5">
+ <button
+ className="button-primary"
+ onClick={() => window.open('https://github.com/apache/doris/discussions/27683', '_blank')}
>
- There are more than 2,000 companies worldwide leveraging Apache Doris to build their unified
- data analytical database. Some of them are listed below:
- </Translate>
+ Share your story
+ </button>
</div>
- <div className="user-cases">
- {userCases &&
- userCases.map(item => (
- <div className="user-case" key={item.name}>
- <h2 className="user-case-title">{item.name}</h2>
- <p className="user-case-intro">{item.introduction}</p>
- </div>
- ))}
- </div>
- </PageColumn>
+ }
+ />
+ <section className="users-wall container lg:pt-[88px]">{renderSwiper()}</section>
+ <section className="lg:pt-[5.5rem] container">
+ <div className="blog-list-wrap row mt-28 lg:mt-0">
+ <ul className="container scrollbar-none mt-0 m-auto flex flex-wrap gap-3 overflow-auto lg:w-[58rem] text-[#4C576C] lg:mt-8 lg:justify-center lg:gap-6 ">
+ {USER_STORIES_CATEGORIES.map((item: any) => (
+ <li className="py-px" key={item} onClick={() => changeCategory(item)}>
+ <span
+ className={`block cursor-pointer whitespace-nowrap rounded-[2.5rem] px-4 py-2 text-sm shadow-[0px_1px_4px_0px_rgba(49,77,136,0.10)] hover:bg-primary hover:text-white lg:px-6 lg:py-3 lg:text-base ${
+ active === item && 'bg-primary text-white'
+ }`}
+ >
+ {item}
+ </span>
+ </li>
+ ))}
+ </ul>
+ </div>
+ <ul className="mt-6 grid gap-1 grid-cols-3 lg:gap-6 lg:mt-12 lg:grid-cols-4 pb-[88px]">
+ {users.map(user => (
+ <UserItem key={user.name} {...user} />
+ ))}
+ </ul>
</section>
</Layout>
);
diff --git a/src/pages/users/user-item.css b/src/pages/users/user-item.css
new file mode 100644
index 0000000..ac598af
--- /dev/null
+++ b/src/pages/users/user-item.css
@@ -0,0 +1,32 @@
+.swipe-top-button {
+ text-decoration: none;
+ /* letter-spacing: 2px; */
+ text-align: center;
+ position: relative;
+ transition: all .35s;
+ overflow: hidden;
+}
+
+.swipe-top-button span {
+ position: relative;
+ z-index: 2;
+}
+
+.swipe-top-button:after {
+ position: absolute;
+ content: "";
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 0;
+ background: #444FD9;
+ transition: all .35s;
+}
+
+.swipe-top-button:hover {
+ color: #fff;
+}
+
+.swipe-top-button:hover:after {
+ height: 100%;
+}
\ No newline at end of file
diff --git a/src/pages/users/user-item.tsx b/src/pages/users/user-item.tsx
new file mode 100644
index 0000000..8859272
--- /dev/null
+++ b/src/pages/users/user-item.tsx
@@ -0,0 +1,33 @@
+import Link from '@docusaurus/Link';
+import ReadMore from '@site/src/components/ReadMore';
+import React from 'react';
+import './user-item.css';
+
+interface UserItemProps {
+ image: any;
+ name: string;
+ to?: string;
+ story?: string;
+ order: number;
+}
+
+export default function UserItem(props: UserItemProps) {
+ return (
+ <div className="group cursor-pointer flex flex-col items-center swipe-top-button lg:h-[17.5rem] lg:w-[17.5rem] h-[8rem] w-[8rem] shadow-[0px_2px_8px_0px_rgba(49,77,136,0.16)] rounded-lg">
+ <div className="group-hover:hidden flex justify-between py-2 px-2 lg:px-[2.375rem] lg:pt-[4.25rem] lg:pb-[2.375rem] flex-col items-center h-full w-full gap-[2.375rem]">
+ <img src={props?.image} alt={props?.name} />
+ <span className="text-xs lg:text-base">{props?.name}</span>
+ {/* {props?.to && <ReadMore className="text-primary" to={props?.to} />} */}
+ </div>
+
+ <div
+ className={`hidden group-hover:flex ${
+ props?.to && 'group-hover:flex-col'
+ } z-40 group-hover:text-white h-full justify-between px-4 py-6`}
+ >
+ <span className="text-xs lg:text-sm">{props?.story}</span>
+ {props?.to && <ReadMore className="hover:text-white justify-center text-white" to={props?.to} />}
+ </div>
+ </div>
+ );
+}
diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss
index 535a12e..ec0cb5e 100644
--- a/src/scss/_variables.scss
+++ b/src/scss/_variables.scss
@@ -1,19 +1,11 @@
-html[lang="zh-Hans-CN"] {
- --ifm-font-family-base: 'Noto Sans SC',
- 'Source Sans Pro',
- 'Helvetica Neue',
- Helvetica,
- Arial,
- sans-serif;
+html[lang='zh-Hans-CN'] {
+ --ifm-font-family-base: 'MiSans', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-family: 'MiSans', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
-html[lang="en-US"] {
- --ifm-font-family-base: 'Montserrat',
- 'Source Sans Pro',
- 'Helvetica Neue',
- Helvetica,
- Arial,
- sans-serif;
+html[lang='en-US'] {
+ --ifm-font-family-base: 'MiSans Latin', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-family: 'MiSans Latin', 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
:root {
@@ -30,18 +22,19 @@
--ifm-navbar-search-input-icon: url('data:image/svg+xml;utf8,<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24"><path d="M11 2.5C15.6945 2.5 19.5 6.3055 19.5 11C19.5 13.0175 18.797 14.871 17.623 16.3285C17.7199 16.3471 17.8089 16.3945 17.8785 16.4645L21.0605 19.6465C21.1542 19.7403 21.2069 19.8674 21.2069 20C21.2069 20.1326 21.1542 20.2597 21.0605 20.3535L20.3535 21.0605C20.2597 21.1542 20.1326 21.2069 20 21.2069C19.8674 21.2069 19.7403 21.1542 19.6465 21.0605L16.4645 17.8785C16.3945 17.8088 16.3468 17.7199 16.3275 17.623C14.8191 18.8405 12.9384 19.5032 11 19.5C6.3055 19.5 2.5 15.6945 2.5 11C2.5 6.3055 6.3055 2.5 11 2.5ZM11 4.5C7.41 4.5 4.5 7.41 4.5 11C4.5 14.59 7.41 17.5 11 17.5C14.59 17.5 17.5 14.59 17.5 11C17.5 7.41 14.59 4.5 11 4.5Z" /></svg>');
--ifm-navbar-item-padding-vertical: 0.4rem;
--ifm-navbar-height: 5rem;
- --ifm-menu-color-background-active: #E4E8EE;
+ --ifm-menu-color-background-active: #e4e8ee;
- --ifm-blockquote-color: #63646D;
+ --ifm-blockquote-color: #63646d;
--global-gutter: 1.5625rem;
--global-colors-text-black: #162033;
- --global-colors-text-primary: #232D3E;
- --global-colors-text: #63646D;
+ --global-colors-text-primary: #232d3e;
+ --global-colors-text: #63646d;
+ --global-colors-text-secondary: #4c576c;
// --global-colors-background: #F5F7FA;
- --global-colors-split: #DADDE1;
- --global-colors-white: #FFFFFF;
+ --global-colors-split: #dadde1;
+ --global-colors-white: #ffffff;
--search-local-modal-background: var(--global-colors-white);
--search-local-modal-shadow: 0px 0px 30px rgba(201, 217, 233, 0.5);
@@ -67,5 +60,4 @@
--global-header-height: 5rem;
--global-sidebar-width: 20rem;
--doc-sidebar-width: 20rem !important;
-
-}
\ No newline at end of file
+}
diff --git a/src/scss/common.scss b/src/scss/common.scss
index b25bd3a..1c02f03 100644
--- a/src/scss/common.scss
+++ b/src/scss/common.scss
@@ -1,24 +1,56 @@
.docs-wrapper {
- .versions {
- opacity: 1;
+ .navbar__inner {
+ .navbar__items--right {
+ .header-right-button-github,
+ .header-right-button-slack {
+ display: none;
+ }
+ }
}
-}
-
-.plugin-id-community {
- .versions {
- opacity: 0;
- }
-
- .doc-search {
+ .navbar__bottom {
display: none;
}
}
-.markdown code {
- background-color: #f6f7f8;
+
+@media screen and (max-width: 996px) {
+ .docs-wrapper {
+ .navbar__inner {
+ .navbar__items--right {
+ .docs-search,
+ .custom-navbar-item {
+ display: none;
+ }
+ }
+ }
+ .navbar__bottom {
+ display: block;
+ }
+ }
}
-.markdown pre code {
- background-color: #282A36;
+.custom-scrollbar {
+ &::-webkit-scrollbar {
+ width: 6px;
+ height: 10px;
+ }
+ &::-webkit-scrollbar-track {
+ background-color: #fff;
+ border-radius: 10px;
+ }
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(0, 0, 0, 0);
+ border-radius: 8px;
+ }
+ &:hover {
+ &::-webkit-scrollbar-thumb {
+ background-color: #dfe5f0;
+ }
+ }
+ &::-webkit-scrollbar-thumb {
+ &:hover {
+ background-color: #dfe5f0;
+ }
+ }
}
@media (max-width: 996px) {
@@ -35,6 +67,10 @@
@media (max-width: 576px) {
:root {
- --ifm-font-size-base: 12px;
+ --ifm-font-size-base: 16px;
}
-}
\ No newline at end of file
+}
+
+.theme-code-block {
+ font-size: 0.875rem !important;
+}
diff --git a/src/scss/components/blog.scss b/src/scss/components/blog.scss
index 6c747cd..cd8c858 100644
--- a/src/scss/components/blog.scss
+++ b/src/scss/components/blog.scss
@@ -2,8 +2,8 @@
.blog-info {
display: flex;
align-items: center;
- color: rgba(38, 40, 51, 0.4);
flex-wrap: wrap;
+ color: #1d1d1d;
.split-line {
margin: 0 0.5rem;
@@ -37,7 +37,7 @@
.s-tag {
font-size: 12px;
- background-color: #F5F7F9;
+ background-color: #f5f7f9;
padding: 2px 4px;
border-radius: 2px;
color: rgba(38, 40, 51, 0.6);
@@ -49,4 +49,4 @@
.pagination-nav {
display: none;
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/breadcrumbs.scss b/src/scss/components/breadcrumbs.scss
index dbd44ac..ba43197 100644
--- a/src/scss/components/breadcrumbs.scss
+++ b/src/scss/components/breadcrumbs.scss
@@ -6,9 +6,12 @@
}
.breadcrumbs {
+ display: flex;
&__item {
+ display: flex;
+ align-items: center;
+ position: relative;
&:first-child {
-
&:before {
content: '';
display: block;
@@ -16,7 +19,9 @@
height: 2rem;
position: absolute;
z-index: 1;
-
+ }
+ svg {
+ color: #4c576c;
}
}
@@ -31,7 +36,7 @@
padding: 0;
vertical-align: middle;
- >svg {
+ > svg {
top: -1px;
}
}
@@ -46,4 +51,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/markdown.scss b/src/scss/components/markdown.scss
index 7051f3b..5d3b5b9 100644
--- a/src/scss/components/markdown.scss
+++ b/src/scss/components/markdown.scss
@@ -1,5 +1,5 @@
.markdown {
- color: #4c4e4d;
+ color: #4c576c;
padding-left: 1rem;
h1,
h2,
@@ -7,40 +7,61 @@
h4,
h5,
h6 {
- color: var(--global-colors-text-primary);
+ color: #1d1d1d;
margin-bottom: 0.3125rem;
font-weight: 500;
}
h1,
h1:first-child {
- --ifm-h1-font-size: 1.875rem;
+ font-size: 2rem;
+ margin-bottom: 1.5rem;
+ margin-top: 0;
}
h2 {
- --ifm-h2-font-size: 1.5rem;
+ font-size: 1.5rem;
+ margin-bottom: 1.25rem;
+ margin-top: 2rem;
+ padding-top: 2rem;
+ border-top: 1px solid #e6e7e9;
}
h3 {
- --ifm-h3-font-size: 1.25rem;
+ font-size: 1rem;
+ margin-bottom: 1.25rem;
+ margin-top: 1rem;
}
-
-
+ p {
+ line-height: 1.875;
+ }
code {
border-radius: 4px;
- background-color: var(--global-colors-background);
+ background-color: #edf2fa;
border: none;
- padding: 0.125rem 0.3125rem;
+ padding: 3px 4px;
+ margin: 0 8px;
+ font-size: 14px;
+ color: #4c576c;
}
pre {
code {
- padding: 0.625rem;
+ padding: 0.725rem 1.25rem;
+ background-color: #262a37;
+ line-height: 1.875;
}
}
table thead tr {
- background-color: var(--global-colors-background);
+ background-color: #f7f9fe;
+ }
+
+ table thead th {
+ background-color: #f7f9fe;
+ color: #1d1d1d;
+ font-size: 1rem;
+ font-weight: 500;
}
table tr {
@@ -49,9 +70,33 @@
font-size: var(--global-font-size-small);
}
- table th,
- table td {
- padding: 0.375rem 0.8125rem;
+ table tr th {
+ padding: 0.53rem 0.8125rem;
+ border-color: #dfe5f0;
+ }
+
+ table tr td {
+ padding: 0.65rem 0.8125rem;
+ border-color: #dfe5f0;
+ }
+ a {
+ color: var(--ifm-color-primary);
+ }
+ ul {
+ margin: 16px 0;
+ padding-left: 20px;
+ li {
+ margin-top: 4px;
+ position: relative;
+ list-style: initial;
+ }
+ }
+ ol {
+ margin: 16px 0;
+ padding-left: 20px;
+ li {
+ list-style: decimal;
+ }
}
}
@@ -59,8 +104,8 @@
header {
margin-top: 1rem;
- &+h1 {
+ & + h1 {
display: none;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/navbar.scss b/src/scss/components/navbar.scss
index c055c2d..7bcf594 100644
--- a/src/scss/components/navbar.scss
+++ b/src/scss/components/navbar.scss
@@ -5,7 +5,23 @@
display: flex;
border-bottom: 1px solid rgba(255, 255, 255, 0.4);
box-shadow: 0px 6px 16px rgba(160, 170, 208, 0.15);
-
+ .navbar-left {
+ display: flex;
+ }
+ .docs-search {
+ display: none;
+ }
+ .custom-navbar-item {
+ display: none;
+ }
+ &.docs {
+ .docs-search {
+ display: block;
+ }
+ .custom-navbar-item {
+ display: block;
+ }
+ }
&__inner {
padding: 0 5rem;
margin: 0 auto;
@@ -108,11 +124,11 @@
text-align: center;
background-color: var(--ifm-color-primary);
margin-left: 1rem;
- transition: all .3s;
+ transition: all 0.3s;
&:hover {
background-color: var(--ifm-color-primary-darkest);
- color: rgba(255, 255, 255, .8);
+ color: rgba(255, 255, 255, 0.8);
text-decoration: none;
}
}
@@ -126,10 +142,22 @@
position: relative;
&:hover {
- opacity: .8;
+ opacity: 0.8;
}
}
+ .header-right-button-slack {
+ min-width: 2.25rem;
+ padding-left: 2.25rem;
+ height: 2.25rem;
+ background: url('@site/static/images/icon/slack.svg') no-repeat left center;
+ background-size: contain;
+ position: relative;
+ margin-left: 1rem;
+ &:hover {
+ opacity: 0.8;
+ }
+ }
.navbar-search {
display: none;
@@ -140,7 +168,7 @@
&-input {
height: 2.625rem;
- border-radius: 4px;
+ border-radius: 0.5rem;
background-color: transparent;
color: var(--global-colors-text-primary);
padding-left: 3rem;
@@ -149,16 +177,16 @@
border: 1px solid rgba(35, 45, 62, 0.5);
&:hover {
- border-color: #3784FF;
+ border-color: #3784ff;
}
&:focus {
- border: 1px solid #3784FF;
+ border: 1px solid #3784ff;
outline: none;
}
}
- >div:last-child {
+ > div:last-child {
display: none;
}
}
@@ -167,11 +195,16 @@
.dropdown {
padding-left: 0;
padding-right: 0;
+ .navbar__link {
+ &:after {
+ top: 0;
+ }
+ }
}
.dropdown__menu {
box-shadow: 0px 6px 20px rgba(83, 132, 204, 0.2);
- border-radius: 4px;
+ border-radius: 0.5rem;
min-width: 6.5rem;
.dropdown__link {
@@ -206,7 +239,6 @@
}
.github-btn {
-
.gh-text {
display: none;
}
@@ -227,7 +259,7 @@
line-height: 1.2;
text-decoration: none;
pointer-events: none;
- background-color: #F0F1FC;
+ background-color: #f0f1fc;
margin-top: 0.4rem;
position: relative;
margin-left: 0.3rem;
@@ -239,7 +271,7 @@
.gh-count:before,
.gh-count:after {
- content: "";
+ content: '';
position: absolute;
display: inline-block;
width: 0;
@@ -253,18 +285,60 @@
left: -10px;
margin-top: -5px;
border: 5px solid transparent;
- border-right-color: #F0F1FC;
+ border-right-color: #f0f1fc;
}
-
}
-
-
+ .navbar__bottom {
+ display: none;
+ }
}
-
@media screen and (max-width: 996px) {
.navbar {
-
+ height: 3.75rem;
+ &.docs {
+ height: 6.5rem;
+ flex-direction: column;
+ .navbar__inner {
+ height: 3.75rem;
+ }
+ .navbar__bottom {
+ display: block;
+ border-top: 0.5px solid #edf2fa;
+ height: 2.75rem;
+ padding: 0 1.25rem;
+ .docs-nav-version-locale {
+ display: flex;
+ justify-content: flex-end;
+ .navbar__item {
+ display: block;
+ }
+ }
+ li {
+ list-style: none;
+ }
+ }
+ }
+ .navbar__inner {
+ padding: 0 1.25rem;
+ }
+ .navbar-left {
+ .navbar-logo-wrapper {
+ .navbar__logo {
+ height: 1.5625rem;
+ }
+ .docs {
+ svg {
+ width: 8.125rem;
+ height: 1.5625rem;
+ }
+ }
+ }
+ }
+ .navbar__toggle.clean-btn > svg {
+ width: 1.5rem;
+ height: 1.5rem;
+ }
&__brand {
height: 2rem;
}
@@ -274,8 +348,8 @@
}
.navbar__toggle {
-
- >svg {
+ margin-right: 0;
+ > svg {
width: 2rem;
height: 2rem;
}
@@ -287,7 +361,7 @@
}
&__close {
- >svg {
+ > svg {
width: 1.5rem;
height: 1.5rem;
}
@@ -304,7 +378,7 @@
.menu__list {
&-item {
- &+.menu__list-item {
+ & + .menu__list-item {
&::before {
content: '';
display: block;
@@ -313,7 +387,7 @@
left: 0;
right: 0;
height: 1px;
- transform: scaleY(.5);
+ transform: scaleY(0.5);
background-color: var(--global-colors-split);
}
}
@@ -352,9 +426,16 @@
}
.navbar__items--right {
+ .docs-search {
+ display: none;
+ }
+ .custom-navbar-item {
+ display: none;
+ }
.navbar__search-input {
background: transparent var(--ifm-navbar-search-input-icon) no-repeat 0.75rem center / 2rem 2rem;
border: none;
+ border-radius: 0.5rem;
}
.navbar-search {
@@ -368,11 +449,16 @@
.github-btn-desktop {
display: none;
}
+ .header-right-button-github {
+ display: none;
+ }
+ .header-right-button-slack {
+ display: none;
+ }
}
&__search {
-
- >button {
+ > button {
display: none;
}
}
@@ -406,7 +492,7 @@
margin-left: -0.2rem;
&:hover {
- opacity: .8;
+ opacity: 0.8;
}
.github-btn {
@@ -416,5 +502,4 @@
}
}
}
-
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/pagination-nav.scss b/src/scss/components/pagination-nav.scss
index 7fa6c60..3dad192 100644
--- a/src/scss/components/pagination-nav.scss
+++ b/src/scss/components/pagination-nav.scss
@@ -1,7 +1,7 @@
.pagination-nav {
- border-top: 1px solid var(--global-colors-split);
- margin-top: 3.75rem;
- padding-top: 1.875rem;
+ padding-top: 5rem;
+ padding-bottom: 4.5rem;
+ margin-top: 0 !important;
&__link {
border: none;
@@ -14,8 +14,6 @@
timing-function: ease-out;
duration: 0.3s;
}
-
-
}
&__sublabel {
@@ -26,4 +24,4 @@
font-weight: 400;
text-transform: initial;
}
-}
\ No newline at end of file
+}
diff --git a/src/scss/components/search.scss b/src/scss/components/search.scss
index 401fc36..2736031 100644
--- a/src/scss/components/search.scss
+++ b/src/scss/components/search.scss
@@ -28,7 +28,6 @@
.hitAction__La6 {
svg {
display: none;
-
}
&::after {
@@ -50,9 +49,30 @@
color: var(--ifm-color-primary);
}
}
-
}
p[class*='searchResultItemSummary'] {
font-style: normal;
-}
\ No newline at end of file
+}
+
+@media screen and (max-width: 996px) {
+ .docs-search {
+ display: none;
+ }
+ .docs-subnav-searchbar {
+ .navbar-search {
+ position: relative !important;
+ right: auto;
+ width: 100%;
+ .navbar__search {
+ margin-left: 0;
+ .searchBar_src-theme-SearchBar-SearchBar-module {
+ width: 100%;
+ }
+ .navbar__search-input {
+ width: 100% !important;
+ }
+ }
+ }
+ }
+}
diff --git a/src/scss/components/sidebar.scss b/src/scss/components/sidebar.scss
index 6f0e5ec..608249e 100644
--- a/src/scss/components/sidebar.scss
+++ b/src/scss/components/sidebar.scss
@@ -19,7 +19,6 @@
}
}
-
.theme-doc-sidebar-menu {
padding: 0.5rem;
diff --git a/src/scss/custom.scss b/src/scss/custom.scss
index 6bd3347..8361d14 100644
--- a/src/scss/custom.scss
+++ b/src/scss/custom.scss
@@ -5,7 +5,9 @@
*/
/* You can override the default Infima variables here. */
-
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
@import './variables';
@import './components/sidebar';
@import './components/breadcrumbs';
@@ -14,4 +16,24 @@
@import './components/navbar';
@import './components/blog';
@import './components/search';
-@import './common';
\ No newline at end of file
+@import './common';
+
+
+@layer utilities {
+ .transition-slide {
+ @apply inline-block transform transition-transform duration-300 hover:translate-x-1 group-hover:translate-x-1;
+ }
+}
+
+
+.button-primary {
+ display: flex;
+ height: 52px;
+ padding: 15px 40px;
+ justify-content: center;
+ align-items: center;
+ gap: 4px;
+ border-radius: 4px;
+ background: var(--b-1, #444FD9);
+ color: white;
+}
\ No newline at end of file
diff --git a/src/theme/AnnouncementBar/index.tsx b/src/theme/AnnouncementBar/index.tsx
index 40d6c4e..e5c1f0e 100644
--- a/src/theme/AnnouncementBar/index.tsx
+++ b/src/theme/AnnouncementBar/index.tsx
@@ -32,7 +32,7 @@
description: 'The ARIA label for close button of announcement bar',
})}
>
- <IconClose width={14} height={14} strokeWidth={3.1} />
+ <IconClose width={14} height={14} strokeWidth={3.1} style={{ color: 'white' }} />
</button>
) : null}
</div>
diff --git a/src/theme/AnnouncementBar/styles.module.css b/src/theme/AnnouncementBar/styles.module.css
index a9b1a2c..976586c 100644
--- a/src/theme/AnnouncementBar/styles.module.css
+++ b/src/theme/AnnouncementBar/styles.module.css
@@ -1,88 +1,93 @@
:root {
- --docusaurus-announcement-bar-height: 30px;
+ --docusaurus-announcement-bar-height: 30px;
}
.announcementBar {
- display: flex;
- align-items: center;
- height: var(--docusaurus-announcement-bar-height);
- background-color: var(--ifm-color-white);
- background: linear-gradient(270.01deg, #3C2FD5 -12.32%, #7780F4 150.41%);;
- color: var(--ifm-color-black);
- border-bottom: 1px solid var(--ifm-color-emphasis-100);
- z-index: 1;
+ display: flex;
+ align-items: center;
+ height: var(--docusaurus-announcement-bar-height);
+ background-color: var(--ifm-color-white);
+ background: linear-gradient(270.01deg, #3c2fd5 -12.32%, #7780f4 150.41%);
+ color: var(--ifm-color-black);
+ border-bottom: 1px solid var(--ifm-color-emphasis-100);
+ z-index: 1;
}
html[data-announcement-bar-initially-dismissed='true'] .announcementBar {
- display: none;
+ display: none;
}
.announcementBarPlaceholder {
- flex: 0 0 10px;
+ flex: 0 0 10px;
}
.announcementBarClose {
- flex: 0 0 30px;
- align-self: stretch;
- padding: 0;
- line-height: 0;
+ flex: 0 0 30px;
+ align-self: stretch;
+ padding: 0;
+ line-height: 0;
}
.announcementBarContent {
- flex: 1 1 auto;
- font-size: 85%;
- text-align: center;
- padding: 5px 0;
- display: flex;
- justify-content: center;
- align-items: center;
- position: relative;
+ flex: 1 1 auto;
+ font-size: 85%;
+ text-align: center;
+ padding: 5px 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
}
.announcementBarContent:before {
- content: '';
- display: block;
- position: absolute;
- left: 1rem;
- top: 50%;
- transform: translateY(-50%);
- background: url('../../../static/images/announcementBar-left.png') center no-repeat;
- background-size: contain;
- width: 29rem;
- height: 2.375rem;
+ content: '';
+ display: block;
+ position: absolute;
+ left: 1rem;
+ top: 50%;
+ transform: translateY(-50%);
+ background: url('../../../static/images/announcementBar-left.png') center no-repeat;
+ background-size: contain;
+ width: 29rem;
+ height: 2.375rem;
}
.announcementBarContent:after {
- content: '';
- display: block;
- position: absolute;
- right: 1rem;
- top: 50%;
- transform: translateY(-50%);
- background: url('../../../static/images/announcementBar-right.png') center no-repeat;
- background-size: contain;
- width: 29rem;
- height: 2.375rem;
+ content: '';
+ display: block;
+ position: absolute;
+ right: 1rem;
+ top: 50%;
+ transform: translateY(-50%);
+ background: url('../../../static/images/announcementBar-right.png') center no-repeat;
+ background-size: contain;
+ width: 29rem;
+ height: 2.375rem;
}
@media print {
- .announcementBar {
- display: none;
- }
+ .announcementBar {
+ display: none;
+ }
}
.announcementBarContent a {
- color: inherit;
- text-decoration: underline;
+ color: inherit;
+ text-decoration: underline;
}
@media (min-width: 997px) {
- :root {
- --docusaurus-announcement-bar-height: 40px;
- }
+ :root {
+ --docusaurus-announcement-bar-height: 40px;
+ }
- .announcementBarPlaceholder,
- .announcementBarClose {
- flex-basis: 50px;
- }
+ .announcementBarPlaceholder,
+ .announcementBarClose {
+ flex-basis: 50px;
+ }
+}
+@media (max-width: 997px) {
+ .announcementBar {
+ display: none;
+ }
}
diff --git a/src/theme/BlogFooter/index.tsx b/src/theme/BlogFooter/index.tsx
new file mode 100644
index 0000000..314fd37
--- /dev/null
+++ b/src/theme/BlogFooter/index.tsx
@@ -0,0 +1,39 @@
+import { useHistory, useLocation } from '@docusaurus/router';
+import { ConfigProvider, Pagination } from 'antd';
+import zhCN from 'antd/locale/zh_CN';
+import React from 'react';
+
+export default function BlogListFooter({
+ total,
+ currentPage,
+ currentCategory,
+}: {
+ total: number;
+ currentPage: number;
+ currentCategory?: string;
+}) {
+ const location = useLocation();
+ const history = useHistory();
+
+ return (
+ <div className="mt-6 flex justify-between container">
+ <div className="text-sm text-[#8592A6]">Total {total} items</div>
+ <Pagination
+ responsive
+ onChange={page => {
+ history.push(
+ `${location.pathname}?currentPage=${page ? page : ''}¤tCategory=${
+ currentCategory ? currentCategory : ''
+ }#blog`,
+ location.state,
+ );
+ }}
+ defaultPageSize={9}
+ current={currentPage}
+ total={total}
+ showSizeChanger={false}
+ showQuickJumper
+ />
+ </div>
+ );
+}
diff --git a/src/theme/BlogLayout/index.tsx b/src/theme/BlogLayout/index.tsx
index 4c1ad6d..7fe0e43 100644
--- a/src/theme/BlogLayout/index.tsx
+++ b/src/theme/BlogLayout/index.tsx
@@ -1,31 +1,33 @@
-import React from "react";
-import clsx from "clsx";
-import Layout from "@theme/Layout";
-import BlogSidebar from "@theme/BlogSidebar";
-import "./style.scss";
+import React from 'react';
+import clsx from 'clsx';
+import Layout from '@theme/Layout';
+import BlogSidebar from '@theme/BlogSidebar';
+import './style.scss';
export default function BlogLayout(props) {
- const { sidebar, toc, children, pageType, ...layoutProps } = props;
- const hasSidebar = sidebar && sidebar.items.length > 0;
- const isBlogListPage = pageType === "blogList";
- return (
- <Layout {...layoutProps}>
- <div className="container margin-vert--lg blog-container">
- <div className="row">
- <BlogSidebar sidebar={sidebar} />
- <main
- className={clsx("col", {
- "col--7": hasSidebar,
- "col--12": !hasSidebar && isBlogListPage,
- "col--9 col--offset-1": !hasSidebar && !isBlogListPage,
- })}
- itemScope
- itemType="http://schema.org/Blog"
- >
- {children}
- </main>
- {toc && <div className="col col--2">{toc}</div>}
- </div>
- </div>
- </Layout>
- );
+ const { sidebar, toc, children, pageType, ...layoutProps } = props;
+ const hasSidebar = sidebar && sidebar.items.length > 0;
+ const isBlogListPage = pageType === 'blogList';
+
+ return (
+ <Layout {...layoutProps}>
+ <div className="mb-[4.875rem] container">
+ <div className="lg:row lg:flex">
+ <BlogSidebar sidebar={sidebar} />
+ <main
+ className={clsx({
+ col: !isBlogListPage,
+ 'col--7': hasSidebar && !isBlogListPage,
+ 'col--12': !hasSidebar && isBlogListPage,
+ 'col--9 col--offset-1': !hasSidebar && !isBlogListPage,
+ })}
+ itemScope
+ itemType="http://schema.org/Blog"
+ >
+ {children}
+ </main>
+ {toc && <div className="col col--2">{toc}</div>}
+ </div>
+ </div>
+ </Layout>
+ );
}
diff --git a/src/theme/BlogLayout/style.scss b/src/theme/BlogLayout/style.scss
index ba78e8f..c5b6375 100644
--- a/src/theme/BlogLayout/style.scss
+++ b/src/theme/BlogLayout/style.scss
@@ -1,6 +1,10 @@
.blog-container {
- // margin-top: 0 !important;
+ @media (min-width: 1280px) {
+ max-width: 1280px;
+ }
}
+
+
@media (max-width: 996px) {
}
\ No newline at end of file
diff --git a/src/theme/BlogListItem/HeadItem/index.tsx b/src/theme/BlogListItem/HeadItem/index.tsx
new file mode 100644
index 0000000..d894ff5
--- /dev/null
+++ b/src/theme/BlogListItem/HeadItem/index.tsx
@@ -0,0 +1,94 @@
+import Link from '@docusaurus/Link';
+import React from 'react';
+
+export default function HeadItem(props: any) {
+ const {
+ permalink,
+ large,
+ image,
+ title,
+ summary,
+ formattedDate,
+ date,
+ authorsExists,
+ authors,
+ size = 'small',
+ } = props;
+ if (size === 'small') {
+ return (
+ <li>
+ <Link
+ to={permalink}
+ className="hover:no-underline hover:decoration-none transition-scale relative block rounded-lg border border-[#DFE5F0] px-6 py-5 hover:border-[#0065FD] "
+ >
+ <div className=" ">
+ <h1 className="line-clamp-2 text-xl font-medium leading-normal text-black-dark transition group-hover:text-primary">
+ {title}
+ </h1>
+ <div className="mt-4 line-clamp-2 h-11 text-sm leading-relaxed text-[#4C576C] transition group-hover:text-primary">
+ {summary}
+ </div>
+ <div className="mt-4 flex justify-start space-x-2 text-sm leading-[1.375rem] text-[#8592a6]">
+ <time dateTime={date} itemProp="datePublished" className="mr-4">
+ {formattedDate}
+ </time>
+ {authorsExists && (
+ <>
+ <span className="split-line"></span>
+ <span className="authors">
+ {authors.map((author, i) => (
+ <span className="s-author" key={i}>
+ {author.name}
+ </span>
+ ))}
+ </span>
+ </>
+ )}
+ </div>
+ </div>
+ </Link>
+ </li>
+ );
+ }
+ return (
+ <Link
+ to={permalink}
+ className={`hover:no-underline hover:decoration-none transition-scale group relative ${
+ large ? 'h-full' : 'h-auto'
+ } flex flex-col rounded-lg border border-[#DFE5F0] hover:border-[#0065FD]`}
+ >
+ <img src={image} alt="" />
+ <div className="flex flex-col-reverse justify-between lg:flex-row lg:py-0 py-6 lg:space-x-10 px-6">
+ <div className="flex-1">
+ <h1 className=" mt-4 line-clamp-2 text-2xl font-medium text-black-dark lg:text-[2rem] lg:leading-[3rem]">
+ {title}
+ </h1>
+ <div className="lg:h-[9.25rem]">
+ <p className="mt-4 line-clamp-2 text-sm leading-[1.6875rem] text-[#666666] lg:text-lg ">
+ {summary}
+ </p>
+ </div>
+ <div className="mt-4 flex space-x-6">
+ <span className="text-sm text-[#8592a6]">
+ <time dateTime={date} itemProp="datePublished" className="mr-4">
+ {formattedDate}
+ </time>
+ {authorsExists && (
+ <>
+ <span className="split-line"></span>
+ <span className="authors">
+ {authors.map((author, i) => (
+ <span className="s-author" key={i}>
+ {author.name}
+ </span>
+ ))}
+ </span>
+ </>
+ )}
+ </span>
+ </div>
+ </div>
+ </div>
+ </Link>
+ );
+}
diff --git a/src/theme/BlogListItem/index.tsx b/src/theme/BlogListItem/index.tsx
index e9a714e..b1946b0 100644
--- a/src/theme/BlogListItem/index.tsx
+++ b/src/theme/BlogListItem/index.tsx
@@ -10,6 +10,7 @@
import TagsListInline from '@theme/TagsListInline';
import BlogPostAuthors from '@theme/BlogPostAuthors';
import './styles.scss';
+import HeadItem from './HeadItem';
// Very simple pluralization: probably good enough for now
function useReadingTimePlural() {
const { selectMessage } = usePluralForm();
@@ -32,66 +33,98 @@
export default function BlogListItem(props) {
const readingTimePlural = useReadingTimePlural();
const { withBaseUrl } = useBaseUrlUtils();
- const { children, frontMatter, assets, metadata, truncated, isBlogPostPage = false } = props;
+ const { children, frontMatter, assets, metadata, large = false } = props;
const { date, formattedDate, permalink, tags, readingTime, title, editUrl, authors } = metadata;
const image = assets.image ?? frontMatter.image;
- const truncatedPost = !isBlogPostPage && truncated;
const tagsExists = tags.length > 0;
- const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
const summary = frontMatter.summary;
const authorsExists = authors && authors.length > 0;
+ if (props?.headBlog) {
+ return (
+ <HeadItem
+ {...metadata}
+ image={image}
+ large={large}
+ size={large ? 'large' : 'small'}
+ tagsExists={tagsExists}
+ authorsExists={authorsExists}
+ summary={summary}
+ />
+ );
+ }
return (
- <article
- className={!isBlogPostPage ? 'margin-bottom--xl blog-list-item' : undefined}
- itemProp="blogPost"
- itemScope
- itemType="http://schema.org/BlogPosting"
- >
- <Link itemProp="url" to={permalink}>
- {!!image && <div className="blog-preview-img" style={{ backgroundImage: `url(${image})` }}></div>}
- <div className="blog-content">
- <header>
- <TitleHeading className="blog-post-title" itemProp="headline">
- {title}
- </TitleHeading>
- <div className="blog-info">
- <time dateTime={date} itemProp="datePublished">
- {formattedDate}
- </time>
- {authorsExists && (
- <>
- <span className="split-line"></span>
- <span className="authors">
- {authors.map((author, i) => (
- <span className="s-author" key={i}>
- {author.name}
- </span>
- ))}
+ <article itemProp="blogPost" itemScope itemType="http://schema.org/BlogPosting">
+ <Link
+ itemProp="url"
+ to={permalink}
+ className="hover:no-underline hover:decoration-none transition-scale group relative flex h-full flex-col rounded-lg border border-[#DFE5F0] hover:border-[#0065FD] lg:border-0"
+ >
+ <div
+ className={`relative overflow-hidden rounded-t-lg border-[#DFE5F0] group-hover:border-[#0065FD] lg:border lg:border-b-0 lg:pb-0`}
+ style={{
+ width: '100%',
+ height: '165px',
+ }}
+ >
+ <img src={image} alt="" />
+ </div>
+ <div
+ className={`px-6 ${
+ large ? 'py-6 lg:pt-12' : ' py-6'
+ } flex-1 rounded-b-lg border-[#DFE5F0] group-hover:border-[#0065FD] lg:border lg:border-t-0`}
+ >
+ {!large && (
+ <div className="">
+ {tagsExists &&
+ tags.map((tag: any) => (
+ <span
+ key={tag.label}
+ className="mr-4 inline-block rounded-3xl border border-[#DADCE0] px-2 py-1 text-xs leading-normal"
+ >
+ {tag.label}
</span>
- </>
- )}
-
- {tagsExists && (
- <>
- <span className="split-line"></span>
- <span className="s-tags">
- {tags.map((tag, i) => (
- <span className="s-tag" key={i}>
- {tag.label}
- </span>
- ))}
- </span>
- </>
- )}
+ ))}
</div>
- </header>
+ )}
+ <div className={`${large ? 'lg:h-[5.25rem]' : ''} h-12`}>
+ <h1
+ className={`${
+ large ? ' lg:text-[1.75rem] lg:leading-normal' : 'mt-4'
+ } line-clamp-2 break-keep text-xl font-medium leading-tight text-black-dark transition`}
+ >
+ {title}
+ </h1>
+ </div>
+ <div className={`${large ? 'h-14' : 'h-12'} mt-6 `}>
+ <span
+ className={`${
+ large ? ' lg:text-lg' : ' leading-[1.375rem]'
+ } line-clamp-2 break-all text-sm text-[#4C576C] transition`}
+ >
+ {summary}
+ </span>
+ </div>
<div
- // This ID is used for the feed generation to locate the main content
- id={isBlogPostPage ? blogPostContainerID : undefined}
- className="markdown blog-item-summary"
- itemProp="articleBody"
+ className={`${
+ large ? ' mt-8 lg:text-base' : ' mt-4'
+ } justify-start space-x-2 text-sm leading-[1.375rem] text-[#8592a6]`}
>
- {summary}
+ <time dateTime={date} itemProp="datePublished">
+ {formattedDate}
+ </time>
+
+ {authorsExists && (
+ <>
+ <span className="split-line"></span>
+ <span className="authors">
+ {authors.map((author, i) => (
+ <span className="s-author" key={i}>
+ {author.name}
+ </span>
+ ))}
+ </span>
+ </>
+ )}
</div>
</div>
</Link>
diff --git a/src/theme/BlogListPage/index.tsx b/src/theme/BlogListPage/index.tsx
index 1997f15..f8d3639 100644
--- a/src/theme/BlogListPage/index.tsx
+++ b/src/theme/BlogListPage/index.tsx
@@ -6,6 +6,11 @@
import BlogListItem from '../BlogListItem';
import './styles.scss';
import useIsBrowser from '@docusaurus/useIsBrowser';
+import HeadBlogs from '@site/src/components/blogs/components/head-blogs';
+import PageHeader from '@site/src/components/PageHeader';
+import BlogListFooter from '../BlogFooter';
+import { useHistory, useLocation } from '@docusaurus/router';
+const allText = 'All';
function BlogListPageMetadata(props) {
const { metadata } = props;
@@ -22,9 +27,8 @@
);
}
-function getBlogCatetories(props) {
+function getBlogCategories(props) {
const { siteConfig } = useDocusaurusContext();
- const isCN = siteConfig.baseUrl.indexOf('zh-CN') > -1;
const allText = 'All';
const { items } = props;
const allCategory = { label: allText, values: [] };
@@ -32,7 +36,7 @@
useEffect(() => {
sessionStorage.setItem('tag', allText);
- }, [isCN]);
+ }, []);
items.forEach(({ content: BlogPostContent }) => {
const { frontMatter } = BlogPostContent;
const tags = frontMatter.tags || [];
@@ -62,29 +66,57 @@
const { metadata, items, sidebar } = props;
const isBrowser = useIsBrowser();
const [blogs, setBlogs] = useState([]);
- const blogCategories = getBlogCatetories(props);
+ const blogCategories = getBlogCategories(props);
+ const ALL_BLOG = blogCategories.find(item => item.label === allText).values;
const { siteConfig } = useDocusaurusContext();
const isCN = siteConfig.baseUrl.indexOf('zh-CN') > -1;
- const allText = 'All';
const [active, setActive] = useState(() => {
const tag = isBrowser ? sessionStorage.getItem('tag') : allText;
return tag || allText;
});
- const [pageSize, setPageSize] = useState<number>(8);
+ const [pageSize, setPageSize] = useState<number>(9);
let [pageNumber, setPageNumber] = useState<number>(1);
const [currentBlogs, setCurrentBlogs] = useState([]);
+ const [currentPage, setCurrentPage] = useState<number>(0);
+ const location = useLocation();
+ const history = useHistory();
const changeCategory = category => {
- setPageNumber(1);
- setActive(category);
- let currentCategory = blogCategories.find(item => item.label === category);
+ history.push(
+ `${location.pathname}?currentPage=1¤tCategory=${category ? category : ''}#blog`,
+ location.state,
+ );
+ };
+
+ useEffect(() => {
+ let currentPageNumber = 1;
+ let currentCategoryName = allText;
+ if (location.search && location.search.split('?').length > 0) {
+ const params = location.search.split('?')[1].split('&');
+ if (params) {
+ params.map(e => {
+ const [key, value] = e.split('=');
+ if (key === 'currentPage') {
+ if (value) currentPageNumber = +value;
+ } else {
+ if (value) currentCategoryName = decodeURI(value);
+ }
+ });
+ }
+ }
+
+ setActive(currentCategoryName);
+ setCurrentPage(currentPageNumber);
+
+ let currentCategory = blogCategories.find(item => item.label === currentCategoryName);
if (!currentCategory) {
- setActive(allText);
currentCategory = blogCategories.find(item => item.label === allText);
}
+
setBlogs(currentCategory.values);
- };
+ setCurrentBlogs(currentCategory.values.slice((currentPageNumber - 1) * pageSize, currentPageNumber * pageSize));
+ }, [location.search]);
useEffect(() => {
changeCategory(active);
@@ -92,24 +124,25 @@
}, [active]);
return (
- <BlogLayout sidebar={sidebar} pageType="blogList">
- <div className="blog-list-wrap row">
- <div className="blog-list-nav col col--3">
- <ul className="category-list">
- {blogCategories &&
- blogCategories.map((item, i) => (
- <li
- className={clsx('category-item', active === item.label && 'active')}
- key={i}
- onClick={() => changeCategory(item.label)}
- >
- {item.label}
- </li>
- ))}
- </ul>
- </div>
- <div className="blot-list col col--9">
- {blogs.map((BlogPostContent, i) => (
+ <BlogLayout sidebar={sidebar} pageType="blogList" className="lg:max-w-7xl">
+ <PageHeader title="Blog" className="bg-white" {...props} />
+ <HeadBlogs blogs={ALL_BLOG} />
+ <div className="flex flex-col lg:max-w-7xl">
+ <ul className="scrollbar-none w-[100%] mt-6 custom-scrollbar m-auto flex gap-3 overflow-auto text-[#4C576C] lg:mt-[5.5rem] lg:justify-center lg:gap-6">
+ {blogCategories.map((item: any, index) => (
+ <li className=" py-px" key={index} onClick={() => changeCategory(item.label)}>
+ <span
+ className={`block cursor-pointer whitespace-nowrap rounded-[2.5rem] px-4 py-2 text-sm shadow-[0px_1px_4px_0px_rgba(49,77,136,0.10)] hover:bg-[#444FD9] hover:text-white lg:px-6 lg:py-3 lg:text-base ${
+ active === item.label && 'bg-[#444FD9] text-white'
+ }`}
+ >
+ {item.label}
+ </span>
+ </li>
+ ))}
+ </ul>
+ <ul className="mt-6 grid gap-6 lg:mt-10 lg:grid-cols-3 m-auto">
+ {currentBlogs.map((BlogPostContent, i) => (
<BlogListItem
key={BlogPostContent.metadata.permalink + i}
frontMatter={BlogPostContent.frontMatter}
@@ -120,7 +153,8 @@
<BlogPostContent />
</BlogListItem>
))}
- </div>
+ </ul>
+ <BlogListFooter total={blogs.length} currentPage={currentPage} currentCategory={active} />
</div>
</BlogLayout>
);
diff --git a/src/theme/BlogPostItem/index.tsx b/src/theme/BlogPostItem/index.tsx
index c188eee..29306e7 100644
--- a/src/theme/BlogPostItem/index.tsx
+++ b/src/theme/BlogPostItem/index.tsx
@@ -44,7 +44,22 @@
itemType="http://schema.org/BlogPosting"
>
<header>
- <TitleHeading className="blog-post-title" itemProp="headline">
+ <div className="text-center mb-4">
+ <Link className="text-[#8592A6] cursor-pointer hover:no-underline" to="/blog">
+ Blog
+ </Link>
+ <span className="px-2 text-[#8592A6]">/</span>
+ <span>
+ <span className="s-tags">
+ {tags.map((tag, i) => (
+ <span className="s-tag" key={i}>
+ {tag.label}
+ </span>
+ ))}
+ </span>
+ </span>
+ </div>
+ <TitleHeading className="blog-post-title text-[2.5rem] text-center" itemProp="headline">
{isBlogPostPage ? (
title
) : (
@@ -53,23 +68,19 @@
</Link>
)}
</TitleHeading>
- <div className="blog-info">
- <time dateTime={date} itemProp="datePublished">
- {formattedDate}
- </time>
+ <div className="blog-info text-center flex justify-center text-sm text-black">
{authorsExists && (
<>
- <span className="split-line"></span>
<span className="authors">
{authors.map((author, i) => (
- <span className="s-author" key={i}>
+ <span className="s-author text-black" key={i}>
{author.name}
</span>
))}
</span>
</>
)}
- {tagsExists && (
+ {/* {tagsExists && (
<>
<span className="split-line"></span>
<span className="s-tags">
@@ -80,7 +91,10 @@
))}
</span>
</>
- )}
+ )} */}
+ <time dateTime={date} itemProp="datePublished" className="text-black ml-4">
+ {formattedDate}
+ </time>
</div>
</header>
@@ -94,51 +108,6 @@
>
<MDXContent>{children}</MDXContent>
</div>
-
- {/* {(tagsExists || truncated) && (
- <footer
- className={clsx(
- "row docusaurus-mt-lg",
- isBlogPostPage && "blog-post-details-full"
- )}
- >
- {isBlogPostPage && editUrl && (
- <div className="col margin-top--sm">
- <EditThisPage editUrl={editUrl} />
- </div>
- )}
-
- {truncatedPost && (
- <div
- className={clsx("col text--right", {
- "col--3": tagsExists,
- })}
- >
- <Link
- to={metadata.permalink}
- aria-label={translate(
- {
- message: "Read more about {title}",
- id: "theme.blog.post.readMoreLabel",
- description:
- "The ARIA label for the link to full blog posts from excerpts",
- },
- { title }
- )}
- >
- <b>
- <Translate
- id="theme.blog.post.readMore"
- description="The label used in blog post item excerpts to link to full blog posts"
- >
- Read More
- </Translate>
- </b>
- </Link>
- </div>
- )}
- </footer>
- )} */}
</article>
);
}
diff --git a/src/theme/BlogPostItem/styles.scss b/src/theme/BlogPostItem/styles.scss
index f5a182f..2f4ec71 100644
--- a/src/theme/BlogPostItem/styles.scss
+++ b/src/theme/BlogPostItem/styles.scss
@@ -1,29 +1,31 @@
.blog-article-content {
- margin-top: 2rem;
- margin-bottom: 3rem;
+ margin-top: 2rem;
+ margin-bottom: 3rem;
- .blog-post-title {
- margin-bottom: 1.5rem;
- }
+ .blog-post-title {
+ margin-bottom: 1rem;
+ font-weight: 500;
+ line-height: 4rem;
+ }
- .blog-info {
- margin-bottom: 2rem;
- }
+ .blog-info {
+ margin-bottom: 2.5rem;
+ }
}
/**
Blog post title should be smaller on smaller devices
**/
@media (max-width: 576px) {
- .blog-post-title {
- font-size: 2rem;
- }
+ .blog-post-title {
+ font-size: 2rem;
+ }
}
.blog-post-data {
- font-size: 0.9rem;
+ font-size: 0.9rem;
}
.blog-post-details-full {
- flex-direction: column;
-}
\ No newline at end of file
+ flex-direction: column;
+}
diff --git a/src/theme/DocSidebar/Desktop/Content/index.js b/src/theme/DocSidebar/Desktop/Content/index.js
new file mode 100644
index 0000000..6839430
--- /dev/null
+++ b/src/theme/DocSidebar/Desktop/Content/index.js
@@ -0,0 +1,42 @@
+import React, { useState } from 'react';
+import clsx from 'clsx';
+import { ThemeClassNames } from '@docusaurus/theme-common';
+import { useAnnouncementBar, useScrollPosition } from '@docusaurus/theme-common/internal';
+import { translate } from '@docusaurus/Translate';
+import DocSidebarItems from '@theme/DocSidebarItems';
+import styles from './styles.module.css';
+function useShowAnnouncementBar() {
+ const { isActive } = useAnnouncementBar();
+ const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive);
+ useScrollPosition(
+ ({ scrollY }) => {
+ if (isActive) {
+ setShowAnnouncementBar(scrollY === 0);
+ }
+ },
+ [isActive],
+ );
+ return isActive && showAnnouncementBar;
+}
+export default function DocSidebarDesktopContent({ path, sidebar, className }) {
+ const showAnnouncementBar = useShowAnnouncementBar();
+ return (
+ <nav
+ aria-label={translate({
+ id: 'theme.docs.sidebar.navAriaLabel',
+ message: 'Docs sidebar',
+ description: 'The ARIA label for the sidebar navigation',
+ })}
+ className={clsx(
+ 'menu custom-scrollbar',
+ styles.menu,
+ showAnnouncementBar && styles.menuWithAnnouncementBar,
+ className,
+ )}
+ >
+ <ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
+ <DocSidebarItems items={sidebar} activePath={path} level={1} />
+ </ul>
+ </nav>
+ );
+}
diff --git a/src/theme/DocSidebar/Desktop/Content/styles.module.css b/src/theme/DocSidebar/Desktop/Content/styles.module.css
new file mode 100644
index 0000000..0c43a4e
--- /dev/null
+++ b/src/theme/DocSidebar/Desktop/Content/styles.module.css
@@ -0,0 +1,16 @@
+@media (min-width: 997px) {
+ .menu {
+ flex-grow: 1;
+ padding: 0.5rem;
+ }
+ @supports (scrollbar-gutter: stable) {
+ .menu {
+ padding: 0.5rem 0 0.5rem 0.5rem;
+ scrollbar-gutter: stable;
+ }
+ }
+
+ .menuWithAnnouncementBar {
+ margin-bottom: var(--docusaurus-announcement-bar-height);
+ }
+}
diff --git a/src/theme/DocSidebar/Desktop/index.tsx b/src/theme/DocSidebar/Desktop/index.tsx
index 92bce9f..000fac8 100644
--- a/src/theme/DocSidebar/Desktop/index.tsx
+++ b/src/theme/DocSidebar/Desktop/index.tsx
@@ -17,11 +17,11 @@
} = useThemeConfig();
const hasLearningPath = path.includes('/docs');
return (
- <div className={clsx('sidebar', hideOnScroll && 'sidebar-with-hideable-navbar', isHidden && 'sidebar-hidden')}>
+ <div className={clsx('sidebar ', hideOnScroll && 'sidebar-with-hideable-navbar', isHidden && 'sidebar-hidden')}>
{hideOnScroll && <Logo tabIndex={-1} className="sidebar-logo" />}
- <div className="doc-search">
+ {/* <div className="doc-search">
<SearchBar />
- </div>
+ </div> */}
{/* {hasLearningPath && <Link to="/learning" className="learning-path">
<Translate id="sitemap.page.title" description="">
Learning Path
diff --git a/src/theme/DocSidebar/Desktop/styles.scss b/src/theme/DocSidebar/Desktop/styles.scss
index 973550c..e9c3b9c 100644
--- a/src/theme/DocSidebar/Desktop/styles.scss
+++ b/src/theme/DocSidebar/Desktop/styles.scss
@@ -1,94 +1,94 @@
@media (min-width: 997px) {
- .sidebar {
- display: flex;
- flex-direction: column;
- max-height: 100vh;
- height: 100%;
- position: sticky;
- top: 0;
- padding-top: var(--ifm-navbar-height);
- width: var(--doc-sidebar-width);
- transition: opacity 50ms ease;
- }
-
- .sidebar-with-hideable-navbar {
- padding-top: 0;
- }
-
- .sidebar-hidden {
- opacity: 0;
- height: 0;
- overflow: hidden;
- visibility: hidden;
- }
-
- .sidebar-logo {
- display: flex !important;
- align-items: center;
- margin: 0 var(--ifm-navbar-padding-horizontal);
- min-height: var(--ifm-navbar-height);
- max-height: var(--ifm-navbar-height);
- color: inherit !important;
- text-decoration: none !important;
-
- img {
- margin-right: 0.5rem;
- height: 2rem;
+ .sidebar {
+ display: flex;
+ flex-direction: column;
+ max-height: 100vh;
+ height: 100%;
+ position: sticky;
+ top: 0;
+ padding-top: var(--ifm-navbar-height);
+ width: var(--doc-sidebar-width);
+ transition: opacity 50ms ease;
+ border-right: 1px solid #dfe5f0;
}
- }
+
+ .sidebar-with-hideable-navbar {
+ padding-top: 0;
+ }
+
+ .sidebar-hidden {
+ opacity: 0;
+ height: 0;
+ overflow: hidden;
+ visibility: hidden;
+ }
+
+ .sidebar-logo {
+ display: flex !important;
+ align-items: center;
+ margin: 0 var(--ifm-navbar-padding-horizontal);
+ min-height: var(--ifm-navbar-height);
+ max-height: var(--ifm-navbar-height);
+ color: inherit !important;
+ text-decoration: none !important;
+
+ img {
+ margin-right: 0.5rem;
+ height: 2rem;
+ }
+ }
}
.sidebar-logo {
- display: none;
+ display: none;
}
.learning-path {
- padding: 0.8rem 1rem 0.5rem 2.5rem;
- margin-bottom: -1.3rem;
- color: var(--global-colors-text-primary);
- text-decoration: none;
- position: relative;
- background-color: var(--global-colors-background);
- z-index: 1;
- &:hover {
+ padding: 0.8rem 1rem 0.5rem 2.5rem;
+ margin-bottom: -1.3rem;
+ color: var(--global-colors-text-primary);
text-decoration: none;
- }
+ position: relative;
+ background-color: var(--global-colors-background);
+ z-index: 1;
+ &:hover {
+ text-decoration: none;
+ }
}
.doc-search {
- margin: 0.9375rem 0.9375rem 0;
+ margin: 0.9375rem 0.9375rem 0;
- .navbar__search {
- margin: 0;
- flex: 1;
+ .navbar__search {
+ margin: 0;
+ flex: 1;
- >span {
- display: block !important;
+ > span {
+ display: block !important;
- >span:last-child {
- left: 0 !important;
- right: auto !important;
- }
+ > span:last-child {
+ left: 0 !important;
+ right: auto !important;
+ }
+ }
+
+ &-input {
+ width: 100%;
+ border-radius: 4px;
+ height: 2.25rem;
+ }
+
+ > div:last-child {
+ display: none;
+ }
}
- &-input {
- width: 100%;
- border-radius: 4px;
- height: 2.25rem;
- }
+ // .navbar__item {
+ // display: block;
+ // padding: 0 0.625rem;
+ // margin-left: 0.625rem;
- >div:last-child {
- display: none;
- }
- }
-
-
- // .navbar__item {
- // display: block;
- // padding: 0 0.625rem;
- // margin-left: 0.625rem;
-
- // .navbar__link {
- // padding: 0;
- // }
- // }
-}
\ No newline at end of file
+ // .navbar__link {
+ // padding: 0;
+ // }
+ // }
+}
diff --git a/src/theme/DocSidebarItem/Category/index.tsx b/src/theme/DocSidebarItem/Category/index.tsx
new file mode 100644
index 0000000..cfbfb9a
--- /dev/null
+++ b/src/theme/DocSidebarItem/Category/index.tsx
@@ -0,0 +1,172 @@
+import React, { useEffect, useMemo } from 'react';
+import clsx from 'clsx';
+import { ThemeClassNames, useThemeConfig, usePrevious, Collapsible, useCollapsible } from '@docusaurus/theme-common';
+import {
+ isActiveSidebarItem,
+ findFirstCategoryLink,
+ useDocSidebarItemsExpandedState,
+ isSamePath,
+} from '@docusaurus/theme-common/internal';
+import Link from '@docusaurus/Link';
+import { translate } from '@docusaurus/Translate';
+import useIsBrowser from '@docusaurus/useIsBrowser';
+import DocSidebarItems from '@theme/DocSidebarItems';
+import './style.scss';
+// If we navigate to a category and it becomes active, it should automatically
+// expand itself
+function useAutoExpandActiveCategory({ isActive, collapsed, updateCollapsed }) {
+ const wasActive = usePrevious(isActive);
+ useEffect(() => {
+ const justBecameActive = isActive && !wasActive;
+ if (justBecameActive && collapsed) {
+ updateCollapsed(false);
+ }
+ }, [isActive, wasActive, collapsed, updateCollapsed]);
+}
+/**
+ * When a collapsible category has no link, we still link it to its first child
+ * during SSR as a temporary fallback. This allows to be able to navigate inside
+ * the category even when JS fails to load, is delayed or simply disabled
+ * React hydration becomes an optional progressive enhancement
+ * see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188
+ * see https://github.com/facebook/docusaurus/issues/3030
+ */
+function useCategoryHrefWithSSRFallback(item) {
+ const isBrowser = useIsBrowser();
+ return useMemo(() => {
+ if (item.href) {
+ return item.href;
+ }
+ // In these cases, it's not necessary to render a fallback
+ // We skip the "findFirstCategoryLink" computation
+ if (isBrowser || !item.collapsible) {
+ return undefined;
+ }
+ return findFirstCategoryLink(item);
+ }, [item, isBrowser]);
+}
+function CollapseButton({ categoryLabel, onClick }) {
+ return (
+ <button
+ aria-label={translate(
+ {
+ id: 'theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel',
+ message: "Toggle the collapsible sidebar category '{label}'",
+ description: 'The ARIA label to toggle the collapsible sidebar category',
+ },
+ { label: categoryLabel },
+ )}
+ type="button"
+ className="clean-btn menu__caret"
+ onClick={onClick}
+ />
+ );
+}
+export default function DocSidebarItemCategory({ item, onItemClick, activePath, level, index, ...props }) {
+ const { items, label, collapsible, className, href } = item;
+ const {
+ docs: {
+ sidebar: { autoCollapseCategories },
+ },
+ } = useThemeConfig();
+ const hrefWithSSRFallback = useCategoryHrefWithSSRFallback(item);
+ const isActive = isActiveSidebarItem(item, activePath);
+ const isCurrentPage = isSamePath(href, activePath);
+ const { collapsed, setCollapsed } = useCollapsible({
+ // Active categories are always initialized as expanded. The default
+ // (`item.collapsed`) is only used for non-active categories.
+ initialState: () => {
+ if (!collapsible) {
+ return false;
+ }
+ return isActive || level === 1 ? false : item.collapsed;
+ },
+ });
+ const { expandedItem, setExpandedItem } = useDocSidebarItemsExpandedState();
+ // Use this instead of `setCollapsed`, because it is also reactive
+ const updateCollapsed = (toCollapsed = !collapsed) => {
+ setExpandedItem(toCollapsed ? null : index);
+ setCollapsed(toCollapsed);
+ };
+ useAutoExpandActiveCategory({ isActive, collapsed, updateCollapsed });
+ useEffect(() => {
+ if (collapsible && expandedItem != null && expandedItem !== index && autoCollapseCategories) {
+ setCollapsed(true);
+ }
+ }, [collapsible, expandedItem, index, setCollapsed, autoCollapseCategories]);
+ return (
+ <li
+ className={clsx(
+ ThemeClassNames.docs.docSidebarItemCategory,
+ ThemeClassNames.docs.docSidebarItemCategoryLevel(level),
+ 'menu__list-item',
+ {
+ 'menu__list-item--collapsed': collapsed,
+ },
+ className,
+ )}
+ >
+ <div
+ className={clsx('menu__list-item-collapsible', {
+ 'menu__list-item-collapsible--active': isCurrentPage,
+ })}
+ >
+ <Link
+ id={`${level === 1 ? 'menu__group' : ''}`}
+ className={clsx(`menu__link menu__link_level_${level}`, {
+ 'menu__link--sublist': collapsible,
+ 'menu__link--sublist-caret': !href && collapsible,
+ 'menu__link--active': isActive,
+ })}
+ onClick={
+ collapsible
+ ? e => {
+ if (level === 1) return;
+ onItemClick?.(item);
+ if (href) {
+ updateCollapsed(false);
+ } else {
+ e.preventDefault();
+ updateCollapsed();
+ }
+ }
+ : () => {
+ if (level === 1) return;
+ onItemClick?.(item);
+ }
+ }
+ aria-current={isCurrentPage ? 'page' : undefined}
+ aria-expanded={collapsible ? !collapsed : undefined}
+ href={collapsible ? hrefWithSSRFallback ?? '#' : hrefWithSSRFallback}
+ {...props}
+ >
+ {label}
+ </Link>
+ {href && collapsible && (
+ <CollapseButton
+ categoryLabel={label}
+ onClick={e => {
+ e.preventDefault();
+ updateCollapsed();
+ }}
+ />
+ )}
+ </div>
+
+ <Collapsible
+ lazy
+ as="ul"
+ className={`menu__list ${level === 1 ? 'menu__list_level_2' : ''}`}
+ collapsed={collapsed}
+ >
+ <DocSidebarItems
+ items={items}
+ tabIndex={collapsed ? -1 : 0}
+ onItemClick={onItemClick}
+ activePath={activePath}
+ level={level + 1}
+ />
+ </Collapsible>
+ </li>
+ );
+}
diff --git a/src/theme/DocSidebarItem/Category/style.scss b/src/theme/DocSidebarItem/Category/style.scss
new file mode 100644
index 0000000..da25dbc
--- /dev/null
+++ b/src/theme/DocSidebarItem/Category/style.scss
@@ -0,0 +1,63 @@
+.theme-doc-sidebar-menu.menu__list {
+ .theme-doc-sidebar-item-category-level-1 {
+ padding-bottom: 1.375rem;
+ padding-top: 1.375rem;
+ border-bottom: 1px solid #edf2fa;
+ margin-top: 0;
+ .menu__link.menu__link--sublist-caret.menu__link_level_1 {
+ &:after {
+ display: none;
+ }
+ color: #8592a6;
+ font-weight: 500;
+ font-size: 12px;
+ }
+ }
+ .menu__link_level_2.menu__link {
+ color: #1d1d1d !important;
+ }
+ .theme-doc-sidebar-item-link-level-2 {
+ .menu__link {
+ color: #1d1d1d !important;
+ }
+ }
+ .menu__link.menu__link--active:not(.menu__link--sublist) {
+ color: #444fd9 !important;
+ font-weight: 500;
+ background-color: rgba(237, 238, 250, 0.6);
+ }
+ .menu__list-item {
+ .menu__link {
+ line-height: 2rem;
+ padding: 0 0.625rem;
+ color: #4c576c;
+ font-size: 14px;
+ font-weight: 400;
+ &:hover {
+ background-color: rgba(237, 242, 250, 0.5) !important;
+ }
+ &:after {
+ right: 0;
+ background: url('../../../../static/images/chevron-down.svg') no-repeat center;
+ }
+ }
+ }
+ #menu__group:hover {
+ background-color: white !important;
+ }
+ .menu__list .menu__list {
+ margin-left: 0.625rem;
+ border-left: 1px solid #dfe5f0;
+ }
+ .menu__list_level_2 {
+ padding-left: 0;
+ }
+}
+.menu__list-item .menu__link--sublist:after,
+.menu__list-item .menu__caret:before {
+ transform: rotateZ(0);
+}
+.menu__list-item--collapsed .menu__link--sublist:after,
+.menu__list-item--collapsed .menu__caret:before {
+ transform: rotateZ(-90deg);
+}
diff --git a/src/theme/Footer/index.tsx b/src/theme/Footer/index.tsx
index fadca73..46722b7 100644
--- a/src/theme/Footer/index.tsx
+++ b/src/theme/Footer/index.tsx
@@ -12,7 +12,7 @@
import { WechatIcon } from '@site/src/components/Icons/wechat';
import { YoutubeIcon } from '@site/src/components/Icons/youtube';
import { LinkedinIcon } from '@site/src/components/Icons/linkedin';
-
+import { MediumIcon } from '@site/src/components/Icons/medium';
import Translate from '@docusaurus/Translate';
function Footer() {
@@ -22,7 +22,7 @@
}
const { copyright, links, logo, style } = footer;
return (
- <div className="footer">
+ <div className="footer pt-16 pb-10">
<div className="container">
<div className="footer-box">
<div className="left">
@@ -32,7 +32,7 @@
<div className="right">
<div className="footer__title">
<Translate id="footer.follow" description="Footer Follow">
- Connect with Us
+ Join the community
</Translate>
</div>
<div className="social-list">
@@ -56,8 +56,6 @@
>
<TwitterIcon />
</a>
- </div>
- <div className="social">
<a
href="https://join.slack.com/t/apachedoriscommunity/shared_invite/zt-28il1o2wk-DD6LsLOz3v4aD92Mu0S0aQ"
title="slack"
@@ -66,6 +64,8 @@
>
<SlackIcon />
</a>
+ </div>
+ <div className="social">
<a
href="https://www.youtube.com/@apachedoris/channels"
title="youtube"
@@ -82,6 +82,21 @@
>
<LinkedinIcon />
</a>
+ <a
+ href="https://medium.com/@ApacheDoris"
+ title="medium"
+ target="_blank"
+ className="item"
+ >
+ <MediumIcon />
+ </a>
+ <a className="item wechat">
+ <WechatIcon />
+ <div className="wechat-dropdown">
+ <p className="text-[#4c576c] text-xs">Connect on WeChat</p>
+ <img src={require('@site/static/images/doris-wechat.png').default} alt="" />
+ </div>
+ </a>
</div>
</div>
</div>
diff --git a/src/theme/Footer/styles.scss b/src/theme/Footer/styles.scss
index 9cc7bfe..48a40ad 100644
--- a/src/theme/Footer/styles.scss
+++ b/src/theme/Footer/styles.scss
@@ -14,12 +14,24 @@
font-size: var(--global-font-size-medium);
margin-bottom: 1.5rem;
font-weight: 500;
+ white-space: nowrap;
+ }
+
+ .footer__items {
+ .footer__item {
+ & + .footer__item {
+ margin-top: 0.5rem;
+ }
+ .footer__link-item {
+ line-height: 1.375rem;
+ }
+ }
}
.footer__link-item {
color: var(--global-colors-white);
font-size: var(--global-font-size-small);
- transition: all .3s;
+ transition: all 0.3s;
white-space: nowrap;
svg {
@@ -32,8 +44,8 @@
}
.footer__col {
- &+.footer__col {
- margin-left: 2rem;
+ & + .footer__col {
+ margin-left: 4rem;
}
}
@@ -71,7 +83,7 @@
.footer__col {
flex: 1;
- &+.footer__col {
+ & + .footer__col {
margin-left: 0;
}
}
@@ -116,11 +128,9 @@
color: var(--global-colors-white);
position: relative;
-
&.wechat {
&:hover {
- opacity: 1;
-
+ cursor: pointer;
.wechat-dropdown {
display: flex;
}
@@ -128,17 +138,19 @@
.wechat-dropdown {
background-color: var(--global-colors-white);
- padding: 0.625rem;
+ padding: 0.5rem;
border-radius: var(--global-border-radius);
width: 8.75rem;
- height: 8.75rem;
+ height: 10rem;
align-items: center;
justify-content: center;
+ flex-direction: column;
position: absolute;
- right: 0;
+ left: 50%;
top: 2.5rem;
z-index: 2;
- box-shadow: 0px 6px 16px rgba(255, 255, 255, .1);
+ transform: translateX(-50%);
+ box-shadow: 0px 6px 16px rgba(255, 255, 255, 0.1);
display: none;
&::before {
@@ -147,40 +159,49 @@
border-bottom-color: var(--global-colors-white);
display: block;
position: absolute;
- right: 0.625rem;
+ left: 50%;
+ transform: translateX(-50%);
top: -1rem;
}
img {
width: 100%;
display: block;
+ left: 50%;
+ width: 156px;
+ height: 180px;
+ background: url('/static/images/wechat-qrc.png') no-repeat center;
+ background-size: cover;
+ z-index: 1;
+ @media screen and (max-width: 996px) {
+ width: 78px;
+ height: 90px;
+ }
}
}
}
&:hover {
- opacity: .8;
+ opacity: 0.8;
}
}
}
}
-
-
}
}
.footer__copyright {
- width: 65%;
+ width: 98%;
margin: 0 auto;
- margin-top: 4.375rem;
+ margin-top: 3.5rem;
line-height: 1.8;
text-align: center;
- color: var(--global-colors-white);
- opacity: .6;
- font-size: var(--global-font-size-smaller);
+ color: #dfe5f0;
+ opacity: 0.6;
+ font-size: 0.75rem;
a {
- color: var(--global-colors-white);
+ color: #dfe5f0;
}
@media screen and (max-width: 996px) {
@@ -188,4 +209,4 @@
margin: 1rem 1rem 0;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/theme/Navbar/ColorModeToggle/index.js b/src/theme/Navbar/ColorModeToggle/index.js
new file mode 100644
index 0000000..a506863
--- /dev/null
+++ b/src/theme/Navbar/ColorModeToggle/index.js
@@ -0,0 +1,22 @@
+import React from 'react';
+import {useColorMode, useThemeConfig} from '@docusaurus/theme-common';
+import ColorModeToggle from '@theme/ColorModeToggle';
+import styles from './styles.module.css';
+export default function NavbarColorModeToggle({className}) {
+ const navbarStyle = useThemeConfig().navbar.style;
+ const disabled = useThemeConfig().colorMode.disableSwitch;
+ const {colorMode, setColorMode} = useColorMode();
+ if (disabled) {
+ return null;
+ }
+ return (
+ <ColorModeToggle
+ className={className}
+ buttonClassName={
+ navbarStyle === 'dark' ? styles.darkNavbarColorModeToggle : undefined
+ }
+ value={colorMode}
+ onChange={setColorMode}
+ />
+ );
+}
diff --git a/src/theme/Navbar/ColorModeToggle/styles.module.css b/src/theme/Navbar/ColorModeToggle/styles.module.css
new file mode 100644
index 0000000..7bd077a
--- /dev/null
+++ b/src/theme/Navbar/ColorModeToggle/styles.module.css
@@ -0,0 +1,3 @@
+.darkNavbarColorModeToggle:hover {
+ background: var(--ifm-color-gray-800);
+}
diff --git a/src/theme/Navbar/Content/index.tsx b/src/theme/Navbar/Content/index.tsx
index 03b1914..3bfe7a0 100644
--- a/src/theme/Navbar/Content/index.tsx
+++ b/src/theme/Navbar/Content/index.tsx
@@ -6,10 +6,13 @@
import SearchBar from '@theme/SearchBar';
import NavbarMobileSidebarToggle from '@theme/Navbar/MobileSidebar/Toggle';
import NavbarLogo from '@theme/Navbar/Logo';
+import DocsLogo from '@site/static/images/docs-logo.svg';
import NavbarSearch from '@theme/Navbar/Search';
import styles from './styles.module.css';
import Link from '@docusaurus/Link';
import Translate from '@docusaurus/Translate';
+import DocsVersionDropdownNavbarItem from '../../NavbarItem/DocsVersionDropdownNavbarItem';
+import LocaleDropdownNavbarItem from '../../NavbarItem/LocaleDropdownNavbarItem';
function useNavbarItems() {
// TODO temporary casting until ThemeConfig type is improved
return useThemeConfig().navbar.items;
@@ -23,12 +26,20 @@
</>
);
}
-function NavbarContentLayout({ left, right }) {
+function NavbarContentLayout({ left, right, bottom, isDocsPage = false }) {
return (
- <div className="navbar__inner">
- <div className="navbar__items">{left}</div>
- <div className="navbar__items navbar__items--right">{right}</div>
- </div>
+ <>
+ <div
+ className="navbar__inner"
+ style={{
+ padding: isDocsPage && '0 1.6rem',
+ }}
+ >
+ <div className="navbar__items">{left}</div>
+ <div className="navbar__items navbar__items--right">{right}</div>
+ </div>
+ <div className="navbar__bottom">{bottom}</div>
+ </>
);
}
export default function NavbarContent({ mobile }) {
@@ -37,9 +48,15 @@
const [leftItems, rightItems] = splitNavbarItems(items);
const searchBarItem = items.find(item => item.type === 'search');
const [star, setStar] = useState<any>();
+ const [isDocsPage, setIsDocsPage] = useState(false);
useEffect(() => {
getGithubStar();
- }, []);
+ if (typeof window !== 'undefined') {
+ const pathname = location.pathname.split('/')[1];
+ const docsPage = pathname === 'docs' || location.pathname.includes('zh-CN/docs');
+ setIsDocsPage(docsPage);
+ }
+ }, [typeof window !== 'undefined' && location.pathname]);
async function getGithubStar() {
const res = await fetch('https://api.github.com/repos/apache/doris');
@@ -56,20 +73,40 @@
return (index % 3 ? next : next + '.') + prev;
});
}
+
+ function getNavItem(type: string) {
+ return items.find(item => item.type === type);
+ }
return (
<NavbarContentLayout
left={
// TODO stop hardcoding items?
- <>
- {!mobileSidebar.disabled && <NavbarMobileSidebarToggle />}
- <NavbarLogo />
- <NavbarItems items={leftItems} />
- </>
+ <div className="navbar-left">
+ <div className="navbar-logo-wrapper flex items-center">
+ {isDocsPage ? (
+ <div
+ className="cursor-pointer docs"
+ onClick={() => {
+ window.location.href = '/';
+ }}
+ >
+ <DocsLogo />
+ </div>
+ ) : (
+ <NavbarLogo />
+ )}
+ </div>
+
+ {!isDocsPage && <NavbarItems items={leftItems} />}
+ {/* */}
+ </div>
}
+ isDocsPage={isDocsPage}
right={
// TODO stop hardcoding items?
// Ask the user to add the respective navbar items => more flexible
<>
+ {!mobileSidebar.disabled && <NavbarMobileSidebarToggle />}
<NavbarItems items={rightItems} />
<NavbarColorModeToggle className={styles.colorModeToggle} />
{!searchBarItem && (
@@ -84,12 +121,31 @@
>
{star && <div className="gh-count">{star}k</div>}
</Link>
-
+ <Link
+ className="slack-btn desktop header-right-button-slack"
+ href="https://join.slack.com/t/apachedoriscommunity/shared_invite/zt-28il1o2wk-DD6LsLOz3v4aD92Mu0S0aQ"
+ target="_blank"
+ ></Link>
<Link className="header-right-button-primary navbar-download-desktop" to="/download">
<Translate id="navbar.download">Download</Translate>
</Link>
</>
}
+ bottom={
+ isDocsPage ? (
+ <div className="docs-nav-version-locale">
+ <LocaleDropdownNavbarItem mobile={false} {...(getNavItem('localeDropdown') as any)} />
+ <DocsVersionDropdownNavbarItem
+ mobile={false}
+ docsPluginId="default"
+ collapsed={false}
+ {...(getNavItem('docsVersionDropdown') as any)}
+ />
+ </div>
+ ) : (
+ <></>
+ )
+ }
/>
);
}
diff --git a/src/theme/Navbar/Layout/index.tsx b/src/theme/Navbar/Layout/index.tsx
new file mode 100644
index 0000000..d5bbc45
--- /dev/null
+++ b/src/theme/Navbar/Layout/index.tsx
@@ -0,0 +1,50 @@
+import React, { useEffect, useState } from 'react';
+import clsx from 'clsx';
+import { useThemeConfig } from '@docusaurus/theme-common';
+import { useHideableNavbar, useNavbarMobileSidebar } from '@docusaurus/theme-common/internal';
+import { translate } from '@docusaurus/Translate';
+import NavbarMobileSidebar from '@theme/Navbar/MobileSidebar';
+import styles from './styles.module.css';
+function NavbarBackdrop(props) {
+ return <div role="presentation" {...props} className={clsx('navbar-sidebar__backdrop', props.className)} />;
+}
+export default function NavbarLayout({ children }) {
+ const {
+ navbar: { hideOnScroll, style },
+ } = useThemeConfig();
+ const mobileSidebar = useNavbarMobileSidebar();
+ const { navbarRef, isNavbarVisible } = useHideableNavbar(hideOnScroll);
+ const [isDocsPage, setIsDocsPage] = useState(false);
+ useEffect(() => {
+ if (typeof window !== 'undefined') {
+ const pathname = location.pathname.split('/')[1];
+ const docsPage = pathname === 'docs' || location.pathname.includes('zh-CN/docs');
+ setIsDocsPage(docsPage);
+ }
+ }, [typeof window !== 'undefined' && location.pathname]);
+ return (
+ <nav
+ ref={navbarRef}
+ aria-label={translate({
+ id: 'theme.NavBar.navAriaLabel',
+ message: 'Main',
+ description: 'The ARIA label for the main navigation',
+ })}
+ className={clsx(
+ 'navbar',
+ 'navbar--fixed-top',
+ isDocsPage && 'docs',
+ hideOnScroll && [styles.navbarHideable, !isNavbarVisible && styles.navbarHidden],
+ {
+ 'navbar--dark': style === 'dark',
+ 'navbar--primary': style === 'primary',
+ 'navbar-sidebar--show': mobileSidebar.shown,
+ },
+ )}
+ >
+ {children}
+ <NavbarBackdrop onClick={mobileSidebar.toggle} />
+ <NavbarMobileSidebar />
+ </nav>
+ );
+}
diff --git a/src/theme/Navbar/Layout/styles.module.css b/src/theme/Navbar/Layout/styles.module.css
new file mode 100644
index 0000000..e72891a
--- /dev/null
+++ b/src/theme/Navbar/Layout/styles.module.css
@@ -0,0 +1,7 @@
+.navbarHideable {
+ transition: transform var(--ifm-transition-fast) ease;
+}
+
+.navbarHidden {
+ transform: translate3d(0, calc(-100% - 2px), 0);
+}
diff --git a/src/theme/Navbar/Logo/index.js b/src/theme/Navbar/Logo/index.js
new file mode 100644
index 0000000..f0fa51f
--- /dev/null
+++ b/src/theme/Navbar/Logo/index.js
@@ -0,0 +1,11 @@
+import React from 'react';
+import Logo from '@theme/Logo';
+export default function NavbarLogo() {
+ return (
+ <Logo
+ className="navbar__brand"
+ imageClassName="navbar__logo"
+ titleClassName="navbar__title text--truncate"
+ />
+ );
+}
diff --git a/src/theme/Navbar/MobileSidebar/Header/index.js b/src/theme/Navbar/MobileSidebar/Header/index.js
new file mode 100644
index 0000000..9e128eb
--- /dev/null
+++ b/src/theme/Navbar/MobileSidebar/Header/index.js
@@ -0,0 +1,32 @@
+import React from 'react';
+import { useNavbarMobileSidebar } from '@docusaurus/theme-common/internal';
+import { translate } from '@docusaurus/Translate';
+import NavbarColorModeToggle from '@theme/Navbar/ColorModeToggle';
+import IconClose from '@theme/Icon/Close';
+import NavbarLogo from '@theme/Navbar/Logo';
+function CloseButton() {
+ const mobileSidebar = useNavbarMobileSidebar();
+ return (
+ <button
+ type="button"
+ aria-label={translate({
+ id: 'theme.docs.sidebar.closeSidebarButtonAriaLabel',
+ message: 'Close navigation bar',
+ description: 'The ARIA label for close button of mobile sidebar',
+ })}
+ className="clean-btn navbar-sidebar__close lg:w-6 w-4"
+ onClick={() => mobileSidebar.toggle()}
+ >
+ <IconClose color="var(--ifm-color-emphasis-600)" />
+ </button>
+ );
+}
+export default function NavbarMobileSidebarHeader() {
+ return (
+ <div className="navbar-sidebar__brand">
+ <NavbarLogo />
+ <NavbarColorModeToggle className="margin-right--md" />
+ <CloseButton />
+ </div>
+ );
+}
diff --git a/src/theme/Navbar/MobileSidebar/Layout/index.js b/src/theme/Navbar/MobileSidebar/Layout/index.js
new file mode 100644
index 0000000..b19eb2f
--- /dev/null
+++ b/src/theme/Navbar/MobileSidebar/Layout/index.js
@@ -0,0 +1,22 @@
+import React from 'react';
+import clsx from 'clsx';
+import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal';
+export default function NavbarMobileSidebarLayout({
+ header,
+ primaryMenu,
+ secondaryMenu,
+}) {
+ const {shown: secondaryMenuShown} = useNavbarSecondaryMenu();
+ return (
+ <div className="navbar-sidebar">
+ {header}
+ <div
+ className={clsx('navbar-sidebar__items', {
+ 'navbar-sidebar__items--show-secondary': secondaryMenuShown,
+ })}>
+ <div className="navbar-sidebar__item menu">{primaryMenu}</div>
+ <div className="navbar-sidebar__item menu">{secondaryMenu}</div>
+ </div>
+ </div>
+ );
+}
diff --git a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.d.ts b/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.d.ts
deleted file mode 100644
index 5cf526b..0000000
--- a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-/// <reference types="react" />
-export default function NavbarMobilePrimaryMenu(): JSX.Element;
diff --git a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx b/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx
index d46798a..c7b203f 100644
--- a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx
+++ b/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx
@@ -17,13 +17,15 @@
return (
<>
<ul className="menu__list">
- {items.map((item, i) => (
- <NavbarItem mobile {...item} onClick={() => mobileSidebar.toggle()} key={i} />
- ))}
+ {items
+ .filter(val => !['docsVersionDropdown', 'localeDropdown'].includes(val.type as string))
+ .map((item, i) => (
+ <NavbarItem mobile {...item} onClick={() => mobileSidebar.toggle()} key={i} />
+ ))}
</ul>
- <span className="github-btn-mobile">
+ {/* <span className="github-btn-mobile">
<GitHubButton type="stargazers" size="large" namespace="apache" repo="doris" />
- </span>
+ </span> */}
</>
);
}
diff --git a/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx b/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx
new file mode 100644
index 0000000..60010f1
--- /dev/null
+++ b/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import { useThemeConfig } from '@docusaurus/theme-common';
+import { useNavbarSecondaryMenu } from '@docusaurus/theme-common/internal';
+import SearchBar from '@theme/SearchBar';
+import Translate from '@docusaurus/Translate';
+import NavbarSearch from '../../Search';
+function SecondaryMenuBackButton(props) {
+ return (
+ <button {...props} type="button" className="clean-btn navbar-sidebar__back">
+ <Translate
+ id="theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel"
+ description="The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
+ >
+ ← Back to main menu
+ </Translate>
+ </button>
+ );
+}
+// The secondary menu slides from the right and shows contextual information
+// such as the docs sidebar
+export default function NavbarMobileSidebarSecondaryMenu() {
+ const isPrimaryMenuEmpty = useThemeConfig().navbar.items.length === 0;
+ const secondaryMenu = useNavbarSecondaryMenu();
+ return (
+ <>
+ {/* edge-case: prevent returning to the primaryMenu when it's empty */}
+ {!isPrimaryMenuEmpty && <SecondaryMenuBackButton onClick={() => secondaryMenu.hide()} />}
+ <div className="w-full h-12 relative px-6 docs-subnav-searchbar">
+ <NavbarSearch className="navbar-search">
+ <SearchBar />
+ </NavbarSearch>
+ </div>
+ {secondaryMenu.content}
+ </>
+ );
+}
diff --git a/src/theme/Navbar/MobileSidebar/Toggle/index.js b/src/theme/Navbar/MobileSidebar/Toggle/index.js
new file mode 100644
index 0000000..bfe2988
--- /dev/null
+++ b/src/theme/Navbar/MobileSidebar/Toggle/index.js
@@ -0,0 +1,22 @@
+import React from 'react';
+import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal';
+import {translate} from '@docusaurus/Translate';
+import IconMenu from '@theme/Icon/Menu';
+export default function MobileSidebarToggle() {
+ const {toggle, shown} = useNavbarMobileSidebar();
+ return (
+ <button
+ onClick={toggle}
+ aria-label={translate({
+ id: 'theme.docs.sidebar.toggleSidebarButtonAriaLabel',
+ message: 'Toggle navigation bar',
+ description:
+ 'The ARIA label for hamburger menu button of mobile navigation',
+ })}
+ aria-expanded={shown}
+ className="navbar__toggle clean-btn"
+ type="button">
+ <IconMenu />
+ </button>
+ );
+}
diff --git a/src/theme/Navbar/MobileSidebar/index.js b/src/theme/Navbar/MobileSidebar/index.js
new file mode 100644
index 0000000..5db3cc7
--- /dev/null
+++ b/src/theme/Navbar/MobileSidebar/index.js
@@ -0,0 +1,23 @@
+import React from 'react';
+import {
+ useLockBodyScroll,
+ useNavbarMobileSidebar,
+} from '@docusaurus/theme-common/internal';
+import NavbarMobileSidebarLayout from '@theme/Navbar/MobileSidebar/Layout';
+import NavbarMobileSidebarHeader from '@theme/Navbar/MobileSidebar/Header';
+import NavbarMobileSidebarPrimaryMenu from '@theme/Navbar/MobileSidebar/PrimaryMenu';
+import NavbarMobileSidebarSecondaryMenu from '@theme/Navbar/MobileSidebar/SecondaryMenu';
+export default function NavbarMobileSidebar() {
+ const mobileSidebar = useNavbarMobileSidebar();
+ useLockBodyScroll(mobileSidebar.shown);
+ if (!mobileSidebar.shouldRender) {
+ return null;
+ }
+ return (
+ <NavbarMobileSidebarLayout
+ header={<NavbarMobileSidebarHeader />}
+ primaryMenu={<NavbarMobileSidebarPrimaryMenu />}
+ secondaryMenu={<NavbarMobileSidebarSecondaryMenu />}
+ />
+ );
+}
diff --git a/src/theme/Navbar/Search/index.js b/src/theme/Navbar/Search/index.js
new file mode 100644
index 0000000..6c6e7c2
--- /dev/null
+++ b/src/theme/Navbar/Search/index.js
@@ -0,0 +1,6 @@
+import React from 'react';
+import clsx from 'clsx';
+import styles from './styles.module.css';
+export default function NavbarSearch({children, className}) {
+ return <div className={clsx(className, styles.searchBox)}>{children}</div>;
+}
diff --git a/src/theme/Navbar/Search/styles.module.css b/src/theme/Navbar/Search/styles.module.css
new file mode 100644
index 0000000..ebce92d
--- /dev/null
+++ b/src/theme/Navbar/Search/styles.module.css
@@ -0,0 +1,13 @@
+@media (max-width: 996px) {
+ .searchBox {
+ position: absolute;
+ right: var(--ifm-navbar-padding-horizontal);
+ }
+}
+
+@media (min-width: 997px) {
+ .searchBox {
+ padding: var(--ifm-navbar-item-padding-vertical)
+ var(--ifm-navbar-item-padding-horizontal);
+ }
+}
diff --git a/src/theme/Navbar/index.js b/src/theme/Navbar/index.js
new file mode 100644
index 0000000..d18a258
--- /dev/null
+++ b/src/theme/Navbar/index.js
@@ -0,0 +1,10 @@
+import React from 'react';
+import NavbarLayout from '@theme/Navbar/Layout';
+import NavbarContent from '@theme/Navbar/Content';
+export default function Navbar() {
+ return (
+ <NavbarLayout>
+ <NavbarContent />
+ </NavbarLayout>
+ );
+}
diff --git a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js
deleted file mode 100644
index c179571..0000000
--- a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react';
-import DocsVersionDropdownNavbarItem from '@theme-original/NavbarItem/DocsVersionDropdownNavbarItem';
-import Translate from '@docusaurus/Translate';
-
-export default function DocsVersionDropdownNavbarItemWrapper(props) {
- const { mobile } = props;
- return mobile ? (
- <DocsVersionDropdownNavbarItem {...props} />
- ) : (
- <div className="versions">
- <Translate id="doc.version" description="Version">
- Version
- </Translate>
- :
- <DocsVersionDropdownNavbarItem {...props} />
- </div>
- );
-}
diff --git a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx
new file mode 100644
index 0000000..8d9cc62
--- /dev/null
+++ b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx
@@ -0,0 +1,70 @@
+import React from 'react';
+import { useVersions, useActiveDocContext } from '@docusaurus/plugin-content-docs/client';
+import { useDocsPreferredVersion } from '@docusaurus/theme-common';
+import { useDocsVersionCandidates } from '@docusaurus/theme-common/internal';
+import { translate } from '@docusaurus/Translate';
+import { useLocation } from '@docusaurus/router';
+import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
+import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
+const getVersionMainDoc = version => version.docs.find(doc => doc.id === version.mainDocId);
+export default function DocsVersionDropdownNavbarItem({
+ mobile,
+ docsPluginId,
+ dropdownActiveClassDisabled,
+ dropdownItemsBefore,
+ dropdownItemsAfter,
+ ...props
+}) {
+ const { search, hash } = useLocation();
+ const activeDocContext = useActiveDocContext(docsPluginId);
+ const versions = useVersions(docsPluginId);
+ const { savePreferredVersionName } = useDocsPreferredVersion(docsPluginId);
+ const versionLinks = versions.map(version => {
+ // We try to link to the same doc, in another version
+ // When not possible, fallback to the "main doc" of the version
+ const versionDoc = activeDocContext.alternateDocVersions[version.name] ?? getVersionMainDoc(version);
+ return {
+ label: version.label,
+ // preserve ?search#hash suffix on version switches
+ to: `${versionDoc.path}${search}${hash}`,
+ isActive: () => version === activeDocContext.activeVersion,
+ onClick: () => savePreferredVersionName(version.name),
+ };
+ });
+ const items = [...dropdownItemsBefore, ...versionLinks, ...dropdownItemsAfter];
+ const dropdownVersion = useDocsVersionCandidates(docsPluginId)[0];
+ // Mobile dropdown is handled a bit differently
+ const dropdownLabel =
+ mobile && items.length > 1
+ ? translate({
+ id: 'theme.navbar.mobileVersionsDropdown.label',
+ message: 'Versions',
+ description: 'The label for the navbar versions dropdown on mobile view',
+ })
+ : dropdownVersion.label;
+ const dropdownTo = mobile && items.length > 1 ? undefined : getVersionMainDoc(dropdownVersion).path;
+ // We don't want to render a version dropdown with 0 or 1 item. If we build
+ // the site with a single docs version (onlyIncludeVersions: ['1.0.0']),
+ // We'd rather render a button instead of a dropdown
+ if (items.length <= 1) {
+ return (
+ <DefaultNavbarItem
+ {...props}
+ mobile={mobile}
+ label={dropdownLabel}
+ to={dropdownTo}
+ isActive={dropdownActiveClassDisabled ? () => false : undefined}
+ />
+ );
+ }
+ return (
+ <DropdownNavbarItem
+ {...props}
+ mobile={mobile}
+ label={<span className="text-sm">Versions</span>}
+ to={dropdownTo}
+ items={items}
+ isActive={dropdownActiveClassDisabled ? () => false : undefined}
+ />
+ );
+}
diff --git a/src/theme/NavbarItem/DropdownNavbarItem.js b/src/theme/NavbarItem/DropdownNavbarItem.js
new file mode 100644
index 0000000..8b250f4
--- /dev/null
+++ b/src/theme/NavbarItem/DropdownNavbarItem.js
@@ -0,0 +1,130 @@
+import React, { useState, useRef, useEffect } from 'react';
+import clsx from 'clsx';
+import { isRegexpStringMatch, useCollapsible, Collapsible } from '@docusaurus/theme-common';
+import { isSamePath, useLocalPathname } from '@docusaurus/theme-common/internal';
+import NavbarNavLink from '@theme/NavbarItem/NavbarNavLink';
+import NavbarItem from '@theme/NavbarItem';
+import './style.scss';
+
+function isItemActive(item, localPathname) {
+ if (isSamePath(item.to, localPathname)) {
+ return true;
+ }
+ if (isRegexpStringMatch(item.activeBaseRegex, localPathname)) {
+ return true;
+ }
+ if (item.activeBasePath && localPathname.startsWith(item.activeBasePath)) {
+ return true;
+ }
+ return false;
+}
+function containsActiveItems(items, localPathname) {
+ return items.some(item => isItemActive(item, localPathname));
+}
+function DropdownNavbarItemDesktop({ items, position, className, onClick, ...props }) {
+ const dropdownRef = useRef(null);
+ const [showDropdown, setShowDropdown] = useState(false);
+ useEffect(() => {
+ const handleClickOutside = event => {
+ if (!dropdownRef.current || dropdownRef.current.contains(event.target)) {
+ return;
+ }
+ setShowDropdown(false);
+ };
+ document.addEventListener('mousedown', handleClickOutside);
+ document.addEventListener('touchstart', handleClickOutside);
+ document.addEventListener('focusin', handleClickOutside);
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside);
+ document.removeEventListener('touchstart', handleClickOutside);
+ document.removeEventListener('focusin', handleClickOutside);
+ };
+ }, [dropdownRef]);
+ return (
+ <div
+ ref={dropdownRef}
+ className={clsx('custom-navbar-item', 'navbar__item', 'dropdown', 'dropdown--hoverable', {
+ 'dropdown--right': position === 'right',
+ 'dropdown--show': showDropdown,
+ })}
+ >
+ <NavbarNavLink
+ aria-haspopup="true"
+ aria-expanded={showDropdown}
+ role="button"
+ href={props.to ? undefined : '#'}
+ className={clsx('navbar__link', className)}
+ {...props}
+ defaultValue=""
+ onClick={props.to ? undefined : e => e.preventDefault()}
+ onKeyDown={e => {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ setShowDropdown(!showDropdown);
+ }
+ }}
+ >
+ {props.children ?? props.label}
+ </NavbarNavLink>
+ <ul className="dropdown__menu">
+ {items.map((childItemProps, i) => (
+ <NavbarItem isDropdownItem activeClassName="dropdown__link--active" {...childItemProps} key={i} />
+ ))}
+ </ul>
+ </div>
+ );
+}
+function DropdownNavbarItemMobile({
+ items,
+ className,
+ position, // Need to destructure position from props so that it doesn't get passed on.
+ onClick,
+ ...props
+}) {
+ const localPathname = useLocalPathname();
+ const containsActive = containsActiveItems(items, localPathname);
+ const { collapsed, toggleCollapsed, setCollapsed } = useCollapsible({
+ initialState: () => !containsActive,
+ });
+ // Expand/collapse if any item active after a navigation
+ useEffect(() => {
+ if (containsActive) {
+ setCollapsed(!containsActive);
+ }
+ }, [localPathname, containsActive, setCollapsed]);
+ return (
+ <li
+ className={clsx('menu__list-item', {
+ 'menu__list-item--collapsed': collapsed,
+ })}
+ >
+ <NavbarNavLink
+ role="button"
+ className={clsx('menu__link menu__link--sublist menu__link--sublist-caret', className)}
+ {...props}
+ onClick={e => {
+ e.preventDefault();
+ toggleCollapsed();
+ }}
+ >
+ {props.children ?? props.label}
+ </NavbarNavLink>
+ <Collapsible lazy as="ul" className="menu__list" collapsed={collapsed}>
+ {items.map((childItemProps, i) => (
+ <NavbarItem
+ mobile
+ isDropdownItem
+ onClick={onClick}
+ activeClassName="menu__link--active"
+ {...childItemProps}
+ key={i}
+ />
+ ))}
+ </Collapsible>
+ </li>
+ );
+}
+export default function DropdownNavbarItem({ mobile = false, ...props }) {
+ const Comp = mobile ? DropdownNavbarItemMobile : DropdownNavbarItemDesktop;
+ return <Comp {...props} />;
+}
diff --git a/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx b/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx
index ee89db5..867fbe8 100644
--- a/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx
+++ b/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx
@@ -50,23 +50,47 @@
return <></>;
}
- return mobile ? (
+ return (
<DropdownNavbarItem
{...props}
mobile={mobile}
label={
<>
- <IconLanguage className="icon-language" />
- {dropdownLabel}
+ <svg
+ className="icon-language"
+ xmlns="http://www.w3.org/2000/svg"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ fill="none"
+ >
+ <path
+ d="M7.75756 14.3L10.5816 6.91667H11.8759L14.7 14.3H13.4057L12.7501 12.4167H9.74113L9.06873 14.3H7.75756ZM10.1109 11.35H12.3467L11.254 8.3H11.2036L10.1109 11.35ZM2.84908 12.45L1.97498 11.5833L5.11841 8.48333C4.72618 8.05 4.38439 7.60267 4.09302 7.14133C3.80165 6.68044 3.54389 6.19444 3.31976 5.68333H4.61412C4.80463 6.06111 5.00635 6.39711 5.21927 6.69133C5.43219 6.986 5.68434 7.29444 5.97571 7.61667C6.43519 7.12778 6.81621 6.62511 7.11879 6.10867C7.42137 5.59178 7.67352 5.03889 7.87523 4.45H1V3.23333H5.33694V2H6.58087V3.23333H10.9178V4.45H9.11916C8.89503 5.18333 8.59805 5.89155 8.22824 6.57467C7.85842 7.25822 7.39895 7.90555 6.84983 8.51667L8.3459 10.0167L7.87523 11.2833L5.95891 9.38333L2.84908 12.45Z"
+ fill="#4C576C"
+ />
+ </svg>
</>
}
items={items}
/>
- ) : (
- <div className="locale-box">
- {items.map((item, index) => (
- <NavbarItem {...item} key={index} />
- ))}
- </div>
);
+ // return mobile ? (
+ // <DropdownNavbarItem
+ // {...props}
+ // mobile={mobile}
+ // label={
+ // <>
+ // <IconLanguage className="icon-language" />
+ // {dropdownLabel}
+ // </>
+ // }
+ // items={items}
+ // />
+ // ) : (
+ // <div className="locale-box">
+ // {items.map((item, index) => (
+ // <NavbarItem {...item} key={index} />
+ // ))}
+ // </div>
+ // );
}
diff --git a/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.scss b/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.scss
index 6e6b35e..892fb02 100644
--- a/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.scss
+++ b/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.scss
@@ -1,40 +1,57 @@
.icon-language {
- vertical-align: text-bottom;
- margin-right: 0.3125rem;
+ vertical-align: text-bottom;
+}
+.dropdown__menu {
+ padding: 6px 0;
+ .dropdown__link {
+ color: #1d1d1d;
+ font-size: 14px;
+ font-weight: normal;
+ padding: 0.5rem 0.75rem;
+ line-height: 1.6;
+ &:hover {
+ background-color: #f7f9fe !important;
+ color: #1d1d1d !important;
+ }
+ }
+ .dropdown__link--active,
+ .dropdown__link--active:hover {
+ color: #444fd9 !important;
+ background-color: transparent !important;
+ }
}
.locale-box {
- display: flex;
- align-items: center;
+ display: flex;
+ align-items: center;
- >a {
- position: relative;
- padding: 0 1rem;
- color: var(--global-colors-text-primary);
- font-size: var(--global-font-size-medium);
+ > a {
+ position: relative;
+ padding: 0 1rem;
+ color: var(--global-colors-text-primary);
+ font-size: var(--global-font-size-medium);
- &.dropdown__link--active {
- background-color: transparent;
- color: var(--ifm-color-primary);
+ &.dropdown__link--active {
+ background-color: transparent;
+ color: var(--ifm-color-primary);
+ }
+
+ &:hover {
+ text-decoration: none;
+ }
+
+ & + a {
+ &::before {
+ content: '';
+ display: block;
+ width: 2px;
+ height: 0.75rem;
+ background-color: var(--global-colors-text-primary);
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ left: 0;
+ }
+ }
}
-
- &:hover {
- text-decoration: none;
- }
-
- &+a {
-
- &::before {
- content: '';
- display: block;
- width: 2px;
- height: 0.75rem;
- background-color: var(--global-colors-text-primary);
- position: absolute;
- top: 50%;
- transform: translateY(-50%);
- left: 0;
- }
- }
- }
-}
\ No newline at end of file
+}
diff --git a/src/theme/NavbarItem/style.scss b/src/theme/NavbarItem/style.scss
new file mode 100644
index 0000000..40c22cd
--- /dev/null
+++ b/src/theme/NavbarItem/style.scss
@@ -0,0 +1,21 @@
+.custom-navbar-item.dropdown {
+ & > .navbar__link {
+ display: flex;
+ align-items: center;
+ color: #4c576c;
+ padding-left: 0rem;
+ padding-right: 0rem;
+ margin-left: 1.5rem;
+ font-weight: normal;
+ .icon-language {
+ display: inline-block;
+ }
+ &:after {
+ background: url('/static/images/chevron-down.svg') no-repeat center;
+ border: none;
+ width: 1rem;
+ height: 1rem;
+ transform: none;
+ }
+ }
+}
diff --git a/src/theme/NotFound.js b/src/theme/NotFound.js
new file mode 100644
index 0000000..e8dc1d1
--- /dev/null
+++ b/src/theme/NotFound.js
@@ -0,0 +1,62 @@
+import React from 'react';
+import Translate, { translate } from '@docusaurus/Translate';
+import { PageMetadata } from '@docusaurus/theme-common';
+import Layout from '@theme/Layout';
+import ExternalLink from '../components/external-link/external-link';
+import { ExternalLinkArrowIcon } from '@site/src/components/Icons/external-link-arrow-icon';
+export default function NotFound() {
+ return (
+ <>
+ <PageMetadata
+ title={translate({
+ id: 'theme.NotFound.title',
+ message: 'Page Not Found',
+ })}
+ />
+ <Layout>
+ <main className="container margin-vert--xl">
+ <div className="row">
+ <div className="col">
+ <div className="flex justify-center mb-10">
+ <img
+ style={{ width: 120 }}
+ src={require('@site/static/images/empty-data.png').default}
+ alt=""
+ />
+ </div>
+ <h1 className="text-[1.75rem] text-[#1D1D1D] leading-[1.6] text-center">
+ <Translate id="theme.NotFound.title" description="The title of the 404 page">
+ Page Not Found
+ </Translate>
+ </h1>
+ <p className="text-center mt-2 text-sm text-[#8592A6]">
+ <Translate id="theme.NotFound.p1" description="The first paragraph of the 404 page">
+ Oops! The page you are looking for can't be found. In any case, try to look for a
+ different page or report this issue.
+ </Translate>
+ </p>
+ <div className="flex justify-center gap-x-6 lg:gap-x-10 mt-10">
+ <div className="w-[9.75rem]">
+ <ExternalLink
+ to="/"
+ label="Go to home"
+ className="text-sm h-[2.625rem] bg-primary text-white rounded-md hover:text-white cursor-pointer"
+ linkIcon={<ExternalLinkArrowIcon />}
+ />
+ </div>
+ <div className="w-[9.75rem]">
+ <ExternalLink
+ label="Report this issue"
+ linkIcon={<ExternalLinkArrowIcon />}
+ to="https://github.com/apache/doris-website/issues"
+ className="text-sm border border-[#444FD9] h-[2.625rem] rounded-md text-primary cursor-pointer"
+ />
+ </div>
+ </div>
+ </div>
+ </div>
+ </main>
+ </Layout>
+ </>
+ );
+}
diff --git a/src/theme/SearchBar/SearchBar.jsx b/src/theme/SearchBar/SearchBar.jsx
index dcef94e..40b546f 100644
--- a/src/theme/SearchBar/SearchBar.jsx
+++ b/src/theme/SearchBar/SearchBar.jsx
@@ -1,34 +1,42 @@
-import React, { useCallback, useEffect, useRef, useState, } from "react";
-import clsx from "clsx";
-import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
-import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment";
-import { useHistory, useLocation } from "@docusaurus/router";
-import { translate } from "@docusaurus/Translate";
-import { ReactContextError, useDocsPreferredVersion, } from "@docusaurus/theme-common";
-import { useActivePlugin } from "@docusaurus/plugin-content-docs/client";
-import { fetchIndexes } from "./fetchIndexes";
-import { SearchSourceFactory } from "../../utils/SearchSourceFactory";
-import { SuggestionTemplate } from "./SuggestionTemplate";
-import { EmptyTemplate } from "./EmptyTemplate";
-import { searchResultLimits, Mark, searchBarShortcut, searchBarShortcutHint, docsPluginIdForPreferredVersion, indexDocs, } from "../../utils/proxiedGenerated";
-import LoadingRing from "../LoadingRing/LoadingRing";
-import styles from "./SearchBar.module.css";
+import React, { useCallback, useEffect, useRef, useState } from 'react';
+import clsx from 'clsx';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
+import { useHistory, useLocation } from '@docusaurus/router';
+import { translate } from '@docusaurus/Translate';
+import { ReactContextError, useDocsPreferredVersion } from '@docusaurus/theme-common';
+import { useActivePlugin } from '@docusaurus/plugin-content-docs/client';
+import { fetchIndexes } from './fetchIndexes';
+import { SearchSourceFactory } from '../../utils/SearchSourceFactory';
+import { SuggestionTemplate } from './SuggestionTemplate';
+import { EmptyTemplate } from './EmptyTemplate';
+import {
+ searchResultLimits,
+ Mark,
+ searchBarShortcut,
+ searchBarShortcutHint,
+ docsPluginIdForPreferredVersion,
+ indexDocs,
+} from '../../utils/proxiedGenerated';
+import LoadingRing from '../LoadingRing/LoadingRing';
+import styles from './SearchBar.module.css';
async function fetchAutoCompleteJS() {
- const autoCompleteModule = await import("@easyops-cn/autocomplete.js");
+ const autoCompleteModule = await import('@easyops-cn/autocomplete.js');
const autoComplete = autoCompleteModule.default;
if (autoComplete.noConflict) {
// For webpack v5 since docusaurus v2.0.0-alpha.75
autoComplete.noConflict();
- }
- else if (autoCompleteModule.noConflict) {
+ } else if (autoCompleteModule.noConflict) {
// For webpack v4 before docusaurus v2.0.0-alpha.74
autoCompleteModule.noConflict();
}
return autoComplete;
}
-const SEARCH_PARAM_HIGHLIGHT = "_highlight";
-export default function SearchBar({ handleSearchBarToggle, }) {
- const { siteConfig: { baseUrl }, } = useDocusaurusContext();
+const SEARCH_PARAM_HIGHLIGHT = '_highlight';
+export default function SearchBar({ handleSearchBarToggle }) {
+ const {
+ siteConfig: { baseUrl },
+ } = useDocusaurusContext();
// It returns undefined for non-docs pages
const activePlugin = useActivePlugin();
let versionUrl = baseUrl;
@@ -43,15 +51,13 @@
// eslint-disable-next-line react-hooks/rules-of-hooks
const { preferredVersion } = useDocsPreferredVersion(activePlugin?.pluginId ?? docsPluginIdForPreferredVersion);
if (preferredVersion && !preferredVersion.isLast) {
- versionUrl = preferredVersion.path + "/";
+ versionUrl = preferredVersion.path + '/';
}
- }
- catch (e) {
+ } catch (e) {
if (indexDocs) {
if (e instanceof ReactContextError) {
/* ignore, happens when website doesn't use versions */
- }
- else {
+ } else {
throw e;
}
}
@@ -59,91 +65,95 @@
const history = useHistory();
const location = useLocation();
const searchBarRef = useRef(null);
- const indexState = useRef("empty"); // empty, loaded, done
+ const indexState = useRef('empty'); // empty, loaded, done
// Should the input be focused after the index is loaded?
const focusAfterIndexLoaded = useRef(false);
const [loading, setLoading] = useState(false);
const [inputChanged, setInputChanged] = useState(false);
- const [inputValue, setInputValue] = useState("");
+ const [inputValue, setInputValue] = useState('');
const search = useRef(null);
const loadIndex = useCallback(async () => {
- if (indexState.current !== "empty") {
+ if (indexState.current !== 'empty') {
// Do not load the index (again) if its already loaded or in the process of being loaded.
return;
}
- indexState.current = "loading";
+ indexState.current = 'loading';
setLoading(true);
const [{ wrappedIndexes, zhDictionary }, autoComplete] = await Promise.all([
fetchIndexes(versionUrl),
fetchAutoCompleteJS(),
]);
- search.current = autoComplete(searchBarRef.current, {
- hint: false,
- autoselect: true,
- openOnFocus: true,
- cssClasses: {
- root: styles.searchBar,
- noPrefix: true,
- dropdownMenu: styles.dropdownMenu,
- input: styles.input,
- hint: styles.hint,
- suggestions: styles.suggestions,
- suggestion: styles.suggestion,
- cursor: styles.cursor,
- dataset: styles.dataset,
- empty: styles.empty,
- },
- }, [
+ search.current = autoComplete(
+ searchBarRef.current,
{
- source: SearchSourceFactory(wrappedIndexes, zhDictionary, searchResultLimits),
- templates: {
- suggestion: SuggestionTemplate,
- empty: EmptyTemplate,
- footer: ({ query, isEmpty }) => {
- if (isEmpty) {
- return;
- }
- const a = document.createElement("a");
- const url = `${baseUrl}search?q=${encodeURIComponent(query)}`;
- a.href = url;
- a.textContent = translate({
- id: "theme.SearchBar.seeAll",
- message: "See all results",
- });
- a.addEventListener("click", (e) => {
- if (!e.ctrlKey && !e.metaKey) {
- e.preventDefault();
- search.current.autocomplete.close();
- history.push(url);
- }
- });
- const div = document.createElement("div");
- div.className = styles.hitFooter;
- div.appendChild(a);
- return div;
- },
+ hint: false,
+ autoselect: true,
+ openOnFocus: true,
+ cssClasses: {
+ root: styles.searchBar,
+ noPrefix: true,
+ dropdownMenu: styles.dropdownMenu,
+ input: styles.input,
+ hint: styles.hint,
+ suggestions: styles.suggestions,
+ suggestion: styles.suggestion,
+ cursor: styles.cursor,
+ dataset: styles.dataset,
+ empty: styles.empty,
},
},
- ])
- .on("autocomplete:selected", function (event, { document: { u, h }, tokens }) {
- searchBarRef.current?.blur();
- let url = u;
- if (Mark && tokens.length > 0) {
- const params = new URLSearchParams();
- for (const token of tokens) {
- params.append(SEARCH_PARAM_HIGHLIGHT, token);
+ [
+ {
+ source: SearchSourceFactory(wrappedIndexes, zhDictionary, searchResultLimits),
+ templates: {
+ suggestion: SuggestionTemplate,
+ empty: EmptyTemplate,
+ footer: ({ query, isEmpty }) => {
+ if (isEmpty) {
+ return;
+ }
+ const a = document.createElement('a');
+ const url = `${baseUrl}search?q=${encodeURIComponent(query)}`;
+ a.href = url;
+ a.textContent = translate({
+ id: 'theme.SearchBar.seeAll',
+ message: 'See all results',
+ });
+ a.addEventListener('click', e => {
+ if (!e.ctrlKey && !e.metaKey) {
+ e.preventDefault();
+ search.current.autocomplete.close();
+ history.push(url);
+ }
+ });
+ const div = document.createElement('div');
+ div.className = styles.hitFooter;
+ div.appendChild(a);
+ return div;
+ },
+ },
+ },
+ ],
+ )
+ .on('autocomplete:selected', function (event, { document: { u, h }, tokens }) {
+ searchBarRef.current?.blur();
+ let url = u;
+ if (Mark && tokens.length > 0) {
+ const params = new URLSearchParams();
+ for (const token of tokens) {
+ params.append(SEARCH_PARAM_HIGHLIGHT, token);
+ }
+ url += `?${params.toString()}`;
}
- url += `?${params.toString()}`;
- }
- if (h) {
- url += h;
- }
- history.push(url);
- })
- .on("autocomplete:closed", () => {
- searchBarRef.current?.blur();
- });
- indexState.current = "done";
+ if (h) {
+ url += h;
+ }
+ history.push(url);
+ })
+ .on('autocomplete:closed', () => {
+ searchBarRef.current?.blur();
+ });
+ indexState.current = 'done';
setLoading(false);
if (focusAfterIndexLoaded.current) {
const input = searchBarRef.current;
@@ -165,7 +175,7 @@
// Code blocks will be re-rendered after this `useEffect` ran.
// So we make the marking run after a macro task.
setTimeout(() => {
- const root = document.querySelector("article");
+ const root = document.querySelector('article');
if (!root) {
return;
}
@@ -175,8 +185,8 @@
mark.mark(keywords);
}
// Apply any keywords to the search input so that we can clear marks in case we loaded a page with a highlight in the url
- setInputValue(keywords.join(" "));
- search.current?.autocomplete.setVal(keywords.join(" "));
+ setInputValue(keywords.join(' '));
+ search.current?.autocomplete.setVal(keywords.join(' '));
});
}, [location.search, location.pathname]);
const [focused, setFocused] = useState(false);
@@ -193,7 +203,7 @@
const onInputMouseEnter = useCallback(() => {
loadIndex();
}, [loadIndex]);
- const onInputChange = useCallback((event) => {
+ const onInputChange = useCallback(event => {
setInputValue(event.target.value);
if (event.target.value) {
setInputChanged(true);
@@ -208,49 +218,64 @@
return;
}
// Add shortcuts command/ctrl + K
- const handleShortcut = (event) => {
- if ((isMac ? event.metaKey : event.ctrlKey) && event.code === "KeyK") {
+ const handleShortcut = event => {
+ if ((isMac ? event.metaKey : event.ctrlKey) && event.code === 'KeyK') {
event.preventDefault();
searchBarRef.current?.focus();
onInputFocus();
}
};
- document.addEventListener("keydown", handleShortcut);
+ document.addEventListener('keydown', handleShortcut);
return () => {
- document.removeEventListener("keydown", handleShortcut);
+ document.removeEventListener('keydown', handleShortcut);
};
}, [isMac, onInputFocus]);
const onClearSearch = useCallback(() => {
const params = new URLSearchParams(location.search);
params.delete(SEARCH_PARAM_HIGHLIGHT);
const paramsStr = params.toString();
- const searchUrl = location.pathname +
- (paramsStr != "" ? `?${paramsStr}` : "") +
- location.hash;
+ const searchUrl = location.pathname + (paramsStr != '' ? `?${paramsStr}` : '') + location.hash;
if (searchUrl != location.pathname + location.search + location.hash) {
history.push(searchUrl);
}
// We always clear these here because in case no match was selected the above history push wont happen
- setInputValue("");
- search.current?.autocomplete.setVal("");
+ setInputValue('');
+ search.current?.autocomplete.setVal('');
}, [location.pathname, location.search, location.hash, history]);
- return (<div className={clsx("navbar__search", styles.searchBarContainer, {
- [styles.searchIndexLoading]: loading && inputChanged,
- [styles.focused]: focused,
- })}>
- <input placeholder={translate({
- id: "theme.SearchBar.label",
- message: "Search",
- description: "The ARIA label and placeholder for search button",
- })} aria-label="Search" className="navbar__search-input" onMouseEnter={onInputMouseEnter} onFocus={onInputFocus} onBlur={onInputBlur} onChange={onInputChange} ref={searchBarRef} value={inputValue}/>
- <LoadingRing className={styles.searchBarLoadingRing}/>
- {searchBarShortcut &&
- searchBarShortcutHint &&
- (inputValue !== "" ? (<button className={styles.searchClearButton} onClick={onClearSearch}>
- ✕
- </button>) : (<div className={styles.searchHintContainer}>
- <kbd className={styles.searchHint}>{isMac ? "⌘" : "ctrl"}</kbd>
- <kbd className={styles.searchHint}>K</kbd>
- </div>))}
- </div>);
+ return (
+ <div
+ className={clsx('navbar__search ', styles.searchBarContainer, {
+ [styles.searchIndexLoading]: loading && inputChanged,
+ [styles.focused]: focused,
+ })}
+ >
+ <input
+ placeholder={translate({
+ id: 'theme.SearchBar.label',
+ message: 'Search',
+ description: 'The ARIA label and placeholder for search button',
+ })}
+ aria-label="Search"
+ className={clsx('navbar__search-input', styles.navbarSearchInput)}
+ onMouseEnter={onInputMouseEnter}
+ onFocus={onInputFocus}
+ onBlur={onInputBlur}
+ onChange={onInputChange}
+ ref={searchBarRef}
+ value={inputValue}
+ />
+ <LoadingRing className={styles.searchBarLoadingRing} />
+ {searchBarShortcut &&
+ (inputValue !== '' ? (
+ <button className={styles.searchClearButton} onClick={onClearSearch}>
+ ✕
+ </button>
+ ) : (
+ <div className={styles.searchHintContainer}>
+ <kbd className={styles.searchHint}>{isMac ? '⌘' : 'ctrl'}</kbd>
+ <kbd className={styles.searchHint}>K</kbd>
+ </div>
+ ))}
+ </div>
+ );
}
diff --git a/src/theme/SearchBar/SearchBar.module.css b/src/theme/SearchBar/SearchBar.module.css
index 1777c86..74e14eb 100644
--- a/src/theme/SearchBar/SearchBar.module.css
+++ b/src/theme/SearchBar/SearchBar.module.css
@@ -1,71 +1,71 @@
.searchBar .dropdownMenu {
- left: auto !important;
- right: 0 !important;
+ left: auto !important;
+ right: 0 !important;
- background: var(--search-local-modal-background, #f5f6f7);
- border-radius: 6px;
- box-shadow: var(
- --search-local-modal-shadow,
- inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5),
- 0 3px 8px 0 #555a64
- );
- margin-top: 8px;
- width: var(--search-local-modal-width, 560px);
- position: relative;
+ background: var(--search-local-modal-background, #f5f6f7);
+ border-radius: 6px;
+ box-shadow: var(--search-local-modal-shadow, inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5), 0 3px 8px 0 #555a64);
+ margin-top: 8px;
+ width: var(--search-local-modal-width, 560px);
+ position: relative;
+ padding: var(--search-local-spacing, 12px);
+}
- padding: var(--search-local-spacing, 12px);
+.navbarSearchInput {
+ border: none !important;
+ background-color: #f7f9fe !important;
+ background-image: url('/static/images/search-icon.svg');
+ height: 2.5rem !important;
+ background-position: 0.625rem center !important;
+ padding-left: 2.25rem !important;
+ color: #4c576c !important;
+ width: 15.625rem !important;
+ border-radius: 0.5rem;
}
@media (max-width: 576px) {
- :global(.navbar__search-input):not(:focus) {
- width: 2rem;
- }
+ :global(.navbar__search-input):not(:focus) {
+ width: 2rem;
+ }
- .searchBar .dropdownMenu {
- width: var(--search-local-modal-width-sm, 340px);
- max-width: calc(100vw - var(--ifm-navbar-padding-horizontal) * 2);
- }
+ .searchBar .dropdownMenu {
+ width: var(--search-local-modal-width-sm, 340px);
+ max-width: calc(100vw - var(--ifm-navbar-padding-horizontal) * 2);
+ }
}
-html[data-theme="dark"] .searchBar .dropdownMenu {
- background: var(--search-local-modal-background, var(--ifm-background-color));
- box-shadow: var(
- --search-local-modal-shadow,
- inset 1px 1px 0 0 #2c2e40,
- 0 3px 8px 0 #000309
- );
+html[data-theme='dark'] .searchBar .dropdownMenu {
+ background: var(--search-local-modal-background, var(--ifm-background-color));
+ box-shadow: var(--search-local-modal-shadow, inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309);
}
.searchBar .dropdownMenu .suggestion {
- cursor: pointer;
- background: var(--search-local-hit-background, #fff);
- border-radius: 4px;
- box-shadow: var(--search-local-hit-shadow, 0 1px 3px 0 #d4d9e1);
- padding: 0 var(--search-local-spacing, 12px);
- width: 100%;
+ cursor: pointer;
+ background: var(--search-local-hit-background, #fff);
+ border-radius: 4px;
+ box-shadow: var(--search-local-hit-shadow, 0 1px 3px 0 #d4d9e1);
+ padding: 0 var(--search-local-spacing, 12px);
+ width: 100%;
- align-items: center;
- color: var(--search-local-hit-color, #444950);
- display: flex;
- flex-direction: row;
- height: var(--search-local-hit-height, 56px);
+ align-items: center;
+ color: var(--search-local-hit-color, #444950);
+ display: flex;
+ flex-direction: row;
+ height: var(--search-local-hit-height, 56px);
}
-html[data-theme="dark"] .dropdownMenu .suggestion {
- background: var(--search-local-hit-background, var(--ifm-color-emphasis-100));
- box-shadow: var(--search-local-hit-shadow, none);
- color: var(--search-local-hit-color, var(--ifm-font-color-base));
+html[data-theme='dark'] .dropdownMenu .suggestion {
+ background: var(--search-local-hit-background, var(--ifm-color-emphasis-100));
+ box-shadow: var(--search-local-hit-shadow, none);
+ color: var(--search-local-hit-color, var(--ifm-font-color-base));
}
.searchBar .dropdownMenu .suggestion:not(:last-child) {
- margin-bottom: 4px;
+ margin-bottom: 4px;
}
.searchBar .dropdownMenu .suggestion.cursor {
- background-color: var(
- --search-local-highlight-color,
- var(--ifm-color-primary)
- );
+ background-color: var(--search-local-highlight-color, var(--ifm-color-primary));
}
.hitTree,
@@ -73,99 +73,99 @@
.hitPath,
.noResultsIcon,
.hitFooter a {
- color: var(--search-local-muted-color, #969faf);
+ color: var(--search-local-muted-color, #969faf);
}
-html[data-theme="dark"] .hitTree,
-html[data-theme="dark"] .hitIcon,
-html[data-theme="dark"] .hitPath,
-html[data-theme="dark"] .noResultsIcon {
- color: var(--search-local-muted-color, var(--ifm-color-secondary-darkest));
+html[data-theme='dark'] .hitTree,
+html[data-theme='dark'] .hitIcon,
+html[data-theme='dark'] .hitPath,
+html[data-theme='dark'] .noResultsIcon {
+ color: var(--search-local-muted-color, var(--ifm-color-secondary-darkest));
}
.hitTree {
- display: flex;
- align-items: center;
+ display: flex;
+ align-items: center;
}
.hitTree > svg {
- height: var(--search-local-hit-height, 56px);
- opacity: 0.5;
- stroke-width: var(--search-local-icon-stroke-width, 1.4);
- width: 24px;
+ height: var(--search-local-hit-height, 56px);
+ opacity: 0.5;
+ stroke-width: var(--search-local-icon-stroke-width, 1.4);
+ width: 24px;
}
.hitIcon {
- stroke-width: var(--search-local-icon-stroke-width, 1.4);
+ stroke-width: var(--search-local-icon-stroke-width, 1.4);
- height: 20px;
- width: 20px;
+ height: 20px;
+ width: 20px;
}
.hitWrapper {
- flex: 1 1 auto;
- display: flex;
- flex-direction: column;
- font-weight: 500;
- justify-content: center;
- margin: 0 8px;
- overflow-x: hidden;
- width: 80%;
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+ font-weight: 500;
+ justify-content: center;
+ margin: 0 8px;
+ overflow-x: hidden;
+ width: 80%;
}
.hitWrapper mark {
- background: none;
- color: var(--search-local-highlight-color, var(--ifm-color-primary));
+ background: none;
+ color: var(--search-local-highlight-color, var(--ifm-color-primary));
}
.hitTitle {
- font-size: 0.9em;
+ font-size: 0.9em;
}
.hitPath {
- font-size: 0.75em;
+ font-size: 0.75em;
}
.hitPath,
.hitTitle {
- white-space: nowrap;
- overflow-x: hidden;
- text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
}
.hitAction {
- height: 20px;
- width: 20px;
+ height: 20px;
+ width: 20px;
}
.hideAction > svg {
- display: none;
+ display: none;
}
.noResults {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: var(--search-local-spacing, 12px) 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: var(--search-local-spacing, 12px) 0;
}
.noResultsIcon {
- margin-bottom: var(--search-local-spacing, 12px);
+ margin-bottom: var(--search-local-spacing, 12px);
}
.hitFooter {
- text-align: center;
- margin-top: var(--search-local-spacing, 12px);
- font-size: 0.85em;
+ text-align: center;
+ margin-top: var(--search-local-spacing, 12px);
+ font-size: 0.85em;
}
.hitFooter a {
- text-decoration: underline;
+ text-decoration: underline;
}
.cursor .hideAction > svg {
- display: block;
+ display: block;
}
.suggestion.cursor,
@@ -173,74 +173,79 @@
.suggestion.cursor .hitTree,
.suggestion.cursor .hitIcon,
.suggestion.cursor .hitPath {
- color: var(
- --search-local-hit-active-color,
- var(--ifm-color-white)
- ) !important;
+ color: var(--search-local-hit-active-color, var(--ifm-color-white)) !important;
}
.suggestion.cursor mark {
- text-decoration: underline;
+ text-decoration: underline;
}
.searchBarContainer {
- margin-left: 16px;
+ margin-left: 16px;
}
.searchBarContainer .searchBarLoadingRing {
- display: none;
- position: absolute;
- left: 10px;
- top: 6px;
+ display: none;
+ position: absolute;
+ left: 10px;
+ top: 6px;
}
.searchBarContainer .searchClearButton {
- position: absolute;
- right: 0.8rem;
- top: 50%;
- transform: translate(0, -50%);
- padding: 0;
- background: none;
- border: none;
- line-height: 1rem;
+ position: absolute;
+ right: 0.8rem;
+ top: 50%;
+ transform: translate(0, -50%);
+ padding: 0;
+ background: none;
+ border: none;
+ line-height: 1rem;
+ color: #4c576c;
+ font-size: 14px;
}
:global(.navbar__search) {
- position: relative;
+ position: relative;
}
.searchIndexLoading :global(.navbar__search-input) {
- background-image: none;
+ background-image: none;
}
.searchBarContainer.searchIndexLoading .searchBarLoadingRing {
- display: inline-block;
+ display: inline-block;
}
.searchHintContainer {
- position: absolute;
- right: 10px;
- top: 0px;
- display: flex;
- align-items: center;
- justify-content: center;
- height: 100%;
- pointer-events: none;
- gap: 4px;
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ display: flex !important;
+ align-items: center;
+ justify-content: center;
+ pointer-events: none;
+ border: 1px solid #edf2fa;
+ padding: 5px 7px;
+ background-color: #ffffff;
+ gap: 2px;
}
.searchHint {
- color: var(--ifm-navbar-search-input-placeholder-color);
- background-color: var(--ifm-navbar-search-input-background-color);
- border: 1px solid var(--ifm-color-emphasis-500);
- box-shadow: inset 0 -1px 0 var(--ifm-color-emphasis-500);
+ color: #8592a6;
+ background-color: #ffffff;
+ border: none;
+ border-radius: none;
+ box-shadow: none;
+ font-size: 12px;
+ padding: 0;
}
@media (max-width: 576px) {
- .searchBarContainer:not(.focused) .searchClearButton,
- .searchHintContainer {
- display: none;
- }
+ .searchBarContainer:not(.focused) .searchClearButton,
+ .searchHintContainer {
+ display: none !important;
+ }
}
.input {
diff --git a/static/images/1.2.1-release.png b/static/images/1.2.1-release.png
new file mode 100644
index 0000000..e1209ac
--- /dev/null
+++ b/static/images/1.2.1-release.png
Binary files differ
diff --git a/static/images/1.2.2-release.png b/static/images/1.2.2-release.png
new file mode 100644
index 0000000..4b63544
--- /dev/null
+++ b/static/images/1.2.2-release.png
Binary files differ
diff --git a/static/images/1.2.3-release.png b/static/images/1.2.3-release.png
new file mode 100644
index 0000000..41e45a8
--- /dev/null
+++ b/static/images/1.2.3-release.png
Binary files differ
diff --git a/static/images/1.2.4-release.png b/static/images/1.2.4-release.png
new file mode 100644
index 0000000..8177576
--- /dev/null
+++ b/static/images/1.2.4-release.png
Binary files differ
diff --git a/static/images/1.2.5-release.png b/static/images/1.2.5-release.png
new file mode 100644
index 0000000..47dc33f
--- /dev/null
+++ b/static/images/1.2.5-release.png
Binary files differ
diff --git a/static/images/1.2.6-release.png b/static/images/1.2.6-release.png
new file mode 100644
index 0000000..43a6613
--- /dev/null
+++ b/static/images/1.2.6-release.png
Binary files differ
diff --git a/static/images/1.2.7.png b/static/images/1.2.7.png
new file mode 100644
index 0000000..e82ada1
--- /dev/null
+++ b/static/images/1.2.7.png
Binary files differ
diff --git a/static/images/2.0.1.png b/static/images/2.0.1.png
new file mode 100644
index 0000000..d5cd334
--- /dev/null
+++ b/static/images/2.0.1.png
Binary files differ
diff --git a/static/images/2.0.2.png b/static/images/2.0.2.png
new file mode 100644
index 0000000..40bb689
--- /dev/null
+++ b/static/images/2.0.2.png
Binary files differ
diff --git a/static/images/Iov.png b/static/images/Iov.png
new file mode 100644
index 0000000..f5f0763
--- /dev/null
+++ b/static/images/Iov.png
Binary files differ
diff --git a/static/images/a-glimpse-of-the-next-generation-analytical-database.png b/static/images/a-glimpse-of-the-next-generation-analytical-database.png
new file mode 100644
index 0000000..9282ad0
--- /dev/null
+++ b/static/images/a-glimpse-of-the-next-generation-analytical-database.png
Binary files differ
diff --git a/static/images/ab-testing-was-a-handful-until-we-found-the-replacement-for-druid.png b/static/images/ab-testing-was-a-handful-until-we-found-the-replacement-for-druid.png
new file mode 100644
index 0000000..9c8e1c4
--- /dev/null
+++ b/static/images/ab-testing-was-a-handful-until-we-found-the-replacement-for-druid.png
Binary files differ
diff --git a/static/images/best-practice-in-duyansoft.png b/static/images/best-practice-in-duyansoft.png
new file mode 100644
index 0000000..4acda0f
--- /dev/null
+++ b/static/images/best-practice-in-duyansoft.png
Binary files differ
diff --git a/static/images/best-practice.png b/static/images/best-practice.png
new file mode 100644
index 0000000..6810270
--- /dev/null
+++ b/static/images/best-practice.png
Binary files differ
diff --git a/static/images/building-a-data-warehouse-for-traditional-industry.png b/static/images/building-a-data-warehouse-for-traditional-industry.png
new file mode 100644
index 0000000..92b9119
--- /dev/null
+++ b/static/images/building-a-data-warehouse-for-traditional-industry.png
Binary files differ
diff --git a/static/images/building-a-log-analytics-solution-10-times-more-cost-effective-than-es.jpg b/static/images/building-a-log-analytics-solution-10-times-more-cost-effective-than-es.jpg
new file mode 100644
index 0000000..e2b70fc
--- /dev/null
+++ b/static/images/building-a-log-analytics-solution-10-times-more-cost-effective-than-es.jpg
Binary files differ
diff --git a/static/images/building-the-next-generation-data-lakehouse.jpg b/static/images/building-the-next-generation-data-lakehouse.jpg
new file mode 100644
index 0000000..9ff3d98
--- /dev/null
+++ b/static/images/building-the-next-generation-data-lakehouse.jpg
Binary files differ
diff --git a/static/images/cases-bg-ELT.png b/static/images/cases-bg-ELT.png
new file mode 100644
index 0000000..b9301ea
--- /dev/null
+++ b/static/images/cases-bg-ELT.png
Binary files differ
diff --git a/static/images/cases-bg-ad-hoc.png b/static/images/cases-bg-ad-hoc.png
new file mode 100644
index 0000000..c8519a6
--- /dev/null
+++ b/static/images/cases-bg-ad-hoc.png
Binary files differ
diff --git a/static/images/cases-bg-customer.png b/static/images/cases-bg-customer.png
new file mode 100644
index 0000000..45b9e4b
--- /dev/null
+++ b/static/images/cases-bg-customer.png
Binary files differ
diff --git a/static/images/cases-bg-datalake.png b/static/images/cases-bg-datalake.png
new file mode 100644
index 0000000..3b0175a
--- /dev/null
+++ b/static/images/cases-bg-datalake.png
Binary files differ
diff --git a/static/images/cases-bg-log.png b/static/images/cases-bg-log.png
new file mode 100644
index 0000000..f6a85df
--- /dev/null
+++ b/static/images/cases-bg-log.png
Binary files differ
diff --git a/static/images/cases-bg-real-time.png b/static/images/cases-bg-real-time.png
new file mode 100644
index 0000000..64b75be
--- /dev/null
+++ b/static/images/cases-bg-real-time.png
Binary files differ
diff --git a/static/images/check-the-data-update-mechanism-of-your-database.jpg b/static/images/check-the-data-update-mechanism-of-your-database.jpg
new file mode 100644
index 0000000..009ffde
--- /dev/null
+++ b/static/images/check-the-data-update-mechanism-of-your-database.jpg
Binary files differ
diff --git a/static/images/chevron-down.svg b/static/images/chevron-down.svg
new file mode 100644
index 0000000..e174056
--- /dev/null
+++ b/static/images/chevron-down.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.54004 6.45928L4.45928 5.54004L7.99966 9.08042L11.54 5.54004L12.4593 6.45928L7.99966 10.9189L3.54004 6.45928Z" fill="#8592A6"/>
+</svg>
diff --git a/static/images/china-unicom.png b/static/images/china-unicom.png
new file mode 100644
index 0000000..be20c45
--- /dev/null
+++ b/static/images/china-unicom.png
Binary files differ
diff --git a/static/images/cigna-cmb.png b/static/images/cigna-cmb.png
new file mode 100644
index 0000000..22315a4
--- /dev/null
+++ b/static/images/cigna-cmb.png
Binary files differ
diff --git a/static/images/clickhouse-kudu-to-doris.png b/static/images/clickhouse-kudu-to-doris.png
new file mode 100644
index 0000000..452213b
--- /dev/null
+++ b/static/images/clickhouse-kudu-to-doris.png
Binary files differ
diff --git a/static/images/common.png b/static/images/common.png
new file mode 100644
index 0000000..859cd17
--- /dev/null
+++ b/static/images/common.png
Binary files differ
diff --git a/static/images/docs-logo.svg b/static/images/docs-logo.svg
new file mode 100644
index 0000000..50a6b86
--- /dev/null
+++ b/static/images/docs-logo.svg
@@ -0,0 +1,19 @@
+<svg width="159" height="30" viewBox="0 0 159 30" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_1609_6655)">
+<path d="M13.6055 4.59429L10.3322 1.32107C9.91508 0.90283 9.4196 0.57089 8.87411 0.344218C8.32862 0.117546 7.74381 0.000586913 7.15309 1.93118e-05C6.06361 -0.00328922 5.01583 0.418635 4.23267 1.17603C3.82369 1.57082 3.49737 2.04305 3.27269 2.56521C3.04802 3.08736 2.9295 3.649 2.92403 4.21741C2.91855 4.78583 3.02624 5.34965 3.24082 5.87603C3.4554 6.40241 3.77257 6.88084 4.17387 7.28343L10.1127 13.2223C10.2387 13.3417 10.4056 13.4082 10.5792 13.4082C10.7528 13.4082 10.9197 13.3417 11.0457 13.2223L13.6016 10.6664C13.7623 10.4743 16.4357 7.42063 13.6055 4.59429Z" fill="#15A9CA"/>
+<path d="M18.9692 9.82317C18.3459 9.21949 17.6991 8.5962 17.115 7.92196V7.89844C17.0942 7.95976 17.0784 8.02269 17.068 8.0866C16.8227 9.5194 16.1199 10.8342 15.0648 11.8342C11.6191 15.2563 8.13421 18.753 4.76298 22.136L4.30826 22.5868C3.61334 23.226 3.14433 24.0733 2.97152 25.0015C2.89854 25.6633 2.9678 26.333 3.17468 26.9658C3.38155 27.5986 3.72126 28.1798 4.17105 28.6707C4.55505 29.1062 5.03102 29.451 5.56455 29.6802C6.09808 29.9093 6.67586 30.0171 7.25612 29.9957C8.60069 30.0153 9.25533 29.8389 10.2353 28.8863C14.1554 25.0486 18.0754 21.1795 21.0429 18.2395C22.4423 16.8479 22.7638 14.5429 21.772 12.9906C20.9654 11.8283 20.0246 10.7652 18.9692 9.82317Z" fill="#52CAA3"/>
+<path d="M-0.00390618 7.7743V22.2314C-0.00397307 22.3904 0.0431223 22.5458 0.131419 22.678C0.219716 22.8102 0.345246 22.9133 0.492127 22.9741C0.639009 23.035 0.800637 23.0509 0.956566 23.0199C1.1125 22.9888 1.25572 22.9122 1.3681 22.7998L8.64368 15.5242C8.78109 15.3855 8.85817 15.1981 8.85817 15.0028C8.85817 14.8076 8.78109 14.6202 8.64368 14.4815L1.3681 7.2059C1.29503 7.13135 1.20781 7.07215 1.11155 7.03176C1.01529 6.99137 0.911933 6.97061 0.807543 6.9707C0.593686 6.97069 0.388466 7.05511 0.236514 7.20559C0.0845616 7.35607 -0.00183992 7.56046 -0.00390618 7.7743Z" fill="#5268AD"/>
+<path d="M31.748 21.1408V8.875H35.3858C39.3725 8.875 41.8539 11.227 41.8539 15.002C41.8539 18.777 39.3725 21.1408 35.3858 21.1408H31.748ZM33.7081 19.3846H35.4682C38.1612 19.3846 39.8978 17.6676 39.8978 15.0138C39.8978 12.3599 38.1612 10.6429 35.4682 10.6429H33.7081V19.3846Z" fill="#1D2434"/>
+<path d="M50.6121 21.3296C49.7812 21.3296 48.9585 21.166 48.1909 20.848C47.4232 20.5301 46.7258 20.064 46.1383 19.4765C45.5508 18.889 45.0847 18.1915 44.7668 17.4239C44.4488 16.6563 44.2852 15.8336 44.2852 15.0027C44.2852 14.1718 44.4488 13.3491 44.7668 12.5815C45.0847 11.8139 45.5508 11.1164 46.1383 10.5289C46.7258 9.94139 47.4232 9.47535 48.1909 9.15739C48.9585 8.83944 49.7812 8.67578 50.6121 8.67578C51.4429 8.67578 52.2657 8.83944 53.0333 9.15739C53.8009 9.47535 54.4984 9.94139 55.0859 10.5289C55.6734 11.1164 56.1394 11.8139 56.4574 12.5815C56.7754 13.3491 56.939 14.1718 56.939 15.0027C56.939 15.8336 56.7754 16.6563 56.4574 17.4239C56.1394 18.1915 55.6734 18.889 55.0859 19.4765C54.4984 20.064 53.8009 20.5301 53.0333 20.848C52.2657 21.166 51.4429 21.3296 50.6121 21.3296ZM50.6121 10.4947C49.449 10.5432 48.3497 11.0394 47.5439 11.8795C46.7381 12.7196 46.2882 13.8386 46.2882 15.0027C46.2882 16.1668 46.7381 17.2858 47.5439 18.126C48.3497 18.9661 49.449 19.4622 50.6121 19.5107C51.7977 19.4832 52.9258 18.9944 53.7566 18.1482C54.5875 17.302 55.0555 16.1651 55.0613 14.9792C55.0645 13.795 54.5978 12.6578 53.7638 11.8172C52.9297 10.9765 51.7963 10.5009 50.6121 10.4947Z" fill="#1D2434"/>
+<path d="M75.0559 8.875H73.041V21.129H75.0559V8.875Z" fill="#1D2434"/>
+<path d="M82.4742 21.3296C81.1795 21.3193 79.9005 21.0459 78.7148 20.526V18.7228C79.8924 19.2753 81.1736 19.5719 82.4742 19.5931C84.0422 19.5931 85.0888 18.8757 85.0888 17.8134C85.0888 16.6178 83.8109 16.1434 82.4585 15.6417C80.3377 14.8577 78.7148 14.1011 78.7148 12.0941C78.7148 9.57348 80.9963 8.67578 82.9524 8.67578C84.052 8.6765 85.1419 8.88119 86.1668 9.27947V11.0435C85.1273 10.6289 84.0205 10.4084 82.9014 10.3928C81.3961 10.3928 80.7219 11.1768 80.7219 11.9608C80.7219 12.9996 81.8509 13.4151 83.1758 13.8933C85.4887 14.7283 87.2527 15.5437 87.2527 17.735C87.2448 19.8596 85.2848 21.3296 82.4742 21.3296Z" fill="#1D2434"/>
+<path d="M66.026 16.1741L66.7904 15.8448C67.4416 15.565 67.9968 15.1008 68.3875 14.5095C68.7782 13.9181 68.9875 13.2255 68.9896 12.5167C68.9896 10.3058 67.398 8.87891 64.9363 8.87891H60.291V21.1408H62.251V10.6116H64.7285C65.0223 10.5938 65.3166 10.6367 65.5931 10.7374C65.8697 10.8381 66.1226 10.9946 66.3361 11.1971C66.5497 11.3997 66.7193 11.6439 66.8346 11.9147C66.9498 12.1856 67.0082 12.4772 67.006 12.7715C67.0048 13.0648 66.9441 13.3549 66.8277 13.6241C66.7113 13.8934 66.5416 14.1362 66.3288 14.3381C66.1159 14.5399 65.8644 14.6966 65.5894 14.7986C65.3143 14.9005 65.0215 14.9457 64.7285 14.9314H63.6858C63.2271 14.9981 63.4662 15.3901 63.4662 15.3901L67.4216 21.1408H69.6364L66.026 16.1741Z" fill="#1D2434"/>
+</g>
+<rect x="103.244" y="3" width="1" height="24" fill="#DFE5F0"/>
+<path d="M121.702 21V9.16H126.054C127.217 9.16 128.209 9.40533 129.03 9.896C129.862 10.376 130.492 11.064 130.918 11.96C131.345 12.8453 131.558 13.8853 131.558 15.08C131.558 16.2747 131.334 17.32 130.886 18.216C130.438 19.1013 129.782 19.7893 128.918 20.28C128.054 20.76 127.014 21 125.798 21H121.702ZM125.798 19.512C127.132 19.512 128.15 19.128 128.854 18.36C129.569 17.592 129.926 16.4987 129.926 15.08C129.926 13.6613 129.58 12.568 128.886 11.8C128.204 11.032 127.217 10.648 125.926 10.648H123.27V19.512H125.798ZM137.079 21.224C136.279 21.224 135.581 21.0427 134.983 20.68C134.397 20.3067 133.943 19.784 133.623 19.112C133.303 18.4293 133.143 17.6347 133.143 16.728C133.143 15.8107 133.303 15.016 133.623 14.344C133.943 13.6613 134.397 13.1387 134.983 12.776C135.581 12.4027 136.279 12.216 137.079 12.216C137.869 12.216 138.562 12.4027 139.159 12.776C139.757 13.1387 140.215 13.6613 140.535 14.344C140.866 15.016 141.031 15.8107 141.031 16.728C141.031 17.6347 140.866 18.4293 140.535 19.112C140.215 19.784 139.757 20.3067 139.159 20.68C138.562 21.0427 137.869 21.224 137.079 21.224ZM137.079 19.8C137.815 19.8 138.397 19.5227 138.823 18.968C139.261 18.4133 139.479 17.6667 139.479 16.728C139.479 15.7787 139.261 15.0267 138.823 14.472C138.397 13.9173 137.815 13.64 137.079 13.64C136.354 13.64 135.773 13.9173 135.335 14.472C134.909 15.0267 134.695 15.7787 134.695 16.728C134.695 17.6667 134.909 18.4133 135.335 18.968C135.773 19.5227 136.354 19.8 137.079 19.8ZM146.504 21.224C145.683 21.224 144.963 21.0373 144.344 20.664C143.736 20.2907 143.267 19.7627 142.936 19.08C142.606 18.3973 142.44 17.608 142.44 16.712C142.44 15.816 142.606 15.032 142.936 14.36C143.267 13.6773 143.736 13.1547 144.344 12.792C144.963 12.4187 145.683 12.232 146.504 12.232C147.134 12.232 147.736 12.3973 148.312 12.728C148.888 13.0587 149.347 13.5013 149.688 14.056L148.504 14.888C148.259 14.504 147.955 14.2053 147.592 13.992C147.23 13.768 146.835 13.656 146.408 13.656C145.683 13.656 145.096 13.9387 144.648 14.504C144.211 15.0587 143.992 15.7947 143.992 16.712C143.992 17.64 144.211 18.3867 144.648 18.952C145.086 19.5173 145.667 19.8 146.392 19.8C146.819 19.8 147.214 19.6933 147.576 19.48C147.95 19.256 148.259 18.952 148.504 18.568L149.688 19.4C149.347 19.9547 148.888 20.3973 148.312 20.728C147.736 21.0587 147.134 21.224 146.504 21.224ZM154.266 21.224C153.445 21.224 152.736 21.0533 152.138 20.712C151.552 20.36 151.104 19.9013 150.794 19.336L151.978 18.504C152.533 19.4213 153.312 19.88 154.314 19.88C154.826 19.88 155.226 19.7787 155.514 19.576C155.802 19.3733 155.946 19.1013 155.946 18.76C155.946 18.4293 155.797 18.152 155.498 17.928C155.2 17.704 154.714 17.5173 154.042 17.368C153.05 17.144 152.298 16.8187 151.786 16.392C151.285 15.9547 151.034 15.4 151.034 14.728C151.034 13.96 151.317 13.352 151.882 12.904C152.458 12.4453 153.232 12.216 154.202 12.216C154.938 12.216 155.578 12.376 156.122 12.696C156.666 13.0053 157.12 13.4427 157.482 14.008L156.314 14.84C156.048 14.424 155.733 14.1093 155.37 13.896C155.008 13.6827 154.618 13.576 154.202 13.576C153.701 13.576 153.306 13.672 153.018 13.864C152.73 14.056 152.586 14.3227 152.586 14.664C152.586 15.2827 153.248 15.7413 154.57 16.04C155.52 16.2533 156.245 16.5733 156.746 17C157.248 17.4267 157.498 17.9493 157.498 18.568C157.498 19.3787 157.205 20.024 156.618 20.504C156.032 20.984 155.248 21.224 154.266 21.224Z" fill="#1D1D1D"/>
+<defs>
+<clipPath id="clip0_1609_6655">
+<rect width="87.2442" height="30" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/static/images/doris-intro.png b/static/images/doris-intro.png
new file mode 100644
index 0000000..70537c3
--- /dev/null
+++ b/static/images/doris-intro.png
Binary files differ
diff --git a/static/images/doris-summit-asia.png b/static/images/doris-summit-asia.png
new file mode 100644
index 0000000..bcb4d02
--- /dev/null
+++ b/static/images/doris-summit-asia.png
Binary files differ
diff --git a/static/images/doris-wechat.png b/static/images/doris-wechat.png
new file mode 100644
index 0000000..54248f4
--- /dev/null
+++ b/static/images/doris-wechat.png
Binary files differ
diff --git a/static/images/e-commerce.png b/static/images/e-commerce.png
new file mode 100644
index 0000000..7f61fe5
--- /dev/null
+++ b/static/images/e-commerce.png
Binary files differ
diff --git a/static/images/ecomsystem/cluster-manage.png b/static/images/ecomsystem/cluster-manage.png
new file mode 100644
index 0000000..cc72a5d
--- /dev/null
+++ b/static/images/ecomsystem/cluster-manage.png
Binary files differ
diff --git a/static/images/ecomsystem/dbt.png b/static/images/ecomsystem/dbt.png
new file mode 100644
index 0000000..de3c573
--- /dev/null
+++ b/static/images/ecomsystem/dbt.png
Binary files differ
diff --git a/static/images/ecomsystem/doris-operator.png b/static/images/ecomsystem/doris-operator.png
new file mode 100644
index 0000000..55d9d03
--- /dev/null
+++ b/static/images/ecomsystem/doris-operator.png
Binary files differ
diff --git a/static/images/ecomsystem/download-bg.png b/static/images/ecomsystem/download-bg.png
new file mode 100644
index 0000000..78f2147
--- /dev/null
+++ b/static/images/ecomsystem/download-bg.png
Binary files differ
diff --git a/static/images/ecomsystem/flink.png b/static/images/ecomsystem/flink.png
new file mode 100644
index 0000000..14a51db
--- /dev/null
+++ b/static/images/ecomsystem/flink.png
Binary files differ
diff --git a/static/images/ecomsystem/selectdb.png b/static/images/ecomsystem/selectdb.png
new file mode 100644
index 0000000..5b5c11d
--- /dev/null
+++ b/static/images/ecomsystem/selectdb.png
Binary files differ
diff --git a/static/images/ecomsystem/spark.png b/static/images/ecomsystem/spark.png
new file mode 100644
index 0000000..b7a44d4
--- /dev/null
+++ b/static/images/ecomsystem/spark.png
Binary files differ
diff --git a/static/images/ecomsystem/velodb.png b/static/images/ecomsystem/velodb.png
new file mode 100644
index 0000000..85acba7
--- /dev/null
+++ b/static/images/ecomsystem/velodb.png
Binary files differ
diff --git a/static/images/empty-data.png b/static/images/empty-data.png
new file mode 100644
index 0000000..812ed1d
--- /dev/null
+++ b/static/images/empty-data.png
Binary files differ
diff --git a/static/images/es-vs-doris.png b/static/images/es-vs-doris.png
new file mode 100644
index 0000000..144057c
--- /dev/null
+++ b/static/images/es-vs-doris.png
Binary files differ
diff --git a/static/images/financial-risk.png b/static/images/financial-risk.png
new file mode 100644
index 0000000..4712144
--- /dev/null
+++ b/static/images/financial-risk.png
Binary files differ
diff --git a/static/images/how-fast-data-queries-are-implemented.png b/static/images/how-fast-data-queries-are-implemented.png
new file mode 100644
index 0000000..b2238ed
--- /dev/null
+++ b/static/images/how-fast-data-queries-are-implemented.png
Binary files differ
diff --git a/static/images/how-to-build-a-simple-but-solid-data-architecture.png b/static/images/how-to-build-a-simple-but-solid-data-architecture.png
new file mode 100644
index 0000000..d5c4b5c
--- /dev/null
+++ b/static/images/how-to-build-a-simple-but-solid-data-architecture.png
Binary files differ
diff --git a/static/images/how-we-increased-database-query-concurrency-by-20-times.jpg b/static/images/how-we-increased-database-query-concurrency-by-20-times.jpg
new file mode 100644
index 0000000..c919b44
--- /dev/null
+++ b/static/images/how-we-increased-database-query-concurrency-by-20-times.jpg
Binary files differ
diff --git a/static/images/icon/slack.svg b/static/images/icon/slack.svg
new file mode 100644
index 0000000..1119b7f
--- /dev/null
+++ b/static/images/icon/slack.svg
@@ -0,0 +1,14 @@
+<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<mask id="mask0_2084_1076" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="30" height="30">
+<rect x="3.5" y="3.5" width="29" height="29" fill="url(#pattern0)"/>
+</mask>
+<g mask="url(#mask0_2084_1076)">
+<rect x="3.5" y="3.5" width="29" height="29" fill="#1D1D1D"/>
+</g>
+<defs>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_2084_1076" transform="translate(0.025 -0.178571) scale(0.00892857)"/>
+</pattern>
+<image id="image0_2084_1076" width="400" height="146" xlink:href="data:image/png;base64,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"/>
+</defs>
+</svg>
diff --git a/static/images/jd.jpg b/static/images/jd.jpg
new file mode 100644
index 0000000..72e1286
--- /dev/null
+++ b/static/images/jd.jpg
Binary files differ
diff --git a/static/images/listen-to-that-poor-bi-engineer.png b/static/images/listen-to-that-poor-bi-engineer.png
new file mode 100644
index 0000000..6a34921
--- /dev/null
+++ b/static/images/listen-to-that-poor-bi-engineer.png
Binary files differ
diff --git a/static/images/live-streaming.png b/static/images/live-streaming.png
new file mode 100644
index 0000000..7ebd155
--- /dev/null
+++ b/static/images/live-streaming.png
Binary files differ
diff --git a/static/images/newsletter-1.png b/static/images/newsletter-1.png
new file mode 100644
index 0000000..bd61951
--- /dev/null
+++ b/static/images/newsletter-1.png
Binary files differ
diff --git a/static/images/newsletter-2.png b/static/images/newsletter-2.png
new file mode 100644
index 0000000..7ce8d9b
--- /dev/null
+++ b/static/images/newsletter-2.png
Binary files differ
diff --git a/static/images/newsletter-3.png b/static/images/newsletter-3.png
new file mode 100644
index 0000000..ea808bb
--- /dev/null
+++ b/static/images/newsletter-3.png
Binary files differ
diff --git a/static/images/newsletter-4.jpeg b/static/images/newsletter-4.jpeg
new file mode 100644
index 0000000..5197f46
--- /dev/null
+++ b/static/images/newsletter-4.jpeg
Binary files differ
diff --git a/static/images/nio.png b/static/images/nio.png
new file mode 100644
index 0000000..f1c7aff
--- /dev/null
+++ b/static/images/nio.png
Binary files differ
diff --git a/static/images/release-notes.png b/static/images/release-notes.png
new file mode 100644
index 0000000..bf5718c
--- /dev/null
+++ b/static/images/release-notes.png
Binary files differ
diff --git a/static/images/replacing-apache-hive-es-and-postgresql-with-apache-doris.png b/static/images/replacing-apache-hive-es-and-postgresql-with-apache-doris.png
new file mode 100644
index 0000000..bd68a20
--- /dev/null
+++ b/static/images/replacing-apache-hive-es-and-postgresql-with-apache-doris.png
Binary files differ
diff --git a/static/images/say-goodbye-to-oom-crashes.jpg b/static/images/say-goodbye-to-oom-crashes.jpg
new file mode 100644
index 0000000..259989f
--- /dev/null
+++ b/static/images/say-goodbye-to-oom-crashes.jpg
Binary files differ
diff --git a/static/images/search-icon.svg b/static/images/search-icon.svg
new file mode 100644
index 0000000..ef31db7
--- /dev/null
+++ b/static/images/search-icon.svg
@@ -0,0 +1,3 @@
+<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.0004 4.40039C6.90761 4.40039 4.40039 6.90761 4.40039 10.0004C4.40039 13.0932 6.90761 15.6004 10.0004 15.6004C11.3306 15.6004 12.5526 15.1366 13.5133 14.3618L16.0757 16.9242C16.31 17.1585 16.6899 17.1585 16.9242 16.9242C17.1585 16.6898 17.1585 16.3099 16.9242 16.0756L14.3618 13.5133C15.1366 12.5526 15.6004 11.3306 15.6004 10.0004C15.6004 6.90761 13.0932 4.40039 10.0004 4.40039ZM5.60039 10.0004C5.60039 7.57035 7.57035 5.60039 10.0004 5.60039C12.4304 5.60039 14.4004 7.57035 14.4004 10.0004C14.4004 12.4304 12.4304 14.4004 10.0004 14.4004C7.57035 14.4004 5.60039 12.4304 5.60039 10.0004Z" fill="#4C576C"/>
+</svg>
diff --git a/static/images/start-bg.jpg b/static/images/start-bg.jpg
new file mode 100644
index 0000000..06ca819
--- /dev/null
+++ b/static/images/start-bg.jpg
Binary files differ
diff --git a/static/images/step-by-step-guide-to-building-a-high-performing-risk-data-mart.png b/static/images/step-by-step-guide-to-building-a-high-performing-risk-data-mart.png
new file mode 100644
index 0000000..65a867c
--- /dev/null
+++ b/static/images/step-by-step-guide-to-building-a-high-performing-risk-data-mart.png
Binary files differ
diff --git a/static/images/tech-sharing.png b/static/images/tech-sharing.png
new file mode 100644
index 0000000..27d2490
--- /dev/null
+++ b/static/images/tech-sharing.png
Binary files differ
diff --git a/static/images/tencent-data-engineer.png b/static/images/tencent-data-engineer.png
new file mode 100644
index 0000000..5fc12a7
--- /dev/null
+++ b/static/images/tencent-data-engineer.png
Binary files differ
diff --git a/static/images/the-tencent-experience-with-apache-doris.png b/static/images/the-tencent-experience-with-apache-doris.png
new file mode 100644
index 0000000..993452c
--- /dev/null
+++ b/static/images/the-tencent-experience-with-apache-doris.png
Binary files differ
diff --git a/static/images/tiered-storage-for-hot-and-cold-cata.jpg b/static/images/tiered-storage-for-hot-and-cold-cata.jpg
new file mode 100644
index 0000000..406b4f2
--- /dev/null
+++ b/static/images/tiered-storage-for-hot-and-cold-cata.jpg
Binary files differ
diff --git a/static/images/tme.png b/static/images/tme.png
new file mode 100644
index 0000000..f3fca59
--- /dev/null
+++ b/static/images/tme.png
Binary files differ
diff --git a/static/images/top-news.png b/static/images/top-news.png
new file mode 100644
index 0000000..395bc63
--- /dev/null
+++ b/static/images/top-news.png
Binary files differ
diff --git a/static/images/understanding-data-compaction-in-3-minutes.jpg b/static/images/understanding-data-compaction-in-3-minutes.jpg
new file mode 100644
index 0000000..886ccc3
--- /dev/null
+++ b/static/images/understanding-data-compaction-in-3-minutes.jpg
Binary files differ
diff --git a/static/images/user-jd.jpg b/static/images/user-jd.jpg
new file mode 100644
index 0000000..bf43c7d
--- /dev/null
+++ b/static/images/user-jd.jpg
Binary files differ
diff --git a/static/images/user-logo/Finance/Industrial Bank Co.Ltd.jpg b/static/images/user-logo/Finance/Industrial Bank.jpg
similarity index 100%
rename from static/images/user-logo/Finance/Industrial Bank Co.Ltd.jpg
rename to static/images/user-logo/Finance/Industrial Bank.jpg
Binary files differ
diff --git a/static/images/user-logo/Technology/AISPEACH.jpg b/static/images/user-logo/Technology/AISPEECH.jpg
similarity index 100%
rename from static/images/user-logo/Technology/AISPEACH.jpg
rename to static/images/user-logo/Technology/AISPEECH.jpg
Binary files differ
diff --git a/static/images/wechat-qrc.png b/static/images/wechat-qrc.png
new file mode 100644
index 0000000..1293507
--- /dev/null
+++ b/static/images/wechat-qrc.png
Binary files differ
diff --git a/static/images/what-is-doris.png b/static/images/what-is-doris.png
index 4250dd1..ae8d129 100644
--- a/static/images/what-is-doris.png
+++ b/static/images/what-is-doris.png
Binary files differ
diff --git a/static/images/zipping-up-the-lambda-architecture-for-40-percent-faster-performance.png b/static/images/zipping-up-the-lambda-architecture-for-40-percent-faster-performance.png
new file mode 100644
index 0000000..77555c7
--- /dev/null
+++ b/static/images/zipping-up-the-lambda-architecture-for-40-percent-faster-performance.png
Binary files differ
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..38b1e26
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,20 @@
+module.exports = {
+ content: ['./src/**/*.{js,jsx,ts,tsx}'],
+ theme: {
+ extend: {
+ screens: {
+ xl: '1280px',
+ '2xl': '1280px',
+ },
+ },
+ colors: {
+ primary: '#444FD9',
+ white: '#FFFFFF',
+ },
+ fontFamily: {
+ misans: ['MiSans Latin'],
+ },
+ },
+ darkMode: ['class', '[data-theme="dark"]'],
+ plugins: [],
+};
diff --git a/versioned_sidebars/version-2.0-sidebars.json b/versioned_sidebars/version-2.0-sidebars.json
new file mode 100644
index 0000000..ad4c735
--- /dev/null
+++ b/versioned_sidebars/version-2.0-sidebars.json
@@ -0,0 +1,1345 @@
+{
+ "docs": [
+ {
+ "type": "category",
+ "label": "Getting Started",
+ "items": [
+ "get-starting/quick-start",
+ "get-starting/what-is-apache-doris"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Install and Deploy",
+ "items": [
+ "install/standard-deployment",
+ {
+ "type": "category",
+ "label": "Docker Deployment",
+ "items": [
+ "install/construct-docker/build-docker-image",
+ "install/construct-docker/run-docker-cluster"
+ ]
+ },
+ "install/k8s-deploy",
+ {
+ "type": "category",
+ "label": "Source Code Compilation",
+ "items": [
+ "install/source-install/compilation-general",
+ "install/source-install/compilation-with-ldb-toolchain",
+ "install/source-install/compilation-arm",
+ "install/source-install/compilation-win",
+ "install/source-install/compilation-mac"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Table Design",
+ "items": [
+ "data-table/data-model",
+ "data-table/data-partition",
+ "data-table/basic-usage",
+ "data-table/hit-the-rollup",
+ "data-table/best-practice",
+ {
+ "type": "category",
+ "label": "Index",
+ "items": [
+ "data-table/index/index-overview",
+ "data-table/index/inverted-index",
+ "data-table/index/bloomfilter",
+ "data-table/index/ngram-bloomfilter-index",
+ "data-table/index/bitmap-index"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Data Operation",
+ "items": [
+ {
+ "type": "category",
+ "label": "Import",
+ "items": [
+ "data-operate/import/load-manual",
+ {
+ "type": "category",
+ "label": "Import Scenes",
+ "items": [
+ "data-operate/import/import-scenes/local-file-load",
+ "data-operate/import/import-scenes/external-storage-load",
+ "data-operate/import/import-scenes/kafka-load",
+ "data-operate/import/import-scenes/external-table-load",
+ "data-operate/import/import-scenes/jdbc-load",
+ "data-operate/import/import-scenes/load-atomicity",
+ "data-operate/import/import-scenes/load-data-convert",
+ "data-operate/import/import-scenes/load-strict-mode"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Import Way",
+ "items": [
+ "data-operate/import/import-way/broker-load-manual",
+ "data-operate/import/import-way/routine-load-manual",
+ "data-operate/import/import-way/spark-load-manual",
+ "data-operate/import/import-way/stream-load-manual",
+ "data-operate/import/import-way/mysql-load-manual",
+ "data-operate/import/import-way/s3-load-manual",
+ "data-operate/import/import-way/insert-into-manual",
+ "data-operate/import/import-way/load-json-format"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Import Advanced",
+ "items": [
+ "data-operate/import/import-advanced/min-load-replica-num"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Export",
+ "items": [
+ "data-operate/export/export-manual",
+ "data-operate/export/outfile",
+ "data-operate/export/export-with-mysql-dump"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Update and Delete",
+ "items": [
+ "data-operate/update-delete/batch-delete-manual",
+ "data-operate/update-delete/update",
+ "data-operate/update-delete/partial-update",
+ "data-operate/update-delete/delete-manual",
+ "data-operate/update-delete/sequence-column-manual"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Advanced Usage",
+ "items": [
+ {
+ "type": "category",
+ "label": "Alter Table",
+ "items": [
+ "advanced/alter-table/schema-change",
+ "advanced/alter-table/replace-table"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Doris Partition",
+ "items": [
+ "advanced/partition/dynamic-partition",
+ "advanced/partition/table-temp-partition"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Data Cache",
+ "items": [
+ "advanced/cache/partition-cache"
+ ]
+ },
+ "advanced/autobucket",
+ "advanced/broker",
+ {
+ "type": "category",
+ "label": "Best Practice",
+ "items": [
+ "advanced/best-practice/query-analysis",
+ "advanced/best-practice/import-analysis",
+ "advanced/best-practice/debug-log",
+ "advanced/best-practice/compaction"
+ ]
+ },
+ "advanced/resource",
+ "advanced/orthogonal-bitmap-manual",
+ "advanced/using-hll",
+ "advanced/variables",
+ "advanced/time-zone",
+ "advanced/small-file-mgr",
+ "advanced/cold-hot-separation",
+ "advanced/compute-node",
+ "advanced/lateral-view",
+ "advanced/is-being-synced",
+ "advanced/sql-mode"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Query Acceleration",
+ "items": [
+ "query-acceleration/pipeline-execution-engine",
+ "query-acceleration/nereids",
+ "query-acceleration/hight-concurrent-point-query",
+ "query-acceleration/materialized-view",
+ "query-acceleration/statistics",
+ {
+ "type": "category",
+ "label": "Join Optimization",
+ "items": [
+ "query-acceleration/join-optimization/bucket-shuffle-join",
+ "query-acceleration/join-optimization/colocation-join",
+ "query-acceleration/join-optimization/runtime-filter",
+ "query-acceleration/join-optimization/doris-join-optimization"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Lakehouse",
+ "items": [
+ {
+ "type": "category",
+ "label": "Multi-catalog",
+ "items": [
+ "lakehouse/multi-catalog/multi-catalog",
+ "lakehouse/multi-catalog/hive",
+ "lakehouse/multi-catalog/iceberg",
+ "lakehouse/multi-catalog/hudi",
+ "lakehouse/multi-catalog/paimon",
+ "lakehouse/multi-catalog/dlf",
+ "lakehouse/multi-catalog/max-compute",
+ "lakehouse/multi-catalog/es",
+ "lakehouse/multi-catalog/jdbc"
+ ]
+ },
+ "lakehouse/file",
+ "lakehouse/filecache",
+ "lakehouse/external-statistics",
+ "lakehouse/fs-benchmark-tool",
+ "lakehouse/faq"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Ecosystem",
+ "items": [
+ "ecosystem/spark-doris-connector",
+ "ecosystem/flink-doris-connector",
+ "ecosystem/datax",
+ "ecosystem/seatunnel",
+ "ecosystem/kyuubi",
+ "ecosystem/logstash",
+ "ecosystem/beats",
+ "ecosystem/plugin-development-manual",
+ "ecosystem/audit-plugin",
+ "ecosystem/cloudcanal",
+ "ecosystem/hive-bitmap-udf",
+ "ecosystem/dbt-doris-adapter",
+ {
+ "type": "category",
+ "label": "UDF",
+ "items": [
+ "ecosystem/udf/contribute-udf",
+ "ecosystem/udf/remote-user-defined-function",
+ "ecosystem/udf/java-user-defined-function"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "UDAF",
+ "items": [
+ "ecosystem/udaf/remote-user-defined-aggregation-function"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "SQL Manual",
+ "items": [
+ {
+ "type": "category",
+ "label": "SQL Functions",
+ "items": [
+ {
+ "type": "category",
+ "label": "Array Functions",
+ "items": [
+ "sql-manual/sql-functions/array-functions/array",
+ "sql-manual/sql-functions/array-functions/array-max",
+ "sql-manual/sql-functions/array-functions/array-min",
+ "sql-manual/sql-functions/array-functions/array-map",
+ "sql-manual/sql-functions/array-functions/array-filter",
+ "sql-manual/sql-functions/array-functions/array-avg",
+ "sql-manual/sql-functions/array-functions/array-sum",
+ "sql-manual/sql-functions/array-functions/array-size",
+ "sql-manual/sql-functions/array-functions/array-remove",
+ "sql-manual/sql-functions/array-functions/array-slice",
+ "sql-manual/sql-functions/array-functions/array-sort",
+ "sql-manual/sql-functions/array-functions/array-reverse-sort",
+ "sql-manual/sql-functions/array-functions/array-sortby",
+ "sql-manual/sql-functions/array-functions/array-position",
+ "sql-manual/sql-functions/array-functions/array-contains",
+ "sql-manual/sql-functions/array-functions/array-except",
+ "sql-manual/sql-functions/array-functions/array-product",
+ "sql-manual/sql-functions/array-functions/array-intersect",
+ "sql-manual/sql-functions/array-functions/array-range",
+ "sql-manual/sql-functions/array-functions/array-distinct",
+ "sql-manual/sql-functions/array-functions/array-difference",
+ "sql-manual/sql-functions/array-functions/array-union",
+ "sql-manual/sql-functions/array-functions/array-join",
+ "sql-manual/sql-functions/array-functions/array-with-constant",
+ "sql-manual/sql-functions/array-functions/array-enumerate",
+ "sql-manual/sql-functions/array-functions/array-enumerate-uniq",
+ "sql-manual/sql-functions/array-functions/array-popback",
+ "sql-manual/sql-functions/array-functions/array-popfront",
+ "sql-manual/sql-functions/array-functions/array-pushfront",
+ "sql-manual/sql-functions/array-functions/array-pushback",
+ "sql-manual/sql-functions/array-functions/array-compact",
+ "sql-manual/sql-functions/array-functions/array-concat",
+ "sql-manual/sql-functions/array-functions/array-zip",
+ "sql-manual/sql-functions/array-functions/array-shuffle",
+ "sql-manual/sql-functions/array-functions/array-cum-sum",
+ "sql-manual/sql-functions/array-functions/array-exists",
+ "sql-manual/sql-functions/array-functions/array-first-index",
+ "sql-manual/sql-functions/array-functions/array-last-index",
+ "sql-manual/sql-functions/array-functions/array-first",
+ "sql-manual/sql-functions/array-functions/array-last",
+ "sql-manual/sql-functions/array-functions/arrays-overlap",
+ "sql-manual/sql-functions/array-functions/array-count",
+ "sql-manual/sql-functions/array-functions/countequal",
+ "sql-manual/sql-functions/array-functions/element-at"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Date Functions",
+ "items": [
+ "sql-manual/sql-functions/date-time-functions/convert-tz",
+ "sql-manual/sql-functions/date-time-functions/curdate",
+ "sql-manual/sql-functions/date-time-functions/curtime",
+ "sql-manual/sql-functions/date-time-functions/current-timestamp",
+ "sql-manual/sql-functions/date-time-functions/localtime",
+ "sql-manual/sql-functions/date-time-functions/now",
+ "sql-manual/sql-functions/date-time-functions/year",
+ "sql-manual/sql-functions/date-time-functions/quarter",
+ "sql-manual/sql-functions/date-time-functions/month",
+ "sql-manual/sql-functions/date-time-functions/day",
+ "sql-manual/sql-functions/date-time-functions/dayofyear",
+ "sql-manual/sql-functions/date-time-functions/dayofmonth",
+ "sql-manual/sql-functions/date-time-functions/dayofweek",
+ "sql-manual/sql-functions/date-time-functions/week",
+ "sql-manual/sql-functions/date-time-functions/weekday",
+ "sql-manual/sql-functions/date-time-functions/weekofyear",
+ "sql-manual/sql-functions/date-time-functions/yearweek",
+ "sql-manual/sql-functions/date-time-functions/dayname",
+ "sql-manual/sql-functions/date-time-functions/monthname",
+ "sql-manual/sql-functions/date-time-functions/hour",
+ "sql-manual/sql-functions/date-time-functions/minute",
+ "sql-manual/sql-functions/date-time-functions/second",
+ "sql-manual/sql-functions/date-time-functions/from-days",
+ "sql-manual/sql-functions/date-time-functions/last-day",
+ "sql-manual/sql-functions/date-time-functions/to-monday",
+ "sql-manual/sql-functions/date-time-functions/from-unixtime",
+ "sql-manual/sql-functions/date-time-functions/unix-timestamp",
+ "sql-manual/sql-functions/date-time-functions/utc-timestamp",
+ "sql-manual/sql-functions/date-time-functions/to-date",
+ "sql-manual/sql-functions/date-time-functions/to-days",
+ "sql-manual/sql-functions/date-time-functions/time-to-sec",
+ "sql-manual/sql-functions/date-time-functions/sec-to-time",
+ "sql-manual/sql-functions/date-time-functions/extract",
+ "sql-manual/sql-functions/date-time-functions/makedate",
+ "sql-manual/sql-functions/date-time-functions/str-to-date",
+ "sql-manual/sql-functions/date-time-functions/time-round",
+ "sql-manual/sql-functions/date-time-functions/timediff",
+ "sql-manual/sql-functions/date-time-functions/timestampadd",
+ "sql-manual/sql-functions/date-time-functions/timestampdiff",
+ "sql-manual/sql-functions/date-time-functions/date-add",
+ "sql-manual/sql-functions/date-time-functions/date-sub",
+ "sql-manual/sql-functions/date-time-functions/date-trunc",
+ "sql-manual/sql-functions/date-time-functions/date-format",
+ "sql-manual/sql-functions/date-time-functions/datediff",
+ "sql-manual/sql-functions/date-time-functions/microseconds-add",
+ "sql-manual/sql-functions/date-time-functions/microseconds-diff",
+ "sql-manual/sql-functions/date-time-functions/microseconds-sub",
+ "sql-manual/sql-functions/date-time-functions/milliseconds-add",
+ "sql-manual/sql-functions/date-time-functions/milliseconds-diff",
+ "sql-manual/sql-functions/date-time-functions/milliseconds-sub",
+ "sql-manual/sql-functions/date-time-functions/minutes-add",
+ "sql-manual/sql-functions/date-time-functions/minutes-diff",
+ "sql-manual/sql-functions/date-time-functions/minutes-sub",
+ "sql-manual/sql-functions/date-time-functions/seconds-add",
+ "sql-manual/sql-functions/date-time-functions/seconds-diff",
+ "sql-manual/sql-functions/date-time-functions/seconds-sub",
+ "sql-manual/sql-functions/date-time-functions/hours-add",
+ "sql-manual/sql-functions/date-time-functions/hours-diff",
+ "sql-manual/sql-functions/date-time-functions/hours-sub",
+ "sql-manual/sql-functions/date-time-functions/days-add",
+ "sql-manual/sql-functions/date-time-functions/days-diff",
+ "sql-manual/sql-functions/date-time-functions/days-sub",
+ "sql-manual/sql-functions/date-time-functions/weeks-add",
+ "sql-manual/sql-functions/date-time-functions/weeks-diff",
+ "sql-manual/sql-functions/date-time-functions/weeks-sub",
+ "sql-manual/sql-functions/date-time-functions/months-add",
+ "sql-manual/sql-functions/date-time-functions/months-diff",
+ "sql-manual/sql-functions/date-time-functions/months-sub",
+ "sql-manual/sql-functions/date-time-functions/years-add",
+ "sql-manual/sql-functions/date-time-functions/years-diff",
+ "sql-manual/sql-functions/date-time-functions/years-sub"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "GIS Functions",
+ "items": [
+ "sql-manual/sql-functions/spatial-functions/st-x",
+ "sql-manual/sql-functions/spatial-functions/st-y",
+ "sql-manual/sql-functions/spatial-functions/st-circle",
+ "sql-manual/sql-functions/spatial-functions/st-distance-sphere",
+ "sql-manual/sql-functions/spatial-functions/st-angle",
+ "sql-manual/sql-functions/spatial-functions/st-azimuth",
+ "sql-manual/sql-functions/spatial-functions/st-angle-sphere",
+ "sql-manual/sql-functions/spatial-functions/st-area",
+ "sql-manual/sql-functions/spatial-functions/st-point",
+ "sql-manual/sql-functions/spatial-functions/st-polygon",
+ "sql-manual/sql-functions/spatial-functions/st-astext",
+ "sql-manual/sql-functions/spatial-functions/st-contains",
+ "sql-manual/sql-functions/spatial-functions/st-geometryfromtext",
+ "sql-manual/sql-functions/spatial-functions/st-linefromtext",
+ "sql-manual/sql-functions/spatial-functions/st-asbinary",
+ "sql-manual/sql-functions/spatial-functions/st-geometryfromwkb"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "String Functions",
+ "items": [
+ "sql-manual/sql-functions/string-functions/to-base64",
+ "sql-manual/sql-functions/string-functions/from-base64",
+ "sql-manual/sql-functions/string-functions/ascii",
+ "sql-manual/sql-functions/string-functions/length",
+ "sql-manual/sql-functions/string-functions/bit-length",
+ "sql-manual/sql-functions/string-functions/char-length",
+ "sql-manual/sql-functions/string-functions/lpad",
+ "sql-manual/sql-functions/string-functions/rpad",
+ "sql-manual/sql-functions/string-functions/lower",
+ "sql-manual/sql-functions/string-functions/lcase",
+ "sql-manual/sql-functions/string-functions/upper",
+ "sql-manual/sql-functions/string-functions/ucase",
+ "sql-manual/sql-functions/string-functions/initcap",
+ "sql-manual/sql-functions/string-functions/repeat",
+ "sql-manual/sql-functions/string-functions/reverse",
+ "sql-manual/sql-functions/string-functions/char",
+ "sql-manual/sql-functions/string-functions/concat",
+ "sql-manual/sql-functions/string-functions/concat-ws",
+ "sql-manual/sql-functions/string-functions/substr",
+ "sql-manual/sql-functions/string-functions/substring",
+ "sql-manual/sql-functions/string-functions/sub-replace",
+ "sql-manual/sql-functions/string-functions/append-trailing-char-if-absent",
+ "sql-manual/sql-functions/string-functions/ends-with",
+ "sql-manual/sql-functions/string-functions/starts-with",
+ "sql-manual/sql-functions/string-functions/trim",
+ "sql-manual/sql-functions/string-functions/ltrim",
+ "sql-manual/sql-functions/string-functions/rtrim",
+ "sql-manual/sql-functions/string-functions/null-or-empty",
+ "sql-manual/sql-functions/string-functions/not-null-or-empty",
+ "sql-manual/sql-functions/string-functions/hex",
+ "sql-manual/sql-functions/string-functions/unhex",
+ "sql-manual/sql-functions/string-functions/elt",
+ "sql-manual/sql-functions/string-functions/instr",
+ "sql-manual/sql-functions/string-functions/locate",
+ "sql-manual/sql-functions/string-functions/field",
+ "sql-manual/sql-functions/string-functions/find-in-set",
+ "sql-manual/sql-functions/string-functions/replace",
+ "sql-manual/sql-functions/string-functions/left",
+ "sql-manual/sql-functions/string-functions/right",
+ "sql-manual/sql-functions/string-functions/strleft",
+ "sql-manual/sql-functions/string-functions/strright",
+ "sql-manual/sql-functions/string-functions/split-part",
+ "sql-manual/sql-functions/string-functions/split-by-string",
+ "sql-manual/sql-functions/string-functions/substring-index",
+ "sql-manual/sql-functions/string-functions/money-format",
+ "sql-manual/sql-functions/string-functions/parse-url",
+ "sql-manual/sql-functions/string-functions/convert-to",
+ "sql-manual/sql-functions/string-functions/extract-url-parameter",
+ "sql-manual/sql-functions/string-functions/uuid",
+ "sql-manual/sql-functions/string-functions/space",
+ "sql-manual/sql-functions/string-functions/sleep",
+ "sql-manual/sql-functions/string-functions/esquery",
+ {
+ "type": "category",
+ "label": "Search in String",
+ "items": [
+ "sql-manual/sql-functions/string-functions/search/multi-search-all-positions",
+ "sql-manual/sql-functions/string-functions/search/multi-match-any"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Mask in String",
+ "items": [
+ "sql-manual/sql-functions/string-functions/mask/mask",
+ "sql-manual/sql-functions/string-functions/mask/mask-first-n",
+ "sql-manual/sql-functions/string-functions/mask/mask-last-n"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Fuzzy Match",
+ "items": [
+ "sql-manual/sql-functions/string-functions/like/like",
+ "sql-manual/sql-functions/string-functions/like/not-like"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Regular Match",
+ "items": [
+ "sql-manual/sql-functions/string-functions/regexp/regexp",
+ "sql-manual/sql-functions/string-functions/regexp/regexp-extract",
+ "sql-manual/sql-functions/string-functions/regexp/regexp-extract-all",
+ "sql-manual/sql-functions/string-functions/regexp/regexp-replace",
+ "sql-manual/sql-functions/string-functions/regexp/regexp-replace-one",
+ "sql-manual/sql-functions/string-functions/regexp/not-regexp"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Struct Functions",
+ "items": [
+ "sql-manual/sql-functions/struct-functions/struct",
+ "sql-manual/sql-functions/struct-functions/named-struct",
+ "sql-manual/sql-functions/struct-functions/struct-element"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Combinators",
+ "items": [
+ "sql-manual/sql-functions/combinators/state",
+ "sql-manual/sql-functions/combinators/merge",
+ "sql-manual/sql-functions/combinators/union"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Aggregate Functions",
+ "items": [
+ "sql-manual/sql-functions/aggregate-functions/collect-set",
+ "sql-manual/sql-functions/aggregate-functions/min",
+ "sql-manual/sql-functions/aggregate-functions/stddev-samp",
+ "sql-manual/sql-functions/aggregate-functions/avg",
+ "sql-manual/sql-functions/aggregate-functions/avg-weighted",
+ "sql-manual/sql-functions/aggregate-functions/percentile",
+ "sql-manual/sql-functions/aggregate-functions/percentile-array",
+ "sql-manual/sql-functions/aggregate-functions/hll-union-agg",
+ "sql-manual/sql-functions/aggregate-functions/topn",
+ "sql-manual/sql-functions/aggregate-functions/topn-array",
+ "sql-manual/sql-functions/aggregate-functions/topn-weighted",
+ "sql-manual/sql-functions/aggregate-functions/count",
+ "sql-manual/sql-functions/aggregate-functions/sum",
+ "sql-manual/sql-functions/aggregate-functions/max-by",
+ "sql-manual/sql-functions/aggregate-functions/bitmap-union",
+ "sql-manual/sql-functions/aggregate-functions/group-bitmap-xor",
+ "sql-manual/sql-functions/aggregate-functions/group-bit-and",
+ "sql-manual/sql-functions/aggregate-functions/group-bit-or",
+ "sql-manual/sql-functions/aggregate-functions/group-bit-xor",
+ "sql-manual/sql-functions/aggregate-functions/percentile-approx",
+ "sql-manual/sql-functions/aggregate-functions/stddev",
+ "sql-manual/sql-functions/aggregate-functions/group-concat",
+ "sql-manual/sql-functions/aggregate-functions/collect-list",
+ "sql-manual/sql-functions/aggregate-functions/min-by",
+ "sql-manual/sql-functions/aggregate-functions/max",
+ "sql-manual/sql-functions/aggregate-functions/any-value",
+ "sql-manual/sql-functions/aggregate-functions/var-samp",
+ "sql-manual/sql-functions/aggregate-functions/approx-count-distinct",
+ "sql-manual/sql-functions/aggregate-functions/variance",
+ "sql-manual/sql-functions/aggregate-functions/retention",
+ "sql-manual/sql-functions/aggregate-functions/sequence-match",
+ "sql-manual/sql-functions/aggregate-functions/sequence-count",
+ "sql-manual/sql-functions/aggregate-functions/grouping",
+ "sql-manual/sql-functions/aggregate-functions/grouping-id",
+ "sql-manual/sql-functions/aggregate-functions/count-by-enum",
+ "sql-manual/sql-functions/aggregate-functions/histogram",
+ "sql-manual/sql-functions/aggregate-functions/map-agg"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Bitmap Functions",
+ "items": [
+ "sql-manual/sql-functions/bitmap-functions/to-bitmap",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-hash",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-from-string",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-to-string",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-to-array",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-from-array",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-empty",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-or",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-and",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-union",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-xor",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-not",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-and-not",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-subset-limit",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-subset-in-range",
+ "sql-manual/sql-functions/bitmap-functions/sub-bitmap",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-count",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-and-count",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-and-not-count",
+ "sql-manual/sql-functions/bitmap-functions/orthogonal-bitmap-union-count",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-xor-count",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-or-count",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-contains",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-has-all",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-has-any",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-max",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-min",
+ "sql-manual/sql-functions/bitmap-functions/intersect-count",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-intersect",
+ "sql-manual/sql-functions/bitmap-functions/orthogonal-bitmap-intersect",
+ "sql-manual/sql-functions/bitmap-functions/orthogonal-bitmap-intersect-count",
+ "sql-manual/sql-functions/bitmap-functions/orthogonal-bitmap-expr-calculate",
+ "sql-manual/sql-functions/bitmap-functions/orthogonal-bitmap-expr-calculate-count",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-hash64",
+ "sql-manual/sql-functions/bitmap-functions/bitmap-remove"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Bitwise Functions",
+ "items": [
+ "sql-manual/sql-functions/bitwise-functions/bitand",
+ "sql-manual/sql-functions/bitwise-functions/bitor",
+ "sql-manual/sql-functions/bitwise-functions/bitxor",
+ "sql-manual/sql-functions/bitwise-functions/bitnot"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Conditional Functions",
+ "items": [
+ "sql-manual/sql-functions/conditional-functions/case",
+ "sql-manual/sql-functions/conditional-functions/coalesce",
+ "sql-manual/sql-functions/conditional-functions/if",
+ "sql-manual/sql-functions/conditional-functions/ifnull",
+ "sql-manual/sql-functions/conditional-functions/nvl",
+ "sql-manual/sql-functions/conditional-functions/nullif"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "JSON Functions",
+ "items": [
+ "sql-manual/sql-functions/json-functions/json-parse",
+ "sql-manual/sql-functions/json-functions/json-extract",
+ "sql-manual/sql-functions/json-functions/json-exists-path",
+ "sql-manual/sql-functions/json-functions/json-type",
+ "sql-manual/sql-functions/json-functions/json-array",
+ "sql-manual/sql-functions/json-functions/json-object",
+ "sql-manual/sql-functions/json-functions/json-quote",
+ "sql-manual/sql-functions/json-functions/json-unquote",
+ "sql-manual/sql-functions/json-functions/json-valid",
+ "sql-manual/sql-functions/json-functions/json-contains",
+ "sql-manual/sql-functions/json-functions/json-length",
+ "sql-manual/sql-functions/json-functions/get-json-double",
+ "sql-manual/sql-functions/json-functions/get-json-int",
+ "sql-manual/sql-functions/json-functions/get-json-bigint",
+ "sql-manual/sql-functions/json-functions/get-json-string",
+ "sql-manual/sql-functions/json-functions/json-insert",
+ "sql-manual/sql-functions/json-functions/json-replace",
+ "sql-manual/sql-functions/json-functions/json-set"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Hash Functions",
+ "items": [
+ "sql-manual/sql-functions/hash-functions/murmur-hash3-32",
+ "sql-manual/sql-functions/hash-functions/murmur-hash3-64"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "HLL Functions",
+ "items": [
+ "sql-manual/sql-functions/hll-functions/hll-cardinality",
+ "sql-manual/sql-functions/hll-functions/hll-empty",
+ "sql-manual/sql-functions/hll-functions/hll-hash"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Numeric Functions",
+ "items": [
+ "sql-manual/sql-functions/numeric-functions/conv",
+ "sql-manual/sql-functions/numeric-functions/bin",
+ "sql-manual/sql-functions/numeric-functions/sin",
+ "sql-manual/sql-functions/numeric-functions/cos",
+ "sql-manual/sql-functions/numeric-functions/tan",
+ "sql-manual/sql-functions/numeric-functions/asin",
+ "sql-manual/sql-functions/numeric-functions/acos",
+ "sql-manual/sql-functions/numeric-functions/atan",
+ "sql-manual/sql-functions/numeric-functions/e",
+ "sql-manual/sql-functions/numeric-functions/pi",
+ "sql-manual/sql-functions/numeric-functions/exp",
+ "sql-manual/sql-functions/numeric-functions/log",
+ "sql-manual/sql-functions/numeric-functions/log2",
+ "sql-manual/sql-functions/numeric-functions/log10",
+ "sql-manual/sql-functions/numeric-functions/ln",
+ "sql-manual/sql-functions/numeric-functions/ceil",
+ "sql-manual/sql-functions/numeric-functions/floor",
+ "sql-manual/sql-functions/numeric-functions/pmod",
+ "sql-manual/sql-functions/numeric-functions/round",
+ "sql-manual/sql-functions/numeric-functions/round-bankers",
+ "sql-manual/sql-functions/numeric-functions/truncate",
+ "sql-manual/sql-functions/numeric-functions/abs",
+ "sql-manual/sql-functions/numeric-functions/sqrt",
+ "sql-manual/sql-functions/numeric-functions/cbrt",
+ "sql-manual/sql-functions/numeric-functions/pow",
+ "sql-manual/sql-functions/numeric-functions/degrees",
+ "sql-manual/sql-functions/numeric-functions/radians",
+ "sql-manual/sql-functions/numeric-functions/sign",
+ "sql-manual/sql-functions/numeric-functions/positive",
+ "sql-manual/sql-functions/numeric-functions/negative",
+ "sql-manual/sql-functions/numeric-functions/greatest",
+ "sql-manual/sql-functions/numeric-functions/least",
+ "sql-manual/sql-functions/numeric-functions/random",
+ "sql-manual/sql-functions/numeric-functions/mod",
+ "sql-manual/sql-functions/numeric-functions/running-difference"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Encryption Functions",
+ "items": [
+ "sql-manual/sql-functions/encrypt-digest-functions/aes",
+ "sql-manual/sql-functions/encrypt-digest-functions/md5",
+ "sql-manual/sql-functions/encrypt-digest-functions/md5sum",
+ "sql-manual/sql-functions/encrypt-digest-functions/sm4",
+ "sql-manual/sql-functions/encrypt-digest-functions/sm3",
+ "sql-manual/sql-functions/encrypt-digest-functions/sm3sum",
+ "sql-manual/sql-functions/encrypt-digest-functions/sha",
+ "sql-manual/sql-functions/encrypt-digest-functions/sha2"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Table Functions",
+ "items": [
+ "sql-manual/sql-functions/table-functions/explode-json-array",
+ "sql-manual/sql-functions/table-functions/explode",
+ "sql-manual/sql-functions/table-functions/explode-split",
+ "sql-manual/sql-functions/table-functions/explode-bitmap",
+ "sql-manual/sql-functions/table-functions/numbers",
+ "sql-manual/sql-functions/table-functions/explode-numbers",
+ "sql-manual/sql-functions/table-functions/explode-numbers-outer",
+ "sql-manual/sql-functions/table-functions/s3",
+ "sql-manual/sql-functions/table-functions/hdfs",
+ "sql-manual/sql-functions/table-functions/local",
+ "sql-manual/sql-functions/table-functions/iceberg-meta",
+ "sql-manual/sql-functions/table-functions/backends",
+ "sql-manual/sql-functions/table-functions/frontends",
+ "sql-manual/sql-functions/table-functions/workload-group",
+ "sql-manual/sql-functions/table-functions/catalogs",
+ "sql-manual/sql-functions/table-functions/frontends_disks",
+ "sql-manual/sql-functions/table-functions/queries"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Analytic(Window) Functions",
+ "items": [
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-SUM",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-AVG",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-MAX",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-MIN",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-COUNT",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-RANK",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-DENSE-RANK",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-FIRST-VALUE",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-LAST-VALUE",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-LEAD",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-LAG",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-ROW-NUMBER",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-NTILE",
+ "sql-manual/sql-functions/window-functions/WINDOW-FUNCTION-WINDOW-FUNNEL"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "IP Functions",
+ "items": [
+ "sql-manual/sql-functions/ip-functions/ipv4-num-to-string",
+ "sql-manual/sql-functions/ip-functions/inet-ntoa"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Vector Distance Functions",
+ "items": [
+ "sql-manual/sql-functions/distance-functions/cosine-distance",
+ "sql-manual/sql-functions/distance-functions/inner-product",
+ "sql-manual/sql-functions/distance-functions/l1-distance",
+ "sql-manual/sql-functions/distance-functions/l2-distance"
+ ]
+ },
+ "sql-manual/sql-functions/cast",
+ "sql-manual/sql-functions/digital-masking",
+ "sql-manual/sql-functions/width-bucket"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "SQL Reference",
+ "items": [
+ {
+ "type": "category",
+ "label": "Cluster management",
+ "items": [
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-ADD-FOLLOWER",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-ADD-OBSERVER",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-ADD-BACKEND",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-ADD-BROKER",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-FOLLOWER",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-OBSERVER",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND",
+ "sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BROKER",
+ "sql-manual/sql-reference/Cluster-Management-Statements/CANCEL-ALTER-SYSTEM"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Account Management",
+ "items": [
+ "sql-manual/sql-reference/Account-Management-Statements/CREATE-ROLE",
+ "sql-manual/sql-reference/Account-Management-Statements/CREATE-USER",
+ "sql-manual/sql-reference/Account-Management-Statements/ALTER-USER",
+ "sql-manual/sql-reference/Account-Management-Statements/SET-PASSWORD",
+ "sql-manual/sql-reference/Account-Management-Statements/SET-PROPERTY",
+ "sql-manual/sql-reference/Account-Management-Statements/LDAP",
+ "sql-manual/sql-reference/Account-Management-Statements/GRANT",
+ "sql-manual/sql-reference/Account-Management-Statements/REVOKE",
+ "sql-manual/sql-reference/Account-Management-Statements/DROP-ROLE",
+ "sql-manual/sql-reference/Account-Management-Statements/DROP-USER"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Database Administration",
+ "items": [
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SHOW-CONFIG",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SET-CONFIG",
+ "sql-manual/sql-reference/Database-Administration-Statements/SET-VARIABLE",
+ "sql-manual/sql-reference/Database-Administration-Statements/INSTALL-PLUGIN",
+ "sql-manual/sql-reference/Database-Administration-Statements/UNINSTALL-PLUGIN",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SET-REPLICA-STATUS",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SET-REPLICA-VERSION",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SET-PARTITION-VERSION",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SET-TABLE-STATUS",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SHOW-REPLICA-DISTRIBUTION",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SHOW-REPLICA-STATUS",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-REPAIR-TABLE",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-CANCEL-REPAIR",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-CHECK-TABLET",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-DIAGNOSE-TABLET",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-COPY-TABLET",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-SHOW-TABLET-STORAGE-FORMAT",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-CLEAN-TRASH",
+ "sql-manual/sql-reference/Database-Administration-Statements/RECOVER",
+ "sql-manual/sql-reference/Database-Administration-Statements/KILL",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-REBALANCE-DISK",
+ "sql-manual/sql-reference/Database-Administration-Statements/ADMIN-CANCEL-REBALANCE-DISK"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Data Types",
+ "items": [
+ "sql-manual/sql-reference/Data-Types/BOOLEAN",
+ "sql-manual/sql-reference/Data-Types/TINYINT",
+ "sql-manual/sql-reference/Data-Types/SMALLINT",
+ "sql-manual/sql-reference/Data-Types/INT",
+ "sql-manual/sql-reference/Data-Types/BIGINT",
+ "sql-manual/sql-reference/Data-Types/LARGEINT",
+ "sql-manual/sql-reference/Data-Types/FLOAT",
+ "sql-manual/sql-reference/Data-Types/DOUBLE",
+ "sql-manual/sql-reference/Data-Types/DECIMAL",
+ "sql-manual/sql-reference/Data-Types/DATE",
+ "sql-manual/sql-reference/Data-Types/DATETIME",
+ "sql-manual/sql-reference/Data-Types/CHAR",
+ "sql-manual/sql-reference/Data-Types/VARCHAR",
+ "sql-manual/sql-reference/Data-Types/STRING",
+ "sql-manual/sql-reference/Data-Types/HLL",
+ "sql-manual/sql-reference/Data-Types/BITMAP",
+ "sql-manual/sql-reference/Data-Types/QUANTILE_STATE",
+ "sql-manual/sql-reference/Data-Types/ARRAY",
+ "sql-manual/sql-reference/Data-Types/MAP",
+ "sql-manual/sql-reference/Data-Types/STRUCT",
+ "sql-manual/sql-reference/Data-Types/JSON",
+ "sql-manual/sql-reference/Data-Types/AGG_STATE"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "DDL",
+ "items": [
+ {
+ "type": "category",
+ "label": "Create",
+ "items": [
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-DATABASE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE-LIKE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE-AS-SELECT",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-EXTERNAL-TABLE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-INDEX",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-JOB",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-VIEW",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-MATERIALIZED-VIEW",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-FUNCTION",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-FILE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-POLICY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-ENCRYPT-KEY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-RESOURCE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-WORKLOAD-GROUP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-SQL-BLOCK-RULE"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Alter",
+ "items": [
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-CATALOG",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-DATABASE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-COLUMN",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-PARTITION",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-BITMAP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-ROLLUP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-REPLACE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-PROPERTY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-COMMENT",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/CANCEL-ALTER-TABLE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-VIEW",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-STORAGE-POLICY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-RESOURCE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-COLOCATE-GROUP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-WORKLOAD-GROUP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-SQL-BLOCK-RULE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/PAUSE-JOB",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/RESUME-JOB",
+ "sql-manual/sql-reference/Data-Definition-Statements/Alter/STOP-JOB"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Drop",
+ "items": [
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-CATALOG",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-DATABASE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-TABLE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-INDEX",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-MATERIALIZED-VIEW",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-FUNCTION",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-FILE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-POLICY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-ENCRYPT-KEY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-RESOURCE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-WORKLOAD-GROUP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/DROP-SQL-BLOCK-RULE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Drop/TRUNCATE-TABLE"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Backup and Restore",
+ "items": [
+ "sql-manual/sql-reference/Data-Definition-Statements/Backup-and-Restore/CREATE-REPOSITORY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Backup-and-Restore/DROP-REPOSITORY",
+ "sql-manual/sql-reference/Data-Definition-Statements/Backup-and-Restore/BACKUP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Backup-and-Restore/CANCEL-BACKUP",
+ "sql-manual/sql-reference/Data-Definition-Statements/Backup-and-Restore/RESTORE",
+ "sql-manual/sql-reference/Data-Definition-Statements/Backup-and-Restore/CANCEL-RESTORE"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "DML",
+ "items": [
+ {
+ "type": "category",
+ "label": "Load",
+ "items": [
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/STREAM-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/MULTI-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/BROKER-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/MYSQL-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/CREATE-ROUTINE-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/ALTER-ROUTINE-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/PAUSE-ROUTINE-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/RESUME-ROUTINE-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/STOP-ROUTINE-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/CREATE-SYNC-JOB",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/PAUSE-SYNC-JOB",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/RESUME-SYNC-JOB",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/STOP-SYNC-JOB",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/CANCEL-LOAD",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Load/CLEAN-LABEL"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Manipulation",
+ "items": [
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/INSERT",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/SELECT",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/DELETE",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/UPDATE",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/EXPORT",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/CANCEL-EXPORT",
+ "sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/INSERT-OVERWRITE"
+ ]
+ },
+ "sql-manual/sql-reference/Data-Manipulation-Statements/OUTFILE"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Show",
+ "items": [
+ "sql-manual/sql-reference/Show-Statements/SHOW-ALTER-TABLE-MATERIALIZED-VIEW",
+ "sql-manual/sql-reference/Show-Statements/SHOW-ALTER",
+ "sql-manual/sql-reference/Show-Statements/SHOW-BACKUP",
+ "sql-manual/sql-reference/Show-Statements/SHOW-BACKENDS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-BROKER",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CATALOGS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-TABLE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CHARSET",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-CATALOG",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-DATABASE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-MATERIALIZED-VIEW",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-LOAD",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-REPOSITORY",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-ROUTINE-LOAD",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CREATE-FUNCTION",
+ "sql-manual/sql-reference/Show-Statements/SHOW-COLUMNS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-COLLATION",
+ "sql-manual/sql-reference/Show-Statements/SHOW-DATABASES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-DATA-SKEW",
+ "sql-manual/sql-reference/Show-Statements/SHOW-DATABASE-ID",
+ "sql-manual/sql-reference/Show-Statements/SHOW-DYNAMIC-PARTITION",
+ "sql-manual/sql-reference/Show-Statements/SHOW-DELETE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-DATA",
+ "sql-manual/sql-reference/Show-Statements/SHOW-ENGINES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-EVENTS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-EXPORT",
+ "sql-manual/sql-reference/Show-Statements/SHOW-ENCRYPT-KEY",
+ "sql-manual/sql-reference/Show-Statements/SHOW-FUNCTIONS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TYPECAST",
+ "sql-manual/sql-reference/Show-Statements/SHOW-FILE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-GRANTS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-JOB",
+ "sql-manual/sql-reference/Show-Statements/SHOW-JOB-TASK",
+ "sql-manual/sql-reference/Show-Statements/SHOW-LAST-INSERT",
+ "sql-manual/sql-reference/Show-Statements/SHOW-LOAD-PROFILE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-LOAD-WARNINGS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-INDEX",
+ "sql-manual/sql-reference/Show-Statements/SHOW-MIGRATIONS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-PARTITION-ID",
+ "sql-manual/sql-reference/Show-Statements/SHOW-SNAPSHOT",
+ "sql-manual/sql-reference/Show-Statements/SHOW-SQL-BLOCK-RULE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-ROUTINE-LOAD",
+ "sql-manual/sql-reference/Show-Statements/SHOW-SYNC-JOB",
+ "sql-manual/sql-reference/Show-Statements/SHOW-WHITE-LIST",
+ "sql-manual/sql-reference/Show-Statements/SHOW-WARNING",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TABLET",
+ "sql-manual/sql-reference/Show-Statements/SHOW-VARIABLES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-PLUGINS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-ROLES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-PROCEDURE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-ROUTINE-LOAD-TASK",
+ "sql-manual/sql-reference/Show-Statements/SHOW-PROC",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TABLE-STATUS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-REPOSITORIES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-QUERY-PROFILE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-OPEN-TABLES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TABLETS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-LOAD",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TABLES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-RESOURCES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-WORKLOAD-GROUPS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-PARTITIONS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-FRONTENDS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-FRONTENDS-DISKS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-RESTORE",
+ "sql-manual/sql-reference/Show-Statements/SHOW-PROPERTY",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TRIGGERS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-PROCESSLIST",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TRASH",
+ "sql-manual/sql-reference/Show-Statements/SHOW-VIEW",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TRANSACTION",
+ "sql-manual/sql-reference/Show-Statements/SHOW-STREAM-LOAD",
+ "sql-manual/sql-reference/Show-Statements/SHOW-STATUS",
+ "sql-manual/sql-reference/Show-Statements/SHOW-TABLE-ID",
+ "sql-manual/sql-reference/Show-Statements/SHOW-SMALL-FILES",
+ "sql-manual/sql-reference/Show-Statements/SHOW-POLICY",
+ "sql-manual/sql-reference/Show-Statements/SHOW-CATALOG-RECYCLE-BIN",
+ "sql-manual/sql-reference/Show-Statements/SHOW-QUERY-STATS"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Operators",
+ "items": [
+ "sql-manual/sql-reference/Operators/in"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Utility",
+ "items": [
+ "sql-manual/sql-reference/Utility-Statements/HELP",
+ "sql-manual/sql-reference/Utility-Statements/USE",
+ "sql-manual/sql-reference/Utility-Statements/DESCRIBE",
+ "sql-manual/sql-reference/Utility-Statements/SWITCH",
+ "sql-manual/sql-reference/Utility-Statements/REFRESH",
+ "sql-manual/sql-reference/Utility-Statements/SYNC",
+ "sql-manual/sql-reference/Utility-Statements/CLEAN-QUERY-STATS"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Admin Manual",
+ "items": [
+ {
+ "type": "category",
+ "label": "cluster management",
+ "items": [
+ "admin-manual/cluster-management/upgrade",
+ "admin-manual/cluster-management/elastic-expansion",
+ "admin-manual/cluster-management/load-balancing",
+ "admin-manual/cluster-management/fqdn"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Data Admin",
+ "items": [
+ "admin-manual/data-admin/backup",
+ "admin-manual/data-admin/restore",
+ "admin-manual/data-admin/data-recovery",
+ "admin-manual/data-admin/delete-recover"
+ ]
+ },
+ "admin-manual/sql-interception",
+ "admin-manual/query-profile",
+ "admin-manual/certificate",
+ "admin-manual/fe-certificate",
+ {
+ "type": "category",
+ "label": "Maintenance and Monitor",
+ "items": [
+ {
+ "type": "category",
+ "label": "Monitor Metrics",
+ "items": [
+ "admin-manual/maint-monitor/monitor-metrics/metrics"
+ ]
+ },
+ "admin-manual/maint-monitor/disk-capacity",
+ "admin-manual/maint-monitor/tablet-repair-and-balance",
+ "admin-manual/maint-monitor/be-olap-error-code",
+ "admin-manual/maint-monitor/doris-error-code",
+ "admin-manual/maint-monitor/tablet-meta-tool",
+ "admin-manual/maint-monitor/monitor-alert",
+ "admin-manual/maint-monitor/tablet-local-debug",
+ "admin-manual/maint-monitor/metadata-operation",
+ "admin-manual/maint-monitor/automatic-service-start"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Memory Management",
+ "items": [
+ "admin-manual/maint-monitor/memory-management/memory-tracker",
+ "admin-manual/maint-monitor/memory-management/memory-limit-exceeded-analysis",
+ "admin-manual/maint-monitor/memory-management/be-oom-analysis"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Config",
+ "items": [
+ "admin-manual/config/config-dir",
+ "admin-manual/config/fe-config",
+ "admin-manual/config/be-config",
+ "admin-manual/config/user-property"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "User Privilege and Ldap",
+ "items": [
+ "admin-manual/privilege-ldap/user-privilege",
+ "admin-manual/privilege-ldap/ldap"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "System Table",
+ "items": [
+ "admin-manual/system-table/rowsets"
+ ]
+ },
+ "admin-manual/workload-group",
+ "admin-manual/multi-tenant",
+ {
+ "type": "category",
+ "label": "HTTP API",
+ "items": [
+ {
+ "type": "category",
+ "label": "FE",
+ "items": [
+ "admin-manual/http-actions/fe/config-action",
+ "admin-manual/http-actions/fe/ha-action",
+ "admin-manual/http-actions/fe/hardware-info-action",
+ "admin-manual/http-actions/fe/help-action",
+ "admin-manual/http-actions/fe/log-action",
+ "admin-manual/http-actions/fe/login-action",
+ "admin-manual/http-actions/fe/logout-action",
+ "admin-manual/http-actions/fe/query-profile-action-controller",
+ "admin-manual/http-actions/fe/session-action",
+ "admin-manual/http-actions/fe/system-action",
+ "admin-manual/http-actions/fe/colocate-meta-action",
+ "admin-manual/http-actions/fe/meta-action",
+ "admin-manual/http-actions/fe/cluster-action",
+ "admin-manual/http-actions/fe/node-action",
+ "admin-manual/http-actions/fe/query-profile-action",
+ "admin-manual/http-actions/fe/backends-action",
+ "admin-manual/http-actions/fe/bootstrap-action",
+ "admin-manual/http-actions/fe/cancel-load-action",
+ "admin-manual/http-actions/fe/check-decommission-action",
+ "admin-manual/http-actions/fe/check-storage-type-action",
+ "admin-manual/http-actions/fe/connection-action",
+ "admin-manual/http-actions/fe/extra-basepath-action",
+ "admin-manual/http-actions/fe/fe-version-info-action",
+ "admin-manual/http-actions/fe/get-ddl-stmt-action",
+ "admin-manual/http-actions/fe/get-load-info-action",
+ "admin-manual/http-actions/fe/get-load-state",
+ "admin-manual/http-actions/fe/get-log-file-action",
+ "admin-manual/http-actions/fe/get-small-file",
+ "admin-manual/http-actions/fe/health-action",
+ "admin-manual/http-actions/fe/meta-info-action",
+ "admin-manual/http-actions/fe/meta-replay-state-action",
+ "admin-manual/http-actions/fe/metrics-action",
+ "admin-manual/http-actions/fe/profile-action",
+ "admin-manual/http-actions/fe/query-detail-action",
+ "admin-manual/http-actions/fe/query-schema-action",
+ "admin-manual/http-actions/fe/query-stats-action",
+ "admin-manual/http-actions/fe/row-count-action",
+ "admin-manual/http-actions/fe/set-config-action",
+ "admin-manual/http-actions/fe/show-data-action",
+ "admin-manual/http-actions/fe/show-meta-info-action",
+ "admin-manual/http-actions/fe/show-proc-action",
+ "admin-manual/http-actions/fe/show-runtime-info-action",
+ "admin-manual/http-actions/fe/statement-execution-action",
+ "admin-manual/http-actions/fe/table-query-plan-action",
+ "admin-manual/http-actions/fe/table-row-count-action",
+ "admin-manual/http-actions/fe/table-schema-action",
+ "admin-manual/http-actions/fe/upload-action",
+ "admin-manual/http-actions/fe/import-action",
+ "admin-manual/http-actions/fe/meta-info-action-V2",
+ "admin-manual/http-actions/fe/debug-point-action",
+ "admin-manual/http-actions/fe/statistic-action"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "BE",
+ "items": [
+ "admin-manual/http-actions/be/check-rpc-channel",
+ "admin-manual/http-actions/be/reset-rpc-channel",
+ "admin-manual/http-actions/be/compaction-status",
+ "admin-manual/http-actions/be/compaction-run",
+ "admin-manual/http-actions/be/meta",
+ "admin-manual/http-actions/be/snapshot",
+ "admin-manual/http-actions/be/check-tablet-segment",
+ "admin-manual/http-actions/be/config",
+ "admin-manual/http-actions/be/metrics",
+ "admin-manual/http-actions/be/tablet-distribution",
+ "admin-manual/http-actions/be/tablet-migration",
+ "admin-manual/http-actions/be/tablet-info",
+ "admin-manual/http-actions/be/checksum",
+ "admin-manual/http-actions/be/download",
+ "admin-manual/http-actions/be/pad-rowset",
+ "admin-manual/http-actions/be/version-info",
+ "admin-manual/http-actions/be/health",
+ "admin-manual/http-actions/be/tablet-reload",
+ "admin-manual/http-actions/be/tablet-restore"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "category",
+ "label": "FAQ",
+ "items": [
+ "faq/install-faq",
+ "faq/data-faq",
+ "faq/sql-faq"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Benchmark",
+ "items": [
+ "benchmark/ssb",
+ "benchmark/tpch"
+ ]
+ },
+ {
+ "type": "category",
+ "label": "Release notes",
+ "items": [
+ "releasenotes/release-2.0.2",
+ "releasenotes/release-2.0.1",
+ "releasenotes/release-2.0.0",
+ "releasenotes/release-1.2.7",
+ "releasenotes/release-1.2.6",
+ "releasenotes/release-1.2.5",
+ "releasenotes/release-1.2.4",
+ "releasenotes/release-1.2.3",
+ "releasenotes/release-1.2.2",
+ "releasenotes/release-1.2.1",
+ "releasenotes/release-1.2.0",
+ "releasenotes/release-1.1.5",
+ "releasenotes/release-1.1.4",
+ "releasenotes/release-1.1.3",
+ "releasenotes/release-1.1.2",
+ "releasenotes/release-1.1.1",
+ "releasenotes/release-1.1.0"
+ ]
+ }
+ ]
+}
\ No newline at end of file