From 1a9c4948db15817ca3e29bbd7d3f31239166c908 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:21:43 +0900 Subject: [PATCH 01/50] Hide table of contents --- docs/index.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.mdx b/docs/index.mdx index 353c8014..b6dab738 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -5,6 +5,7 @@ tags: - Enterprise Premium displayed_sidebar: docsEnglish image: img/scalardb-social-card-preview.png +hide_table_of_contents: true --- # ScalarDB From baa52b5648d0203d87e160da91196a6a6e36566a Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:22:01 +0900 Subject: [PATCH 02/50] Add `react-lite-youtube-embed` --- package-lock.json | 13 ++++++++++++- package.json | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 42ccd2ce..93435b1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,8 @@ "prism-react-renderer": "^2.3.0", "react": "^18.0.0", "react-cookie-consent": "9.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-lite-youtube-embed": "^2.4.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.7.0", @@ -16892,6 +16893,16 @@ "react": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-lite-youtube-embed": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-lite-youtube-embed/-/react-lite-youtube-embed-2.5.1.tgz", + "integrity": "sha512-qH/0RumywPtzSx5SmWX/cUGvB3mSB7zMx3VrDe1UwyCEQ0SX785xnjRAodEel1pu3A3EhZyzSjwmLpfcaUN6KQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=18.2.0", + "react-dom": ">=18.2.0" + } + }, "node_modules/react-loadable": { "name": "@docusaurus/react-loadable", "version": "6.0.0", diff --git a/package.json b/package.json index a233b381..54446a62 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "react": "^18.0.0", "react-cookie-consent": "9.0.0", "react-dom": "^18.0.0", + "react-lite-youtube-embed": "^2.4.0", "@typebot.io/react": "0.3.47" }, "devDependencies": { From 3d9853a7b2ecc74133539cc02b1c5c92cd5024ad Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:22:53 +0900 Subject: [PATCH 03/50] Add additional styles for home page contents --- src/css/custom.css | 94 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/src/css/custom.css b/src/css/custom.css index a72ea3fe..c27a5656 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -81,6 +81,100 @@ div[class^='announcementBar'] { text-decoration: none; } +.grid-container { + display: flex; + flex-direction: column; + gap: 2rem; + margin: 2rem 0; +} + +.hero-section { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + gap: 2rem; +} + +.hero-text { + flex: 1; + min-width: 250px; +} + +.youtube-embed { + padding: 0 3rem 0 0; + flex: 1; + min-width: 600px; + aspect-ratio: 16 / 9; +} + +.new-docs-table { + font-weight: 600; + margin-top: 2rem; +} + +.new-docs-row { + align-items: center; + display: flex; + flex-wrap: wrap; + margin-bottom: 0.5rem; + padding: 0.4rem; +} + +.new-docs-cell { + color: var(--ifm-font-color-base); + padding: 0.5rem 0; + text-align: center; + + &:hover { + color: var(--ifm-font-color-base) !important; + } +} + +.link { + background-color: #f0f0f0; + border-radius: 5px; + color: var(--ifm-color-primary); + margin: 0 5px; + padding: 10px; + text-decoration: none; +} + +.category-table { + display: grid; + grid-template-columns: 0.4fr 1fr 1fr 1fr; + gap: 0; + margin-top: 1rem; + width: 100%; +} + +.category-row { + border: 1px 0 solid var(--ifm-color-emphasis-200); + display: contents; +} + +.category-label { + color: var(--ifm-font-color-base); + font-weight: 600; + padding: 1.5rem 0; + text-align: left; + vertical-align: middle; + width: 130px; +} + +.category-cell { + background-color: var(--ifm-color-emphasis-200); + color: var(--ifm-font-color-base); + font-weight: 500; + outline: 1px 0 solid var(--ifm-color-emphasis-200); + padding: 1.5rem 2rem; + text-align: left; + vertical-align: middle; + + &:hover { + color: var(--ifm-font-color-base) !important; + } +} + /* GitHub icon */ .header-github-link::before { From 762fb1c00755820bb3070491ff9661494dc0848e Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:26:12 +0900 Subject: [PATCH 04/50] Refactor home page components --- docs/index.mdx | 32 +-- src/components/Cards/3.15.tsx | 372 +++++++--------------------------- 2 files changed, 73 insertions(+), 331 deletions(-) diff --git a/docs/index.mdx b/docs/index.mdx index b6dab738..794f236a 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -10,34 +10,6 @@ hide_table_of_contents: true # ScalarDB -import { CardRowAbout, CardRowQuickstart, CardRowDevelop, CardRowDeploy, CardRowMigrate, CardRowManage, CardRowReference } from '/src/components/Cards/3.15'; +import CategoryGrid from '/src/components/Cards/3.15'; -ScalarDB is a cross-database HTAP engine. It achieves ACID transactions and real-time analytics across diverse databases to simplify the complexity of managing multiple databases. - -**About ScalarDB** - - - -**Quickstart** - - - -**Develop** - - - -**Deploy** - - - -**Migrate** - - - -**Manage** - - - -**Troubleshoot & Reference** - - + diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 59e5ba9d..0bab4aa3 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -11,335 +11,105 @@ import React from 'react'; import clsx from 'clsx'; import Translate from '@docusaurus/Translate'; import Link from '@docusaurus/Link'; +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -const CardsAbout = [ +const categories = [ { - // name: '', - // image: '.png', - url: { - page: 'overview', - }, - description: ( - - Overview - - ), + name: 'About', + links: ['/about', '/about/team', '/about/contact'], + labels: ['Doc 1', 'Doc 2', 'Doc 3'], }, { - // name: '', - // image: '.png', - url: { - page: 'requirements', - }, - description: ( - - Requirements - - ), - }, -] - -const CardsQuickstart = [ - { - // name: '', - // image: '.png', - url: { - page: 'getting-started-with-scalardb', - }, - description: ( - - Getting started with ScalarDB - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-cluster/getting-started-with-scalardb-cluster', - }, - description: ( - - Getting started with ScalarDB Cluster - - ), - }, -] - -const CardsSamples = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-samples/multi-storage-transaction-sample', - }, - description: ( - - Run a sample application with multi-storage transaction support - - ), + name: 'Quickstart', + links: ['/quickstart', '/quickstart/tutorials', '/quickstart/examples'], + labels: ['Doc 1', 'Doc 2', 'Doc 3'], }, { - // name: '', - // image: '.png', - url: { - page: 'scalardb-samples/microservice-transaction-sample', - }, - description: ( - - Run a sample application that supports microservice transactions - - ), + name: 'Develop', + links: ['/develop', '/develop/example1', '/develop/example2'], + labels: ['Doc 1', 'Doc 2', 'Doc 3'], }, -] - -const CardsDevelop = [ { - // name: '', - // image: '.png', - url: { - page: 'add-scalardb-to-your-build', - }, - description: ( - - Add ScalarDB to your build - - ), + name: 'Deploy', + links: ['/deploy', '/deploy/tutorials', '/deploy/examples'], + labels: ['Doc 1', 'Doc 2', 'Doc 3'], }, { - // name: '', - // image: '.png', - url: { - page: 'schema-loader', - }, - description: ( - - ScalarDB Schema Loader - - ), + name: 'Migrate', + links: ['/migrate', '/migrate/tutorials', '/migrate/examples'], + labels: ['Doc 1', 'Doc 2', 'Doc 3'], }, -] - -const CardsDeploy = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ProductionChecklistForScalarDBCluster', - }, - description: ( - - See the ScalarDB Cluster production checklist - - ), + name: 'Manage', + links: ['/manage', '/manage/tutorials', '/manage/examples'], + labels: ['Doc 1', 'Doc 2', 'Doc 3'], }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', - }, - description: ( - - Deploy ScalarDB Cluster on Amazon EKS - - ), + name: 'Integrate', + links: ['/integrate', '/integrate/api', '/integrate/sdks'], + labels: ['Doc 1', 'Doc 2', 'Doc 3'], }, -] - -const CardsMigrate = [ - { - // name: '', - // image: '.png', - url: { - page: 'schema-loader-import', - }, - description: ( - - Import Existing Tables by Using ScalarDB Schema Loader - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-sql/migration-guide', - }, - description: ( - - Migrate Your Applications and Databases - - ), - }, -] +]; -const CardsManage = [ +const new_docs = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/K8sMonitorGuide', - }, - description: ( - - Monitor ScalarDB in a Kubernetes cluster - - ), + links: ['/about'], + labels: ['Doc 1'], }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/BackupNoSQL', - }, - description: ( - - Back up a NoSQL database in a Kubernetes environment - - ), + links: ['/quickstart'], + labels: ['Doc 1'], }, -] - -const CardsReference = [ { - // name: '', - // image: '.png', - url: { - page: 'scalardb-core-status-codes', - }, - description: ( - - ScalarDB Core Error Codes - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-licensing', - }, - description: ( - - How to Configure a Product License Key - - ), + links: ['/develop'], + labels: ['Doc 1'], }, ]; -interface Props { - // name: string; - // image: string; - url: { - page?: string; - }; - description: JSX.Element; -} - -function Card({ /* name, image,*/ url, description }: Props) { +const CategoryGrid = () => { return ( -
-
-
- {/* - } - */} +
+ {/* Hero Section */} +
+
+ ScalarDB is a universal HTAP engine. It achieves ACID transactions and real-time analytics across diverse databases to simplify the complexity of managing multiple databases. + {/* New Docs */} +
New Docs
+ + {new_docs.map((doc, i) => ( + +
+ {doc.links.map((link, j) => ( + + {doc.labels[j]} + + ))} +
+ ))} + +
+
+
- -
- {/*

{name}

*/} -

{description}

