From 46fc03c3c5f021c5233896722bc98d7d60cdd63f Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Tue, 28 Apr 2026 15:47:55 -0400 Subject: [PATCH 01/10] =?UTF-8?q?=F0=9F=93=9D=20Inline=20Hubble=20desc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytics/hubble/data-catalog/data-dictionary/README.mdx | 4 ---- .../data-catalog/data-dictionary/bronze/_category_.json | 3 +++ .../hubble/data-catalog/data-dictionary/gold/_category_.json | 3 +++ .../data-catalog/data-dictionary/silver/_category_.json | 3 +++ 4 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 docs/data/analytics/hubble/data-catalog/data-dictionary/bronze/_category_.json create mode 100644 docs/data/analytics/hubble/data-catalog/data-dictionary/gold/_category_.json create mode 100644 docs/data/analytics/hubble/data-catalog/data-dictionary/silver/_category_.json diff --git a/docs/data/analytics/hubble/data-catalog/data-dictionary/README.mdx b/docs/data/analytics/hubble/data-catalog/data-dictionary/README.mdx index 651f2d4c2a..5711d1d9ad 100644 --- a/docs/data/analytics/hubble/data-catalog/data-dictionary/README.mdx +++ b/docs/data/analytics/hubble/data-catalog/data-dictionary/README.mdx @@ -7,8 +7,4 @@ import DocCardList from "@theme/DocCardList"; Hubble data is organized into bronze, silver, and gold sections. -- Bronze 🥉 - raw, untransformed data from the Stellar network (e.g., history_contract_events contains all Stellar events) -- Silver 🥈 - decoded, transformed, and filtered data (e.g., token_transfers contains SEP-41 complaint Stellar events) -- Gold 🥇 - Curated analytics with friendly aggregate tables (e.g., tvl_agg aggregates the relevant amounts in Stellar events) - diff --git a/docs/data/analytics/hubble/data-catalog/data-dictionary/bronze/_category_.json b/docs/data/analytics/hubble/data-catalog/data-dictionary/bronze/_category_.json new file mode 100644 index 0000000000..bb96482b8c --- /dev/null +++ b/docs/data/analytics/hubble/data-catalog/data-dictionary/bronze/_category_.json @@ -0,0 +1,3 @@ +{ + "description": "Raw, untransformed data from the Stellar network. For example, history_contract_events contains all Stellar events." +} diff --git a/docs/data/analytics/hubble/data-catalog/data-dictionary/gold/_category_.json b/docs/data/analytics/hubble/data-catalog/data-dictionary/gold/_category_.json new file mode 100644 index 0000000000..4e28ff12f7 --- /dev/null +++ b/docs/data/analytics/hubble/data-catalog/data-dictionary/gold/_category_.json @@ -0,0 +1,3 @@ +{ + "description": "Curated analytics with friendly aggregate tables. For example, tvl_agg aggregates relevant amounts in Stellar events." +} diff --git a/docs/data/analytics/hubble/data-catalog/data-dictionary/silver/_category_.json b/docs/data/analytics/hubble/data-catalog/data-dictionary/silver/_category_.json new file mode 100644 index 0000000000..b160b56ded --- /dev/null +++ b/docs/data/analytics/hubble/data-catalog/data-dictionary/silver/_category_.json @@ -0,0 +1,3 @@ +{ + "description": "Decoded, transformed, and filtered data. For example, token_transfers_raw contains SEP-41-compliant Stellar events." +} From e3e5c41dc58f18add70dcf6c8479361e67dabff7 Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Tue, 28 Apr 2026 15:57:50 -0400 Subject: [PATCH 02/10] Add custom doc card formatting --- src/theme/DocCard/index.tsx | 137 +++++++++++++++++++++++++++ src/theme/DocCard/styles.module.scss | 31 ++++++ 2 files changed, 168 insertions(+) create mode 100644 src/theme/DocCard/index.tsx create mode 100644 src/theme/DocCard/styles.module.scss diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx new file mode 100644 index 0000000000..0033b6afdc --- /dev/null +++ b/src/theme/DocCard/index.tsx @@ -0,0 +1,137 @@ +import React, {type ReactNode} from "react"; +import clsx from "clsx"; +import Link from "@docusaurus/Link"; +import { + useDocById, + findFirstSidebarItemLink, +} from "@docusaurus/plugin-content-docs/client"; +import type { + PropSidebarItemCategory, + PropSidebarItemLink, +} from "@docusaurus/plugin-content-docs"; +import { usePluralForm } from "@docusaurus/theme-common"; +import isInternalUrl from "@docusaurus/isInternalUrl"; +import { translate } from "@docusaurus/Translate"; + +import type { Props } from "@theme/DocCard"; +import Heading from "@theme/Heading"; +import styles from "./styles.module.scss"; + +function useCategoryItemsPlural() { + const { selectMessage } = usePluralForm(); + return (count: number) => + selectMessage( + count, + translate( + { + message: "1 item|{count} items", + id: "theme.docs.DocCard.categoryDescription.plurals", + description: + "Default description for a category card in the generated index about how many items this category includes", + }, + { count }, + ), + ); +} + +function CardContainer({ + className, + href, + children, +}: { + className?: string; + href: string; + children: ReactNode; +}): ReactNode { + return ( + + {children} + + ); +} + +function CardLayout({ + className, + href, + icon, + title, + description, +}: { + className?: string; + href: string; + icon: ReactNode; + title: string; + description?: string; +}): ReactNode { + return ( + + + {icon} {title} + + {description && ( +

+ {description} +

+ )} +
+ ); +} + +function CardCategory({ item }: { item: PropSidebarItemCategory }): ReactNode { + const href = findFirstSidebarItemLink(item); + const categoryItemsPlural = useCategoryItemsPlural(); + + if (!href) { + return null; + } + + const description = + item.description ?? + item.customProps?.description ?? + categoryItemsPlural(item.items.length); + + return ( + + ); +} + +function CardLink({ item }: { item: PropSidebarItemLink }): ReactNode { + const icon = isInternalUrl(item.href) ? "📄" : "🔗"; + const doc = useDocById(item.docId ?? undefined); + return ( + + ); +} + +export default function DocCard({ item }: Props): ReactNode { + switch (item.type) { + case "link": + return ; + case "category": + return ; + default: + throw new Error(`unknown item type ${JSON.stringify(item)}`); + } +} diff --git a/src/theme/DocCard/styles.module.scss b/src/theme/DocCard/styles.module.scss new file mode 100644 index 0000000000..316a472d99 --- /dev/null +++ b/src/theme/DocCard/styles.module.scss @@ -0,0 +1,31 @@ +.cardContainer { + --ifm-link-color: var(--ifm-color-emphasis-800); + --ifm-link-hover-color: var(--ifm-color-emphasis-700); + --ifm-link-hover-decoration: none; + + box-shadow: 0 1.5px 3px 0 rgb(0 0 0 / 15%); + border: 1px solid var(--ifm-color-emphasis-200); + transition: all var(--ifm-transition-fast) ease; + transition-property: border, box-shadow; +} + +.cardContainer:hover { + border-color: var(--ifm-color-primary); + box-shadow: 0 3px 6px 0 rgb(0 0 0 / 20%); +} + +.cardContainer *:last-child { + margin-bottom: 0; +} + +.cardTitle { + font-size: 1.2rem; +} + +.cardDescription { + font-size: 0.8rem; + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + overflow: hidden; +} From 865dca4d7268d7c712d9eea2eb2decc0566f9dec Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Tue, 28 Apr 2026 16:00:21 -0400 Subject: [PATCH 03/10] Add fundamentals category descriptions --- .../fundamentals/contract-development/_category_.json | 9 +++++++++ docs/learn/fundamentals/data-format/_category_.json | 9 +++++++++ .../fundamentals/stellar-data-structures/_category_.json | 9 +++++++++ docs/learn/fundamentals/transactions/_category_.json | 9 +++++++++ 4 files changed, 36 insertions(+) create mode 100644 docs/learn/fundamentals/contract-development/_category_.json create mode 100644 docs/learn/fundamentals/data-format/_category_.json create mode 100644 docs/learn/fundamentals/stellar-data-structures/_category_.json create mode 100644 docs/learn/fundamentals/transactions/_category_.json diff --git a/docs/learn/fundamentals/contract-development/_category_.json b/docs/learn/fundamentals/contract-development/_category_.json new file mode 100644 index 0000000000..421dc264c5 --- /dev/null +++ b/docs/learn/fundamentals/contract-development/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Smart Contracts", + "position": 84, + "link": { + "type": "doc", + "id": "learn/fundamentals/contract-development/README" + }, + "description": "Dive into Soroban smart-contract concepts, lifecycle guidance, and authorization patterns so you can ship production-ready code on Stellar." +} diff --git a/docs/learn/fundamentals/data-format/_category_.json b/docs/learn/fundamentals/data-format/_category_.json new file mode 100644 index 0000000000..bba43ef4d4 --- /dev/null +++ b/docs/learn/fundamentals/data-format/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Data Format", + "position": 85, + "link": { + "type": "doc", + "id": "learn/fundamentals/data-format/README" + }, + "description": "Understand Stellar's XDR and JSON encodings so you can inspect transactions, debug payloads, and interchange data with other systems." +} diff --git a/docs/learn/fundamentals/stellar-data-structures/_category_.json b/docs/learn/fundamentals/stellar-data-structures/_category_.json new file mode 100644 index 0000000000..5d21b285a4 --- /dev/null +++ b/docs/learn/fundamentals/stellar-data-structures/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Stellar Data Structures", + "position": 50, + "link": { + "type": "doc", + "id": "learn/fundamentals/stellar-data-structures/README" + }, + "description": "Learn how accounts, assets, contracts, events, and ledgers fit together to describe everything living on the Stellar network." +} diff --git a/docs/learn/fundamentals/transactions/_category_.json b/docs/learn/fundamentals/transactions/_category_.json new file mode 100644 index 0000000000..4bb739336d --- /dev/null +++ b/docs/learn/fundamentals/transactions/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Operations & Transactions", + "position": 60, + "link": { + "type": "doc", + "id": "learn/fundamentals/transactions/README" + }, + "description": "Trace how Stellar transactions bundle operations, flow through the network, and unlock asset transfers or contract calls." +} From 61681e5c8e679667c1f40d18ed9eaf0cb68249ac Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:48:12 -0400 Subject: [PATCH 04/10] =?UTF-8?q?=F0=9F=93=9D=20Internal=20consistency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/theme/DocCard/index.tsx | 4 +++- src/theme/DocCard/styles.module.scss | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx index 0033b6afdc..bdaa5a6eff 100644 --- a/src/theme/DocCard/index.tsx +++ b/src/theme/DocCard/index.tsx @@ -43,9 +43,11 @@ function CardContainer({ href: string; children: ReactNode; }): ReactNode { + const linkProps = isInternalUrl(href) ? { to: href } : { href }; + return ( {children} diff --git a/src/theme/DocCard/styles.module.scss b/src/theme/DocCard/styles.module.scss index 316a472d99..eabaa3fed7 100644 --- a/src/theme/DocCard/styles.module.scss +++ b/src/theme/DocCard/styles.module.scss @@ -23,9 +23,14 @@ } .cardDescription { + --card-description-lines: 4; + font-size: 0.8rem; + white-space: normal; + overflow-wrap: anywhere; display: -webkit-box; - -webkit-line-clamp: 4; + -webkit-line-clamp: var(--card-description-lines); -webkit-box-orient: vertical; + max-height: calc(1.8em * var(--card-description-lines)); overflow: hidden; } From 71c18c3edf59b472e16689d430a6d99e864e6882 Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Wed, 29 Apr 2026 02:08:29 -0400 Subject: [PATCH 05/10] =?UTF-8?q?=E2=99=BF=20Screen=20reader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/theme/DocCard/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx index bdaa5a6eff..cfba9f8ac8 100644 --- a/src/theme/DocCard/index.tsx +++ b/src/theme/DocCard/index.tsx @@ -75,7 +75,7 @@ function CardLayout({ className={clsx("text--truncate", styles.cardTitle)} title={title} > - {icon} {title} + {title} {description && (

Date: Wed, 29 Apr 2026 02:10:11 -0400 Subject: [PATCH 06/10] =?UTF-8?q?=F0=9F=93=9D=20Description=20fetching?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/theme/DocCard/index.tsx | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx index cfba9f8ac8..c29a3b2775 100644 --- a/src/theme/DocCard/index.tsx +++ b/src/theme/DocCard/index.tsx @@ -3,6 +3,7 @@ import clsx from "clsx"; import Link from "@docusaurus/Link"; import { useDocById, + useDocsVersion, findFirstSidebarItemLink, } from "@docusaurus/plugin-content-docs/client"; import type { @@ -34,6 +35,31 @@ function useCategoryItemsPlural() { ); } +function getStringCustomProp( + customProps: PropSidebarItemCategory["customProps"], + key: string, +): string | undefined { + const value = customProps?.[key]; + return typeof value === "string" ? value : undefined; +} + +function getCategoryIndexDocIds(href: string | undefined): string[] { + if (!href || !isInternalUrl(href)) { + return []; + } + + const [pathname] = href.split(/[?#]/); + const pathSegments = pathname.replace(/^\/+|\/+$/g, "").split("/"); + const docsSegmentIndex = pathSegments.indexOf("docs"); + const docPathSegments = + docsSegmentIndex >= 0 + ? pathSegments.slice(docsSegmentIndex + 1) + : pathSegments; + const docPath = docPathSegments.join("/"); + + return docPath ? [`${docPath}/README`, `${docPath}/index`, docPath] : []; +} + function CardContainer({ className, href, @@ -92,6 +118,10 @@ function CardLayout({ function CardCategory({ item }: { item: PropSidebarItemCategory }): ReactNode { const href = findFirstSidebarItemLink(item); const categoryItemsPlural = useCategoryItemsPlural(); + const { docs } = useDocsVersion(); + const categoryIndexDoc = getCategoryIndexDocIds(item.href).find( + (docId) => docs[docId], + ); if (!href) { return null; @@ -99,7 +129,8 @@ function CardCategory({ item }: { item: PropSidebarItemCategory }): ReactNode { const description = item.description ?? - item.customProps?.description ?? + getStringCustomProp(item.customProps, "description") ?? + docs[categoryIndexDoc ?? ""]?.description ?? categoryItemsPlural(item.items.length); return ( From 9dc03d556019b74b4924387bccc60e59bfa3a078 Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Wed, 29 Apr 2026 02:11:37 -0400 Subject: [PATCH 07/10] =?UTF-8?q?=E2=9A=A0=EF=B8=8F=20Actionable=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/theme/DocCard/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx index c29a3b2775..d71d323b52 100644 --- a/src/theme/DocCard/index.tsx +++ b/src/theme/DocCard/index.tsx @@ -165,6 +165,6 @@ export default function DocCard({ item }: Props): ReactNode { case "category": return ; default: - throw new Error(`unknown item type ${JSON.stringify(item)}`); + throw new Error(`Unknown DocCard item type: ${item.type}`); } } From a08d9ab1242e7277c728ba7d760a4248d5f02134 Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Wed, 29 Apr 2026 02:19:30 -0400 Subject: [PATCH 08/10] =?UTF-8?q?=F0=9F=93=9D=20Clean=20meta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytics/hubble/analyst-guide/optimizing-queries.mdx | 2 +- .../contract-development/storage/_category_.json | 8 ++++++++ docs/tokens/how-to-issue-an-asset.mdx | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 docs/learn/fundamentals/contract-development/storage/_category_.json diff --git a/docs/data/analytics/hubble/analyst-guide/optimizing-queries.mdx b/docs/data/analytics/hubble/analyst-guide/optimizing-queries.mdx index 5f73d739e9..59cb2d811a 100644 --- a/docs/data/analytics/hubble/analyst-guide/optimizing-queries.mdx +++ b/docs/data/analytics/hubble/analyst-guide/optimizing-queries.mdx @@ -3,7 +3,7 @@ title: "Optimizing Queries" sidebar_position: 30 --- -Hubble has terabytes of data to explore—that’s a lot of data! With access to so much data at your fingertips, it is crucial to performance-tune your queries. +Hubble has terabytes of data to explore—that’s a lot of data! With access to so much data at your fingertips, it is crucial to performance-tune your queries. One of the strengths of BigQuery is also its pitfall: you have access to tremendous compute capabilities, but you pay for what you use. If you fine-tune your queries, you will have access to powerful insights at the fraction of the cost of maintaining a data warehouse yourself. It is, however, easy to incur burdensome costs if you are not careful. diff --git a/docs/learn/fundamentals/contract-development/storage/_category_.json b/docs/learn/fundamentals/contract-development/storage/_category_.json new file mode 100644 index 0000000000..e0748c9e35 --- /dev/null +++ b/docs/learn/fundamentals/contract-development/storage/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Storage", + "position": 10, + "link": { + "type": "doc", + "id": "learn/fundamentals/contract-development/storage/README" + } +} diff --git a/docs/tokens/how-to-issue-an-asset.mdx b/docs/tokens/how-to-issue-an-asset.mdx index f184b07984..9b9dfd0a1c 100644 --- a/docs/tokens/how-to-issue-an-asset.mdx +++ b/docs/tokens/how-to-issue-an-asset.mdx @@ -367,7 +367,7 @@ You can also create a market directly from the issuing account and issue tokens :::danger -This section details how to lock your account with the purpose of limiting the supply of your issued asset. However, locking your account means you’ll never be able to do anything with it ever again—whether that’s adjusting signers, changing the home domain, claiming any held XLM, or any other operation. Your account will be completely frozen. +This section details how to lock your account with the purpose of limiting the supply of your issued asset. However, locking your account means you’ll never be able to do anything with it ever again—whether that’s adjusting signers, changing the home domain, claiming any held XLM, or any other operation. Your account will be completely frozen. ::: From 6c7e368de01cf438182fb43316fff105506fc76c Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Wed, 29 Apr 2026 02:20:22 -0400 Subject: [PATCH 09/10] =?UTF-8?q?=F0=9F=8E=AF=20Target=20=E2=89=A5elements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/theme/DocCard/styles.module.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/theme/DocCard/styles.module.scss b/src/theme/DocCard/styles.module.scss index eabaa3fed7..ae93f8d665 100644 --- a/src/theme/DocCard/styles.module.scss +++ b/src/theme/DocCard/styles.module.scss @@ -14,7 +14,7 @@ box-shadow: 0 3px 6px 0 rgb(0 0 0 / 20%); } -.cardContainer *:last-child { +.cardContainer > :last-child { margin-bottom: 0; } From 32408f5b9430e0d2622691e5bd8148b56dd45336 Mon Sep 17 00:00:00 2001 From: "john.xlm" <60260750+JFWooten4@users.noreply.github.com> Date: Wed, 29 Apr 2026 02:31:59 -0400 Subject: [PATCH 10/10] SEO nit --- docs/learn/fundamentals/contract-development/storage/README.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/learn/fundamentals/contract-development/storage/README.mdx b/docs/learn/fundamentals/contract-development/storage/README.mdx index 84004720be..d7e9f2b032 100644 --- a/docs/learn/fundamentals/contract-development/storage/README.mdx +++ b/docs/learn/fundamentals/contract-development/storage/README.mdx @@ -1,6 +1,7 @@ --- title: Storage sidebar_position: 10 +description: Learn how smart contracts store and access data on Stellar, including persistent state and archival behavior. --- import DocCardList from "@theme/DocCardList";