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

junma pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git


The following commit(s) were added to refs/heads/main by this push:
     new bbbed35e44f [feat] Add client matrix page (#513)
bbbed35e44f is described below

commit bbbed35e44fab3cbc5f2ef673ce7f104e1908392
Author: Li Li <[email protected]>
AuthorDate: Thu May 4 16:37:38 2023 +0800

    [feat] Add client matrix page (#513)
    
    * matrix page with demo datas
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * run yarn install
    
    Signed-off-by: tison <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    * update
    
    Signed-off-by: Li Li <[email protected]>
    
    ---------
    
    Signed-off-by: Li Li <[email protected]>
    Signed-off-by: tison <[email protected]>
    Co-authored-by: tison <[email protected]>
---
 client-feature-matrix/index.mdx |  29 ++
 data/matrix.js                  | 886 ++++++++++++++++++++++++++++++++++++++++
 docusaurus.config.js            |  10 +
 package.json                    |   1 +
 src/components/Matrix/matrix.js |  29 ++
 src/components/Matrix/util.js   | 123 ++++++
 src/css/custom.css              |  32 +-
 yarn.lock                       |  66 ++-
 8 files changed, 1174 insertions(+), 2 deletions(-)

diff --git a/client-feature-matrix/index.mdx b/client-feature-matrix/index.mdx
new file mode 100644
index 00000000000..c7bd669acd4
--- /dev/null
+++ b/client-feature-matrix/index.mdx
@@ -0,0 +1,29 @@
+---
+id: pulsar-client-feaure-matrix
+title: Pulsar Client Feaure Matrix
+sidebar_label: Pulsar Client Feaure Matrix
+---
+
+import Matrix from "../src/components/Matrix/matrix";
+import {
+  languages,
+  client,
+  producer,
+  reader,
+  consumer,
+  tableview,
+} from "../data/matrix.js";
+
+### Client
+
+<Matrix data={client} name="client" />
+
+### Producer
+
+<Matrix data={producer} name="producer" />
+
+### Consumer
+
+<Matrix data={consumer} name="consumer" />
+
+See details and full version 
[here](https://docs.google.com/spreadsheets/d/1YHYTkIXR8-Ql103u-IMI18TXLlGStK8uJjDsOOA0T20/edit?usp=sharing)
\ No newline at end of file
diff --git a/data/matrix.js b/data/matrix.js
new file mode 100644
index 00000000000..a007b873313
--- /dev/null
+++ b/data/matrix.js
@@ -0,0 +1,886 @@
+module.exports = {
+  languages: [
+    "Java",
+    "C++",
+    "Go",
+    "Python",
+    "Node.js",
+    "C#/DotPulsar",
+    "Websocket",
+    "REST",
+    ".NET (C#/F#/VB)",
+  ],
+  client: [
+    {
+      Feature: "TLS encryption",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Authentication",
+      Children: [
+        {
+          Feature: "JWT",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "mTLS",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Kerberos",
+          Java: 2,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 0,
+        },
+        {
+          Feature: "OAuth2",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Athenz",
+          Java: 2,
+          "C++": 0,
+          Go: 2,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 0,
+        },
+        {
+          Feature: "HTTP Basic",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 0,
+        },
+      ],
+    },
+    {
+      Feature: "Transaction",
+      Java: 2,
+      "C++": 0,
+      Go: 0,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Cluster-level failover",
+      Java: 2,
+      "C++": 0,
+      Go: 0,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 0,
+    },
+    {
+      Feature: "Multi-host service",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Statistics",
+      Java: 2,
+      "C++": 0,
+      Go: 0,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Proxy",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Reconnection",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+  ],
+  producer: [
+    {
+      Feature: "Batching",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 0,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Chunking",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Delayed message delivery",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 0,
+      REST: 2,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Compression",
+      Children: [
+        {
+          Feature: "LZ4",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 2,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "ZLIB",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "ZSTD",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "SNAPPY",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+      ],
+    },
+    {
+      Feature: "Schema",
+      Children: [
+        {
+          Feature: "Primitive",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 2,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Avro",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 2,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "JSON",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 2,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Protobuf",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Protobuf-native",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Native avro",
+          Java: 2,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 0,
+        },
+        {
+          Feature: "KeyValue",
+          Java: 2,
+          "C++": 2,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 2,
+          REST: 2,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Autoschema",
+          Java: 2,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+      ],
+    },
+    {
+      Feature: "Transaction",
+      Java: 2,
+      "C++": 0,
+      Go: 0,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "End-to-end encryption",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Sync | Async Send",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+  ],
+  consumer: [
+    {
+      Feature: "ACK",
+      Children: [
+        {
+          Feature: "Batch-Index ACK",
+          Java: 2,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "ACK Timeout",
+          Java: 2,
+          "C++": 2,
+          Go: 0,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "NACK",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "NACK Backoff",
+          Java: 2,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 0,
+        },
+      ],
+    },
+    {
+      Feature: "Batching",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Chunking",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Seek",
+      Children: [
+        {
+          Feature: "by timestamp",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "by messageID",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 0,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Inclusive/Non-inclusive",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 0,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+      ],
+    },
+    {
+      Feature: "Subscription type",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Subscription mode",
+      Java: 2,
+      "C++": 0,
+      Go: 2,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Retry letter topic",
+      Java: 2,
+      "C++": 0,
+      Go: 2,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Dead letter topic",
+      Java: 2,
+      "C++": 0,
+      Go: 2,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Compression",
+      Children: [
+        {
+          Feature: "LZ4",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 2,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "ZLIB",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "ZSTD",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "SNAPPY",
+          Java: 2,
+          "C++": 2,
+          Go: 0,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+      ],
+    },
+    {
+      Feature: "Compaction",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Schema",
+      Children: [
+        {
+          Feature: "Primitive",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 2,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Avro",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "JSON",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 2,
+          Nodejs: 2,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Protobuf",
+          Java: 2,
+          "C++": 2,
+          Go: 2,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Protobuf-native",
+          Java: 0,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Native avro",
+          Java: 0,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 0,
+        },
+        {
+          Feature: "KeyValue",
+          Java: 2,
+          "C++": 2,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 2,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+        {
+          Feature: "Autoschema",
+          Java: 2,
+          "C++": 0,
+          Go: 0,
+          Python: 0,
+          Nodejs: 0,
+          "C#/DotPulsar": 0,
+          Websocket: 0,
+          REST: 0,
+          "NET(C#/F#/VB)": 2,
+        },
+      ],
+    },
+    {
+      Feature: "End-to-end encryption",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 2,
+      REST: 2,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Transaction",
+      Java: 2,
+      "C++": 0,
+      Go: 0,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+  ],
+  reader: [
+    {
+      Feature: "Batching",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 2,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Chunking",
+      Java: 2,
+      "C++": 0,
+      Go: 2,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Seek",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 1,
+      Nodejs: 1,
+      "C#/DotPulsar": 2,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Compression",
+      Java: 2,
+      "C++": 2,
+      Go: 1,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 1,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Compaction",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 2,
+      "C#/DotPulsar": 2,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+    {
+      Feature: "Schema",
+      Java: 2,
+      "C++": 1,
+      Go: 1,
+      Python: 1,
+      Nodejs: 1,
+      "C#/DotPulsar": 1,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 1,
+    },
+    {
+      Feature: "End-to-end encryption",
+      Java: 2,
+      "C++": 2,
+      Go: 2,
+      Python: 2,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 2,
+    },
+  ],
+  tableview: [
+    {
+      Feature: "Compaction",
+      Java: 2,
+      "C++": 0,
+      Go: 2,
+      Python: 2,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 0,
+    },
+    {
+      Feature: "Schema",
+      Java: 1,
+      "C++": 0,
+      Go: 1,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 1,
+    },
+    {
+      Feature: "Listener",
+      Java: 2,
+      "C++": 0,
+      Go: 2,
+      Python: 0,
+      Nodejs: 0,
+      "C#/DotPulsar": 0,
+      Websocket: 0,
+      REST: 0,
+      "NET(C#/F#/VB)": 0,
+    },
+  ],
+};
diff --git a/docusaurus.config.js b/docusaurus.config.js
index 6072dc7eeb2..c74c1273dcd 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -393,6 +393,16 @@ module.exports = {
                 sidebarPath: false,
             }),
         ],
+        [
+          "content-docs",
+          /** @type {import('@docusaurus/plugin-content-docs').Options} */
+          ({
+            id: "client-feature-matrix",
+            path: "client-feature-matrix",
+            routeBasePath: "client-feature-matrix",
+            sidebarPath: false,
+          }),
+        ],
     ],
     scripts: [
         {src: "/js/sine-waves.min.js", async: true},
diff --git a/package.json b/package.json
index 7346d156081..1247dcf5179 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
     "npm": "^8.1.3",
     "prism-react-renderer": "^1.2.1",
     "react": "^17.0.2",
+    "react-base-table": "^1.13.4",
     "react-dom": "^17.0.2",
     "react-markdown": "^8.0.0",
     "react-md-file": "^2.0.0",
diff --git a/src/components/Matrix/matrix.js b/src/components/Matrix/matrix.js
new file mode 100644
index 00000000000..91d9b9564dc
--- /dev/null
+++ b/src/components/Matrix/matrix.js
@@ -0,0 +1,29 @@
+import React from "react";
+import "react-base-table/styles.css";
+import BaseTable, { AutoResizer } from "react-base-table";
+import { fixedColumns, getHeight, genData, rowRenderer } from "./util.js";
+
+export default function Matrix(props) {
+  const data = props.data;
+  const name = props.name;
+  return (
+    <div className="tailwind">
+      <div className="mb-8" key={name}>
+        <div className={`w-full ${getHeight(name)}`}>
+          <AutoResizer>
+            {({ width, height }) => (
+              <BaseTable
+                fixed
+                width={width}
+                height={height}
+                columns={fixedColumns}
+                data={genData(data)}
+                rowRenderer={rowRenderer}
+              />
+            )}
+          </AutoResizer>
+        </div>
+      </div>
+    </div>
+  );
+}
diff --git a/src/components/Matrix/util.js b/src/components/Matrix/util.js
new file mode 100644
index 00000000000..e41fcbac524
--- /dev/null
+++ b/src/components/Matrix/util.js
@@ -0,0 +1,123 @@
+import React from "react";
+import "react-base-table/styles.css";
+import { Column } from "react-base-table";
+import { languages } from "../../../data/matrix.js";
+const _key = (language) => language.replace(".", "").replace(" ", "");
+export const genColomns = () => {
+  return ["Feature", "Sub"].concat(languages).map((language, index) => {
+    return {
+      key: _key(language),
+      dataKey: _key(language),
+      title: language === "Sub" ? "" : language,
+      width:
+        index === 0
+          ? 180
+          : index === 1
+          ? 150
+          : index === 7
+          ? 120
+          : index === 8
+          ? 90
+          : index === 10
+          ? 126
+          : 74,
+      dataGetter: ({ column, rowData }) => {
+        if (parseInt(rowData[column.dataKey]) === 0) {
+          return "🚫";
+        } else if (parseInt(rowData[column.dataKey]) === 1) {
+          return "✔️";
+        } else if (parseInt(rowData[column.dataKey]) === 2) {
+          return "✅";
+        }
+        return rowData[column.dataKey];
+      },
+      align: index > 1 ? "center" : "left",
+    };
+  });
+};
+
+export const genData = (values) => {
+  const datas = [];
+  values.forEach((feature) => {
+    if (feature.Children) {
+      feature.Children.forEach((child, index) => {
+        const data = {
+          id: feature.Feature + "-" + child.Feature,
+          Feature: index > 0 ? "" : feature.Feature,
+          Sub: child.Feature,
+          rowSpan: () => (index > 0 ? 1 : feature.Children.length),
+          isLast: index === feature.Children.length - 1,
+        };
+        languages.forEach((language) => {
+          if (language === "Feature") {
+            data["Sub"] = child["Feature"];
+          } else {
+            data[_key(language)] = child[_key(language)];
+          }
+        });
+        datas.push(data);
+      });
+    } else {
+      const data = {
+        id: feature.Feature,
+        Feature: feature.Feature,
+        Sub: "",
+        rowSpan: () => 1,
+      };
+      languages.forEach((language) => {
+        data[_key(language)] = feature[_key(language)];
+      });
+      datas.push(data);
+    }
+  });
+  return datas;
+};
+
+export const genCount = (values) => {
+  let count = 1;
+  values.forEach((feature) => {
+    if (feature.Children) {
+      count = count + feature.Children.length;
+    } else {
+      count = count + 1;
+    }
+  });
+  return count;
+};
+
+export const getHeight = (name) => {
+  if (name === "client") return "h-[700px]";
+  if (name === "producer") return "h-[950px]";
+  // if (name === 'consumer') return "h-[1450px]";
+  if (name === "consumer") return "h-[950px]";
+  if (name === "reader") return "h-[400px]";
+  if (name === "tableview") return "h-[200px]";
+  return "h-[700px]";
+};
+
+const columns = genColomns();
+
+export const fixedColumns = columns.map((column, columnIndex) => {
+  let frozen;
+  if (columnIndex < 2) frozen = Column.FrozenDirection.LEFT;
+  if (columnIndex === 0) {
+    return { ...column, frozen, rowSpan: ({ rowData }) => rowData.rowSpan() };
+  }
+  return { ...column, frozen };
+});
+
+export const rowRenderer = ({ rowData, rowIndex, cells, columns }) => {
+  const rowSpan = columns[0].rowSpan({ rowData, rowIndex });
+  if (rowData.Sub.length > 0 && !rowData.isLast) {
+    const cell = cells[0];
+    const style = {
+      ...cell.props.style,
+      height: rowSpan * 50,
+      alignSelf: "flex-start",
+      zIndex: 1,
+      borderBottom: "0px",
+    };
+    cells[0] = React.cloneElement(cell, { style });
+  }
+  return cells;
+};
diff --git a/src/css/custom.css b/src/css/custom.css
index 37fe6d2a1f5..765be722933 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -1267,7 +1267,7 @@ div[role="tabpanel"] {
   padding: var(--ifm-alert-padding-vertical) 
var(--ifm-alert-padding-horizontal);
 }
 
-.tabs-container>.margin-top--md {
+.tabs-container > .margin-top--md {
   margin-top: 0 !important;
 }
 
@@ -1280,3 +1280,33 @@ table th,
 table td {
   border: none;
 }
+
+.BaseTable {
+  background-color: transparent !important;
+}
+
+.BaseTable__table {
+  background-color: transparent !important;
+}
+
+.BaseTable__table-main {
+  outline: 1px solid rgb(209 213 219) !important;
+}
+
+.BaseTable__row {
+  background-color: transparent !important;
+  border-bottom: 0px solid rgb(209 213 219) !important;
+}
+
+.BaseTable__header {
+  background-color: transparent !important;
+}
+
+.BaseTable__header-row {
+  background-color: transparent !important;
+  border-bottom: 1px solid rgb(209 213 219) !important;
+}
+
+.BaseTable__row-cell {
+  border-bottom: 1px solid rgb(209 213 219);
+}
diff --git a/yarn.lock b/yarn.lock
index da91eb0c8ad..ac37470dede 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1577,6 +1577,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/runtime@npm:^7.0.0":
+  version: 7.21.0
+  resolution: "@babel/runtime@npm:7.21.0"
+  dependencies:
+    regenerator-runtime: ^0.13.11
+  checksum: 
7b33e25bfa9e0e1b9e8828bb61b2d32bdd46b41b07ba7cb43319ad08efc6fda8eb89445193e67d6541814627df0ca59122c0ea795e412b99c5183a0540d338ab
+  languageName: node
+  linkType: hard
+
 "@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.2, 
@babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, 
@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.9, 
@babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, 
@babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, 
@babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, 
@babel/runtime@npm:^7.8.7":
   version: 7.20.7
   resolution: "@babel/runtime@npm:7.20.7"
@@ -4930,6 +4939,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"classnames@npm:^2.2.5":
+  version: 2.3.2
+  resolution: "classnames@npm:2.3.2"
+  checksum: 
2c62199789618d95545c872787137262e741f9db13328e216b093eea91c85ef2bfb152c1f9e63027204e2559a006a92eb74147d46c800a9f96297ae1d9f96f4e
+  languageName: node
+  linkType: hard
+
 "clean-css@npm:^5.2.2, clean-css@npm:^5.3.0":
   version: 5.3.1
   resolution: "clean-css@npm:5.3.1"
@@ -8837,6 +8853,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"memoize-one@npm:>=3.1.1 <6, memoize-one@npm:^5.0.0":
+  version: 5.2.1
+  resolution: "memoize-one@npm:5.2.1"
+  checksum: 
a3cba7b824ebcf24cdfcd234aa7f86f3ad6394b8d9be4c96ff756dafb8b51c7f71320785fbc2304f1af48a0467cbbd2a409efc9333025700ed523f254cb52e3d
+  languageName: node
+  linkType: hard
+
 "merge-descriptors@npm:1.0.1":
   version: 1.0.1
   resolution: "merge-descriptors@npm:1.0.1"
@@ -11268,7 +11291,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"prop-types@npm:^15.0.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, 
prop-types@npm:^15.8.1":
+"prop-types@npm:^15.0.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.0, 
prop-types@npm:^15.7.2, prop-types@npm:^15.8.1":
   version: 15.8.1
   resolution: "prop-types@npm:15.8.1"
   dependencies:
@@ -11435,6 +11458,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"react-base-table@npm:^1.13.4":
+  version: 1.13.4
+  resolution: "react-base-table@npm:1.13.4"
+  dependencies:
+    "@babel/runtime": ^7.0.0
+    classnames: ^2.2.5
+    memoize-one: ^5.0.0
+    prop-types: ^15.7.0
+    react-virtualized-auto-sizer: ^1.0.2
+    react-window: ^1.8.2
+  peerDependencies:
+    react: ^16.0.0 || ^17.0.0
+    react-dom: ^16.0.0 || ^17.0.0
+  checksum: 
bda8eda540847d5e3cb13a0e13120edcfdf54473b552f0470fec73c34845ca646149d8165ed5e6e336c1e7694a01288540cc173581abd26ea9cda99affa99169
+  languageName: node
+  linkType: hard
+
 "react-base16-styling@npm:^0.6.0":
   version: 0.6.0
   resolution: "react-base16-styling@npm:0.6.0"
@@ -11710,6 +11750,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"react-virtualized-auto-sizer@npm:^1.0.2":
+  version: 1.0.15
+  resolution: "react-virtualized-auto-sizer@npm:1.0.15"
+  peerDependencies:
+    react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc
+    react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc
+  checksum: 
db6716fff307dcd2b2492ee0539d5fe2922ea067f91a69969aed6ac03f46db105e993e0a9f946e74b1fb3b9caf88ce5629bf1132e3a995457f42b559979d6708
+  languageName: node
+  linkType: hard
+
+"react-window@npm:^1.8.2":
+  version: 1.8.9
+  resolution: "react-window@npm:1.8.9"
+  dependencies:
+    "@babel/runtime": ^7.0.0
+    memoize-one: ">=3.1.1 <6"
+  peerDependencies:
+    react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+    react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+  checksum: 
cefa232f4f37269d292529ef15780fb108123d6bb5beee19eeac657e75cf8d4664be66f2da04baf0cb1bc64c5ab3d83a88199c3358f023b78940acd37b0673b2
+  languageName: node
+  linkType: hard
+
 "react@npm:^16.6.0":
   version: 16.14.0
   resolution: "react@npm:16.14.0"
@@ -14226,6 +14289,7 @@ __metadata:
     postcss-preset-env: ^7.1.0
     prism-react-renderer: ^1.2.1
     react: ^17.0.2
+    react-base-table: ^1.13.4
     react-dom: ^17.0.2
     react-markdown: ^8.0.0
     react-md-file: ^2.0.0

Reply via email to