-
- - {/*
-
- - Read more - -
-
*/}
-
- ); -} -export function CardRowAbout(): JSX.Element { - return ( -
- {CardsAbout.map((special) => ( - - ))} -
- ); -} - -export function CardRowQuickstart(): JSX.Element { - return ( -
- {CardsQuickstart.map((special) => ( - - ))} -
- ); -} - -export function CardRowSamples(): JSX.Element { - return ( -
- {CardsSamples.map((special) => ( - - ))} -
- ); -} - -export function CardRowDevelop(): JSX.Element { - return ( -
- {CardsDevelop.map((special) => ( - - ))} -
- ); -} - -export function CardRowDeploy(): JSX.Element { - return ( -
- {CardsDeploy.map((special) => ( - - ))} -
- ); -} - -export function CardRowMigrate(): JSX.Element { - return ( -
- {CardsMigrate.map((special) => ( - - ))} -
- ); -} - -export function CardRowManage(): JSX.Element { - return ( -
- {CardsManage.map((special) => ( - - ))} + {/* Category Table */} +
+ {categories.map((cat, i) => ( + +
{cat.name}
+ {cat.links.map((link, j) => ( + + {cat.labels[j]} + + ))} +
+ ))} +
); -} +}; -export function CardRowReference(): JSX.Element { - return ( -
- {CardsReference.map((special) => ( - - ))} -
- ); -} +export default CategoryGrid; \ No newline at end of file From 0cd1307bb95359136d0cd68abf74627e20699441 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 10 Jun 2025 15:03:36 +0900 Subject: [PATCH 05/50] Adjust links of version home page (iteration 1) --- src/components/Cards/3.15.tsx | 59 +++++++++++++++++------------------ src/css/custom.css | 14 ++++++++- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 0bab4aa3..55eb9175 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -17,54 +17,49 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; const categories = [ { - name: 'About', - links: ['/about', '/about/team', '/about/contact'], - labels: ['Doc 1', 'Doc 2', 'Doc 3'], + name: 'About ScalarDB', + links: ['overview', 'design', 'requirements'], + labels: ['Overview', 'Design', 'Requirements'], }, { name: 'Quickstart', - links: ['/quickstart', '/quickstart/tutorials', '/quickstart/examples'], - labels: ['Doc 1', 'Doc 2', 'Doc 3'], + links: ['getting-started-with-scalardb', 'scalardb-cluster/getting-started-with-scalardb-cluster', 'scalardb-samples/scalardb-analytics-spark-sample'], + labels: ['Getting Started with ScalarDB', 'Getting Started with ScalarDB Cluster', 'Getting Started with ScalarDB Analytics'], }, { name: 'Develop', - links: ['/develop', '/develop/example1', '/develop/example2'], - labels: ['Doc 1', 'Doc 2', 'Doc 3'], + links: ['data-modeling', 'configurations', 'scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster'], + labels: ['Model Your Data', 'Run Transactions Through ScalarDB Cluster', 'Run Non-Transactional Storage Operations Through ScalarDB Cluster'], }, { name: 'Deploy', - links: ['/deploy', '/deploy/tutorials', '/deploy/examples'], - labels: ['Doc 1', 'Doc 2', 'Doc 3'], + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart', 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', 'scalardb-analytics/deployment'], + labels: ['Deploy ScalarDB Cluster Locally', 'Deploy ScalarDB Cluster on Amazon Elastic Kubernetes Service (EKS)', 'Deploy ScalarDB Analytics in Public Cloud Environments'], }, { name: 'Migrate', - links: ['/migrate', '/migrate/tutorials', '/migrate/examples'], - labels: ['Doc 1', 'Doc 2', 'Doc 3'], + links: ['scalardb-sql/migration-guide', 'scalardb-sql/migration-guide', ''], + labels: ['Importing Existing Tables to ScalarDB by Using ScalarDB Schema Loader', 'Migrate Your Applications and Databases into a ScalarDB-Based Environment', ''], }, { name: 'Manage', - links: ['/manage', '/manage/tutorials', '/manage/examples'], - labels: ['Doc 1', 'Doc 2', 'Doc 3'], - }, - { - name: 'Integrate', - links: ['/integrate', '/integrate/api', '/integrate/sdks'], - labels: ['Doc 1', 'Doc 2', 'Doc 3'], + links: ['scalar-kubernetes/HowToScaleScalarDB', 'scalar-kubernetes/HowToUpgradeScalarDB', 'backup-restore'], + labels: ['Scale ScalarDB', 'Upgrade ScalarDB', 'Back Up and Restore Databases Used Through ScalarDB'], }, ]; const new_docs = [ - { - links: ['/about'], - labels: ['Doc 1'], +{ + links: ['features'], + labels: ['ScalarDB Features'], }, { - links: ['/quickstart'], - labels: ['Doc 1'], + links: ['scalardb-cluster/authorize-with-abac'], + labels: ['Control User Access in a Fine-Grained Manner'], }, { - links: ['/develop'], - labels: ['Doc 1'], + links: ['scalardb-cluster/getting-started-with-vector-search'], + labels: ['Getting Started with ScalarDB Cluster for Vector Search'], }, ]; @@ -81,11 +76,15 @@ const CategoryGrid = () => { {new_docs.map((doc, i) => (
- {doc.links.map((link, j) => ( - - {doc.labels[j]} - - ))} +
    +
  • + {doc.links.map((link, j) => ( + + {doc.labels[j]} + + ))} +
  • +
))} diff --git a/src/css/custom.css b/src/css/custom.css index 5708a5a8..e650be24 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -130,6 +130,18 @@ div[class^='announcementBar'] { } } +.new-docs-row ul, +.new-docs-cell ul { + list-style-type: disc; + padding-left: 1.5rem; + margin: 0; +} + +.new-docs-row li, +.new-docs-cell li { + margin-bottom: 0.3rem; +} + .link { background-color: #f0f0f0; border-radius: 5px; @@ -141,7 +153,7 @@ div[class^='announcementBar'] { .category-table { display: grid; - grid-template-columns: 0.4fr 1fr 1fr 1fr; + grid-template-columns: 0.5fr 1fr 1fr 1fr; gap: 0; margin-top: 1rem; width: 100%; From 7be04a64bfb3e8fc2edcf63d0622e6781f81d4e1 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 10 Jun 2025 17:25:37 +0900 Subject: [PATCH 06/50] Remove page title Remove title since it stands out awkwardly --- docs/index.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/index.mdx b/docs/index.mdx index 794f236a..8924cb93 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -6,10 +6,9 @@ tags: displayed_sidebar: docsEnglish image: img/scalardb-social-card-preview.png hide_table_of_contents: true +title: "" --- -# ScalarDB - import CategoryGrid from '/src/components/Cards/3.15'; From 3baf81d7cf04276f21f75835b35cea76c436d56f Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 10 Jun 2025 17:25:11 +0900 Subject: [PATCH 07/50] Adjust links/layout for version home page (iteration 2) --- src/components/Cards/3.15.tsx | 64 ++++++++++++++++------------------- src/css/custom.css | 61 ++++++++++----------------------- 2 files changed, 48 insertions(+), 77 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 55eb9175..9193ed86 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -15,6 +15,14 @@ import LiteYouTubeEmbed from 'react-lite-youtube-embed'; import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +const new_docs = [ + { + name: 'New docs', + links: ['features', 'scalardb-cluster/getting-started-with-vector-search', 'scalardb-cluster/authorize-with-abac'], + labels: ['ScalarDB Features', 'Getting Started with ScalarDB Cluster for Vector Search', 'Control User Access in a Fine-Grained Manner'], + }, +]; + const categories = [ { name: 'About ScalarDB', @@ -48,54 +56,42 @@ const categories = [ }, ]; -const new_docs = [ -{ - links: ['features'], - labels: ['ScalarDB Features'], - }, - { - links: ['scalardb-cluster/authorize-with-abac'], - labels: ['Control User Access in a Fine-Grained Manner'], - }, - { - links: ['scalardb-cluster/getting-started-with-vector-search'], - labels: ['Getting Started with ScalarDB Cluster for Vector Search'], - }, -]; - const CategoryGrid = () => { return (
- {/* Hero Section */} + {/* Hero section */}
- ScalarDB is a universal HTAP engine. It achieves ACID transactions and real-time analytics across diverse databases to simplify the complexity of managing multiple databases. - {/* New Docs */} -
New Docs
+

ScalarDB is a universal hybrid transaction/analytical processing (HTAP) engine for diverse databases. It runs as middleware on databases and virtually unifies diverse databases by achieving ACID transactions and real-time analytics across them to simplify the complexity of managing multiple databases or multiple instances of a single database.

- {new_docs.map((doc, i) => ( - -
-
    -
  • - {doc.links.map((link, j) => ( - - {doc.labels[j]} - - ))} -
  • -
-
- ))} + +

As a versatile solution, ScalarDB supports a range of databases, including:

+
    +
  • Relational databases that support JDBC, such as MariaDB, Microsoft SQL Server, MySQL, Oracle Database, PostgreSQL, SQLite, and their compatible databases, like Amazon Aurora and YugabyteDB.
  • +
  • NoSQL databases like Amazon DynamoDB, Apache Cassandra, and Azure Cosmos DB.
  • +
+
- {/* Category Table */} + {/* New docs table */}
+ {new_docs.map((new_docs, i) => ( + +
{new_docs.name}
+ {new_docs.links.map((link, j) => ( + + {new_docs.labels[j]} + + ))} +
+ ))} + + {/* Category table */} {categories.map((cat, i) => (
{cat.name}
diff --git a/src/css/custom.css b/src/css/custom.css index e650be24..af3616b4 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -100,46 +100,23 @@ div[class^='announcementBar'] { min-width: 250px; } -.youtube-embed { - padding: 0 3rem 0 0; - flex: 1; - min-width: 600px; - aspect-ratio: 16 / 9; -} - -.new-docs-table { +.hero-text-first-sentence { font-weight: 600; - margin-top: 2rem; } -.new-docs-row { - align-items: center; - display: flex; - flex-wrap: wrap; - margin-bottom: 0.5rem; - padding: 0.4rem; +.hero-text-additional { + display: none; } -.new-docs-cell { - color: var(--ifm-font-color-base); - padding: 0.5rem 0; - text-align: center; - - &:hover { - color: var(--ifm-font-color-base) !important; +@media (min-width: 1440px) { /* Hides the second paragraph in the hero text if the page is too narrow. This reduces awkward spacing issues, mostly on larger screens. */ + .hero-text-additional { + display: block; } } -.new-docs-row ul, -.new-docs-cell ul { - list-style-type: disc; - padding-left: 1.5rem; - margin: 0; -} - -.new-docs-row li, -.new-docs-cell li { - margin-bottom: 0.3rem; +.youtube-embed { + flex: 1; + min-width: 480px; } .link { @@ -154,31 +131,25 @@ div[class^='announcementBar'] { .category-table { display: grid; grid-template-columns: 0.5fr 1fr 1fr 1fr; - gap: 0; + gap: 0.75rem 0; margin-top: 1rem; width: 100%; } -.category-row { - border: 1px 0 solid var(--ifm-color-emphasis-200); - display: contents; -} - .category-label { color: var(--ifm-font-color-base); font-weight: 600; - padding: 1.5rem 0; + padding: 1rem 0; text-align: left; - vertical-align: middle; + vertical-align: top; width: 130px; } -.category-cell { +.category-cell, .new-docs-cell { background-color: var(--ifm-color-emphasis-200); color: var(--ifm-font-color-base); font-weight: 500; - outline: 1px 0 solid var(--ifm-color-emphasis-200); - padding: 1.5rem 2rem; + padding: 1rem 1.5rem; text-align: left; vertical-align: middle; @@ -187,6 +158,10 @@ div[class^='announcementBar'] { } } +.new-docs-icon { + color: #78C740; +} + /* GitHub icon */ .header-github-link::before { From ed8c9ce91cff1a2fdc7ca3d2b8d9b6bc7c204db0 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 10 Jun 2025 18:13:44 +0900 Subject: [PATCH 08/50] Remove semi-bold from version home page links --- src/css/custom.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/css/custom.css b/src/css/custom.css index af3616b4..c981db3c 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -148,7 +148,6 @@ div[class^='announcementBar'] { .category-cell, .new-docs-cell { background-color: var(--ifm-color-emphasis-200); color: var(--ifm-font-color-base); - font-weight: 500; padding: 1rem 1.5rem; text-align: left; vertical-align: middle; From 8b39f4bb46d12d14989ef449f2075f218d333a82 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 10 Jun 2025 20:49:28 +0900 Subject: [PATCH 09/50] Fix FOUC issue with Font Awesome icon for new docs When the page loads, a flash of unstyled content (FOUC) occurs, which makes the Font Awesome icon appear large until the page fully loads. This commit fixes that issue. --- src/components/Cards/3.15.tsx | 15 ++++++++++++++- src/css/custom.css | 6 +++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 9193ed86..6b5fa6b2 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -82,7 +82,20 @@ const CategoryGrid = () => {
{new_docs.map((new_docs, i) => ( -
{new_docs.name}
+
+ { + const iconElement = document.querySelector('.new-docs-icon'); + if (iconElement) { + iconElement.style.visibility = 'visible'; + } + }} + /> + {new_docs.name} +
{new_docs.links.map((link, j) => ( {new_docs.labels[j]} diff --git a/src/css/custom.css b/src/css/custom.css index c981db3c..77ac3ca8 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -158,7 +158,11 @@ div[class^='announcementBar'] { } .new-docs-icon { - color: #78C740; + visibility: hidden; /* Hide icon until font is loaded to eliminate FOUC issue. */ +} + +.new-docs-icon-loaded { + visibility: visible; /* Show icon once font is loaded to eliminate FOUC issue. */ } /* GitHub icon */ From 7c4cf99a4b59e4a4861b787829d1659f580aedcb Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:27:40 +0900 Subject: [PATCH 10/50] Add links to category labels --- src/components/Cards/3.15.tsx | 15 ++++++++++++++- src/css/custom.css | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 6b5fa6b2..9df8ebc4 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -23,6 +23,15 @@ const new_docs = [ }, ]; +const categoryLinks = { + 'About ScalarDB': 'overview', + 'Quickstart': 'quickstart-overview', + 'Develop': 'develop-overview', + 'Deploy': 'deploy-overview', + 'Migrate': 'migrate-overview', + 'Manage': 'manage-overview', +}; + const categories = [ { name: 'About ScalarDB', @@ -107,7 +116,11 @@ const CategoryGrid = () => { {/* Category table */} {categories.map((cat, i) => ( -
{cat.name}
+
+ + {cat.name} + +
{cat.links.map((link, j) => ( {cat.labels[j]} diff --git a/src/css/custom.css b/src/css/custom.css index 77ac3ca8..cdc22ee9 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -145,6 +145,16 @@ div[class^='announcementBar'] { width: 130px; } +.category-label-link { + color: var(--ifm-font-color-base); + text-decoration: none; +} + +.category-label-link:hover { + color: var(--ifm-color-primary); + text-decoration: none; +} + .category-cell, .new-docs-cell { background-color: var(--ifm-color-emphasis-200); color: var(--ifm-font-color-base); From 8763ff1705becb073a88035b8907ea536c8bbc56 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 11 Jun 2025 12:53:36 +0900 Subject: [PATCH 11/50] Add home-page-background.avif --- static/img/home-page-background.avif | Bin 0 -> 82537 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/home-page-background.avif diff --git a/static/img/home-page-background.avif b/static/img/home-page-background.avif new file mode 100644 index 0000000000000000000000000000000000000000..a148b7c53a48b8c9ec8511549f9654ffcfa12f63 GIT binary patch literal 82537 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 literal 0 HcmV?d00001 From 3adc6071b49d6066a54e3ac51c0035bfd1c086e4 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 11 Jun 2025 12:55:26 +0900 Subject: [PATCH 12/50] Add background image to hero section --- src/css/custom.css | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/css/custom.css b/src/css/custom.css index cdc22ee9..bed1582d 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -89,10 +89,29 @@ div[class^='announcementBar'] { } .hero-section { + background-repeat: no-repeat; display: flex; - justify-content: space-between; flex-wrap: wrap; gap: 2rem; + justify-content: space-between; + padding: 1rem; + position: relative; + z-index: 1; +} + +.hero-section::before { + background-image: url("/img/home-page-background.avif"); + background-repeat: no-repeat; + background-size: cover; + content: ""; + opacity: 0.25; + padding-top: 2em; + position: absolute; + z-index: -1; + top: 0; + left: 0; + right: 0; + bottom: 0; } .hero-text { From 940e082fce30ecbce9c34135364c1208c3e19715 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:07:57 +0900 Subject: [PATCH 13/50] Revise `.new-docs-icon` style --- src/css/custom.css | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index bed1582d..0fbe19dc 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -186,12 +186,10 @@ div[class^='announcementBar'] { } } -.new-docs-icon { - visibility: hidden; /* Hide icon until font is loaded to eliminate FOUC issue. */ } -.new-docs-icon-loaded { - visibility: visible; /* Show icon once font is loaded to eliminate FOUC issue. */ +.new-docs-icon { + color: #78C740; } /* GitHub icon */ From 887e709ed70071288d8a803552d268d728e745e4 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:09:21 +0900 Subject: [PATCH 14/50] Change Font Awesome icon implementation method --- src/components/Cards/3.15.tsx | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 9df8ebc4..468c410d 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -14,6 +14,7 @@ import Link from '@docusaurus/Link'; import LiteYouTubeEmbed from 'react-lite-youtube-embed'; import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBook } from '@fortawesome/free-solid-svg-icons'; const new_docs = [ { @@ -92,18 +93,8 @@ const CategoryGrid = () => { {new_docs.map((new_docs, i) => (
- { - const iconElement = document.querySelector('.new-docs-icon'); - if (iconElement) { - iconElement.style.visibility = 'visible'; - } - }} - /> - {new_docs.name} + +  {new_docs.name}
{new_docs.links.map((link, j) => ( From b7c0bf4e5d29db71b19dee1626e8c311913b8eb1 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:19:53 +0900 Subject: [PATCH 15/50] Revert "Add links to category labels" This reverts commit 7c4cf99a4b59e4a4861b787829d1659f580aedcb. --- src/components/Cards/3.15.tsx | 15 +-------------- src/css/custom.css | 10 ---------- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 468c410d..3aa0283e 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -24,15 +24,6 @@ const new_docs = [ }, ]; -const categoryLinks = { - 'About ScalarDB': 'overview', - 'Quickstart': 'quickstart-overview', - 'Develop': 'develop-overview', - 'Deploy': 'deploy-overview', - 'Migrate': 'migrate-overview', - 'Manage': 'manage-overview', -}; - const categories = [ { name: 'About ScalarDB', @@ -107,11 +98,7 @@ const CategoryGrid = () => { {/* Category table */} {categories.map((cat, i) => ( -
- - {cat.name} - -
+
{cat.name}
{cat.links.map((link, j) => ( {cat.labels[j]} diff --git a/src/css/custom.css b/src/css/custom.css index 0fbe19dc..febc5b84 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -164,16 +164,6 @@ div[class^='announcementBar'] { width: 130px; } -.category-label-link { - color: var(--ifm-font-color-base); - text-decoration: none; -} - -.category-label-link:hover { - color: var(--ifm-color-primary); - text-decoration: none; -} - .category-cell, .new-docs-cell { background-color: var(--ifm-color-emphasis-200); color: var(--ifm-font-color-base); From 048668cc329c5f312e36ec5b6af3c82fc01256ab Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:33:12 +0900 Subject: [PATCH 16/50] Add support for multiple links per cell --- src/components/Cards/3.15.tsx | 198 +++++++++++++++++++++++++++++----- src/css/custom.css | 62 ++++++++++- 2 files changed, 234 insertions(+), 26 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 3aa0283e..44ec615b 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -19,41 +19,158 @@ import { faBook } from '@fortawesome/free-solid-svg-icons'; const new_docs = [ { name: 'New docs', - links: ['features', 'scalardb-cluster/getting-started-with-vector-search', 'scalardb-cluster/authorize-with-abac'], - labels: ['ScalarDB Features', 'Getting Started with ScalarDB Cluster for Vector Search', 'Control User Access in a Fine-Grained Manner'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['features', ''], + labels: ['ScalarDB Features', ''] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/getting-started-with-vector-search', ''], + labels: ['Getting Started with ScalarDB Cluster for Vector Search', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/authorize-with-abac', ''], + labels: ['Control User Access in a Fine-Grained Manner', ''] + } + ], }, ]; const categories = [ { name: 'About ScalarDB', - links: ['overview', 'design', 'requirements'], - labels: ['Overview', 'Design', 'Requirements'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['overview', ''], + labels: ['Overview', ''] + }, + { + cell: 1, // Second cell + links: ['design', ''], + labels: ['Design', ''] + }, + { + cell: 2, // Third cell + links: ['requirements', ''], + labels: ['Requirements', ''] + } + ], + links: ['', '', ''], + labels: ['', '', ''], }, { name: 'Quickstart', - links: ['getting-started-with-scalardb', 'scalardb-cluster/getting-started-with-scalardb-cluster', 'scalardb-samples/scalardb-analytics-spark-sample'], - labels: ['Getting Started with ScalarDB', 'Getting Started with ScalarDB Cluster', 'Getting Started with ScalarDB Analytics'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['quickstart-overview', 'getting-started-with-scalardb'], + labels: ['Overview', 'Getting Started with ScalarDB'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/getting-started-with-scalardb-cluster', ''], + labels: ['Getting Started with ScalarDB Cluster', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-samples/scalardb-analytics-spark-sample', ''], + labels: ['Getting Started with ScalarDB Analytics', ''] + } + ], + links: ['', '', ''], + labels: ['', '', ''], }, { name: 'Develop', - links: ['data-modeling', 'configurations', 'scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster'], - labels: ['Model Your Data', 'Run Transactions Through ScalarDB Cluster', 'Run Non-Transactional Storage Operations Through ScalarDB Cluster'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['develop-overview', 'data-modeling'], + labels: ['Overview', 'Model Your Data'] + }, + { + cell: 1, // Second cell + links: ['configurations', 'scalardb-cluster/configurations'], + labels: ['ScalarDB Core Configurations', 'ScalarDB Cluster Configurations'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster', ''], + labels: ['Run Non-Transactional Storage Operations Through ScalarDB Cluster', ''] + } + ], + links: ['', '', ''], + labels: ['', '', ''], }, { name: 'Deploy', - links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart', 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', 'scalardb-analytics/deployment'], - labels: ['Deploy ScalarDB Cluster Locally', 'Deploy ScalarDB Cluster on Amazon Elastic Kubernetes Service (EKS)', 'Deploy ScalarDB Analytics in Public Cloud Environments'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['deploy-overview', 'scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['Overview', 'Deploy ScalarDB Cluster Locally'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', ''], + labels: ['Deploy ScalarDB Cluster on Amazon EKS', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-analytics/deployment', ''], + labels: ['Deploy ScalarDB Analytics in Public Cloud Environments', ''] + } + ], + links: ['', '', ''], + labels: ['', '', ''], }, { name: 'Migrate', - links: ['scalardb-sql/migration-guide', 'scalardb-sql/migration-guide', ''], - labels: ['Importing Existing Tables to ScalarDB by Using ScalarDB Schema Loader', 'Migrate Your Applications and Databases into a ScalarDB-Based Environment', ''], + categoryLinks: [ + { + cell: 0, // First cell + links: ['migrate-overview', ''], + labels: ['Overview', ''] + }, + { + cell: 1, // Second cell + links: ['scalardb-sql/migration-guide', ''], + labels: ['Importing Tables by Using ScalarDB Schema Loader', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-sql/migration-guide', ''], + labels: ['Migrate Applications and Databases', ''] + } + ], + links: ['', '', ''], + labels: ['', '', ''], }, { name: 'Manage', - links: ['scalar-kubernetes/HowToScaleScalarDB', 'scalar-kubernetes/HowToUpgradeScalarDB', 'backup-restore'], - labels: ['Scale ScalarDB', 'Upgrade ScalarDB', 'Back Up and Restore Databases Used Through ScalarDB'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['manage-overview', 'backup-restore'], + labels: ['Overview', 'Back Up and Restore Databases Used Through ScalarDB'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/HowToScaleScalarDB', ''], + labels: ['Scale ScalarDB', ''] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/HowToUpgradeScalarDB', ''], + labels: ['Upgrade ScalarDB', ''] + } + ], + links: ['', '', ''], + labels: ['', '', ''], }, ]; @@ -81,16 +198,26 @@ const CategoryGrid = () => { {/* New docs table */}
- {new_docs.map((new_docs, i) => ( + {new_docs.map((doc, i) => (
-  {new_docs.name} +  {doc.name}
- {new_docs.links.map((link, j) => ( - - {new_docs.labels[j]} - + {doc.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
))}
))} @@ -99,11 +226,32 @@ const CategoryGrid = () => { {categories.map((cat, i) => (
{cat.name}
- {cat.links.map((link, j) => ( - - {cat.labels[j]} - - ))} + {cat.links.map((link, j) => { + // Check if this cell has multiple links defined in the categoryLinks property + const categoryLinkCell = cat.categoryLinks && cat.categoryLinks.find(item => item.cell === j); + + if (categoryLinkCell) { + return ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + + {categoryLinkCell.labels[k]} + + ))} +
+ ); + } else if (link) { + // Regular single link cell + return ( + + {cat.labels[j]} + + ); + } else { + // Empty cell + return
; + } + })}
))}
diff --git a/src/css/custom.css b/src/css/custom.css index febc5b84..95a04146 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -158,7 +158,7 @@ div[class^='announcementBar'] { .category-label { color: var(--ifm-font-color-base); font-weight: 600; - padding: 1rem 0; + padding: 11px 0; text-align: left; vertical-align: top; width: 130px; @@ -176,6 +176,66 @@ div[class^='announcementBar'] { } } +.category-cell-multiple-links { + background-color: var(--ifm-color-emphasis-200); + display: flex; + flex-direction: column; + padding: 0; + height: 100%; + grid-column: span 1; +} + +.category-cell-link { + color: var(--ifm-font-color-base); + display: block; + padding: 0.75rem 1.5rem; + text-decoration: none; + + &:last-child { + border-bottom: none; + } + + &:hover { + background-color: var(--ifm-color-emphasis-300); + color: var(--ifm-color-primary); + text-decoration: none; + } +} + +.empty-cell { + background-color: var(--ifm-color-emphasis-200); + height: 100%; +} + +@media (max-width: 768px) { /* Responsive design for mobile screens. */ + .category-table { + display: flex; + flex-direction: column; + gap: 0.5rem; + } + + .category-label { + width: 100%; + padding: 0.75rem 0 0.25rem 0; + border-top: 1px solid var(--ifm-color-emphasis-300); + margin-top: 0.5rem; + } + + .category-cell, .new-docs-cell { + width: 100%; + margin-bottom: 0.5rem; + } + + .multi-link-cell { + width: 100%; + margin-bottom: 0.5rem; + padding: 0.75rem 1.5rem; + } + + .cell-with-links { + width: 100%; + margin-bottom: 0.5rem; + } } .new-docs-icon { From 398d94875c7dab81a6bbb90c5bec29ee95ffd192 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:33:12 +0900 Subject: [PATCH 17/50] Add support for multiple links per cell Cells should automatically know when a cell contains one link or multiple links and apply the necessary styles based on logic. --- src/components/Cards/3.15.tsx | 177 +++++++++++++++++++++++++++++----- src/css/custom.css | 89 ++++++++++++++++- 2 files changed, 238 insertions(+), 28 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 3aa0283e..a1d2fa76 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -19,42 +19,147 @@ import { faBook } from '@fortawesome/free-solid-svg-icons'; const new_docs = [ { name: 'New docs', - links: ['features', 'scalardb-cluster/getting-started-with-vector-search', 'scalardb-cluster/authorize-with-abac'], - labels: ['ScalarDB Features', 'Getting Started with ScalarDB Cluster for Vector Search', 'Control User Access in a Fine-Grained Manner'], - }, + categoryLinks: [ + { + cell: 0, // First cell + links: ['features', ''], + labels: ['ScalarDB Features', ''] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/getting-started-with-vector-search', ''], + labels: ['Getting Started with ScalarDB Cluster for Vector Search', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/authorize-with-abac', ''], + labels: ['Control User Access in a Fine-Grained Manner', ''] + } + ] + } ]; const categories = [ { name: 'About ScalarDB', - links: ['overview', 'design', 'requirements'], - labels: ['Overview', 'Design', 'Requirements'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['overview', ''], + labels: ['Overview', ''] + }, + { + cell: 1, // Second cell + links: ['design', ''], + labels: ['Design', ''] + }, + { + cell: 2, // Third cell + links: ['requirements', ''], + labels: ['Requirements', ''] + } + ] }, { name: 'Quickstart', - links: ['getting-started-with-scalardb', 'scalardb-cluster/getting-started-with-scalardb-cluster', 'scalardb-samples/scalardb-analytics-spark-sample'], - labels: ['Getting Started with ScalarDB', 'Getting Started with ScalarDB Cluster', 'Getting Started with ScalarDB Analytics'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['quickstart-overview', 'getting-started-with-scalardb'], + labels: ['Overview', 'Getting Started with ScalarDB'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/getting-started-with-scalardb-cluster', ''], + labels: ['Getting Started with ScalarDB Cluster', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-samples/scalardb-analytics-spark-sample', ''], + labels: ['Getting Started with ScalarDB Analytics', ''] + } + ] }, { name: 'Develop', - links: ['data-modeling', 'configurations', 'scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster'], - labels: ['Model Your Data', 'Run Transactions Through ScalarDB Cluster', 'Run Non-Transactional Storage Operations Through ScalarDB Cluster'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['develop-overview', 'data-modeling'], + labels: ['Overview', 'Model Your Data'] + }, + { + cell: 1, // Second cell + links: ['configurations', 'scalardb-cluster/configurations'], + labels: ['ScalarDB Core Configurations', 'ScalarDB Cluster Configurations'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster', ''], + labels: ['Run Non-Transactional Storage Operations Through ScalarDB Cluster', ''] + } + ] }, { name: 'Deploy', - links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart', 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', 'scalardb-analytics/deployment'], - labels: ['Deploy ScalarDB Cluster Locally', 'Deploy ScalarDB Cluster on Amazon Elastic Kubernetes Service (EKS)', 'Deploy ScalarDB Analytics in Public Cloud Environments'], + categoryLinks: [ + { + cell: 0, // First cell + links: ['deploy-overview', 'scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['Overview', 'Deploy ScalarDB Cluster Locally'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', ''], + labels: ['Deploy ScalarDB Cluster on Amazon EKS', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-analytics/deployment', ''], + labels: ['Deploy ScalarDB Analytics in Public Cloud Environments', ''] + } + ] }, { name: 'Migrate', - links: ['scalardb-sql/migration-guide', 'scalardb-sql/migration-guide', ''], - labels: ['Importing Existing Tables to ScalarDB by Using ScalarDB Schema Loader', 'Migrate Your Applications and Databases into a ScalarDB-Based Environment', ''], + categoryLinks: [ + { + cell: 0, // First cell + links: ['migrate-overview', ''], + labels: ['Overview', ''] + }, + { + cell: 1, // Second cell + links: ['scalardb-sql/migration-guide', ''], + labels: ['Importing Tables by Using ScalarDB Schema Loader', ''] + }, + { + cell: 2, // Third cell + links: ['scalardb-sql/migration-guide', ''], + labels: ['Migrate Applications and Databases', ''] + } + ] }, { name: 'Manage', - links: ['scalar-kubernetes/HowToScaleScalarDB', 'scalar-kubernetes/HowToUpgradeScalarDB', 'backup-restore'], - labels: ['Scale ScalarDB', 'Upgrade ScalarDB', 'Back Up and Restore Databases Used Through ScalarDB'], - }, + categoryLinks: [ + { + cell: 0, // First cell + links: ['manage-overview', 'backup-restore'], + labels: ['Overview', 'Back Up and Restore Databases Used Through ScalarDB'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/HowToScaleScalarDB', ''], + labels: ['Scale ScalarDB', ''] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/HowToUpgradeScalarDB', ''], + labels: ['Upgrade ScalarDB', ''] + } + ] + } ]; const CategoryGrid = () => { @@ -81,16 +186,26 @@ const CategoryGrid = () => { {/* New docs table */}
- {new_docs.map((new_docs, i) => ( + {new_docs.map((doc, i) => (
-  {new_docs.name} +  {doc.name}
- {new_docs.links.map((link, j) => ( - - {new_docs.labels[j]} - + {doc.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
))}
))} @@ -99,10 +214,20 @@ const CategoryGrid = () => { {categories.map((cat, i) => (
{cat.name}
- {cat.links.map((link, j) => ( - - {cat.labels[j]} - + {cat.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
))}
))} diff --git a/src/css/custom.css b/src/css/custom.css index febc5b84..45425c45 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -158,7 +158,7 @@ div[class^='announcementBar'] { .category-label { color: var(--ifm-font-color-base); font-weight: 600; - padding: 1rem 0; + padding: 11px 0; text-align: left; vertical-align: top; width: 130px; @@ -167,7 +167,6 @@ div[class^='announcementBar'] { .category-cell, .new-docs-cell { background-color: var(--ifm-color-emphasis-200); color: var(--ifm-font-color-base); - padding: 1rem 1.5rem; text-align: left; vertical-align: middle; @@ -176,6 +175,92 @@ div[class^='announcementBar'] { } } +.category-cell-multiple-links { + background-color: var(--ifm-color-emphasis-200); + display: flex; + flex-direction: column; + padding: 0; + height: 100%; + grid-column: span 1; +} + +.category-cell-link { + color: var(--ifm-font-color-base); + display: block; + padding: 0.75rem 1.5rem; + text-decoration: none; + + &:last-child { + border-bottom: none; + } + + &:hover { + color: var(--ifm-color-primary); + text-decoration: underline; + } +} + +.category-cell-link:empty { + pointer-events: none; + background-color: var(--ifm-color-emphasis-200); +} + +.category-cell-link:empty:hover { + background-color: var(--ifm-color-emphasis-200); +} + + +a[href=""], a:not([href]) { /* Add these styles to prevent hover effects on empty links. */ + pointer-events: none; + cursor: default; +} + +a[href=""]:hover, a:not([href]):hover { + background-color: var(--ifm-color-emphasis-200); + color: var(--ifm-font-color-base); +} + +.category-cell-multiple-links:has(> a[href=""]), +.category-cell-multiple-links:has(> span.category-cell) { /* Ensure empty cell containers don't show effects on hover. */ + pointer-events: none; +} + +.empty-cell { + background-color: var(--ifm-color-emphasis-200); + height: 100%; + cursor: default; + pointer-events: none; +} + +@media (max-width: 768px) { /* Responsive design for mobile screens. */ + .category-table { + display: flex; + flex-direction: column; + gap: 0.5rem; + } + + .category-label { + width: 100%; + padding: 0.75rem 0 0.25rem 0; + border-top: 1px solid var(--ifm-color-emphasis-300); + margin-top: 0.5rem; + } + + .category-cell, .new-docs-cell { + width: 100%; + margin-bottom: 0.5rem; + } + + .multi-link-cell { + width: 100%; + margin-bottom: 0.5rem; + padding: 0.75rem 1.5rem; + } + + .cell-with-links { + width: 100%; + margin-bottom: 0.5rem; + } } .new-docs-icon { From 5308d637175fad34d0fd43786927c6d338fc68da Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:45:09 +0900 Subject: [PATCH 18/50] Revise links and add new ones --- src/components/Cards/3.15.tsx | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index a1d2fa76..e3f6325b 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -46,7 +46,7 @@ const categories = [ { cell: 0, // First cell links: ['overview', ''], - labels: ['Overview', ''] + labels: ['ScalarDB Overview', ''] }, { cell: 1, // Second cell @@ -65,18 +65,18 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['quickstart-overview', 'getting-started-with-scalardb'], - labels: ['Overview', 'Getting Started with ScalarDB'] + links: ['quickstart-overview', 'scalardb-samples/scalardb-analytics-spark-sample'], + labels: ['Quickstart Overview', 'Getting Started with ScalarDB Analytics'] }, { cell: 1, // Second cell - links: ['scalardb-cluster/getting-started-with-scalardb-cluster', ''], - labels: ['Getting Started with ScalarDB Cluster', ''] + links: ['scalardb-cluster/getting-started-with-scalardb', ''], + labels: ['Getting Started with ScalarDB', ''] }, { cell: 2, // Third cell - links: ['scalardb-samples/scalardb-analytics-spark-sample', ''], - labels: ['Getting Started with ScalarDB Analytics', ''] + links: ['getting-started-with-scalardb-cluster', ''], + labels: ['Getting Started with ScalarDB Cluster', ''] } ] }, @@ -85,18 +85,18 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['develop-overview', 'data-modeling'], - labels: ['Overview', 'Model Your Data'] + links: ['develop-overview', 'develop-run-transactions-overview'], + labels: ['Develop Overview', 'Run Transactions'] }, { cell: 1, // Second cell - links: ['configurations', 'scalardb-cluster/configurations'], - labels: ['ScalarDB Core Configurations', 'ScalarDB Cluster Configurations'] + links: ['configurations', 'develop-run-non-transactional-operations-overview'], + labels: ['ScalarDB Core Configurations', 'Run Non-Transactional Storage Operations'] }, { cell: 2, // Third cell - links: ['scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster', ''], - labels: ['Run Non-Transactional Storage Operations Through ScalarDB Cluster', ''] + links: ['scalardb-cluster/configurations', 'scalardb-analytics/run-analytical-queries'], + labels: ['ScalarDB Cluster Configurations', 'Run Analytical Queries Through ScalarDB Analytics'] } ] }, @@ -105,18 +105,18 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['deploy-overview', 'scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], - labels: ['Overview', 'Deploy ScalarDB Cluster Locally'] + links: ['deploy-overview', 'scalardb-analytics/deployment'], + labels: ['Deploy Overview', 'Deploy ScalarDB Analytics in Public Cloud Environments'] }, { cell: 1, // Second cell - links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', ''], - labels: ['Deploy ScalarDB Cluster on Amazon EKS', ''] + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart', ''], + labels: ['Deploy ScalarDB Cluster Locally', ''] }, { cell: 2, // Third cell - links: ['scalardb-analytics/deployment', ''], - labels: ['Deploy ScalarDB Analytics in Public Cloud Environments', ''] + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', ''], + labels: ['Deploy ScalarDB Cluster on Amazon EKS', ''] } ] }, @@ -126,7 +126,7 @@ const categories = [ { cell: 0, // First cell links: ['migrate-overview', ''], - labels: ['Overview', ''] + labels: ['Migrate Overview', ''] }, { cell: 1, // Second cell @@ -146,12 +146,12 @@ const categories = [ { cell: 0, // First cell links: ['manage-overview', 'backup-restore'], - labels: ['Overview', 'Back Up and Restore Databases Used Through ScalarDB'] + labels: ['Manage Overview', 'Back Up and Restore Databases Used Through ScalarDB'] }, { cell: 1, // Second cell - links: ['scalar-kubernetes/HowToScaleScalarDB', ''], - labels: ['Scale ScalarDB', ''] + links: ['scalar-kubernetes/HowToScaleScalarDB', 'scalar-manager/overview'], + labels: ['Scale ScalarDB', 'Scalar Manager'] }, { cell: 2, // Third cell From e880d2d54b860d215bfd5847758468cf9bb813b6 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 18:49:44 +0900 Subject: [PATCH 19/50] Reduce opacity of background image in hero section Reduce the opacity of the background image in the hero section of the version home pages. --- src/css/custom.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/css/custom.css b/src/css/custom.css index 45425c45..24dc056a 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -104,7 +104,7 @@ div[class^='announcementBar'] { background-repeat: no-repeat; background-size: cover; content: ""; - opacity: 0.25; + opacity: 0.2; padding-top: 2em; position: absolute; z-index: -1; From 84454930083e98b2eaaf50df894ce0be2d312198 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 18:59:15 +0900 Subject: [PATCH 20/50] Add comments for clarity --- src/components/Cards/3.15.tsx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index e3f6325b..f8eacd6c 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -22,8 +22,8 @@ const new_docs = [ categoryLinks: [ { cell: 0, // First cell - links: ['features', ''], - labels: ['ScalarDB Features', ''] + links: ['features', ''], // To add a link, use the format ['link1', 'link2'] + labels: ['ScalarDB Features', ''] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell @@ -45,8 +45,8 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['overview', ''], - labels: ['ScalarDB Overview', ''] + links: ['overview', ''], // To add a link, use the format ['link1', 'link2'] + labels: ['ScalarDB Overview', ''] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell @@ -65,8 +65,8 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['quickstart-overview', 'scalardb-samples/scalardb-analytics-spark-sample'], - labels: ['Quickstart Overview', 'Getting Started with ScalarDB Analytics'] + links: ['quickstart-overview', 'scalardb-samples/scalardb-analytics-spark-sample'], // To add a link, use the format ['link1', 'link2'] + labels: ['Quickstart Overview', 'Getting Started with ScalarDB Analytics'] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell @@ -85,8 +85,8 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['develop-overview', 'develop-run-transactions-overview'], - labels: ['Develop Overview', 'Run Transactions'] + links: ['develop-overview', 'develop-run-transactions-overview'], // To add a link, use the format ['link1', 'link2'] + labels: ['Develop Overview', 'Run Transactions'] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell @@ -105,8 +105,8 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['deploy-overview', 'scalardb-analytics/deployment'], - labels: ['Deploy Overview', 'Deploy ScalarDB Analytics in Public Cloud Environments'] + links: ['deploy-overview', 'scalardb-analytics/deployment'], // To add a link, use the format ['link1', 'link2'] + labels: ['Deploy Overview', 'Deploy ScalarDB Analytics in Public Cloud Environments'] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell @@ -125,8 +125,8 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['migrate-overview', ''], - labels: ['Migrate Overview', ''] + links: ['migrate-overview', ''], // To add a link, use the format ['link1', 'link2'] + labels: ['Migrate Overview', ''] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell @@ -145,8 +145,8 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['manage-overview', 'backup-restore'], - labels: ['Manage Overview', 'Back Up and Restore Databases Used Through ScalarDB'] + links: ['manage-overview', 'backup-restore'], // To add a link, use the format ['link1', 'link2'] + labels: ['Manage Overview', 'Back Up and Restore Databases Used Through ScalarDB'] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell From 8d616dc5ce7facf8b49ff48c20ae32722f703b91 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:44:54 +0900 Subject: [PATCH 21/50] Remove empty link/title placeholders in arrays Keeping empty link/title placeholders causes links to not work when the site is built. --- src/components/Cards/3.15.tsx | 52 +++++++++++++++++------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index f8eacd6c..a2e88bb0 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -22,18 +22,18 @@ const new_docs = [ categoryLinks: [ { cell: 0, // First cell - links: ['features', ''], // To add a link, use the format ['link1', 'link2'] - labels: ['ScalarDB Features', ''] // To add a label, use the format ['label1', 'label2'] + links: ['features'], // To add a link, use the format ['link1', 'link2'] + labels: ['ScalarDB Features'] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell - links: ['scalardb-cluster/getting-started-with-vector-search', ''], - labels: ['Getting Started with ScalarDB Cluster for Vector Search', ''] + links: ['scalardb-cluster/getting-started-with-vector-search'], + labels: ['Getting Started with ScalarDB Cluster for Vector Search'] }, { cell: 2, // Third cell - links: ['scalardb-cluster/authorize-with-abac', ''], - labels: ['Control User Access in a Fine-Grained Manner', ''] + links: ['scalardb-cluster/authorize-with-abac'], + labels: ['Control User Access in a Fine-Grained Manner'] } ] } @@ -45,18 +45,18 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['overview', ''], // To add a link, use the format ['link1', 'link2'] - labels: ['ScalarDB Overview', ''] // To add a label, use the format ['label1', 'label2'] + links: ['overview'], // To add a link, use the format ['link1', 'link2'] + labels: ['ScalarDB Overview'] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell - links: ['design', ''], - labels: ['Design', ''] + links: ['design'], + labels: ['Design'] }, { cell: 2, // Third cell - links: ['requirements', ''], - labels: ['Requirements', ''] + links: ['requirements'], + labels: ['Requirements'] } ] }, @@ -71,12 +71,12 @@ const categories = [ { cell: 1, // Second cell links: ['scalardb-cluster/getting-started-with-scalardb', ''], - labels: ['Getting Started with ScalarDB', ''] + labels: ['Getting Started with ScalarDB'] }, { cell: 2, // Third cell links: ['getting-started-with-scalardb-cluster', ''], - labels: ['Getting Started with ScalarDB Cluster', ''] + labels: ['Getting Started with ScalarDB Cluster'] } ] }, @@ -110,13 +110,13 @@ const categories = [ }, { cell: 1, // Second cell - links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart', ''], - labels: ['Deploy ScalarDB Cluster Locally', ''] + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['Deploy ScalarDB Cluster Locally'] }, { cell: 2, // Third cell - links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', ''], - labels: ['Deploy ScalarDB Cluster on Amazon EKS', ''] + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS'], + labels: ['Deploy ScalarDB Cluster on Amazon EKS'] } ] }, @@ -125,18 +125,18 @@ const categories = [ categoryLinks: [ { cell: 0, // First cell - links: ['migrate-overview', ''], // To add a link, use the format ['link1', 'link2'] - labels: ['Migrate Overview', ''] // To add a label, use the format ['label1', 'label2'] + links: ['migrate-overview'], // To add a link, use the format ['link1', 'link2'] + labels: ['Migrate Overview'] // To add a label, use the format ['label1', 'label2'] }, { cell: 1, // Second cell - links: ['scalardb-sql/migration-guide', ''], - labels: ['Importing Tables by Using ScalarDB Schema Loader', ''] + links: ['scalardb-sql/migration-guide'], + labels: ['Importing Tables by Using ScalarDB Schema Loader'] }, { cell: 2, // Third cell - links: ['scalardb-sql/migration-guide', ''], - labels: ['Migrate Applications and Databases', ''] + links: ['scalardb-sql/migration-guide'], + labels: ['Migrate Applications and Databases'] } ] }, @@ -155,8 +155,8 @@ const categories = [ }, { cell: 2, // Third cell - links: ['scalar-kubernetes/HowToUpgradeScalarDB', ''], - labels: ['Upgrade ScalarDB', ''] + links: ['scalar-kubernetes/HowToUpgradeScalarDB'], + labels: ['Upgrade ScalarDB'] } ] } From 34d61c7635ff2d3ff54b737fec1f89bbf9d70a97 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:46:48 +0900 Subject: [PATCH 22/50] Fix links --- src/components/Cards/3.15.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index a2e88bb0..32047b33 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -70,12 +70,12 @@ const categories = [ }, { cell: 1, // Second cell - links: ['scalardb-cluster/getting-started-with-scalardb', ''], + links: ['getting-started-with-scalardb'], labels: ['Getting Started with ScalarDB'] }, { cell: 2, // Third cell - links: ['getting-started-with-scalardb-cluster', ''], + links: ['scalardb-cluster/getting-started-with-scalardb-cluster'], labels: ['Getting Started with ScalarDB Cluster'] } ] From d90d3db84b75351da5b34245d3f9c4b3dd9502a4 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:49:56 +0900 Subject: [PATCH 23/50] Remove unused styles --- src/css/custom.css | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index 24dc056a..50111224 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -250,17 +250,6 @@ a[href=""]:hover, a:not([href]):hover { width: 100%; margin-bottom: 0.5rem; } - - .multi-link-cell { - width: 100%; - margin-bottom: 0.5rem; - padding: 0.75rem 1.5rem; - } - - .cell-with-links { - width: 100%; - margin-bottom: 0.5rem; - } } .new-docs-icon { From 5fbb1ac1cf84421de6c8477aef630359c8605516 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:54:10 +0900 Subject: [PATCH 24/50] Adjust table spacing for home page links on mobile --- src/css/custom.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index 50111224..a1a12378 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -236,14 +236,14 @@ a[href=""]:hover, a:not([href]):hover { .category-table { display: flex; flex-direction: column; - gap: 0.5rem; + gap: 0; } .category-label { width: 100%; padding: 0.75rem 0 0.25rem 0; border-top: 1px solid var(--ifm-color-emphasis-300); - margin-top: 0.5rem; + margin-top: 1.25rem; } .category-cell, .new-docs-cell { From 02edff2683729672ac06ac7e515d586ab431b198 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:56:34 +0900 Subject: [PATCH 25/50] Adjust `min-width` for hero section on home page This style shows the second paragraph depending on if the visitor's screen is wide enough to show the content and not make it look disproportionate (basically, the text gets longer but the video stays the same height). --- src/css/custom.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/css/custom.css b/src/css/custom.css index a1a12378..542d8dfa 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -127,7 +127,7 @@ div[class^='announcementBar'] { display: none; } -@media (min-width: 1440px) { /* Hides the second paragraph in the hero text if the page is too narrow. This reduces awkward spacing issues, mostly on larger screens. */ +@media (min-width: 1472px) { /* Hides the second paragraph in the hero text if the page is too narrow. This reduces awkward spacing issues, mostly on larger screens. */ .hero-text-additional { display: block; } From 99939c75cfc93ca21a1ebab9ab42928e60fe275a Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:56:59 +0900 Subject: [PATCH 26/50] Adjust category label spacing on home page --- src/css/custom.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index 542d8dfa..a994a536 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -156,12 +156,12 @@ div[class^='announcementBar'] { } .category-label { + align-content: center; color: var(--ifm-font-color-base); font-weight: 600; - padding: 11px 0; + padding: 11px 11px 11px 0; text-align: left; - vertical-align: top; - width: 130px; + width: 140px; } .category-cell, .new-docs-cell { From 53b583fa01efd67f3afbb55e5170f1f11295b9df Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 13 Jun 2025 17:55:56 +0900 Subject: [PATCH 27/50] Move comments for readability --- src/components/Cards/3.15.tsx | 42 +++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 32047b33..a7bcd4fa 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -20,10 +20,12 @@ const new_docs = [ { name: 'New docs', categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['features'], // To add a link, use the format ['link1', 'link2'] - labels: ['ScalarDB Features'] // To add a label, use the format ['label1', 'label2'] + links: ['features'], + labels: ['ScalarDB Features'] }, { cell: 1, // Second cell @@ -43,10 +45,12 @@ const categories = [ { name: 'About ScalarDB', categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['overview'], // To add a link, use the format ['link1', 'link2'] - labels: ['ScalarDB Overview'] // To add a label, use the format ['label1', 'label2'] + links: ['overview'], + labels: ['ScalarDB Overview'] }, { cell: 1, // Second cell @@ -63,10 +67,12 @@ const categories = [ { name: 'Quickstart', categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['quickstart-overview', 'scalardb-samples/scalardb-analytics-spark-sample'], // To add a link, use the format ['link1', 'link2'] - labels: ['Quickstart Overview', 'Getting Started with ScalarDB Analytics'] // To add a label, use the format ['label1', 'label2'] + links: ['quickstart-overview', 'scalardb-samples/scalardb-analytics-spark-sample'], + labels: ['Quickstart Overview', 'Getting Started with ScalarDB Analytics'] }, { cell: 1, // Second cell @@ -83,10 +89,12 @@ const categories = [ { name: 'Develop', categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['develop-overview', 'develop-run-transactions-overview'], // To add a link, use the format ['link1', 'link2'] - labels: ['Develop Overview', 'Run Transactions'] // To add a label, use the format ['label1', 'label2'] + links: ['develop-overview', 'develop-run-transactions-overview'], + labels: ['Develop Overview', 'Run Transactions'] }, { cell: 1, // Second cell @@ -103,10 +111,12 @@ const categories = [ { name: 'Deploy', categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['deploy-overview', 'scalardb-analytics/deployment'], // To add a link, use the format ['link1', 'link2'] - labels: ['Deploy Overview', 'Deploy ScalarDB Analytics in Public Cloud Environments'] // To add a label, use the format ['label1', 'label2'] + links: ['deploy-overview', 'scalardb-analytics/deployment'], + labels: ['Deploy Overview', 'Deploy ScalarDB Analytics in Public Cloud Environments'] }, { cell: 1, // Second cell @@ -123,10 +133,12 @@ const categories = [ { name: 'Migrate', categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['migrate-overview'], // To add a link, use the format ['link1', 'link2'] - labels: ['Migrate Overview'] // To add a label, use the format ['label1', 'label2'] + links: ['migrate-overview'], + labels: ['Migrate Overview'] }, { cell: 1, // Second cell @@ -143,10 +155,12 @@ const categories = [ { name: 'Manage', categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['manage-overview', 'backup-restore'], // To add a link, use the format ['link1', 'link2'] - labels: ['Manage Overview', 'Back Up and Restore Databases Used Through ScalarDB'] // To add a label, use the format ['label1', 'label2'] + links: ['manage-overview', 'backup-restore'], + labels: ['Manage Overview', 'Back Up and Restore Databases Used Through ScalarDB'] }, { cell: 1, // Second cell From e4a242579a340857da7faf63f18f621e5fa4093a Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 13 Jun 2025 18:26:20 +0900 Subject: [PATCH 28/50] Fix FOUC for new docs icon --- src/css/custom.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/css/custom.css b/src/css/custom.css index a994a536..af4cebf1 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -254,6 +254,13 @@ a[href=""]:hover, a:not([href]):hover { .new-docs-icon { color: #78C740; + /* Fix for FontAwesome icon FOUC. */ + width: 1em !important; + height: 1em !important; + display: inline-block; + vertical-align: middle; + font-size: inherit; + overflow: visible; } /* GitHub icon */ From 845f5f3d34f064c0697addd51e3af28001352816 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:03:24 +0900 Subject: [PATCH 29/50] Remove over-spacing before and after hero section --- src/css/custom.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index af4cebf1..45e49b6a 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -84,8 +84,6 @@ div[class^='announcementBar'] { .grid-container { display: flex; flex-direction: column; - gap: 2rem; - margin: 2rem 0; } .hero-section { From f83a4c3e0795f82eaa02ef44863ff329f0b1346c Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:04:38 +0900 Subject: [PATCH 30/50] Change `new docs` related parts to `new content` The section will contain new docs and docs that have new content, so "content" is more appropriate here. --- src/components/Cards/3.15.tsx | 12 ++++++------ src/css/custom.css | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index a7bcd4fa..a04bba8f 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -16,9 +16,9 @@ import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faBook } from '@fortawesome/free-solid-svg-icons'; -const new_docs = [ +const new_content = [ { - name: 'New docs', + name: 'New content', categoryLinks: [ // To add a link, use the format ['link1', 'link2'] // To add a label, use the format ['label1', 'label2'] @@ -198,12 +198,12 @@ const CategoryGrid = () => {
- {/* New docs table */} + {/* New content table */}
- {new_docs.map((doc, i) => ( + {new_content.map((doc, i) => (
- +  {doc.name}
{doc.categoryLinks.map((categoryLinkCell, j) => ( @@ -214,7 +214,7 @@ const CategoryGrid = () => { {categoryLinkCell.labels[k]} ) : ( - + {categoryLinkCell.labels[k]} ) diff --git a/src/css/custom.css b/src/css/custom.css index 45e49b6a..d77f7f3f 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -162,7 +162,7 @@ div[class^='announcementBar'] { width: 140px; } -.category-cell, .new-docs-cell { +.category-cell, .new-content-cell { background-color: var(--ifm-color-emphasis-200); color: var(--ifm-font-color-base); text-align: left; @@ -244,13 +244,13 @@ a[href=""]:hover, a:not([href]):hover { margin-top: 1.25rem; } - .category-cell, .new-docs-cell { + .category-cell, .new-content-cell { width: 100%; margin-bottom: 0.5rem; } } -.new-docs-icon { +.new-content-icon { color: #78C740; /* Fix for FontAwesome icon FOUC. */ width: 1em !important; From 914e383750941d7d2d3eccc30138d903d135ceba Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:11:54 +0900 Subject: [PATCH 31/50] Add new line at bottom of file --- src/components/Cards/3.15.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index a04bba8f..53e79313 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -250,4 +250,4 @@ const CategoryGrid = () => { ); }; -export default CategoryGrid; \ No newline at end of file +export default CategoryGrid; From 38af76d3eb45f860b9242ef81c4ab3e442d6a10e Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:12:35 +0900 Subject: [PATCH 32/50] Add `youtube-embed` style for mobile Without this style, the embedded YouTube video makes the mobile view horizontally scrollable, which is weird behavior. --- src/css/custom.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/css/custom.css b/src/css/custom.css index d77f7f3f..f4a22938 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -248,6 +248,11 @@ a[href=""]:hover, a:not([href]):hover { width: 100%; margin-bottom: 0.5rem; } + + .youtube-embed { + flex: 1; + min-width: 100%; + } } .new-content-icon { From e83ce88e480958b73a2958df020a784266e819c3 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 13 Jun 2025 19:23:32 +0900 Subject: [PATCH 33/50] Fix horizontal scrolling issue on version homepages --- src/css/custom.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/css/custom.css b/src/css/custom.css index f4a22938..4936adb7 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -29,6 +29,12 @@ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } +/* Fix for horizontal scrolling issue */ +html, body { + overflow-x: hidden; + max-width: 100%; +} + .dropdown-separator { margin: 0.3rem 0; } @@ -81,9 +87,13 @@ div[class^='announcementBar'] { text-decoration: none; } +/* Ensure grid container doesn't cause horizontal scrolling */ .grid-container { display: flex; flex-direction: column; + width: 100%; + max-width: 100vw; + overflow-x: hidden; } .hero-section { From 21fbaaa3e0c90262264032b726a345cfa5362e98 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:54:15 +0900 Subject: [PATCH 34/50] Remove second row of category links for now --- src/components/Cards/3.15.tsx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 53e79313..9c13fb8e 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -71,8 +71,8 @@ const categories = [ // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['quickstart-overview', 'scalardb-samples/scalardb-analytics-spark-sample'], - labels: ['Quickstart Overview', 'Getting Started with ScalarDB Analytics'] + links: ['quickstart-overview'], + labels: ['Quickstart Overview'] }, { cell: 1, // Second cell @@ -93,18 +93,18 @@ const categories = [ // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['develop-overview', 'develop-run-transactions-overview'], - labels: ['Develop Overview', 'Run Transactions'] + links: ['develop-overview'], + labels: ['Develop Overview'] }, { cell: 1, // Second cell - links: ['configurations', 'develop-run-non-transactional-operations-overview'], - labels: ['ScalarDB Core Configurations', 'Run Non-Transactional Storage Operations'] + links: ['develop-run-transactions-overview'], + labels: ['Run Transactions'] }, { cell: 2, // Third cell - links: ['scalardb-cluster/configurations', 'scalardb-analytics/run-analytical-queries'], - labels: ['ScalarDB Cluster Configurations', 'Run Analytical Queries Through ScalarDB Analytics'] + links: ['develop-run-non-transactional-operations-overview'], + labels: ['Run Non-Transactional Storage Operations'] } ] }, @@ -115,8 +115,8 @@ const categories = [ // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['deploy-overview', 'scalardb-analytics/deployment'], - labels: ['Deploy Overview', 'Deploy ScalarDB Analytics in Public Cloud Environments'] + links: ['deploy-overview'], + labels: ['Deploy Overview'] }, { cell: 1, // Second cell @@ -159,13 +159,13 @@ const categories = [ // To add a label, use the format ['label1', 'label2'] { cell: 0, // First cell - links: ['manage-overview', 'backup-restore'], - labels: ['Manage Overview', 'Back Up and Restore Databases Used Through ScalarDB'] + links: ['manage-overview'], + labels: ['Manage Overview'] }, { cell: 1, // Second cell - links: ['scalar-kubernetes/HowToScaleScalarDB', 'scalar-manager/overview'], - labels: ['Scale ScalarDB', 'Scalar Manager'] + links: ['scalar-kubernetes/HowToScaleScalarDB'], + labels: ['Scale ScalarDB'] }, { cell: 2, // Third cell From fda4c05b0f1faf70c768f57de410fcfdd2673894 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:55:55 +0900 Subject: [PATCH 35/50] Change link title --- src/components/Cards/3.15.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 9c13fb8e..90d76dc6 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -143,7 +143,7 @@ const categories = [ { cell: 1, // Second cell links: ['scalardb-sql/migration-guide'], - labels: ['Importing Tables by Using ScalarDB Schema Loader'] + labels: ['Import Tables by Using Schema Loader'] }, { cell: 2, // Third cell From d80919bd7bda77ce6d42f7bddddb6eb59f38e7ff Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:56:05 +0900 Subject: [PATCH 36/50] Revise layout and design Revise layout and design according to feedback at https://scalar-labs.slack.com/archives/CDSFWGSTZ/p1750044409557389?thread_ts=1750041895.129159&cid=CDSFWGSTZ. --- src/components/Cards/3.15.tsx | 17 ++-- src/css/custom.css | 163 +++++++++++++++++++++++----------- 2 files changed, 117 insertions(+), 63 deletions(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 90d76dc6..6601b5c8 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -182,16 +182,8 @@ const CategoryGrid = () => { {/* Hero section */}
-

ScalarDB is a universal hybrid transaction/analytical processing (HTAP) engine for diverse databases. It runs as middleware on databases and virtually unifies diverse databases by achieving ACID transactions and real-time analytics across them to simplify the complexity of managing multiple databases or multiple instances of a single database.

- - -

As a versatile solution, ScalarDB supports a range of databases, including:

- -
    -
  • Relational databases that support JDBC, such as MariaDB, Microsoft SQL Server, MySQL, Oracle Database, PostgreSQL, SQLite, and their compatible databases, like Amazon Aurora and YugabyteDB.
  • -
  • NoSQL databases like Amazon DynamoDB, Apache Cassandra, and Azure Cosmos DB.
  • -
-
+

ScalarDB

+ ScalarDB is a universal hybrid transaction/analytical processing (HTAP) engine for diverse databases. It runs as middleware on databases and virtually unifies diverse databases by achieving ACID transactions and real-time analytics across them to simplify the complexity of managing multiple databases or multiple instances of a single database.
@@ -203,8 +195,9 @@ const CategoryGrid = () => { {new_content.map((doc, i) => (
- -  {doc.name} + {/* +  {doc.name}*/} + {doc.name}
{doc.categoryLinks.map((categoryLinkCell, j) => (
diff --git a/src/css/custom.css b/src/css/custom.css index 4936adb7..26ce5488 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -87,7 +87,23 @@ div[class^='announcementBar'] { text-decoration: none; } -/* Ensure grid container doesn't cause horizontal scrolling */ + +/* Fix for horizontal scrolling issue */ +html, body { + overflow-x: hidden; + max-width: 100%; +} + +/* Ensure all elements stay within their containers */ +* { + box-sizing: border-box; + max-width: 100%; +} + +/* Fix for common elements that might cause overflow */ +table, pre, code, img, iframe { + max-width: 100%; +} .grid-container { display: flex; flex-direction: column; @@ -97,34 +113,27 @@ div[class^='announcementBar'] { } .hero-section { + align-items: center; + background-color: #252526; background-repeat: no-repeat; display: flex; flex-wrap: wrap; - gap: 2rem; + font-size: 0.95rem; justify-content: space-between; - padding: 1rem; position: relative; z-index: 1; } .hero-section::before { - background-image: url("/img/home-page-background.avif"); - background-repeat: no-repeat; - background-size: cover; - content: ""; - opacity: 0.2; - padding-top: 2em; - position: absolute; - z-index: -1; - top: 0; - left: 0; - right: 0; - bottom: 0; + background-color: #252526; } .hero-text { + color: white; flex: 1; min-width: 250px; + padding: 2rem; + /* padding-right: 35rem; */ } .hero-text-first-sentence { @@ -135,6 +144,7 @@ div[class^='announcementBar'] { display: none; } +/* This style might come in handy in the future. */ @media (min-width: 1472px) { /* Hides the second paragraph in the hero text if the page is too narrow. This reduces awkward spacing issues, mostly on larger screens. */ .hero-text-additional { display: block; @@ -142,8 +152,13 @@ div[class^='announcementBar'] { } .youtube-embed { + align-items: center; + background-color: #252526; flex: 1; - min-width: 480px; + justify-content: center; + max-width: 480px; + min-width: 250px; + padding: 2rem; } .link { @@ -157,9 +172,10 @@ div[class^='announcementBar'] { .category-table { display: grid; + font-size: 0.95rem; grid-template-columns: 0.5fr 1fr 1fr 1fr; gap: 0.75rem 0; - margin-top: 1rem; + margin-top: 2.5rem; width: 100%; } @@ -167,36 +183,40 @@ div[class^='announcementBar'] { align-content: center; color: var(--ifm-font-color-base); font-weight: 600; - padding: 11px 11px 11px 0; text-align: left; width: 140px; } -.category-cell, .new-content-cell { - background-color: var(--ifm-color-emphasis-200); - color: var(--ifm-font-color-base); - text-align: left; - vertical-align: middle; - - &:hover { - color: var(--ifm-font-color-base) !important; - } -} - .category-cell-multiple-links { - background-color: var(--ifm-color-emphasis-200); + border-top: 1px solid #E3E8EA; + border-bottom: 1px solid #E3E8EA; + background-color: #F5F8FA; display: flex; flex-direction: column; - padding: 0; - height: 100%; grid-column: span 1; + height: 100%; + justify-content: flex-start; + padding: 0.75rem; +} + +/* Target first cell in each row that follows a category-label. */ +.category-label + .category-cell-multiple-links { + border-left: 1px solid #E3E8EA; +} + +/* Target the third cell in each functional row (within the 4-column grid). */ +.category-cell-multiple-links:nth-child(4n) { + border-right: 1px solid #E3E8EA; } .category-cell-link { color: var(--ifm-font-color-base); - display: block; - padding: 0.75rem 1.5rem; + display: flex; + align-items: center; + padding: 0.75rem 1rem; text-decoration: none; + height: 100%; + box-sizing: border-box; &:last-child { border-bottom: none; @@ -208,24 +228,19 @@ div[class^='announcementBar'] { } } -.category-cell-link:empty { - pointer-events: none; - background-color: var(--ifm-color-emphasis-200); -} - -.category-cell-link:empty:hover { - background-color: var(--ifm-color-emphasis-200); -} - - -a[href=""], a:not([href]) { /* Add these styles to prevent hover effects on empty links. */ - pointer-events: none; - cursor: default; +/* When there's only one link in a cell, make it take full height */ +.category-cell-multiple-links:has(> a.category-cell-link:only-child) { + a.category-cell-link { + flex: 1; + } } -a[href=""]:hover, a:not([href]):hover { - background-color: var(--ifm-color-emphasis-200); - color: var(--ifm-font-color-base); +/* When there are multiple links, distribute them evenly */ +.category-cell-multiple-links:has(> a.category-cell-link ~ a.category-cell-link) { + a.category-cell-link { + flex-basis: 0; + flex-grow: 1; + } } .category-cell-multiple-links:has(> a[href=""]), @@ -234,7 +249,7 @@ a[href=""]:hover, a:not([href]):hover { } .empty-cell { - background-color: var(--ifm-color-emphasis-200); + background-color: #F5F8FA; height: 100%; cursor: default; pointer-events: none; @@ -259,9 +274,26 @@ a[href=""]:hover, a:not([href]):hover { margin-bottom: 0.5rem; } + .category-cell-multiple-links { + border-top: 0; + border-bottom: 0; + padding: 0; + } + + /* Target first cell in each row that follows a category-label. */ + .category-label + .category-cell-multiple-links { + border-left: 0; + } + + /* Target the third cell in each functional row (within the 4-column grid). */ + .category-cell-multiple-links:nth-child(4n) { + border-right: 0; + } + .youtube-embed { flex: 1; min-width: 100%; + padding-top: 0; } } @@ -276,6 +308,35 @@ a[href=""]:hover, a:not([href]):hover { overflow: visible; } +html[data-theme="dark"] .category-cell-multiple-links { + background-color: #252526; + border-top: 1px solid #6a6969; + border-bottom: 1px solid #6a6969; + + @media (max-width: 768px) { + border-top: 0; + border-bottom: 0; + } +} + +/* Target first cell in each row that follows a category-label. */ +html[data-theme="dark"] .category-label + .category-cell-multiple-links { + border-left: 1px solid #6a6969; + + @media (max-width: 768px) { + border-left: 0; + } +} + +/* Target the third cell in each functional row (within the 4-column grid). */ +html[data-theme="dark"] .category-cell-multiple-links:nth-child(4n) { + border-right: 1px solid #6a6969; + + @media (max-width: 768px) { + border-right: 0; + } +} + /* GitHub icon */ .header-github-link::before { From b83db30ecdd0053e4f6e59ea7947eb00487c89d5 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:37:46 +0900 Subject: [PATCH 37/50] Increase hero text font size on home page Change made according to discussion on June 17. --- src/css/custom.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/css/custom.css b/src/css/custom.css index 26ce5488..d7716e99 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -118,7 +118,7 @@ table, pre, code, img, iframe { background-repeat: no-repeat; display: flex; flex-wrap: wrap; - font-size: 0.95rem; + font-size: 13.5pt; justify-content: space-between; position: relative; z-index: 1; From 2712600c1286b411218deef3fb014ad385cb78f5 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:38:21 +0900 Subject: [PATCH 38/50] Make YouTube video on version home page bigger Change made according to discussion on June 17. --- src/css/custom.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index d7716e99..e637ef94 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -156,8 +156,8 @@ table, pre, code, img, iframe { background-color: #252526; flex: 1; justify-content: center; - max-width: 480px; - min-width: 250px; + max-width: 640px; + min-width: 400px; padding: 2rem; } From 0fb2c0a7b7c6ff2f7175d78d01401eac5c31a547 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:46:36 +0900 Subject: [PATCH 39/50] Change hero section background color on version home pages Change made according to discussion on June 17. --- src/css/custom.css | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index e637ef94..e46a2e93 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -114,8 +114,7 @@ table, pre, code, img, iframe { .hero-section { align-items: center; - background-color: #252526; - background-repeat: no-repeat; + background-color: #f3f2f1; display: flex; flex-wrap: wrap; font-size: 13.5pt; @@ -153,7 +152,7 @@ table, pre, code, img, iframe { .youtube-embed { align-items: center; - background-color: #252526; + background-color: #f3f2f1; flex: 1; justify-content: center; max-width: 640px; @@ -190,7 +189,7 @@ table, pre, code, img, iframe { .category-cell-multiple-links { border-top: 1px solid #E3E8EA; border-bottom: 1px solid #E3E8EA; - background-color: #F5F8FA; + background-color: #f3f2f1; display: flex; flex-direction: column; grid-column: span 1; @@ -308,6 +307,10 @@ table, pre, code, img, iframe { overflow: visible; } +html[data-theme="dark"] .hero-section, html[data-theme="dark"] .youtube-embed { + background-color: #252526; +} + html[data-theme="dark"] .category-cell-multiple-links { background-color: #252526; border-top: 1px solid #6a6969; From b7bc956dbb08615a295d175658fcb389a62ec8a3 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:47:05 +0900 Subject: [PATCH 40/50] Change hero text color on version home pages Change made according to discussion on June 17. --- src/css/custom.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/css/custom.css b/src/css/custom.css index e46a2e93..b67019ed 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -128,7 +128,7 @@ table, pre, code, img, iframe { } .hero-text { - color: white; + color: var(--ifm-font-color-base); flex: 1; min-width: 250px; padding: 2rem; From b59bb0970e2dce03f1a8616685d5cfd66c27560b Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:47:14 +0900 Subject: [PATCH 41/50] Remove unnecessary style --- src/css/custom.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index b67019ed..9bb7968a 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -123,10 +123,6 @@ table, pre, code, img, iframe { z-index: 1; } -.hero-section::before { - background-color: #252526; -} - .hero-text { color: var(--ifm-font-color-base); flex: 1; From 0488ae0104d32e1ea5c2170d6e1ab65a4cd19001 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:37:33 +0900 Subject: [PATCH 42/50] Remove background from main hero text, reduce padding in hero section Remove background from hero text and reduce padding around hero section, according to feedback at: https://scalar-labs.slack.com/archives/CDSFWGSTZ/p1750218637894259?thread_ts=1750041895.129159&cid=CDSFWGSTZ Also fix spacing issue around video on mobile after changing the padding mentioned. --- src/css/custom.css | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index 9bb7968a..98fa6234 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -114,7 +114,6 @@ table, pre, code, img, iframe { .hero-section { align-items: center; - background-color: #f3f2f1; display: flex; flex-wrap: wrap; font-size: 13.5pt; @@ -127,7 +126,7 @@ table, pre, code, img, iframe { color: var(--ifm-font-color-base); flex: 1; min-width: 250px; - padding: 2rem; + padding: 0 2rem 0 0; /* padding-right: 35rem; */ } @@ -153,7 +152,7 @@ table, pre, code, img, iframe { justify-content: center; max-width: 640px; min-width: 400px; - padding: 2rem; + padding: 1rem; } .link { @@ -287,8 +286,8 @@ table, pre, code, img, iframe { .youtube-embed { flex: 1; + margin-top: 1rem; min-width: 100%; - padding-top: 0; } } @@ -303,7 +302,7 @@ table, pre, code, img, iframe { overflow: visible; } -html[data-theme="dark"] .hero-section, html[data-theme="dark"] .youtube-embed { +html[data-theme="dark"] .youtube-embed { background-color: #252526; } From 33b4d00e472e4d32ed54eeabe6011264560d8ba2 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 3 Jul 2025 16:58:23 +0900 Subject: [PATCH 43/50] Shrink `category table` font; enlarge `hero-section` font --- src/css/custom.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index 98fa6234..a02c90d2 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -116,7 +116,7 @@ table, pre, code, img, iframe { align-items: center; display: flex; flex-wrap: wrap; - font-size: 13.5pt; + font-size: 1.1rem; justify-content: space-between; position: relative; z-index: 1; @@ -166,7 +166,6 @@ table, pre, code, img, iframe { .category-table { display: grid; - font-size: 0.95rem; grid-template-columns: 0.5fr 1fr 1fr 1fr; gap: 0.75rem 0; margin-top: 2.5rem; From 506352267f8771ee6ee11829c41615be60cd8d34 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 3 Jul 2025 16:59:39 +0900 Subject: [PATCH 44/50] Re-add hidable home page text --- src/components/Cards/3.15.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/Cards/3.15.tsx b/src/components/Cards/3.15.tsx index 6601b5c8..4ae4f883 100644 --- a/src/components/Cards/3.15.tsx +++ b/src/components/Cards/3.15.tsx @@ -183,7 +183,15 @@ const CategoryGrid = () => {

ScalarDB

- ScalarDB is a universal hybrid transaction/analytical processing (HTAP) engine for diverse databases. It runs as middleware on databases and virtually unifies diverse databases by achieving ACID transactions and real-time analytics across them to simplify the complexity of managing multiple databases or multiple instances of a single database. +

ScalarDB is a universal hybrid transaction/analytical processing (HTAP) engine for diverse databases. It runs as middleware on databases and virtually unifies diverse databases by achieving ACID transactions and real-time analytics across them to simplify the complexity of managing multiple databases or multiple instances of a single database.

+ {/* +

As a versatile solution, ScalarDB supports a range of databases, including:

+ +
    +
  • Relational databases that support JDBC, such as MariaDB, Microsoft SQL Server, MySQL, Oracle Database, PostgreSQL, SQLite, and their compatible databases, like Amazon Aurora and YugabyteDB.
  • +
  • NoSQL databases like Amazon DynamoDB, Apache Cassandra, and Azure Cosmos DB.
  • +
+
*/}
From ede57c08d441134b611f53b52d2f83da4055868b Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 3 Jul 2025 17:00:28 +0900 Subject: [PATCH 45/50] Refactor design --- src/components/Cards/3.13.tsx | 490 +++++++++++------------- src/components/Cards/3.14.tsx | 553 ++++++++++++---------------- src/components/Cards/ja-jp/3.13.tsx | 490 +++++++++++------------- src/components/Cards/ja-jp/3.14.tsx | 490 +++++++++++------------- src/components/Cards/ja-jp/3.15.tsx | 490 +++++++++++------------- 5 files changed, 1103 insertions(+), 1410 deletions(-) diff --git a/src/components/Cards/3.13.tsx b/src/components/Cards/3.13.tsx index b271251c..8fcd3549 100644 --- a/src/components/Cards/3.13.tsx +++ b/src/components/Cards/3.13.tsx @@ -11,298 +11,244 @@ import React from 'react'; import clsx from 'clsx'; import Translate from '@docusaurus/Translate'; import Link from '@docusaurus/Link'; +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBook } from '@fortawesome/free-solid-svg-icons'; -const CardsAbout = [ +const new_content = [ { - // name: '', - // image: '.png', - url: { - page: 'overview', - }, - description: ( - - Overview - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'requirements', - }, - description: ( - - Requirements - - ), - }, -] - -const CardsQuickstart = [ - { - // name: '', - // image: '.png', - url: { - page: 'getting-started-with-scalardb', - }, - description: ( - - Getting started with ScalarDB - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-cluster/getting-started-with-scalardb-cluster', - }, - description: ( - - Getting started with ScalarDB Cluster - - ), - }, -] - -const CardsDevelop = [ - { - // name: '', - // image: '.png', - url: { - page: 'add-scalardb-to-your-build', - }, - description: ( - - Add ScalarDB to your build - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'schema-loader', - }, - description: ( - - ScalarDB Schema Loader - - ), - }, -] + name: 'New content', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // Third cell + links: ['api-guide#group-commit-for-the-coordinator-table'], + labels: ['Group commit for the Coordinator table'] + }, + { + cell: 1, // First cell + links: ['run-non-transactional-storage-operations-through-library#configure-scalardb-to-run-non-transactional-storage-operations'], + labels: ['Configure ScalarDB to run non-transactional storage operations'] + }, + { + cell: 2, // Second cell + links: ['scalardb-cluster/run-non-transactional-storage-operations-through-sql-interface/#configure-scalardb-cluster-to-run-non-transactional-storage-operations'], + labels: ['Configure ScalarDB Cluster to run non-transactional storage operations'] + } + ] + } +]; -const CardsDeploy = [ +const categories = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ProductionChecklistForScalarDBCluster', - }, - description: ( - - See the ScalarDB Cluster production checklist - - ), + name: 'About ScalarDB', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['overview'], + labels: ['ScalarDB Overview'] + }, + { + cell: 1, // Second cell + links: ['design'], + labels: ['Design'] + }, + { + cell: 2, // Third cell + links: ['requirements'], + labels: ['Requirements'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', - }, - description: ( - - Deploy ScalarDB Cluster on Amazon EKS - - ), + name: 'Quickstart', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['quickstart-overview'], + labels: ['Quickstart Overview'] + }, + { + cell: 1, // Second cell + links: ['getting-started-with-scalardb'], + labels: ['Getting Started with ScalarDB'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/getting-started-with-scalardb-cluster'], + labels: ['Getting Started with ScalarDB Cluster'] + } + ] }, -] - -const CardsMigrate = [ { - // name: '', - // image: '.png', - url: { - page: 'schema-loader-import', - }, - description: ( - - Import Existing Tables by Using ScalarDB Schema Loader - - ), + name: 'Develop', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['develop-overview'], + labels: ['Develop Overview'] + }, + { + cell: 1, // Second cell + links: ['develop-run-transactions-overview'], + labels: ['Run Transactions'] + }, + { + cell: 2, // Third cell + links: ['XXX'], + labels: ['XXX'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalardb-sql/migration-guide', - }, - description: ( - - Migrate Your Applications and Databases - - ), + name: 'Deploy', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['deploy-overview'], + labels: ['Deploy Overview'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['Deploy ScalarDB Cluster Locally'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS'], + labels: ['Deploy ScalarDB Cluster on Amazon EKS'] + } + ] }, -] - -const CardsManage = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/K8sMonitorGuide', - }, - description: ( - - Monitor ScalarDB in a Kubernetes cluster - - ), + name: 'Migrate', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['migrate-overview'], + labels: ['Migrate Overview'] + }, + { + cell: 1, // Second cell + links: ['scalardb-sql/migration-guide'], + labels: ['Import Tables by Using Schema Loader'] + }, + { + cell: 2, // Third cell + links: ['scalardb-sql/migration-guide'], + labels: ['Migrate Applications and Databases'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/BackupNoSQL', - }, - description: ( - - Back up a NoSQL database in a Kubernetes environment - - ), - }, -] - -const CardsReference = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-core-status-codes', - }, - description: ( - - ScalarDB Core Error Codes - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-licensing', - }, - description: ( - - How to Configure a Product License Key - - ), - }, + name: 'Manage', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['manage-overview'], + labels: ['Manage Overview'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/HowToScaleScalarDB'], + labels: ['Scale ScalarDB'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/HowToUpgradeScalarDB'], + labels: ['Upgrade ScalarDB'] + } + ] + } ]; -interface Props { - // name: string; - // image: string; - url: { - page?: string; - }; - description: JSX.Element; -} - -function Card({ /* name, image,*/ url, description }: Props) { +const CategoryGrid = () => { return ( -
-
-
- {/* - } - */} +
+ {/* Hero section */} +
+
+

ScalarDB

+

ScalarDB is a universal hybrid transaction/analytical processing (HTAP) engine for diverse databases. It runs as middleware on databases and virtually unifies diverse databases by achieving ACID transactions and real-time analytics across them to simplify the complexity of managing multiple databases or multiple instances of a single database.

+ {/* +

As a versatile solution, ScalarDB supports a range of databases, including:

+ +
    +
  • Relational databases that support JDBC, such as MariaDB, Microsoft SQL Server, MySQL, Oracle Database, PostgreSQL, SQLite, and their compatible databases, like Amazon Aurora and YugabyteDB.
  • +
  • NoSQL databases like Amazon DynamoDB, Apache Cassandra, and Azure Cosmos DB.
  • +
+
*/} +
+
+
- -
- {/*

{name}

*/} -

{description}

-
- - {/*
-
- - Read more - -
-
*/}
-
- ); -} -export function CardRowAbout(): JSX.Element { - return ( -
- {CardsAbout.map((special) => ( - - ))} -
- ); -} - -export function CardRowQuickstart(): JSX.Element { - return ( -
- {CardsQuickstart.map((special) => ( - - ))} -
- ); -} - -export function CardRowDevelop(): JSX.Element { - return ( -
- {CardsDevelop.map((special) => ( - - ))} -
- ); -} - -export function CardRowDeploy(): JSX.Element { - return ( -
- {CardsDeploy.map((special) => ( - - ))} -
- ); -} - -export function CardRowMigrate(): JSX.Element { - return ( -
- {CardsMigrate.map((special) => ( - - ))} -
- ); -} - -export function CardRowManage(): JSX.Element { - return ( -
- {CardsManage.map((special) => ( - - ))} + {/* New content table */} +
+ {new_content.map((doc, i) => ( + +
+ {/* +  {doc.name}*/} + {doc.name} +
+ {doc.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} + + {/* Category table */} + {categories.map((cat, i) => ( + +
{cat.name}
+ {cat.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} +
); -} +}; -export function CardRowReference(): JSX.Element { - return ( -
- {CardsReference.map((special) => ( - - ))} -
- ); -} +export default CategoryGrid; diff --git a/src/components/Cards/3.14.tsx b/src/components/Cards/3.14.tsx index 59e5ba9d..be2d15b2 100644 --- a/src/components/Cards/3.14.tsx +++ b/src/components/Cards/3.14.tsx @@ -11,335 +11,244 @@ import React from 'react'; import clsx from 'clsx'; import Translate from '@docusaurus/Translate'; import Link from '@docusaurus/Link'; - -const CardsAbout = [ - { - // name: '', - // image: '.png', - url: { - page: 'overview', - }, - description: ( - - Overview - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'requirements', - }, - description: ( - - Requirements - - ), - }, -] - -const CardsQuickstart = [ - { - // name: '', - // image: '.png', - url: { - page: 'getting-started-with-scalardb', - }, - description: ( - - Getting started with ScalarDB - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-cluster/getting-started-with-scalardb-cluster', - }, - description: ( - - Getting started with ScalarDB Cluster - - ), - }, -] - -const CardsSamples = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-samples/multi-storage-transaction-sample', - }, - description: ( - - Run a sample application with multi-storage transaction support - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-samples/microservice-transaction-sample', - }, - description: ( - - Run a sample application that supports microservice transactions - - ), - }, -] - -const CardsDevelop = [ - { - // name: '', - // image: '.png', - url: { - page: 'add-scalardb-to-your-build', - }, - description: ( - - Add ScalarDB to your build - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'schema-loader', - }, - description: ( - - ScalarDB Schema Loader - - ), - }, -] - -const CardsDeploy = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ProductionChecklistForScalarDBCluster', - }, - description: ( - - See the ScalarDB Cluster production checklist - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', - }, - description: ( - - Deploy ScalarDB Cluster on Amazon EKS - - ), - }, -] - -const CardsMigrate = [ - { - // name: '', - // image: '.png', - url: { - page: 'schema-loader-import', - }, - description: ( - - Import Existing Tables by Using ScalarDB Schema Loader - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-sql/migration-guide', - }, - description: ( - - Migrate Your Applications and Databases - - ), - }, -] - -const CardsManage = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/K8sMonitorGuide', - }, - description: ( - - Monitor ScalarDB in a Kubernetes cluster - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/BackupNoSQL', - }, - description: ( - - Back up a NoSQL database in a Kubernetes environment - - ), - }, -] - -const CardsReference = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-core-status-codes', - }, - description: ( - - ScalarDB Core Error Codes - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-licensing', - }, - description: ( - - How to Configure a Product License Key - - ), - }, +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBook } from '@fortawesome/free-solid-svg-icons'; + +const new_content = [ + { + name: 'New content', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['scalardb-cluster/encrypt-data-at-rest'], + labels: ['Encrypt Data at Rest'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster'], + labels: ['Run Non-Transactional Storage Operations Through ScalarDB Cluster'] + }, + { + cell: 2, // Third cell + links: ['scalardb-samples/scalardb-analytics-spark-sample'], + labels: ['Getting Started with ScalarDB Analytics'] + } + ] + } ]; -interface Props { - // name: string; - // image: string; - url: { - page?: string; - }; - description: JSX.Element; -} +const categories = [ + { + name: 'About ScalarDB', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['overview'], + labels: ['ScalarDB Overview'] + }, + { + cell: 1, // Second cell + links: ['design'], + labels: ['Design'] + }, + { + cell: 2, // Third cell + links: ['requirements'], + labels: ['Requirements'] + } + ] + }, + { + name: 'Quickstart', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['quickstart-overview'], + labels: ['Quickstart Overview'] + }, + { + cell: 1, // Second cell + links: ['getting-started-with-scalardb'], + labels: ['Getting Started with ScalarDB'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/getting-started-with-scalardb-cluster'], + labels: ['Getting Started with ScalarDB Cluster'] + } + ] + }, + { + name: 'Develop', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['develop-overview'], + labels: ['Develop Overview'] + }, + { + cell: 1, // Second cell + links: ['develop-run-transactions-overview'], + labels: ['Run Transactions'] + }, + { + cell: 2, // Third cell + links: ['develop-run-non-transactional-operations-overview'], + labels: ['Run Non-Transactional Storage Operations'] + } + ] + }, + { + name: 'Deploy', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['deploy-overview'], + labels: ['Deploy Overview'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['Deploy ScalarDB Cluster Locally'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS'], + labels: ['Deploy ScalarDB Cluster on Amazon EKS'] + } + ] + }, + { + name: 'Migrate', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['migrate-overview'], + labels: ['Migrate Overview'] + }, + { + cell: 1, // Second cell + links: ['scalardb-sql/migration-guide'], + labels: ['Import Tables by Using Schema Loader'] + }, + { + cell: 2, // Third cell + links: ['scalardb-sql/migration-guide'], + labels: ['Migrate Applications and Databases'] + } + ] + }, + { + name: 'Manage', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['manage-overview'], + labels: ['Manage Overview'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/HowToScaleScalarDB'], + labels: ['Scale ScalarDB'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/HowToUpgradeScalarDB'], + labels: ['Upgrade ScalarDB'] + } + ] + } +]; -function Card({ /* name, image,*/ url, description }: Props) { +const CategoryGrid = () => { return ( -
-
-
- {/* - } - */} +
+ {/* Hero section */} +
+
+

ScalarDB

+

ScalarDB is a universal hybrid transaction/analytical processing (HTAP) engine for diverse databases. It runs as middleware on databases and virtually unifies diverse databases by achieving ACID transactions and real-time analytics across them to simplify the complexity of managing multiple databases or multiple instances of a single database.

+ {/* +

As a versatile solution, ScalarDB supports a range of databases, including:

+ +
    +
  • Relational databases that support JDBC, such as MariaDB, Microsoft SQL Server, MySQL, Oracle Database, PostgreSQL, SQLite, and their compatible databases, like Amazon Aurora and YugabyteDB.
  • +
  • NoSQL databases like Amazon DynamoDB, Apache Cassandra, and Azure Cosmos DB.
  • +
+
*/} +
+
+
- -
- {/*

{name}

*/} -

{description}

-
- - {/*
-
- - Read more - -
-
*/}
-
- ); -} - -export function CardRowAbout(): JSX.Element { - return ( -
- {CardsAbout.map((special) => ( - - ))} -
- ); -} - -export function CardRowQuickstart(): JSX.Element { - return ( -
- {CardsQuickstart.map((special) => ( - - ))} -
- ); -} - -export function CardRowSamples(): JSX.Element { - return ( -
- {CardsSamples.map((special) => ( - - ))} -
- ); -} - -export function CardRowDevelop(): JSX.Element { - return ( -
- {CardsDevelop.map((special) => ( - - ))} -
- ); -} - -export function CardRowDeploy(): JSX.Element { - return ( -
- {CardsDeploy.map((special) => ( - - ))} -
- ); -} -export function CardRowMigrate(): JSX.Element { - return ( -
- {CardsMigrate.map((special) => ( - - ))} -
- ); -} - -export function CardRowManage(): JSX.Element { - return ( -
- {CardsManage.map((special) => ( - - ))} + {/* New content table */} +
+ {new_content.map((doc, i) => ( + +
+ {/* +  {doc.name}*/} + {doc.name} +
+ {doc.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} + + {/* Category table */} + {categories.map((cat, i) => ( + +
{cat.name}
+ {cat.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} +
); -} +}; -export function CardRowReference(): JSX.Element { - return ( -
- {CardsReference.map((special) => ( - - ))} -
- ); -} +export default CategoryGrid; diff --git a/src/components/Cards/ja-jp/3.13.tsx b/src/components/Cards/ja-jp/3.13.tsx index b7ff227f..6552ce32 100644 --- a/src/components/Cards/ja-jp/3.13.tsx +++ b/src/components/Cards/ja-jp/3.13.tsx @@ -11,298 +11,244 @@ import React from 'react'; import clsx from 'clsx'; import Translate from '@docusaurus/Translate'; import Link from '@docusaurus/Link'; +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBook } from '@fortawesome/free-solid-svg-icons'; -const CardsAbout = [ +const new_content = [ { - // name: '', - // image: '.png', - url: { - page: 'overview', - }, - description: ( - - 概要 - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'requirements', - }, - description: ( - - 要件 - - ), - }, -] - -const CardsQuickstart = [ - { - // name: '', - // image: '.png', - url: { - page: 'getting-started-with-scalardb', - }, - description: ( - - ScalarDB をはじめよう - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-cluster/getting-started-with-scalardb-cluster', - }, - description: ( - - ScalarDB Cluster をはじめよう - - ), - }, -] - -const CardsDevelop = [ - { - // name: '', - // image: '.png', - url: { - page: 'add-scalardb-to-your-build', - }, - description: ( - - ビルドに ScalarDB を追加する - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'schema-loader', - }, - description: ( - - ScalarDB Schema Loader - - ), - }, -] + name: '新着コンテンツ', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // Third cell + links: ['api-guide#coordinator-テーブルのグループコミット'], + labels: ['Coordinator テーブルのグループコミット'] + }, + { + cell: 1, // First cell + links: ['run-non-transactional-storage-operations-through-library#configure-scalardb-to-run-non-transactional-storage-operations'], + labels: ['非トランザクショナルストレージ操作を実行するための ScalarDB の設定'] + }, + { + cell: 2, // Second cell + links: ['scalardb-cluster/run-non-transactional-storage-operations-through-sql-interface/#configure-scalardb-cluster-to-run-non-transactional-storage-operations'], + labels: ['非トランザクショナルストレージ操作を実行するための ScalarDB Cluster の設定'] + } + ] + } +]; -const CardsDeploy = [ +const categories = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ProductionChecklistForScalarDBCluster', - }, - description: ( - - ScalarDB Cluster の運用チェックリストを参照する - - ), + name: 'ScalarDB について', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['overview'], + labels: ['ScalarDB の概要'] + }, + { + cell: 1, // Second cell + links: ['design'], + labels: ['デザイン'] + }, + { + cell: 2, // Third cell + links: ['requirements'], + labels: ['要件'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', - }, - description: ( - - Amazon EKS に ScalarDB Cluster をデプロイする - - ), + name: 'クイックスタート', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['quickstart-overview'], + labels: ['クイックスタートの概要'] + }, + { + cell: 1, // Second cell + links: ['getting-started-with-scalardb'], + labels: ['ScalarDB をはじめよう'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/getting-started-with-scalardb-cluster'], + labels: ['ScalarDB Cluster をはじめよう'] + } + ] }, -] - -const CardsMigrate = [ { - // name: '', - // image: '.png', - url: { - page: 'schema-loader-import', - }, - description: ( - - ScalarDB Schema Loader を使用して既存のテーブルをインポートする - - ), + name: '開発', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['develop-overview'], + labels: ['開発の概要'] + }, + { + cell: 1, // Second cell + links: ['develop-run-transactions-overview'], + labels: ['トランザクションの実行の概要'] + }, + { + cell: 2, // Third cell + links: ['develop-run-non-transactional-operations-overview'], + labels: ['非トランザクションストレージ操作を実行'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalardb-sql/migration-guide', - }, - description: ( - - アプリケーションとデータベースの移行 - - ), + name: 'デプロイ', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['deploy-overview'], + labels: ['デプロイの概要'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['ScalarDB Cluster をローカルにデプロイする方法'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS'], + labels: ['Amazon Elastic Kubernetes Service (EKS) に ScalarDB Cluster をデプロイする'] + } + ] }, -] - -const CardsManage = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/K8sMonitorGuide', - }, - description: ( - - Kubernetes クラスター上の Scalar 製品の監視 - - ), + name: '移行', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['migrate-overview'], + labels: ['移行の概要'] + }, + { + cell: 1, // Second cell + links: ['scalardb-sql/migration-guide'], + labels: ['アプリケーションとデータベースを ScalarDB ベースの環境に移行する方法'] + }, + { + cell: 2, // Third cell + links: ['scalardb-sql/migration-guide'], + labels: ['アプリケーションとデータベースを ScalarDB ベースの環境に移行する方法'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/BackupNoSQL', - }, - description: ( - - Kubernetes 環境で NoSQL データベースをバックアップする - - ), - }, -] - -const CardsReference = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-core-status-codes', - }, - description: ( - - ScalarDB Core エラーコード - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-licensing', - }, - description: ( - - 製品ライセンスキーの設定方法 - - ), - }, + name: '管理', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['manage-overview'], + labels: ['管理の概要'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/HowToScaleScalarDB'], + labels: ['ScalarDB をスケーリングする方法'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/HowToUpgradeScalarDB'], + labels: ['ScalarDB のアップグレード方法'] + } + ] + } ]; -interface Props { - // name: string; - // image: string; - url: { - page?: string; - }; - description: JSX.Element; -} - -function Card({ /* name, image,*/ url, description }: Props) { +const CategoryGrid = () => { return ( -
-
-
- {/* - } - */} +
+ {/* Hero section */} +
+
+

ScalarDB

+

ScalarDB は、さまざまなデータベースに対応したユニバーサルなハイブリッドトランザクション/分析処理 (HTAP) エンジンです。データベース上でミドルウェアとして動作し、ACID トランザクションとリアルタイム分析を実現することで、複数のデータベースや複数インスタンスの管理の複雑さを簡素化し、仮想的に統合します。

+ {/* +

多用途なソリューションとして、ScalarDB は以下のような幅広いデータベースをサポートしています:

+ +
    +
  • MariaDB、Microsoft SQL Server、MySQL、Oracle Database、PostgreSQL、SQLite などの JDBC をサポートするリレーショナルデータベース、および Amazon Aurora や YugabyteDB のようなそれらに互換性のあるデータベース。
  • +
  • Amazon DynamoDB、Apache Cassandra、Azure Cosmos DB などの NoSQL データベース。
  • +
+
*/} +
+
+
- -
- {/*

{name}

*/} -

{description}

-
- - {/*
-
- - Read more - -
-
*/}
-
- ); -} -export function CardRowAbout(): JSX.Element { - return ( -
- {CardsAbout.map((special) => ( - - ))} -
- ); -} - -export function CardRowQuickstart(): JSX.Element { - return ( -
- {CardsQuickstart.map((special) => ( - - ))} -
- ); -} - -export function CardRowDevelop(): JSX.Element { - return ( -
- {CardsDevelop.map((special) => ( - - ))} -
- ); -} - -export function CardRowDeploy(): JSX.Element { - return ( -
- {CardsDeploy.map((special) => ( - - ))} -
- ); -} - -export function CardRowMigrate(): JSX.Element { - return ( -
- {CardsMigrate.map((special) => ( - - ))} -
- ); -} - -export function CardRowManage(): JSX.Element { - return ( -
- {CardsManage.map((special) => ( - - ))} + {/* New content table */} +
+ {new_content.map((doc, i) => ( + +
+ {/* +  {doc.name}*/} + {doc.name} +
+ {doc.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} + + {/* Category table */} + {categories.map((cat, i) => ( + +
{cat.name}
+ {cat.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} +
); -} +}; -export function CardRowReference(): JSX.Element { - return ( -
- {CardsReference.map((special) => ( - - ))} -
- ); -} +export default CategoryGrid; diff --git a/src/components/Cards/ja-jp/3.14.tsx b/src/components/Cards/ja-jp/3.14.tsx index b7ff227f..22ac1895 100644 --- a/src/components/Cards/ja-jp/3.14.tsx +++ b/src/components/Cards/ja-jp/3.14.tsx @@ -11,298 +11,244 @@ import React from 'react'; import clsx from 'clsx'; import Translate from '@docusaurus/Translate'; import Link from '@docusaurus/Link'; +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBook } from '@fortawesome/free-solid-svg-icons'; -const CardsAbout = [ +const new_content = [ { - // name: '', - // image: '.png', - url: { - page: 'overview', - }, - description: ( - - 概要 - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'requirements', - }, - description: ( - - 要件 - - ), - }, -] - -const CardsQuickstart = [ - { - // name: '', - // image: '.png', - url: { - page: 'getting-started-with-scalardb', - }, - description: ( - - ScalarDB をはじめよう - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-cluster/getting-started-with-scalardb-cluster', - }, - description: ( - - ScalarDB Cluster をはじめよう - - ), - }, -] - -const CardsDevelop = [ - { - // name: '', - // image: '.png', - url: { - page: 'add-scalardb-to-your-build', - }, - description: ( - - ビルドに ScalarDB を追加する - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'schema-loader', - }, - description: ( - - ScalarDB Schema Loader - - ), - }, -] + name: '新着コンテンツ', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['scalardb-cluster/encrypt-data-at-rest'], + labels: ['保存データの暗号化'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/run-non-transactional-storage-operations-through-scalardb-cluster'], + labels: ['ScalarDB Cluster を通じて非トランザクションストレージ操作を実行する'] + }, + { + cell: 2, // Third cell + links: ['scalardb-samples/scalardb-analytics-spark-sample'], + labels: ['ScalarDB Analytics をはじめよう'] + } + ] + } +]; -const CardsDeploy = [ +const categories = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ProductionChecklistForScalarDBCluster', - }, - description: ( - - ScalarDB Cluster の運用チェックリストを参照する - - ), + name: 'ScalarDB について', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['overview'], + labels: ['ScalarDB の概要'] + }, + { + cell: 1, // Second cell + links: ['design'], + labels: ['デザイン'] + }, + { + cell: 2, // Third cell + links: ['requirements'], + labels: ['要件'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', - }, - description: ( - - Amazon EKS に ScalarDB Cluster をデプロイする - - ), + name: 'クイックスタート', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['quickstart-overview'], + labels: ['クイックスタートの概要'] + }, + { + cell: 1, // Second cell + links: ['getting-started-with-scalardb'], + labels: ['ScalarDB をはじめよう'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/getting-started-with-scalardb-cluster'], + labels: ['ScalarDB Cluster をはじめよう'] + } + ] }, -] - -const CardsMigrate = [ { - // name: '', - // image: '.png', - url: { - page: 'schema-loader-import', - }, - description: ( - - ScalarDB Schema Loader を使用して既存のテーブルをインポートする - - ), + name: '開発', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['develop-overview'], + labels: ['開発の概要'] + }, + { + cell: 1, // Second cell + links: ['develop-run-transactions-overview'], + labels: ['トランザクションの実行の概要'] + }, + { + cell: 2, // Third cell + links: ['develop-run-non-transactional-operations-overview'], + labels: ['非トランザクションストレージ操作を実行'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalardb-sql/migration-guide', - }, - description: ( - - アプリケーションとデータベースの移行 - - ), + name: 'デプロイ', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['deploy-overview'], + labels: ['デプロイの概要'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['ScalarDB Cluster をローカルにデプロイする方法'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS'], + labels: ['Amazon Elastic Kubernetes Service (EKS) に ScalarDB Cluster をデプロイする'] + } + ] }, -] - -const CardsManage = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/K8sMonitorGuide', - }, - description: ( - - Kubernetes クラスター上の Scalar 製品の監視 - - ), + name: '移行', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['migrate-overview'], + labels: ['移行の概要'] + }, + { + cell: 1, // Second cell + links: ['scalardb-sql/migration-guide'], + labels: ['アプリケーションとデータベースを ScalarDB ベースの環境に移行する方法'] + }, + { + cell: 2, // Third cell + links: ['scalardb-sql/migration-guide'], + labels: ['アプリケーションとデータベースを ScalarDB ベースの環境に移行する方法'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/BackupNoSQL', - }, - description: ( - - Kubernetes 環境で NoSQL データベースをバックアップする - - ), - }, -] - -const CardsReference = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-core-status-codes', - }, - description: ( - - ScalarDB Core エラーコード - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-licensing', - }, - description: ( - - 製品ライセンスキーの設定方法 - - ), - }, + name: '管理', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['manage-overview'], + labels: ['管理の概要'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/HowToScaleScalarDB'], + labels: ['ScalarDB をスケーリングする方法'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/HowToUpgradeScalarDB'], + labels: ['ScalarDB のアップグレード方法'] + } + ] + } ]; -interface Props { - // name: string; - // image: string; - url: { - page?: string; - }; - description: JSX.Element; -} - -function Card({ /* name, image,*/ url, description }: Props) { +const CategoryGrid = () => { return ( -
-
-
- {/* - } - */} +
+ {/* Hero section */} +
+
+

ScalarDB

+

ScalarDB は、さまざまなデータベースに対応したユニバーサルなハイブリッドトランザクション/分析処理 (HTAP) エンジンです。データベース上でミドルウェアとして動作し、ACID トランザクションとリアルタイム分析を実現することで、複数のデータベースや複数インスタンスの管理の複雑さを簡素化し、仮想的に統合します。

+ {/* +

多用途なソリューションとして、ScalarDB は以下のような幅広いデータベースをサポートしています:

+ +
    +
  • MariaDB、Microsoft SQL Server、MySQL、Oracle Database、PostgreSQL、SQLite などの JDBC をサポートするリレーショナルデータベース、および Amazon Aurora や YugabyteDB のようなそれらに互換性のあるデータベース。
  • +
  • Amazon DynamoDB、Apache Cassandra、Azure Cosmos DB などの NoSQL データベース。
  • +
+
*/} +
+
+
- -
- {/*

{name}

*/} -

{description}

-
- - {/*
-
- - Read more - -
-
*/}
-
- ); -} -export function CardRowAbout(): JSX.Element { - return ( -
- {CardsAbout.map((special) => ( - - ))} -
- ); -} - -export function CardRowQuickstart(): JSX.Element { - return ( -
- {CardsQuickstart.map((special) => ( - - ))} -
- ); -} - -export function CardRowDevelop(): JSX.Element { - return ( -
- {CardsDevelop.map((special) => ( - - ))} -
- ); -} - -export function CardRowDeploy(): JSX.Element { - return ( -
- {CardsDeploy.map((special) => ( - - ))} -
- ); -} - -export function CardRowMigrate(): JSX.Element { - return ( -
- {CardsMigrate.map((special) => ( - - ))} -
- ); -} - -export function CardRowManage(): JSX.Element { - return ( -
- {CardsManage.map((special) => ( - - ))} + {/* New content table */} +
+ {new_content.map((doc, i) => ( + +
+ {/* +  {doc.name}*/} + {doc.name} +
+ {doc.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} + + {/* Category table */} + {categories.map((cat, i) => ( + +
{cat.name}
+ {cat.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} +
); -} +}; -export function CardRowReference(): JSX.Element { - return ( -
- {CardsReference.map((special) => ( - - ))} -
- ); -} +export default CategoryGrid; diff --git a/src/components/Cards/ja-jp/3.15.tsx b/src/components/Cards/ja-jp/3.15.tsx index b7ff227f..8c1410ca 100644 --- a/src/components/Cards/ja-jp/3.15.tsx +++ b/src/components/Cards/ja-jp/3.15.tsx @@ -11,298 +11,244 @@ import React from 'react'; import clsx from 'clsx'; import Translate from '@docusaurus/Translate'; import Link from '@docusaurus/Link'; +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faBook } from '@fortawesome/free-solid-svg-icons'; -const CardsAbout = [ +const new_content = [ { - // name: '', - // image: '.png', - url: { - page: 'overview', - }, - description: ( - - 概要 - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'requirements', - }, - description: ( - - 要件 - - ), - }, -] - -const CardsQuickstart = [ - { - // name: '', - // image: '.png', - url: { - page: 'getting-started-with-scalardb', - }, - description: ( - - ScalarDB をはじめよう - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-cluster/getting-started-with-scalardb-cluster', - }, - description: ( - - ScalarDB Cluster をはじめよう - - ), - }, -] - -const CardsDevelop = [ - { - // name: '', - // image: '.png', - url: { - page: 'add-scalardb-to-your-build', - }, - description: ( - - ビルドに ScalarDB を追加する - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'schema-loader', - }, - description: ( - - ScalarDB Schema Loader - - ), - }, -] + name: '新着コンテンツ', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['features'], + labels: ['ScalarDB の機能'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/getting-started-with-vector-search'], + labels: ['ScalarDB Cluster でベクトル検索をはじめよう'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/authorize-with-abac'], + labels: ['ユーザーアクセスをきめ細かく制御する'] + } + ] + } +]; -const CardsDeploy = [ +const categories = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ProductionChecklistForScalarDBCluster', - }, - description: ( - - ScalarDB Cluster の運用チェックリストを参照する - - ), + name: 'ScalarDB について', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['overview'], + labels: ['ScalarDB の概要'] + }, + { + cell: 1, // Second cell + links: ['design'], + labels: ['デザイン'] + }, + { + cell: 2, // Third cell + links: ['requirements'], + labels: ['要件'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS', - }, - description: ( - - Amazon EKS に ScalarDB Cluster をデプロイする - - ), + name: 'クイックスタート', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['quickstart-overview'], + labels: ['クイックスタートの概要'] + }, + { + cell: 1, // Second cell + links: ['getting-started-with-scalardb'], + labels: ['ScalarDB をはじめよう'] + }, + { + cell: 2, // Third cell + links: ['scalardb-cluster/getting-started-with-scalardb-cluster'], + labels: ['ScalarDB Cluster をはじめよう'] + } + ] }, -] - -const CardsMigrate = [ { - // name: '', - // image: '.png', - url: { - page: 'schema-loader-import', - }, - description: ( - - ScalarDB Schema Loader を使用して既存のテーブルをインポートする - - ), + name: '開発', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['develop-overview'], + labels: ['開発の概要'] + }, + { + cell: 1, // Second cell + links: ['develop-run-transactions-overview'], + labels: ['トランザクションの実行の概要'] + }, + { + cell: 2, // Third cell + links: ['develop-run-non-transactional-operations-overview'], + labels: ['非トランザクションストレージ操作を実行'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalardb-sql/migration-guide', - }, - description: ( - - アプリケーションとデータベースの移行 - - ), + name: 'デプロイ', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['deploy-overview'], + labels: ['デプロイの概要'] + }, + { + cell: 1, // Second cell + links: ['scalardb-cluster/setup-scalardb-cluster-on-kubernetes-by-using-helm-chart'], + labels: ['ScalarDB Cluster をローカルにデプロイする方法'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/ManualDeploymentGuideScalarDBClusterOnEKS'], + labels: ['Amazon Elastic Kubernetes Service (EKS) に ScalarDB Cluster をデプロイする'] + } + ] }, -] - -const CardsManage = [ { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/K8sMonitorGuide', - }, - description: ( - - Kubernetes クラスター上の Scalar 製品の監視 - - ), + name: '移行', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['migrate-overview'], + labels: ['移行の概要'] + }, + { + cell: 1, // Second cell + links: ['scalardb-sql/migration-guide'], + labels: ['アプリケーションとデータベースを ScalarDB ベースの環境に移行する方法'] + }, + { + cell: 2, // Third cell + links: ['scalardb-sql/migration-guide'], + labels: ['アプリケーションとデータベースを ScalarDB ベースの環境に移行する方法'] + } + ] }, { - // name: '', - // image: '.png', - url: { - page: 'scalar-kubernetes/BackupNoSQL', - }, - description: ( - - Kubernetes 環境で NoSQL データベースをバックアップする - - ), - }, -] - -const CardsReference = [ - { - // name: '', - // image: '.png', - url: { - page: 'scalardb-core-status-codes', - }, - description: ( - - ScalarDB Core エラーコード - - ), - }, - { - // name: '', - // image: '.png', - url: { - page: 'scalar-licensing', - }, - description: ( - - 製品ライセンスキーの設定方法 - - ), - }, + name: '管理', + categoryLinks: [ + // To add a link, use the format ['link1', 'link2'] + // To add a label, use the format ['label1', 'label2'] + { + cell: 0, // First cell + links: ['manage-overview'], + labels: ['管理の概要'] + }, + { + cell: 1, // Second cell + links: ['scalar-kubernetes/HowToScaleScalarDB'], + labels: ['ScalarDB をスケーリングする方法'] + }, + { + cell: 2, // Third cell + links: ['scalar-kubernetes/HowToUpgradeScalarDB'], + labels: ['ScalarDB のアップグレード方法'] + } + ] + } ]; -interface Props { - // name: string; - // image: string; - url: { - page?: string; - }; - description: JSX.Element; -} - -function Card({ /* name, image,*/ url, description }: Props) { +const CategoryGrid = () => { return ( -
-
-
- {/* - } - */} +
+ {/* Hero section */} +
+
+

ScalarDB

+

ScalarDB は、さまざまなデータベースに対応したユニバーサルなハイブリッドトランザクション/分析処理 (HTAP) エンジンです。データベース上でミドルウェアとして動作し、ACID トランザクションとリアルタイム分析を実現することで、複数のデータベースや複数インスタンスの管理の複雑さを簡素化し、仮想的に統合します。

+ {/* +

多用途なソリューションとして、ScalarDB は以下のような幅広いデータベースをサポートしています:

+ +
    +
  • MariaDB、Microsoft SQL Server、MySQL、Oracle Database、PostgreSQL、SQLite などの JDBC をサポートするリレーショナルデータベース、および Amazon Aurora や YugabyteDB のようなそれらに互換性のあるデータベース。
  • +
  • Amazon DynamoDB、Apache Cassandra、Azure Cosmos DB などの NoSQL データベース。
  • +
+
*/} +
+
+
- -
- {/*

{name}

*/} -

{description}

-
- - {/*
-
- - Read more - -
-
*/}
-
- ); -} -export function CardRowAbout(): JSX.Element { - return ( -
- {CardsAbout.map((special) => ( - - ))} -
- ); -} - -export function CardRowQuickstart(): JSX.Element { - return ( -
- {CardsQuickstart.map((special) => ( - - ))} -
- ); -} - -export function CardRowDevelop(): JSX.Element { - return ( -
- {CardsDevelop.map((special) => ( - - ))} -
- ); -} - -export function CardRowDeploy(): JSX.Element { - return ( -
- {CardsDeploy.map((special) => ( - - ))} -
- ); -} - -export function CardRowMigrate(): JSX.Element { - return ( -
- {CardsMigrate.map((special) => ( - - ))} -
- ); -} - -export function CardRowManage(): JSX.Element { - return ( -
- {CardsManage.map((special) => ( - - ))} + {/* New content table */} +
+ {new_content.map((doc, i) => ( + +
+ {/* +  {doc.name}*/} + {doc.name} +
+ {doc.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} + + {/* Category table */} + {categories.map((cat, i) => ( + +
{cat.name}
+ {cat.categoryLinks.map((categoryLinkCell, j) => ( +
+ {categoryLinkCell.links.map((cellLink, k) => ( + cellLink ? ( + + {categoryLinkCell.labels[k]} + + ) : ( + + {categoryLinkCell.labels[k]} + + ) + ))} +
+ ))} +
+ ))} +
); -} +}; -export function CardRowReference(): JSX.Element { - return ( -
- {CardsReference.map((special) => ( - - ))} -
- ); -} +export default CategoryGrid; From 2aa0367062b6a2e359675524341422d4eeedd144 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 3 Jul 2025 18:11:00 +0900 Subject: [PATCH 46/50] Refactor to accommodate new design --- .../current/index.mdx | 36 +++---------------- .../version-3.13/index.mdx | 36 +++---------------- .../version-3.14/index.mdx | 36 +++---------------- versioned_docs/version-3.13/index.mdx | 36 +++---------------- versioned_docs/version-3.14/index.mdx | 36 +++---------------- 5 files changed, 20 insertions(+), 160 deletions(-) diff --git a/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/current/index.mdx b/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/current/index.mdx index 973df30a..31a0f4cf 100644 --- a/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/current/index.mdx +++ b/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/current/index.mdx @@ -5,38 +5,10 @@ tags: - Enterprise Premium displayed_sidebar: docsJapanese image: img/scalardb-social-card-preview.png +hide_table_of_contents: true +title: "" --- -# ScalarDB +import CategoryGrid from '/src/components/Cards/ja-jp/3.15'; -import { CardRowAbout, CardRowQuickstart, CardRowDevelop, CardRowDeploy, CardRowMigrate, CardRowManage, CardRowReference } from '/src/components/Cards/ja-jp/3.15'; - -ScalarDB は、さまざまなデータベース向けのハイブリッドトランザクション/分析処理 (HTAP) エンジンです。データベース上でミドルウェアとして実行され、ACID トランザクションとリアルタイム分析を実現することでさまざまなデータベースを仮想的に統合し、複数のデータベースまたは単一のデータベースの複数のインスタンスの管理の複雑さを簡素化します。 - -**ScalarDB について** - - - -**はじめる** - - - -**開発** - - - -**デプロイ** - - - -**移行** - - - -**管理** - - - -**トラブルシューティングと参照** - - + diff --git a/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.13/index.mdx b/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.13/index.mdx index 0bb2539d..38cfe88e 100644 --- a/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.13/index.mdx +++ b/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.13/index.mdx @@ -5,38 +5,10 @@ tags: - Enterprise Premium displayed_sidebar: docsJapanese image: img/scalardb-social-card-preview.png +hide_table_of_contents: true +title: "" --- -# ScalarDB +import CategoryGrid from '/src/components/Cards/ja-jp/3.13'; -import { CardRowAbout, CardRowQuickstart, CardRowDevelop, CardRowDeploy, CardRowMigrate, CardRowManage, CardRowReference } from '/src/components/Cards/ja-jp/3.14'; - -ScalarDB は、さまざまなデータベース向けのハイブリッドトランザクション/分析処理 (HTAP) エンジンです。データベース上でミドルウェアとして実行され、ACID トランザクションとリアルタイム分析を実現することでさまざまなデータベースを仮想的に統合し、複数のデータベースまたは単一のデータベースの複数のインスタンスの管理の複雑さを簡素化します。 - -**ScalarDB について** - - - -**はじめる** - - - -**開発** - - - -**デプロイ** - - - -**移行** - - - -**管理** - - - -**トラブルシューティングと参照** - - + diff --git a/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.14/index.mdx b/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.14/index.mdx index 0bb2539d..df49aa69 100644 --- a/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.14/index.mdx +++ b/i18n/versioned_docs/ja-jp/docusaurus-plugin-content-docs/version-3.14/index.mdx @@ -5,38 +5,10 @@ tags: - Enterprise Premium displayed_sidebar: docsJapanese image: img/scalardb-social-card-preview.png +hide_table_of_contents: true +title: "" --- -# ScalarDB +import CategoryGrid from '/src/components/Cards/ja-jp/3.14'; -import { CardRowAbout, CardRowQuickstart, CardRowDevelop, CardRowDeploy, CardRowMigrate, CardRowManage, CardRowReference } from '/src/components/Cards/ja-jp/3.14'; - -ScalarDB は、さまざまなデータベース向けのハイブリッドトランザクション/分析処理 (HTAP) エンジンです。データベース上でミドルウェアとして実行され、ACID トランザクションとリアルタイム分析を実現することでさまざまなデータベースを仮想的に統合し、複数のデータベースまたは単一のデータベースの複数のインスタンスの管理の複雑さを簡素化します。 - -**ScalarDB について** - - - -**はじめる** - - - -**開発** - - - -**デプロイ** - - - -**移行** - - - -**管理** - - - -**トラブルシューティングと参照** - - + diff --git a/versioned_docs/version-3.13/index.mdx b/versioned_docs/version-3.13/index.mdx index c3b0c9ee..4ca35e77 100644 --- a/versioned_docs/version-3.13/index.mdx +++ b/versioned_docs/version-3.13/index.mdx @@ -5,38 +5,10 @@ tags: - Enterprise Premium displayed_sidebar: docsEnglish image: img/scalardb-social-card-preview.png +hide_table_of_contents: true +title: "" --- -# ScalarDB +import CategoryGrid from '/src/components/Cards/3.13'; -import { CardRowAbout, CardRowQuickstart, CardRowDevelop, CardRowDeploy, CardRowMigrate, CardRowManage, CardRowReference } from '/src/components/Cards/3.13'; - -ScalarDB is a cross-database HTAP engine. It achieves ACID transactions and real-time analytics across diverse databases to simplify the complexity of managing multiple databases. - -**About ScalarDB** - - - -**Quickstart** - - - -**Develop** - - - -**Deploy** - - - -**Migrate** - - - -**Manage** - - - -**Troubleshoot & Reference** - - + diff --git a/versioned_docs/version-3.14/index.mdx b/versioned_docs/version-3.14/index.mdx index 4a5d99db..72fdeab5 100644 --- a/versioned_docs/version-3.14/index.mdx +++ b/versioned_docs/version-3.14/index.mdx @@ -5,38 +5,10 @@ tags: - Enterprise Premium displayed_sidebar: docsEnglish image: img/scalardb-social-card-preview.png +hide_table_of_contents: true +title: "" --- -# ScalarDB +import CategoryGrid from '/src/components/Cards/3.14'; -import { CardRowAbout, CardRowQuickstart, CardRowDevelop, CardRowDeploy, CardRowMigrate, CardRowManage, CardRowReference } from '/src/components/Cards/3.14'; - -ScalarDB is a cross-database HTAP engine. It achieves ACID transactions and real-time analytics across diverse databases to simplify the complexity of managing multiple databases. - -**About ScalarDB** - - - -**Quickstart** - - - -**Develop** - - - -**Deploy** - - - -**Migrate** - - - -**Manage** - - - -**Troubleshoot & Reference** - - + From 4cbc2b7e146237323e3ce11919a7ac3847ed4102 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 3 Jul 2025 18:35:32 +0900 Subject: [PATCH 47/50] Remove duplicate style --- src/css/custom.css | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index a02c90d2..42b9ab5c 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -29,12 +29,6 @@ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } -/* Fix for horizontal scrolling issue */ -html, body { - overflow-x: hidden; - max-width: 100%; -} - .dropdown-separator { margin: 0.3rem 0; } From 177e6cd23b713718c8d4332c0e66a81b72dbedcc Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Thu, 3 Jul 2025 18:36:29 +0900 Subject: [PATCH 48/50] Move home page card styles --- src/css/custom.css | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index 42b9ab5c..8bacb5ed 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -67,6 +67,19 @@ div[class^='announcementBar'] { /* Home page cards */ +html, body { /* Fix for horizontal scrolling issue */ + overflow-x: hidden; + max-width: 100%; +} + +* { /* Ensure all elements stay within their containers */ + box-sizing: border-box; +} + +table, pre, code, img, iframe { /* Fix for common elements that might cause overflow */ + max-width: 100%; +} + .card { border: 1px solid #ebedf0; } @@ -81,23 +94,6 @@ div[class^='announcementBar'] { text-decoration: none; } - -/* Fix for horizontal scrolling issue */ -html, body { - overflow-x: hidden; - max-width: 100%; -} - -/* Ensure all elements stay within their containers */ -* { - box-sizing: border-box; - max-width: 100%; -} - -/* Fix for common elements that might cause overflow */ -table, pre, code, img, iframe { - max-width: 100%; -} .grid-container { display: flex; flex-direction: column; From 6ffd090db008b85adfd346ff1c41813e1c28ac91 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 4 Jul 2025 12:02:02 +0900 Subject: [PATCH 49/50] Fix comment --- src/components/Cards/3.13.tsx | 6 +++--- src/components/Cards/ja-jp/3.13.tsx | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/Cards/3.13.tsx b/src/components/Cards/3.13.tsx index 8fcd3549..678b8a16 100644 --- a/src/components/Cards/3.13.tsx +++ b/src/components/Cards/3.13.tsx @@ -23,17 +23,17 @@ const new_content = [ // To add a link, use the format ['link1', 'link2'] // To add a label, use the format ['label1', 'label2'] { - cell: 0, // Third cell + cell: 0, // First cell links: ['api-guide#group-commit-for-the-coordinator-table'], labels: ['Group commit for the Coordinator table'] }, { - cell: 1, // First cell + cell: 1, // Second cell links: ['run-non-transactional-storage-operations-through-library#configure-scalardb-to-run-non-transactional-storage-operations'], labels: ['Configure ScalarDB to run non-transactional storage operations'] }, { - cell: 2, // Second cell + cell: 2, // Third cell links: ['scalardb-cluster/run-non-transactional-storage-operations-through-sql-interface/#configure-scalardb-cluster-to-run-non-transactional-storage-operations'], labels: ['Configure ScalarDB Cluster to run non-transactional storage operations'] } diff --git a/src/components/Cards/ja-jp/3.13.tsx b/src/components/Cards/ja-jp/3.13.tsx index 6552ce32..7cb7bf2c 100644 --- a/src/components/Cards/ja-jp/3.13.tsx +++ b/src/components/Cards/ja-jp/3.13.tsx @@ -23,17 +23,17 @@ const new_content = [ // To add a link, use the format ['link1', 'link2'] // To add a label, use the format ['label1', 'label2'] { - cell: 0, // Third cell + cell: 0, // First cell links: ['api-guide#coordinator-テーブルのグループコミット'], labels: ['Coordinator テーブルのグループコミット'] }, { - cell: 1, // First cell + cell: 1, // Second cell links: ['run-non-transactional-storage-operations-through-library#configure-scalardb-to-run-non-transactional-storage-operations'], labels: ['非トランザクショナルストレージ操作を実行するための ScalarDB の設定'] }, { - cell: 2, // Second cell + cell: 2, // Third cell links: ['scalardb-cluster/run-non-transactional-storage-operations-through-sql-interface/#configure-scalardb-cluster-to-run-non-transactional-storage-operations'], labels: ['非トランザクショナルストレージ操作を実行するための ScalarDB Cluster の設定'] } From 5001fd7b5922675a675d9236613672e90fbd57f7 Mon Sep 17 00:00:00 2001 From: Josh Wong <23216828+josh-wong@users.noreply.github.com> Date: Fri, 4 Jul 2025 12:05:22 +0900 Subject: [PATCH 50/50] Add missing link --- src/components/Cards/3.13.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Cards/3.13.tsx b/src/components/Cards/3.13.tsx index 678b8a16..c50dc97d 100644 --- a/src/components/Cards/3.13.tsx +++ b/src/components/Cards/3.13.tsx @@ -103,8 +103,8 @@ const categories = [ }, { cell: 2, // Third cell - links: ['XXX'], - labels: ['XXX'] + links: ['develop-run-non-transactional-operations-overview'], + labels: ['Run Non-Transactional Storage Operations'] } ] },