diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..c4756bae --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +# Grid Docs Environment Variables +# Copy this file to .env and fill in the values +# DO NOT commit .env to the repository + +# Central Icons React Library License +# Get your license key from https://www.npmjs.com/package/@central-icons-react/all +# Required for npm run build:icons +CENTRAL_LICENSE_KEY=your-license-key-here diff --git a/.gitignore b/.gitignore index 777b53b5..23810883 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,12 @@ cli/dist/ # Figma design tokens (local reference only) mintlify/tokens/ +# Development reference files +refs/ +figma-*.md + +# Cursor IDE rules (personal config) +.cursor/rules/ + +# Personal todo files +TODO-*.md diff --git a/CLAUDE.md b/CLAUDE.md index 78285835..50456e43 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -155,6 +155,46 @@ Webhooks use **P-256 ECDSA signatures** in the `X-Grid-Signature` header for ver - Use relative paths for internal links - The mintlify subdirectory has its own CLAUDE.md with additional guidance +### Mintlify CLI Version (Important) + +**Use Mintlify CLI version 4.2.284** for local development. Newer versions (e.g., 4.2.312) have a bug where the API reference pages render blank when using the palm theme with OpenAPI auto-generation. + +**Requires Node.js LTS (v20 or v22)** - Mintlify does not support Node 25+. If you have a newer Node version installed, use Node 22 LTS: + +```bash +# Install Node 22 via Homebrew (if needed) +brew install node@22 + +# Run mint dev with Node 22 +export PATH="/opt/homebrew/opt/node@22/bin:$PATH" +cd mintlify && mint dev + +# Or add to ~/.zshrc to make permanent: +# export PATH="/opt/homebrew/opt/node@22/bin:$PATH" +``` + +```bash +# Check current version +mintlify --version + +# If needed, install the working version +npm install -g mintlify@4.2.284 --force +``` + +### Troubleshooting: API Reference Not Showing + +If the API reference pages appear blank (only showing title and navigation, no endpoint details): + +1. **Restart the dev server** - hot reload sometimes fails: + ```bash + pkill -f "mint.*dev" + cd mintlify && mint dev + ``` + +2. **Check CLI version** - ensure you're on 4.2.284 (see above) + +3. **Verify OpenAPI spec** - run `mint openapi-check openapi.yaml` in the mintlify folder + ### Documentation Philosophy - **Document just enough** for user success - balance between too much and too little @@ -163,6 +203,30 @@ Webhooks use **P-256 ECDSA signatures** in the `X-Grid-Signature` header for ver - **Check existing patterns** for consistency before making changes - **Search before adding** - look for existing information before creating new content +### CSS Styling Tips (Mintlify Overrides) + +When overriding Mintlify's default styles in `mintlify/styles/base.css`: + +- **Tailwind utility classes are hard to override directly** - Classes like `mb-3.5` have high specificity. Even with `!important` and complex selectors, they often won't budge. + +- **Workaround: Use negative margins on sibling elements** - Instead of reducing `margin-bottom` on an element, add negative `margin-top` to the following sibling. This achieves the same visual effect. + +- **Test selectors with visible properties first** - If a style isn't applying, add `border: 2px solid red !important;` to confirm the selector is matching. If the border shows, the selector works but something else is overriding your property. + +- **HeadlessUI portal elements** - Mobile nav and modals render inside `#headlessui-portal-root`. Use this in selectors for higher specificity: `#headlessui-portal-root #mobile-nav ...` + +- **Mobile nav lives in `#mobile-nav`** - Target mobile-specific styles with `#mobile-nav` or `div#mobile-nav` selectors to avoid affecting desktop sidebar. + +- **Negative margins for edge-to-edge layouts** - To break out of parent padding (e.g., make nav items edge-to-edge), use negative margins equal to the parent's padding, then add your own padding inside. + +### MDX Component Limitations + +- **`React.useEffect` breaks the MDX parser** - Mintlify uses acorn to parse MDX, and it chokes on `useEffect`. Avoid using hooks that require cleanup or side effects. + +- **`React.useState` works fine** - Simple state management is supported. + +- **Keep components simple** - If you need complex interactivity, consider using CSS-only solutions or restructuring to avoid problematic hooks. + ## Environments - **Production**: `https://api.lightspark.com/grid/2025-10-13` diff --git a/mintlify/api-reference/authentication.mdx b/mintlify/api-reference/authentication.mdx index 5d016130..1e277470 100644 --- a/mintlify/api-reference/authentication.mdx +++ b/mintlify/api-reference/authentication.mdx @@ -1,5 +1,7 @@ --- title: "Authentication" +icon: "/images/icons/key2.svg" +"og:image": "/images/og/og-api-reference.png" --- import { topLevelProductName } from '/snippets/variables.mdx' diff --git a/mintlify/api-reference/environments.mdx b/mintlify/api-reference/environments.mdx index c522eaf6..dcf736f6 100644 --- a/mintlify/api-reference/environments.mdx +++ b/mintlify/api-reference/environments.mdx @@ -1,5 +1,7 @@ --- title: 'Environments' +icon: "/images/icons/globe.svg" +"og:image": "/images/og/og-api-reference.png" --- import { topLevelProductName } from '/snippets/variables.mdx' diff --git a/mintlify/api-reference/terminology.mdx b/mintlify/api-reference/terminology.mdx index d90a2a1d..3899d2cd 100644 --- a/mintlify/api-reference/terminology.mdx +++ b/mintlify/api-reference/terminology.mdx @@ -1,6 +1,8 @@ --- title: "Core Concepts" description: "Core concepts and terminology for the Grid API" +icon: "/images/icons/file-text.svg" +"og:image": "/images/og/og-api-reference.png" --- import Terminology from '/snippets/terminology.mdx'; diff --git a/mintlify/developer-resources/samples.mdx b/mintlify/developer-resources/samples.mdx index 2ee813ad..ef0ad327 100644 --- a/mintlify/developer-resources/samples.mdx +++ b/mintlify/developer-resources/samples.mdx @@ -1,12 +1,13 @@ --- title: "Samples" +icon: "/images/icons/github.svg" --- Explore end-to-end sample apps and snippets in our public repository. - + Browse runnable examples for quickstarts and integrations. diff --git a/mintlify/docs.json b/mintlify/docs.json index 78476a62..962b0b2f 100644 --- a/mintlify/docs.json +++ b/mintlify/docs.json @@ -1,6 +1,6 @@ { "$schema": "https://mintlify.com/docs.json", - "theme": "mint", + "theme": "palm", "name": "Grid API Documentation", "description": "The Grid API enables modern financial institutions to easily send and receive global payments. The following documentation helps developers understand the Grid API and how to integrate with it.", "colors": { @@ -17,53 +17,57 @@ "fonts": { "heading": { "family": "Suisse Intl", - "source": "/fonts/suisse-intl/SuisseIntl-Medium.woff2", - "format": "woff2", "weight": 500 }, "body": { "family": "Suisse Intl", - "source": "/fonts/suisse-intl/SuisseIntl-Regular.woff2", - "format": "woff2", "weight": 400 } }, - "favicon": "/favicon.svg", + "favicon": { + "light": "/favicon-dark.svg", + "dark": "/favicon-light.svg" + }, "navigation": { "tabs": [ { - "tab": "Home", - "pages": ["index"] - }, - { - "tab": "Platform Overview", - "pages": [ + "tab": "Get started", + "groups": [ { - "group": "Introduction", + "group": "Overview", "pages": [ + "index", "platform-overview/introduction/what-is-grid", + "platform-overview/capabilities", + "platform-overview/use-cases", "platform-overview/introduction/faq" ] }, { - "group": "Core Concepts", + "group": "Core concepts", "pages": [ "platform-overview/core-concepts/entities", "platform-overview/core-concepts/quote-system", "platform-overview/core-concepts/account-model", "platform-overview/core-concepts/transaction-lifecycle", - "platform-overview/core-concepts/currencies-and-rails" + "platform-overview/core-concepts/currencies-and-rails", + "platform-overview/configuration" ] } ] }, { "tab": "Payouts & B2B", - "pages": [ - "payouts-and-b2b/index", - "payouts-and-b2b/terminology", - "payouts-and-b2b/onboarding/implementation-overview", - "payouts-and-b2b/quickstart", + "groups": [ + { + "group": "Overview", + "pages": [ + "payouts-and-b2b/index", + "payouts-and-b2b/terminology", + "payouts-and-b2b/onboarding/implementation-overview", + "payouts-and-b2b/quickstart" + ] + }, { "group": "Onboarding", "pages": [ @@ -101,11 +105,16 @@ }, { "tab": "Ramps", - "pages": [ - "ramps/index", - "ramps/terminology", - "ramps/onboarding/implementation-overview", - "ramps/quickstart", + "groups": [ + { + "group": "Overview", + "pages": [ + "ramps/index", + "ramps/terminology", + "ramps/onboarding/implementation-overview", + "ramps/quickstart" + ] + }, { "group": "Onboarding", "pages": [ @@ -141,11 +150,16 @@ }, { "tab": "Rewards", - "pages": [ - "rewards/index", - "rewards/terminology", - "rewards/developer-guides/implementation-overview", - "rewards/quickstart", + "groups": [ + { + "group": "Overview", + "pages": [ + "rewards/index", + "rewards/terminology", + "rewards/developer-guides/implementation-overview", + "rewards/quickstart" + ] + }, { "group": "Onboarding", "pages": [ @@ -179,11 +193,16 @@ }, { "tab": "Global P2P", - "pages": [ - "global-p2p/index", - "global-p2p/terminology", - "global-p2p/getting-started/implementation-overview", - "global-p2p/quickstart", + "groups": [ + { + "group": "Overview", + "pages": [ + "global-p2p/index", + "global-p2p/terminology", + "global-p2p/getting-started/implementation-overview", + "global-p2p/quickstart" + ] + }, { "group": "Onboarding", "pages": [ @@ -247,28 +266,33 @@ "navbar": { "links": [ { - "label": "Github", + "label": "GitHub", "href": "https://github.com/lightsparkdev/grid-api", "icon": "github" + }, + { + "label": "Contact sales", + "href": "https://www.lightspark.com/contact" } - ], - "primary": { - "type": "button", - "label": "Contact Sales", - "href": "https://lightspark.com/grid#signup" - } + ] + }, + "modeToggle": { + "default": "light", + "isHidden": false }, "contextual": { "options": ["copy", "view", "chatgpt", "claude"] }, - "footer": { - "socials": { - "x": "https://x.com/lightspark", - "github": "https://github.com/lightsparkdev", - "linkedin": "https://linkedin.com/company/lightspark-group" + "seo": { + "metatags": { + "og:image": "/images/og/og-fallback-bg.png", + "og:image:width": "1200", + "og:image:height": "630" } }, + "footer": {}, "head": { + "raw": "", "links": [ { "rel": "preload", diff --git a/mintlify/favicon-dark.svg b/mintlify/favicon-dark.svg new file mode 100644 index 00000000..465fd5fd --- /dev/null +++ b/mintlify/favicon-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mintlify/favicon-light.svg b/mintlify/favicon-light.svg new file mode 100644 index 00000000..e33e1842 --- /dev/null +++ b/mintlify/favicon-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mintlify/favicon.svg b/mintlify/favicon.svg deleted file mode 100644 index 70b3d0e6..00000000 --- a/mintlify/favicon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/mintlify/global-p2p/country-support.mdx b/mintlify/global-p2p/country-support.mdx index 4fd63540..ab5572d9 100644 --- a/mintlify/global-p2p/country-support.mdx +++ b/mintlify/global-p2p/country-support.mdx @@ -1,6 +1,7 @@ --- title: "Supported Countries" description: "Grid availability and payment support" +icon: "/images/icons/globe.svg" --- import CountrySupport from '/snippets/country-support.mdx'; diff --git a/mintlify/global-p2p/getting-started/implementation-overview.mdx b/mintlify/global-p2p/getting-started/implementation-overview.mdx index 67b507b5..03d05928 100644 --- a/mintlify/global-p2p/getting-started/implementation-overview.mdx +++ b/mintlify/global-p2p/getting-started/implementation-overview.mdx @@ -1,6 +1,8 @@ --- title: "Implementation Overview" description: "High-level implementation plan for configuring, onboarding, funding, and moving money" +icon: "/images/icons/code.svg" +"og:image": "/images/og/og-global-p2p.png" --- This page gives you a 10,000‑ft view of an end‑to‑end implementation. It is intentionally generalized because the flow supports multiple customer types and external account types (e.g., CLABE, IBAN, US accounts, UPI). The detailed guides that follow provide concrete fields, edge cases, and step‑by‑step instructions. diff --git a/mintlify/global-p2p/getting-started/platform-configuration.mdx b/mintlify/global-p2p/getting-started/platform-configuration.mdx index 8e44ad25..f79ac55c 100644 --- a/mintlify/global-p2p/getting-started/platform-configuration.mdx +++ b/mintlify/global-p2p/getting-started/platform-configuration.mdx @@ -1,6 +1,8 @@ --- title: "Platform Configuration" description: "Configuring credentials, webhooks and currencies for your platform global P2P payments" +icon: "/images/icons/settings-gear2.svg" +"og:image": "/images/og/og-global-p2p.png" --- import PlatformConfigAPI from '/snippets/platform-config-currency-api-webhooks.mdx'; import { topLevelProductName } from '/snippets/variables.mdx'; diff --git a/mintlify/global-p2p/index.mdx b/mintlify/global-p2p/index.mdx index 80370153..5afc23c1 100644 --- a/mintlify/global-p2p/index.mdx +++ b/mintlify/global-p2p/index.mdx @@ -1,23 +1,33 @@ --- -title: "Introduction" -description: "Overview of Global P2P: capabilities, flows" +title: "Global P2P" +sidebarTitle: "Introduction" +icon: "/images/icons/at.svg" +mode: "wide" +"og:image": "/images/og/og-global-p2p.png" --- import { remittanceProductName, topLevelProductName } from '/snippets/variables.mdx'; import PaymentFlow from '/snippets/payment-flow.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + +Global P2P hero With {remittanceProductName}, you can send and receive low cost real-time payments to bank accounts and UMA addresses worldwide through a single, simple API. {topLevelProductName} automatically routes each payment across its network of Grid switches, handling FX, blockchain settlement, and instant banking off-ramps for you. - - - {remittanceProductName} interacts with the Money Grid to route your payments globally. - - + + + {remittanceProductName} interacts with the Money Grid to route your payments globally. + + Leverages local instant banking rails and global low latency crypto rails to settle payments in real-time. - - + + Leverages local instant banking rails and global low latency crypto rails to settle payments in real-time. - - + + For background on the UMA protocol itself, see the UMA Standard documentation: [UMA Standard—Introduction](https://docs.uma.me/uma-standard/introduction). diff --git a/mintlify/global-p2p/managing-accounts/external-accounts.mdx b/mintlify/global-p2p/managing-accounts/external-accounts.mdx index 9577affa..5559a27e 100644 --- a/mintlify/global-p2p/managing-accounts/external-accounts.mdx +++ b/mintlify/global-p2p/managing-accounts/external-accounts.mdx @@ -1,6 +1,8 @@ --- title: "External Accounts" description: "Register and manage beneficiary bank accounts" +icon: "/images/icons/bank.svg" +"og:image": "/images/og/og-global-p2p.png" --- import ExternalAccounts from '/snippets/external-accounts.mdx'; diff --git a/mintlify/global-p2p/managing-accounts/internal-accounts.mdx b/mintlify/global-p2p/managing-accounts/internal-accounts.mdx index b787d2e8..77bdd790 100644 --- a/mintlify/global-p2p/managing-accounts/internal-accounts.mdx +++ b/mintlify/global-p2p/managing-accounts/internal-accounts.mdx @@ -1,6 +1,8 @@ --- title: "Internal Accounts" description: "Create and manage internal accounts" +icon: "/images/icons/wallet1.svg" +"og:image": "/images/og/og-global-p2p.png" --- import InternalAccounts from '/snippets/internal-accounts.mdx'; diff --git a/mintlify/global-p2p/managing-accounts/plaid.mdx b/mintlify/global-p2p/managing-accounts/plaid.mdx index 29cc23e5..9adb151f 100644 --- a/mintlify/global-p2p/managing-accounts/plaid.mdx +++ b/mintlify/global-p2p/managing-accounts/plaid.mdx @@ -1,6 +1,8 @@ --- title: "External Accounts with Plaid" description: "Simplify bank account linking with Plaid" +icon: "/images/icons/IconPlaid.svg" +"og:image": "/images/og/og-global-p2p.png" --- import PlaidIntegration from '/snippets/plaid-integration.mdx'; diff --git a/mintlify/global-p2p/onboarding-customers/configuring-customers.mdx b/mintlify/global-p2p/onboarding-customers/configuring-customers.mdx index e6805e3b..23907144 100644 --- a/mintlify/global-p2p/onboarding-customers/configuring-customers.mdx +++ b/mintlify/global-p2p/onboarding-customers/configuring-customers.mdx @@ -1,6 +1,8 @@ --- title: "Configuring Customers" description: "Creating and managing customers for global P2P payments" +icon: "/images/icons/people.svg" +"og:image": "/images/og/og-global-p2p.png" --- import KycWebhooks from '/snippets/kyc/kyc-webhooks.mdx' import CustomerTypes from '/snippets/creating-customers/customer-types.mdx' diff --git a/mintlify/global-p2p/onboarding-customers/invitations.mdx b/mintlify/global-p2p/onboarding-customers/invitations.mdx index afb154ee..56fcae13 100644 --- a/mintlify/global-p2p/onboarding-customers/invitations.mdx +++ b/mintlify/global-p2p/onboarding-customers/invitations.mdx @@ -1,5 +1,7 @@ --- title: "Invitations" +icon: "/images/icons/people-add.svg" +"og:image": "/images/og/og-global-p2p.png" --- The Grid API provides an invitation system that allows platform customers to invite others to create accounts and receive payments. This guide explains how to use the invitation system effectively. diff --git a/mintlify/global-p2p/platform-tools/postman-collection.mdx b/mintlify/global-p2p/platform-tools/postman-collection.mdx index cfaee6ea..5ec2d975 100644 --- a/mintlify/global-p2p/platform-tools/postman-collection.mdx +++ b/mintlify/global-p2p/platform-tools/postman-collection.mdx @@ -1,5 +1,7 @@ --- title: "Postman Collection" +icon: "/images/icons/IconPostman.svg" +"og:image": "/images/og/og-global-p2p.png" --- import PostmanCollection from '/snippets/postman-collection.mdx'; diff --git a/mintlify/global-p2p/platform-tools/sandbox-testing.mdx b/mintlify/global-p2p/platform-tools/sandbox-testing.mdx index ec4fe573..20c21028 100644 --- a/mintlify/global-p2p/platform-tools/sandbox-testing.mdx +++ b/mintlify/global-p2p/platform-tools/sandbox-testing.mdx @@ -1,5 +1,7 @@ --- title: "Sandbox Testing" +icon: "/images/icons/hammer.svg" +"og:image": "/images/og/og-global-p2p.png" --- The Grid sandbox environment allows you to test your integration without making real payments. When you set up your account, you can configure production and sandbox API tokens. The sandbox token is specifically for testing and development purposes. It corresponds to a separate platform instance in "sandbox" mode, which can only transact with the sandbox UMA addresses for testing. diff --git a/mintlify/global-p2p/platform-tools/uma-test-wallet.mdx b/mintlify/global-p2p/platform-tools/uma-test-wallet.mdx index d97b79b6..94b4637a 100644 --- a/mintlify/global-p2p/platform-tools/uma-test-wallet.mdx +++ b/mintlify/global-p2p/platform-tools/uma-test-wallet.mdx @@ -1,6 +1,8 @@ --- title: "UMA Test Wallet" description: "Test UMA payment flows with a real counterparty" +icon: "/images/icons/wallet1.svg" +"og:image": "/images/og/og-global-p2p.png" --- Grid provides a UMA Test Wallet to help you test UMA payment flows with a real counterparty. diff --git a/mintlify/global-p2p/platform-tools/webhooks.mdx b/mintlify/global-p2p/platform-tools/webhooks.mdx index 5ed3d984..e1531034 100644 --- a/mintlify/global-p2p/platform-tools/webhooks.mdx +++ b/mintlify/global-p2p/platform-tools/webhooks.mdx @@ -1,6 +1,8 @@ --- title: "Webhooks" description: "Security best practices for webhook verification" +icon: "/images/icons/bell.svg" +"og:image": "/images/og/og-global-p2p.png" --- import Webhooks from '/snippets/webhooks.mdx'; diff --git a/mintlify/global-p2p/quickstart.mdx b/mintlify/global-p2p/quickstart.mdx index 5c5483dc..e149a271 100644 --- a/mintlify/global-p2p/quickstart.mdx +++ b/mintlify/global-p2p/quickstart.mdx @@ -1,9 +1,22 @@ --- title: "Quickstart" description: "Send your first cross-border payment" +icon: "/images/icons/rocket.svg" +"og:image": "/images/og/og-global-p2p.png" --- import { remittanceProductName } from '/snippets/variables.mdx' +Global P2P quickstart hero +Global P2P quickstart hero + With Global P2P you can send and receive payments in any supported fiat or crypto currency. This quickstart guides you through a regulated FI sending an individual customer payment from the US to a bank account in Mexico using USDC just-in-time funding. For examples funding with real time fiat rails, see the [Sending Payments](/global-p2p/sending-receiving-payments/sending-payments) guide. ## Understanding Entity Mapping for Remittances diff --git a/mintlify/global-p2p/sending-receiving-payments/depositing-funds.mdx b/mintlify/global-p2p/sending-receiving-payments/depositing-funds.mdx index 6bc5b142..e76528d1 100644 --- a/mintlify/global-p2p/sending-receiving-payments/depositing-funds.mdx +++ b/mintlify/global-p2p/sending-receiving-payments/depositing-funds.mdx @@ -1,6 +1,8 @@ --- title: "Depositing Funds" description: "Depositing funds into internal accounts" +icon: "/images/icons/arrow-inbox.svg" +"og:image": "/images/og/og-global-p2p.png" --- import DepositingFunds from '/snippets/depositing-funds.mdx'; diff --git a/mintlify/global-p2p/sending-receiving-payments/error-handling.mdx b/mintlify/global-p2p/sending-receiving-payments/error-handling.mdx index 64b39856..52f153c7 100644 --- a/mintlify/global-p2p/sending-receiving-payments/error-handling.mdx +++ b/mintlify/global-p2p/sending-receiving-payments/error-handling.mdx @@ -1,6 +1,8 @@ --- title: "Error Handling" description: "Handle payment failures, API errors, and transaction issues in Global P2P" +icon: "/images/icons/shield.svg" +"og:image": "/images/og/og-global-p2p.png" --- import ErrorHandling from '/snippets/error-handling.mdx' diff --git a/mintlify/global-p2p/sending-receiving-payments/receiving-payments.mdx b/mintlify/global-p2p/sending-receiving-payments/receiving-payments.mdx index 636ed38c..cad485d5 100644 --- a/mintlify/global-p2p/sending-receiving-payments/receiving-payments.mdx +++ b/mintlify/global-p2p/sending-receiving-payments/receiving-payments.mdx @@ -1,6 +1,8 @@ --- title: "Receiving Payments" description: "Receiving payments from UMA addresses" +icon: "/images/icons/arrow-inbox.svg" +"og:image": "/images/og/og-global-p2p.png" --- This guide explains how to enable your customers to receive UMA payments. When an external sender initiates a payment to your customer's UMA address, the Grid API requests the counterparty fields you defined in your platform configuration. You can review the counterparty and transaction details for risk before approving the payment. diff --git a/mintlify/global-p2p/sending-receiving-payments/reconciliation.mdx b/mintlify/global-p2p/sending-receiving-payments/reconciliation.mdx index 2ce924bb..c74421c7 100644 --- a/mintlify/global-p2p/sending-receiving-payments/reconciliation.mdx +++ b/mintlify/global-p2p/sending-receiving-payments/reconciliation.mdx @@ -1,6 +1,8 @@ --- title: "Reconciliation" description: "Reconciliation of payments" +icon: "/images/icons/checkmark1.svg" +"og:image": "/images/og/og-global-p2p.png" --- import Reconciliation from '/snippets/reconciliation/reconciliation.mdx' diff --git a/mintlify/global-p2p/sending-receiving-payments/sending-payments.mdx b/mintlify/global-p2p/sending-receiving-payments/sending-payments.mdx index 3bde186d..4a47a30c 100644 --- a/mintlify/global-p2p/sending-receiving-payments/sending-payments.mdx +++ b/mintlify/global-p2p/sending-receiving-payments/sending-payments.mdx @@ -1,5 +1,7 @@ --- title: "Sending Payments" +icon: "/images/icons/paper-plane-top-right.svg" +"og:image": "/images/og/og-global-p2p.png" --- This guide covers three methods to send payments: diff --git a/mintlify/global-p2p/terminology.mdx b/mintlify/global-p2p/terminology.mdx index 8e1a67ab..165ea044 100644 --- a/mintlify/global-p2p/terminology.mdx +++ b/mintlify/global-p2p/terminology.mdx @@ -1,6 +1,8 @@ --- title: "Core Concepts" description: "Core concepts and terminology for the Grid API" +icon: "/images/icons/file-text.svg" +"og:image": "/images/og/og-global-p2p.png" --- import Terminology from '/snippets/terminology.mdx'; diff --git a/mintlify/homepage.js b/mintlify/homepage.js new file mode 100644 index 00000000..57146a78 --- /dev/null +++ b/mintlify/homepage.js @@ -0,0 +1,29 @@ +// Add 'is-homepage' class to body when on the homepage +// This allows us to target homepage-specific CSS + +(function() { + function checkHomepage() { + const path = window.location.pathname; + const isHomepage = path === '/' || path === '/index' || path === ''; + + if (isHomepage) { + document.body.classList.add('is-homepage'); + } else { + document.body.classList.remove('is-homepage'); + } + } + + // Run on initial load + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', checkHomepage); + } else { + checkHomepage(); + } + + // Also run on navigation (for SPA-style navigation) + window.addEventListener('popstate', checkHomepage); + + // Observe URL changes for client-side routing + const observer = new MutationObserver(checkHomepage); + observer.observe(document.body, { childList: true, subtree: true }); +})(); diff --git a/mintlify/images/entities-dark.svg b/mintlify/images/entities-dark.svg new file mode 100644 index 00000000..61922400 --- /dev/null +++ b/mintlify/images/entities-dark.svg @@ -0,0 +1,207 @@ + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/mintlify/images/entities-light.svg b/mintlify/images/entities-light.svg new file mode 100644 index 00000000..802bf98d --- /dev/null +++ b/mintlify/images/entities-light.svg @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-capabilities-dark.svg b/mintlify/images/heroes/hero-capabilities-dark.svg new file mode 100644 index 00000000..1ba98d9f --- /dev/null +++ b/mintlify/images/heroes/hero-capabilities-dark.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-capabilities-light.svg b/mintlify/images/heroes/hero-capabilities-light.svg new file mode 100644 index 00000000..fc4605ca --- /dev/null +++ b/mintlify/images/heroes/hero-capabilities-light.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-globalp2p.jpg b/mintlify/images/heroes/hero-globalp2p.jpg new file mode 100644 index 00000000..10932913 Binary files /dev/null and b/mintlify/images/heroes/hero-globalp2p.jpg differ diff --git a/mintlify/images/heroes/hero-payouts.jpg b/mintlify/images/heroes/hero-payouts.jpg new file mode 100644 index 00000000..b73e9014 Binary files /dev/null and b/mintlify/images/heroes/hero-payouts.jpg differ diff --git a/mintlify/images/heroes/hero-quickstart-globalp2p-dark.svg b/mintlify/images/heroes/hero-quickstart-globalp2p-dark.svg new file mode 100644 index 00000000..4df984de --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-globalp2p-dark.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/mintlify/images/heroes/hero-quickstart-globalp2p-light.svg b/mintlify/images/heroes/hero-quickstart-globalp2p-light.svg new file mode 100644 index 00000000..753314c5 --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-globalp2p-light.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/mintlify/images/heroes/hero-quickstart-payouts-dark.svg b/mintlify/images/heroes/hero-quickstart-payouts-dark.svg new file mode 100644 index 00000000..533e7dfd --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-payouts-dark.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-quickstart-payouts-light.svg b/mintlify/images/heroes/hero-quickstart-payouts-light.svg new file mode 100644 index 00000000..c9f74ede --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-payouts-light.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-quickstart-ramps-dark.svg b/mintlify/images/heroes/hero-quickstart-ramps-dark.svg new file mode 100644 index 00000000..97071277 --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-ramps-dark.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-quickstart-ramps-light.svg b/mintlify/images/heroes/hero-quickstart-ramps-light.svg new file mode 100644 index 00000000..7677fb0b --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-ramps-light.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-quickstart-rewards-dark.svg b/mintlify/images/heroes/hero-quickstart-rewards-dark.svg new file mode 100644 index 00000000..455c8cbb --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-rewards-dark.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-quickstart-rewards-light.svg b/mintlify/images/heroes/hero-quickstart-rewards-light.svg new file mode 100644 index 00000000..119e10e5 --- /dev/null +++ b/mintlify/images/heroes/hero-quickstart-rewards-light.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-ramps.jpg b/mintlify/images/heroes/hero-ramps.jpg new file mode 100644 index 00000000..180b90cd Binary files /dev/null and b/mintlify/images/heroes/hero-ramps.jpg differ diff --git a/mintlify/images/heroes/hero-rewards.jpg b/mintlify/images/heroes/hero-rewards.jpg new file mode 100644 index 00000000..98dde261 Binary files /dev/null and b/mintlify/images/heroes/hero-rewards.jpg differ diff --git a/mintlify/images/heroes/hero-what-is-grid-dark.jpg b/mintlify/images/heroes/hero-what-is-grid-dark.jpg new file mode 100644 index 00000000..22f5517c Binary files /dev/null and b/mintlify/images/heroes/hero-what-is-grid-dark.jpg differ diff --git a/mintlify/images/heroes/hero-what-is-grid-dark.svg b/mintlify/images/heroes/hero-what-is-grid-dark.svg new file mode 100644 index 00000000..35228575 --- /dev/null +++ b/mintlify/images/heroes/hero-what-is-grid-dark.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/heroes/hero-what-is-grid-light.jpg b/mintlify/images/heroes/hero-what-is-grid-light.jpg new file mode 100644 index 00000000..c7b09bd9 Binary files /dev/null and b/mintlify/images/heroes/hero-what-is-grid-light.jpg differ diff --git a/mintlify/images/heroes/hero-what-is-grid-light.svg b/mintlify/images/heroes/hero-what-is-grid-light.svg new file mode 100644 index 00000000..a2812405 --- /dev/null +++ b/mintlify/images/heroes/hero-what-is-grid-light.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/home/hero-landscape.png b/mintlify/images/home/hero-landscape.png new file mode 100644 index 00000000..98851d00 Binary files /dev/null and b/mintlify/images/home/hero-landscape.png differ diff --git a/mintlify/images/home/payout-preview.png b/mintlify/images/home/payout-preview.png new file mode 100644 index 00000000..98851d00 Binary files /dev/null and b/mintlify/images/home/payout-preview.png differ diff --git a/mintlify/images/home/placeholder-use-case.png b/mintlify/images/home/placeholder-use-case.png new file mode 100644 index 00000000..9328de2b Binary files /dev/null and b/mintlify/images/home/placeholder-use-case.png differ diff --git a/mintlify/images/home/sand.png b/mintlify/images/home/sand.png new file mode 100644 index 00000000..70834a62 Binary files /dev/null and b/mintlify/images/home/sand.png differ diff --git a/mintlify/images/icons/IconNewspaper2.svg b/mintlify/images/icons/IconNewspaper2.svg new file mode 100644 index 00000000..426b0c39 --- /dev/null +++ b/mintlify/images/icons/IconNewspaper2.svg @@ -0,0 +1,3 @@ + + + diff --git a/mintlify/images/icons/IconPlaid.svg b/mintlify/images/icons/IconPlaid.svg new file mode 100644 index 00000000..27290aa6 --- /dev/null +++ b/mintlify/images/icons/IconPlaid.svg @@ -0,0 +1,3 @@ + + + diff --git a/mintlify/images/icons/IconPostman.svg b/mintlify/images/icons/IconPostman.svg new file mode 100644 index 00000000..c0b92dc4 --- /dev/null +++ b/mintlify/images/icons/IconPostman.svg @@ -0,0 +1,3 @@ + + + diff --git a/mintlify/images/icons/agent.svg b/mintlify/images/icons/agent.svg new file mode 100644 index 00000000..e28d94c3 --- /dev/null +++ b/mintlify/images/icons/agent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/arrow-expand-hor.svg b/mintlify/images/icons/arrow-expand-hor.svg new file mode 100644 index 00000000..38a57b02 --- /dev/null +++ b/mintlify/images/icons/arrow-expand-hor.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/arrow-inbox.svg b/mintlify/images/icons/arrow-inbox.svg new file mode 100644 index 00000000..048895f8 --- /dev/null +++ b/mintlify/images/icons/arrow-inbox.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/arrow-left-right.svg b/mintlify/images/icons/arrow-left-right.svg new file mode 100644 index 00000000..772059c4 --- /dev/null +++ b/mintlify/images/icons/arrow-left-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/arrows-repeat-circle.svg b/mintlify/images/icons/arrows-repeat-circle.svg new file mode 100644 index 00000000..f45fca27 --- /dev/null +++ b/mintlify/images/icons/arrows-repeat-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/at.svg b/mintlify/images/icons/at.svg new file mode 100644 index 00000000..ce380625 --- /dev/null +++ b/mintlify/images/icons/at.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/bank.svg b/mintlify/images/icons/bank.svg new file mode 100644 index 00000000..afcd5546 --- /dev/null +++ b/mintlify/images/icons/bank.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/banknote1.svg b/mintlify/images/icons/banknote1.svg new file mode 100644 index 00000000..0973ca1d --- /dev/null +++ b/mintlify/images/icons/banknote1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/bell.svg b/mintlify/images/icons/bell.svg new file mode 100644 index 00000000..a37763a3 --- /dev/null +++ b/mintlify/images/icons/bell.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/bitcoin.svg b/mintlify/images/icons/bitcoin.svg new file mode 100644 index 00000000..5476e67a --- /dev/null +++ b/mintlify/images/icons/bitcoin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/blocks.svg b/mintlify/images/icons/blocks.svg new file mode 100644 index 00000000..5e6fe00c --- /dev/null +++ b/mintlify/images/icons/blocks.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/bubble-annotation5.svg b/mintlify/images/icons/bubble-annotation5.svg new file mode 100644 index 00000000..d0e412da --- /dev/null +++ b/mintlify/images/icons/bubble-annotation5.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/bubble-question.svg b/mintlify/images/icons/bubble-question.svg new file mode 100644 index 00000000..cb7507c1 --- /dev/null +++ b/mintlify/images/icons/bubble-question.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/calendar2.svg b/mintlify/images/icons/calendar2.svg new file mode 100644 index 00000000..9230a302 --- /dev/null +++ b/mintlify/images/icons/calendar2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/car-front-view.svg b/mintlify/images/icons/car-front-view.svg new file mode 100644 index 00000000..6ba36281 --- /dev/null +++ b/mintlify/images/icons/car-front-view.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/checkmark1.svg b/mintlify/images/icons/checkmark1.svg new file mode 100644 index 00000000..135ad542 --- /dev/null +++ b/mintlify/images/icons/checkmark1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/code.svg b/mintlify/images/icons/code.svg new file mode 100644 index 00000000..8d2bf3c4 --- /dev/null +++ b/mintlify/images/icons/code.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/coins.svg b/mintlify/images/icons/coins.svg new file mode 100644 index 00000000..2f88ddde --- /dev/null +++ b/mintlify/images/icons/coins.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/credit-card1.svg b/mintlify/images/icons/credit-card1.svg new file mode 100644 index 00000000..19852712 --- /dev/null +++ b/mintlify/images/icons/credit-card1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/crypto-wallet.svg b/mintlify/images/icons/crypto-wallet.svg new file mode 100644 index 00000000..91f3af90 --- /dev/null +++ b/mintlify/images/icons/crypto-wallet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/file-text.svg b/mintlify/images/icons/file-text.svg new file mode 100644 index 00000000..3ffaf90e --- /dev/null +++ b/mintlify/images/icons/file-text.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/gift1.svg b/mintlify/images/icons/gift1.svg new file mode 100644 index 00000000..be7d1daf --- /dev/null +++ b/mintlify/images/icons/gift1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/github.svg b/mintlify/images/icons/github.svg new file mode 100644 index 00000000..ca168cf6 --- /dev/null +++ b/mintlify/images/icons/github.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/globe.svg b/mintlify/images/icons/globe.svg new file mode 100644 index 00000000..f48ec9c3 --- /dev/null +++ b/mintlify/images/icons/globe.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/grid-icon.svg b/mintlify/images/icons/grid-icon.svg new file mode 100644 index 00000000..cdd5b684 --- /dev/null +++ b/mintlify/images/icons/grid-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/mintlify/images/icons/grid-logo.svg b/mintlify/images/icons/grid-logo.svg new file mode 100644 index 00000000..213f29aa --- /dev/null +++ b/mintlify/images/icons/grid-logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/mintlify/images/icons/hammer.svg b/mintlify/images/icons/hammer.svg new file mode 100644 index 00000000..58393e21 --- /dev/null +++ b/mintlify/images/icons/hammer.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/key2.svg b/mintlify/images/icons/key2.svg new file mode 100644 index 00000000..f988f39e --- /dev/null +++ b/mintlify/images/icons/key2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/light-bulb.svg b/mintlify/images/icons/light-bulb.svg new file mode 100644 index 00000000..02ba0b28 --- /dev/null +++ b/mintlify/images/icons/light-bulb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/lightning.svg b/mintlify/images/icons/lightning.svg new file mode 100644 index 00000000..b50fd9ac --- /dev/null +++ b/mintlify/images/icons/lightning.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/linkedin.svg b/mintlify/images/icons/linkedin.svg new file mode 100644 index 00000000..1c89b013 --- /dev/null +++ b/mintlify/images/icons/linkedin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/lock.svg b/mintlify/images/icons/lock.svg new file mode 100644 index 00000000..0acd8588 --- /dev/null +++ b/mintlify/images/icons/lock.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/money-hand.svg b/mintlify/images/icons/money-hand.svg new file mode 100644 index 00000000..57883188 --- /dev/null +++ b/mintlify/images/icons/money-hand.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/multi-media.svg b/mintlify/images/icons/multi-media.svg new file mode 100644 index 00000000..6a438894 --- /dev/null +++ b/mintlify/images/icons/multi-media.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/paper-plane-top-right.svg b/mintlify/images/icons/paper-plane-top-right.svg new file mode 100644 index 00000000..4d0e49e0 --- /dev/null +++ b/mintlify/images/icons/paper-plane-top-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/people-add.svg b/mintlify/images/icons/people-add.svg new file mode 100644 index 00000000..d2ecbcfd --- /dev/null +++ b/mintlify/images/icons/people-add.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/people.svg b/mintlify/images/icons/people.svg new file mode 100644 index 00000000..5f395533 --- /dev/null +++ b/mintlify/images/icons/people.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/receipt-check.svg b/mintlify/images/icons/receipt-check.svg new file mode 100644 index 00000000..59d1ef17 --- /dev/null +++ b/mintlify/images/icons/receipt-check.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/repeat.svg b/mintlify/images/icons/repeat.svg new file mode 100644 index 00000000..c7d6321d --- /dev/null +++ b/mintlify/images/icons/repeat.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/rocket.svg b/mintlify/images/icons/rocket.svg new file mode 100644 index 00000000..c458032b --- /dev/null +++ b/mintlify/images/icons/rocket.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/sandbox.svg b/mintlify/images/icons/sandbox.svg new file mode 100644 index 00000000..9c41bb79 --- /dev/null +++ b/mintlify/images/icons/sandbox.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/settings-gear2.svg b/mintlify/images/icons/settings-gear2.svg new file mode 100644 index 00000000..e23d6026 --- /dev/null +++ b/mintlify/images/icons/settings-gear2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/shield.svg b/mintlify/images/icons/shield.svg new file mode 100644 index 00000000..3f615485 --- /dev/null +++ b/mintlify/images/icons/shield.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/shipping.svg b/mintlify/images/icons/shipping.svg new file mode 100644 index 00000000..8c6c6e6e --- /dev/null +++ b/mintlify/images/icons/shipping.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/square-info.svg b/mintlify/images/icons/square-info.svg new file mode 100644 index 00000000..515e004a --- /dev/null +++ b/mintlify/images/icons/square-info.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mintlify/images/icons/store4.svg b/mintlify/images/icons/store4.svg new file mode 100644 index 00000000..dc79337f --- /dev/null +++ b/mintlify/images/icons/store4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/suitcase-work.svg b/mintlify/images/icons/suitcase-work.svg new file mode 100644 index 00000000..0e506043 --- /dev/null +++ b/mintlify/images/icons/suitcase-work.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/icons/toggle.svg b/mintlify/images/icons/toggle.svg new file mode 100644 index 00000000..6f18f19d --- /dev/null +++ b/mintlify/images/icons/toggle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/mintlify/images/icons/wallet1.svg b/mintlify/images/icons/wallet1.svg new file mode 100644 index 00000000..97e4ae7a --- /dev/null +++ b/mintlify/images/icons/wallet1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/mintlify/images/logos/bitso.svg b/mintlify/images/logos/bitso.svg new file mode 100644 index 00000000..921d4181 --- /dev/null +++ b/mintlify/images/logos/bitso.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mintlify/images/logos/coinbase.svg b/mintlify/images/logos/coinbase.svg new file mode 100644 index 00000000..d985a614 --- /dev/null +++ b/mintlify/images/logos/coinbase.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/mintlify/images/logos/nu.svg b/mintlify/images/logos/nu.svg new file mode 100644 index 00000000..2e8d7b05 --- /dev/null +++ b/mintlify/images/logos/nu.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/mintlify/images/logos/revolut.svg b/mintlify/images/logos/revolut.svg new file mode 100644 index 00000000..9076afaf --- /dev/null +++ b/mintlify/images/logos/revolut.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mintlify/images/logos/sofi.svg b/mintlify/images/logos/sofi.svg new file mode 100644 index 00000000..ed2f0699 --- /dev/null +++ b/mintlify/images/logos/sofi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/mintlify/images/og/og-api-reference.png b/mintlify/images/og/og-api-reference.png new file mode 100644 index 00000000..d8c11478 Binary files /dev/null and b/mintlify/images/og/og-api-reference.png differ diff --git a/mintlify/images/og/og-fallback-bg.png b/mintlify/images/og/og-fallback-bg.png new file mode 100644 index 00000000..1b803562 Binary files /dev/null and b/mintlify/images/og/og-fallback-bg.png differ diff --git a/mintlify/images/og/og-get-started.png b/mintlify/images/og/og-get-started.png new file mode 100644 index 00000000..8af8c28a Binary files /dev/null and b/mintlify/images/og/og-get-started.png differ diff --git a/mintlify/images/og/og-global-p2p.png b/mintlify/images/og/og-global-p2p.png new file mode 100644 index 00000000..22cca83d Binary files /dev/null and b/mintlify/images/og/og-global-p2p.png differ diff --git a/mintlify/images/og/og-payouts-b2b.png b/mintlify/images/og/og-payouts-b2b.png new file mode 100644 index 00000000..1518f615 Binary files /dev/null and b/mintlify/images/og/og-payouts-b2b.png differ diff --git a/mintlify/images/og/og-ramps.png b/mintlify/images/og/og-ramps.png new file mode 100644 index 00000000..1224bfe1 Binary files /dev/null and b/mintlify/images/og/og-ramps.png differ diff --git a/mintlify/images/og/og-rewards.png b/mintlify/images/og/og-rewards.png new file mode 100644 index 00000000..6efc62aa Binary files /dev/null and b/mintlify/images/og/og-rewards.png differ diff --git a/mintlify/images/use-cases/global-p2p-remittances.jpg b/mintlify/images/use-cases/global-p2p-remittances.jpg new file mode 100644 index 00000000..ab04a11d Binary files /dev/null and b/mintlify/images/use-cases/global-p2p-remittances.jpg differ diff --git a/mintlify/images/use-cases/global-p2p-uma.jpg b/mintlify/images/use-cases/global-p2p-uma.jpg new file mode 100644 index 00000000..f9412569 Binary files /dev/null and b/mintlify/images/use-cases/global-p2p-uma.jpg differ diff --git a/mintlify/images/use-cases/payouts-b2b-creators.jpg b/mintlify/images/use-cases/payouts-b2b-creators.jpg new file mode 100644 index 00000000..35408dc9 Binary files /dev/null and b/mintlify/images/use-cases/payouts-b2b-creators.jpg differ diff --git a/mintlify/images/use-cases/payouts-b2b-marketplace.jpg b/mintlify/images/use-cases/payouts-b2b-marketplace.jpg new file mode 100644 index 00000000..92fdd37f Binary files /dev/null and b/mintlify/images/use-cases/payouts-b2b-marketplace.jpg differ diff --git a/mintlify/images/use-cases/payouts-b2b-payroll.jpg b/mintlify/images/use-cases/payouts-b2b-payroll.jpg new file mode 100644 index 00000000..1c295fdb Binary files /dev/null and b/mintlify/images/use-cases/payouts-b2b-payroll.jpg differ diff --git a/mintlify/images/use-cases/payouts-b2b-suppliers.jpg b/mintlify/images/use-cases/payouts-b2b-suppliers.jpg new file mode 100644 index 00000000..20f251e9 Binary files /dev/null and b/mintlify/images/use-cases/payouts-b2b-suppliers.jpg differ diff --git a/mintlify/images/use-cases/ramps-buy-btc.jpg b/mintlify/images/use-cases/ramps-buy-btc.jpg new file mode 100644 index 00000000..d4195eef Binary files /dev/null and b/mintlify/images/use-cases/ramps-buy-btc.jpg differ diff --git a/mintlify/images/use-cases/ramps-offramp-usdc.jpg b/mintlify/images/use-cases/ramps-offramp-usdc.jpg new file mode 100644 index 00000000..0fd0a61d Binary files /dev/null and b/mintlify/images/use-cases/ramps-offramp-usdc.jpg differ diff --git a/mintlify/images/use-cases/ramps-on-ramp-usdc.jpg b/mintlify/images/use-cases/ramps-on-ramp-usdc.jpg new file mode 100644 index 00000000..e00758a5 Binary files /dev/null and b/mintlify/images/use-cases/ramps-on-ramp-usdc.jpg differ diff --git a/mintlify/images/use-cases/ramps-sell-btc.jpg b/mintlify/images/use-cases/ramps-sell-btc.jpg new file mode 100644 index 00000000..1b65ddc9 Binary files /dev/null and b/mintlify/images/use-cases/ramps-sell-btc.jpg differ diff --git a/mintlify/images/use-cases/rewards-cashback.jpg b/mintlify/images/use-cases/rewards-cashback.jpg new file mode 100644 index 00000000..ce37c2c6 Binary files /dev/null and b/mintlify/images/use-cases/rewards-cashback.jpg differ diff --git a/mintlify/images/use-cases/rewards-redeem.jpg b/mintlify/images/use-cases/rewards-redeem.jpg new file mode 100644 index 00000000..a871308b Binary files /dev/null and b/mintlify/images/use-cases/rewards-redeem.jpg differ diff --git a/mintlify/images/use-cases/rewards-refer.jpg b/mintlify/images/use-cases/rewards-refer.jpg new file mode 100644 index 00000000..66872fd8 Binary files /dev/null and b/mintlify/images/use-cases/rewards-refer.jpg differ diff --git a/mintlify/index.mdx b/mintlify/index.mdx index d0475056..d940fed8 100644 --- a/mintlify/index.mdx +++ b/mintlify/index.mdx @@ -1,189 +1,316 @@ --- -title: "Lightspark Grid" -mode: "custom" +title: "" +sidebarTitle: "Welcome" +icon: "/images/icons/grid-logo.svg" +mode: "wide" +"og:image": "/images/og/og-get-started.png" +seo: + title: "Grid Documentation" + description: "Build applications that move money globally across fiat, stablecoins, and Bitcoin with a single API." --- -export const GridLogo = () => { - return ( - <> - Lightspark Grid - Lightspark Grid - - ); -}; +{/* ProductTiles Component */} +export const ProductTiles = ({ categories }) => { + const [activeCategory, setActiveCategory] = React.useState(categories[0].id); + const [activeItem, setActiveItem] = React.useState(categories[0].items[0]?.id); + + const currentCategory = categories.find((cat) => cat.id === activeCategory); + const currentItem = currentCategory?.items.find((item) => item.id === activeItem); -export const HeroCard = ({ title, description, href, icon, whiteIcon }) => { return ( - - Icon - Icon -
-

{title}

- {description} +
+
+ {categories.map((cat) => ( + + ))}
-
+
+
+ {currentCategory?.items.map((item) => ( +
setActiveItem(item.id)} + onMouseEnter={() => setActiveItem(item.id)} + className={`product-tiles-item ${activeItem === item.id ? 'active' : ''}`} + > + +
+
{item.title}
+
{item.description}
+ + Learn more → + +
+
+ ))} +
+
+ {currentCategory?.items.map((item) => ( + {item.title} + ))} +
+
+
); }; -
-
-
-
- - - Grid - +export const gridCategories = [ + { + id: 'payouts', + label: 'Payouts & B2B', + href: '/payouts-and-b2b/', + items: [ + { id: 'creators', title: 'Creator payouts', description: 'Pay creators and influencers instantly, anywhere they bank', icon: '/images/icons/multi-media.svg', image: '/images/use-cases/payouts-b2b-creators.jpg' }, + { id: 'payroll', title: 'Payroll & contractors', description: 'Send salaries and contractor payments globally with locked FX rates', icon: '/images/icons/suitcase-work.svg', image: '/images/use-cases/payouts-b2b-payroll.jpg' }, + { id: 'marketplace', title: 'Marketplace disbursements', description: 'Distribute earnings to sellers and service providers worldwide automatically', icon: '/images/icons/store4.svg', image: '/images/use-cases/payouts-b2b-marketplace.jpg' }, + { id: 'suppliers', title: 'Supplier/vendor payments', description: 'Pay international vendors and suppliers in their local currency, settled in seconds', icon: '/images/icons/shipping.svg', image: '/images/use-cases/payouts-b2b-suppliers.jpg' } + ] + }, + { + id: 'ramps', + label: 'Ramps', + href: '/ramps/', + items: [ + { id: 'buy-btc', title: 'Buy BTC', description: 'Let users purchase Bitcoin directly inside your app', icon: '/images/icons/bitcoin.svg', image: '/images/use-cases/ramps-buy-btc.jpg' }, + { id: 'sell-btc', title: 'Sell BTC', description: 'Convert Bitcoin to fiat and settle to any bank account', icon: '/images/icons/money-hand.svg', image: '/images/use-cases/ramps-sell-btc.jpg' }, + { id: 'wallet-funding', title: 'Wallet funding', description: 'On-ramp fiat to fund user wallets with stablecoins or BTC', icon: '/images/icons/crypto-wallet.svg', image: '/images/use-cases/ramps-on-ramp-usdc.jpg' }, + { id: 'fiat-settlement', title: 'Fiat settlement', description: 'Off-ramp digital assets to local bank rails in real time', icon: '/images/icons/bank.svg', image: '/images/use-cases/ramps-offramp-usdc.jpg' } + ] + }, + { + id: 'rewards', + label: 'Rewards', + href: '/rewards/', + items: [ + { id: 'cashback', title: 'BTC cashback', description: 'Give users Bitcoin back on purchases or actions', icon: '/images/icons/gift1.svg', image: '/images/use-cases/rewards-cashback.jpg' }, + { id: 'referrals', title: 'Referral incentives', description: 'Pay out BTC or fiat when users refer new customers', icon: '/images/icons/people-add.svg', image: '/images/use-cases/rewards-refer.jpg' }, + { id: 'loyalty', title: 'Loyalty programs', description: 'Build point-based or asset-based loyalty with real redemption value', icon: '/images/icons/repeat.svg', image: '/images/use-cases/rewards-redeem.jpg' } + ] + }, + { + id: 'global-p2p', + label: 'Global P2P', + href: '/global-p2p/', + items: [ + { id: 'remittances', title: 'Cross-border remittances', description: 'Move money across countries on the fastest, lowest-cost rails', icon: '/images/icons/globe.svg', image: '/images/use-cases/global-p2p-remittances.jpg' }, + { id: 'uma', title: 'Wallet-to-wallet (UMA)', description: 'Send and receive via UMA addresses across any participating app', icon: '/images/icons/at.svg', image: '/images/use-cases/global-p2p-uma.jpg' } + ] + } +]; + +{/* Wrap all custom content in not-prose for full styling control */} +
+ +{/* Hero Header - Two Column Layout */} +
+
+ Grid + Documentation +
+
+

Build applications and financial products that move money globally across fiat, stablecoins, and Bitcoin with a single API.

+
+
+ +{/* Hero Banner with Sand Dunes Image */} + +
+
+ Ready to test? Explore the Grid Sandbox + Request sandbox access +
+
+ +{/* Info Cards: Understand Grid & Start Building */} +
+
+ +
+
Understand Grid
+
Learn how Grid works before you integrate
-
-

- Commands for money. One API to send, - receive, and settle value globally. Fiat, stablecoins, or BTC. Always - real time, always low-cost, built on Bitcoin. -

+ -
- +
+
+ +
+
Start building
+
Jump into a quickstart guide
+
+
-
-
-
-

Build with Lightspark Grid

-

Choose your use case

+ +
+
+ Capabilities + Primitives for moving money +
+ + + + + +
+ +
+
+
+ +
Send
-
-
- - - - -
+
Move funds to any destination
+
+
+
+ +
Receive
+
Accept incoming funds
-
-
-
-
-

Resources

-

Explore, test, and integrate

+
+
+ +
Convert
-
-
- - - -
+
Exchange currencies and assets
+
+
+
+ +
Hold
+
+
Store multi-currency balances
+
+
+
+ +
Ramp
+
+
Bridge fiat and crypto
+
+
+
+ +
Bill
+
+
Invoice and collect payments
+
+
+
+ +
Program
+
+
Create programmable flows
+
+
+
+ +
Identify
+
KYC/KYB verification
-
-
- +
+ +
+
+ What you can build + Combine primitives, ship products
+ + + + +
+ + + +
+ +{/* Trusted By Section */} +
+ Building on Grid +
+ Coinbase + SoFi + Nu + Revolut + Bitso +
+
+ +{/* Divider Section */} +
+ +## Resources + + + +
{/* End not-prose homepage-content */} diff --git a/mintlify/logo/grid-logo.svg b/mintlify/logo/grid-logo.svg new file mode 100644 index 00000000..bbdf066c --- /dev/null +++ b/mintlify/logo/grid-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mintlify/payouts-and-b2b/depositing-funds/depositing-funds.mdx b/mintlify/payouts-and-b2b/depositing-funds/depositing-funds.mdx index d7fde2ac..2c48abe4 100644 --- a/mintlify/payouts-and-b2b/depositing-funds/depositing-funds.mdx +++ b/mintlify/payouts-and-b2b/depositing-funds/depositing-funds.mdx @@ -1,6 +1,8 @@ --- title: "Depositing Funds" description: "Depositing funds into internal accounts" +icon: "/images/icons/arrow-inbox.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import DepositingFunds from '/snippets/depositing-funds.mdx'; diff --git a/mintlify/payouts-and-b2b/depositing-funds/external-accounts.mdx b/mintlify/payouts-and-b2b/depositing-funds/external-accounts.mdx index d5736b41..430245b1 100644 --- a/mintlify/payouts-and-b2b/depositing-funds/external-accounts.mdx +++ b/mintlify/payouts-and-b2b/depositing-funds/external-accounts.mdx @@ -1,28 +1,25 @@ --- title: "External Accounts" description: "Add and manage external bank accounts, wallets, and payment destinations for withdrawals and payouts" +icon: "/images/icons/bank.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import ExternalAccounts from '/snippets/external-accounts.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; ## Next steps - - - Simplify external account setup with Plaid Link for instant bank verification - - - - Learn how to send international payments using external accounts - - - - View complete API documentation for external accounts - - + + + Simplify external account setup with Plaid Link for instant bank verification + + + Learn how to send international payments using external accounts + + + View complete API documentation for external accounts + + diff --git a/mintlify/payouts-and-b2b/depositing-funds/internal-accounts.mdx b/mintlify/payouts-and-b2b/depositing-funds/internal-accounts.mdx index 8902b682..e3e50294 100644 --- a/mintlify/payouts-and-b2b/depositing-funds/internal-accounts.mdx +++ b/mintlify/payouts-and-b2b/depositing-funds/internal-accounts.mdx @@ -1,28 +1,28 @@ --- title: "Internal Accounts" description: "Learn how to manage internal accounts for holding platform and customer funds" +icon: "/images/icons/wallet1.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import InternalAccounts from '/snippets/internal-accounts.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; ## Next steps - - -Learn how to add customer bank accounts as withdrawal destinations - - - -Simplify bank account verification with Plaid Link - - - -Use internal account balances to send international payments - - - -View complete API documentation for internal accounts - - + + + Learn how to add customer bank accounts as withdrawal destinations + + + Simplify bank account verification with Plaid Link + + + Use internal account balances to send international payments + + + View complete API documentation for internal accounts + + diff --git a/mintlify/payouts-and-b2b/depositing-funds/plaid.mdx b/mintlify/payouts-and-b2b/depositing-funds/plaid.mdx index 65fe4f78..af8040d8 100644 --- a/mintlify/payouts-and-b2b/depositing-funds/plaid.mdx +++ b/mintlify/payouts-and-b2b/depositing-funds/plaid.mdx @@ -1,32 +1,28 @@ --- title: "External Accounts with Plaid" description: "Simplify bank account verification with Plaid Link for external account setup" +icon: "/images/icons/IconPlaid.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import PlaidIntegration from '/snippets/plaid-integration.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; ## Next steps - - -Learn more about managing external accounts - - - - Transfer funds between internal and external accounts - - - - Set up webhook handling for account notifications - - - -View complete Plaid API documentation - - + + + Learn more about managing external accounts + + + Transfer funds between internal and external accounts + + + Set up webhook handling for account notifications + + + View complete Plaid API documentation + + diff --git a/mintlify/payouts-and-b2b/index.mdx b/mintlify/payouts-and-b2b/index.mdx index c57ff2e2..df66e0df 100644 --- a/mintlify/payouts-and-b2b/index.mdx +++ b/mintlify/payouts-and-b2b/index.mdx @@ -1,26 +1,35 @@ --- -title: "Introduction" -description: "Integrate Global payments quickly and easily" +title: "Payouts & B2B" +sidebarTitle: "Introduction" +icon: "/images/icons/paper-plane-top-right.svg" +mode: "wide" +"og:image": "/images/og/og-payouts-b2b.png" --- import { payToBankProductName, topLevelProductName } from '/snippets/variables.mdx'; import PaymentFlow from '/snippets/payment-flow.mdx'; import CountrySupport from '/snippets/country-support.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; -With {payToBankProductName}, you can send and receive low cost real-time payments to bank accounts worldwide through a single, simple API. {topLevelProductName} automatically routes each payment across its network of {topLevelProductName} switches, handling FX, blockchain settlement, and instant banking off-ramps for you. +Payouts & B2B hero +With {payToBankProductName}, you can send and receive low cost real-time payments to bank accounts worldwide through a single, simple API. {topLevelProductName} automatically routes each payment across its network of {topLevelProductName} switches, handling FX, blockchain settlement, and instant banking off-ramps for you. - - + + Single API, global reach. {payToBankProductName} interacts with the Money Grid to route your payments globally. - - + + No crypto handling. {payToBankProductName} converts between fiat and crypto instantly to simplify your implementation and minimize FX costs. - - + + Real-time settlement. Leverages local instant banking rails and global low latency crypto rails to settle payments in real-time. - - + + diff --git a/mintlify/payouts-and-b2b/onboarding/configuring-customers.mdx b/mintlify/payouts-and-b2b/onboarding/configuring-customers.mdx index d3bf13b5..6481f911 100644 --- a/mintlify/payouts-and-b2b/onboarding/configuring-customers.mdx +++ b/mintlify/payouts-and-b2b/onboarding/configuring-customers.mdx @@ -1,6 +1,8 @@ --- title: "Configuring Customers" description: "Configuring customers for Payouts" +icon: "/images/icons/people.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import KycRegulated from '/snippets/kyc/kyc-regulated.mdx' diff --git a/mintlify/payouts-and-b2b/onboarding/implementation-overview.mdx b/mintlify/payouts-and-b2b/onboarding/implementation-overview.mdx index 46a72703..6b5b6f14 100644 --- a/mintlify/payouts-and-b2b/onboarding/implementation-overview.mdx +++ b/mintlify/payouts-and-b2b/onboarding/implementation-overview.mdx @@ -1,5 +1,7 @@ --- title: "Implementation Overview" +icon: "/images/icons/code.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- This page gives you a 10,000‑ft view of an end‑to‑end implementation. It is intentionally generalized because the flow supports multiple customer types and external account types (e.g., CLABE, IBAN, US accounts, UPI). The detailed guides that follow provide concrete fields, edge cases, and step‑by‑step instructions. diff --git a/mintlify/payouts-and-b2b/onboarding/platform-configuration.mdx b/mintlify/payouts-and-b2b/onboarding/platform-configuration.mdx index e9a631aa..29b25a5b 100644 --- a/mintlify/payouts-and-b2b/onboarding/platform-configuration.mdx +++ b/mintlify/payouts-and-b2b/onboarding/platform-configuration.mdx @@ -1,6 +1,8 @@ --- title: "Platform Configuration" description: "Configuring credentials, webhooks and currencies for your platform" +icon: "/images/icons/settings-gear2.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import PlatformConfigAPI from '/snippets/platform-config-currency-api-webhooks.mdx'; diff --git a/mintlify/payouts-and-b2b/payment-flow/error-handling.mdx b/mintlify/payouts-and-b2b/payment-flow/error-handling.mdx index 18346667..225a149b 100644 --- a/mintlify/payouts-and-b2b/payment-flow/error-handling.mdx +++ b/mintlify/payouts-and-b2b/payment-flow/error-handling.mdx @@ -1,6 +1,8 @@ --- title: "Error Handling" description: "Handle payment failures, API errors, and transaction issues gracefully" +icon: "/images/icons/shield.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import ErrorHandling from '/snippets/error-handling.mdx' diff --git a/mintlify/payouts-and-b2b/payment-flow/list-transactions.mdx b/mintlify/payouts-and-b2b/payment-flow/list-transactions.mdx index 8884dbb7..eeb814c7 100644 --- a/mintlify/payouts-and-b2b/payment-flow/list-transactions.mdx +++ b/mintlify/payouts-and-b2b/payment-flow/list-transactions.mdx @@ -1,8 +1,12 @@ --- title: "List Transactions" description: "Query and filter payment history with powerful filtering and pagination options" +icon: "/images/icons/file-text.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + Retrieve transaction history with flexible filtering options. Transactions are returned in descending order (most recent first) with a default limit of 20 per page. @@ -338,24 +342,14 @@ async function fetchWithRetry(url, retries = 3) { ## Next steps - - - Learn how to send payments from internal accounts - - - - Match payments with your internal accounting systems - - - - Handle transaction failures and errors - - + + + Learn how to send payments from internal accounts + + + Match payments with your internal accounting systems + + + Handle transaction failures and errors + + diff --git a/mintlify/payouts-and-b2b/payment-flow/reconciliation.mdx b/mintlify/payouts-and-b2b/payment-flow/reconciliation.mdx index 64ceeb89..571a682b 100644 --- a/mintlify/payouts-and-b2b/payment-flow/reconciliation.mdx +++ b/mintlify/payouts-and-b2b/payment-flow/reconciliation.mdx @@ -1,6 +1,8 @@ --- title: "Reconciliation" description: "Match Grid transactions with your internal systems" +icon: "/images/icons/checkmark1.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import Reconciliation from '/snippets/reconciliation/reconciliation.mdx' diff --git a/mintlify/payouts-and-b2b/payment-flow/send-payment.mdx b/mintlify/payouts-and-b2b/payment-flow/send-payment.mdx index afad8016..82021cb4 100644 --- a/mintlify/payouts-and-b2b/payment-flow/send-payment.mdx +++ b/mintlify/payouts-and-b2b/payment-flow/send-payment.mdx @@ -1,23 +1,26 @@ --- title: "Sending Payments" description: "Learn how to send payments from internal accounts to external bank accounts with same-currency and cross-currency transfers" +icon: "/images/icons/paper-plane-top-right.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + Send payments from your customers' internal accounts to their external bank accounts or to other destinations. Grid supports both same-currency transfers and cross-currency transfers with automatic exchange rate handling. ## Overview Grid provides two payment methods depending on your use case: - - - Send funds in the same currency from an internal account to an external account. Fast and straightforward. - - - - Send funds with currency conversion using real-time exchange rates. Supports multiple fiat currencies and payment rails. - - + + + Send funds in the same currency from an internal account to an external account. Fast and straightforward. + + + Send funds with currency conversion using real-time exchange rates. Supports multiple fiat currencies and payment rails. + + ## Prerequisites @@ -559,24 +562,14 @@ await db.payments.update( ## Next Steps - - - Handle payment failures and error scenarios - - - - Query and filter transaction history - - - - Match payments with your internal systems - - + + + Handle payment failures and error scenarios + + + Query and filter transaction history + + + Match payments with your internal systems + + diff --git a/mintlify/payouts-and-b2b/platform-tools/postman-collection.mdx b/mintlify/payouts-and-b2b/platform-tools/postman-collection.mdx index d11e88a6..9268cd34 100644 --- a/mintlify/payouts-and-b2b/platform-tools/postman-collection.mdx +++ b/mintlify/payouts-and-b2b/platform-tools/postman-collection.mdx @@ -1,5 +1,7 @@ --- title: "Postman Collection" +icon: "/images/icons/IconPostman.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import PostmanCollection from '/snippets/postman-collection.mdx'; diff --git a/mintlify/payouts-and-b2b/platform-tools/sandbox-testing.mdx b/mintlify/payouts-and-b2b/platform-tools/sandbox-testing.mdx index 3d6d5aa6..29d43351 100644 --- a/mintlify/payouts-and-b2b/platform-tools/sandbox-testing.mdx +++ b/mintlify/payouts-and-b2b/platform-tools/sandbox-testing.mdx @@ -1,6 +1,8 @@ --- title: "Sandbox Testing" description: "Test your payouts integration in the Grid sandbox environment" +icon: "/images/icons/hammer.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- ## Overview diff --git a/mintlify/payouts-and-b2b/platform-tools/webhooks.mdx b/mintlify/payouts-and-b2b/platform-tools/webhooks.mdx index e636c6ff..ee85bd26 100644 --- a/mintlify/payouts-and-b2b/platform-tools/webhooks.mdx +++ b/mintlify/payouts-and-b2b/platform-tools/webhooks.mdx @@ -1,5 +1,7 @@ --- title: "Webhooks" +icon: "/images/icons/bell.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import Webhooks from '/snippets/webhooks.mdx'; diff --git a/mintlify/payouts-and-b2b/quickstart.mdx b/mintlify/payouts-and-b2b/quickstart.mdx index 99782575..db56bb4e 100644 --- a/mintlify/payouts-and-b2b/quickstart.mdx +++ b/mintlify/payouts-and-b2b/quickstart.mdx @@ -1,11 +1,24 @@ --- title: "Quickstart" description: "Send your first cross-border payment" +icon: "/images/icons/rocket.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import KycRegulated from '/snippets/kyc/kyc-regulated.mdx'; import KycUnregulated from '/snippets/kyc/kyc-unregulated.mdx'; +Payouts quickstart hero +Payouts quickstart hero + This quickstart covers an example of sending a prefunded cross-border payout for a business customer on an unregulated platform. ## Understanding Entity Mapping for B2B Payouts diff --git a/mintlify/payouts-and-b2b/terminology.mdx b/mintlify/payouts-and-b2b/terminology.mdx index d90a2a1d..6afbd52a 100644 --- a/mintlify/payouts-and-b2b/terminology.mdx +++ b/mintlify/payouts-and-b2b/terminology.mdx @@ -1,6 +1,8 @@ --- title: "Core Concepts" description: "Core concepts and terminology for the Grid API" +icon: "/images/icons/file-text.svg" +"og:image": "/images/og/og-payouts-b2b.png" --- import Terminology from '/snippets/terminology.mdx'; diff --git a/mintlify/platform-overview/capabilities.mdx b/mintlify/platform-overview/capabilities.mdx new file mode 100644 index 00000000..d4521eea --- /dev/null +++ b/mintlify/platform-overview/capabilities.mdx @@ -0,0 +1,95 @@ +--- +icon: "/images/icons/blocks.svg" +title: "Capabilities" +mode: "wide" +"og:image": "/images/og/og-get-started.png" +--- + +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + +Capabilities hero +Capabilities hero + +Grid exposes low-level primitives that you combine to build any payment flow. Fiat, crypto, or both. + + + + Push funds to bank accounts in 65+ countries, crypto wallets, or UMA addresses. You choose the destination, Grid handles delivery. + + + Accept incoming payments via bank transfer, crypto deposit, or UMA. Webhooks notify you in real-time. + + + Exchange between fiat currencies or convert fiat to crypto. Lock in rates before execution. + + + Maintain balances in USD, EUR, BRL, BTC, USDC, and more. Fund and manage accounts via API. + + + On-ramp from bank accounts to BTC or stablecoins. Off-ramp crypto to local bank rails instantly. + + + Generate payment requests and collect funds. Track payment status through completion. + + + Automate flows with webhooks, approval logic, and idempotent operations. Build any payment experience. + + + KYC/KYB verification—use Grid's hosted flows or bring your own compliance. + + diff --git a/mintlify/platform-overview/configuration.mdx b/mintlify/platform-overview/configuration.mdx new file mode 100644 index 00000000..9f44577e --- /dev/null +++ b/mintlify/platform-overview/configuration.mdx @@ -0,0 +1,43 @@ +--- +icon: "/images/icons/settings-gear2.svg" +title: "Configuration" +description: "Configure your Grid integration" +"og:image": "/images/og/og-get-started.png" +--- + +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + +Learn how to configure Grid for your specific use case. + +## Platform Configuration + +Before you can start using Grid, you'll need to configure your platform settings. This includes: + +- Setting up your API credentials +- Configuring webhooks for real-time updates +- Defining your supported currencies and payment rails +- Setting up compliance and KYC requirements + +## Environment Setup + +Grid provides two environments: + + + + Test your integration with simulated payments + + + Process real payments with live credentials + + + +## Next Steps + + + + Learn how to authenticate API requests + + + Set up real-time event notifications + + diff --git a/mintlify/platform-overview/core-concepts/account-model.mdx b/mintlify/platform-overview/core-concepts/account-model.mdx index d9be0cb1..3adb5c2b 100644 --- a/mintlify/platform-overview/core-concepts/account-model.mdx +++ b/mintlify/platform-overview/core-concepts/account-model.mdx @@ -1,6 +1,8 @@ --- +icon: "/images/icons/wallet1.svg" title: "Account Model" description: "Internal accounts, external accounts, and how they work together" +"og:image": "/images/og/og-get-started.png" --- import InternalAccounts from '/snippets/internal-accounts.mdx'; diff --git a/mintlify/platform-overview/core-concepts/currencies-and-rails.mdx b/mintlify/platform-overview/core-concepts/currencies-and-rails.mdx index 7dc70720..d91af445 100644 --- a/mintlify/platform-overview/core-concepts/currencies-and-rails.mdx +++ b/mintlify/platform-overview/core-concepts/currencies-and-rails.mdx @@ -1,6 +1,8 @@ --- +icon: "/images/icons/coins.svg" title: "Currencies & Payment Rails" description: "Supported currencies, countries, and payment methods" +"og:image": "/images/og/og-get-started.png" --- import CountrySupport from '/snippets/country-support.mdx'; diff --git a/mintlify/platform-overview/core-concepts/entities.mdx b/mintlify/platform-overview/core-concepts/entities.mdx index e1832793..71fec70e 100644 --- a/mintlify/platform-overview/core-concepts/entities.mdx +++ b/mintlify/platform-overview/core-concepts/entities.mdx @@ -1,6 +1,8 @@ --- +icon: "/images/icons/agent.svg" title: "Entities & Relationships" description: "Understanding Grid's core data model" +"og:image": "/images/og/og-get-started.png" --- import Terminology from '/snippets/terminology.mdx'; diff --git a/mintlify/platform-overview/core-concepts/quote-system.mdx b/mintlify/platform-overview/core-concepts/quote-system.mdx index 2e9a3b57..8e1adb3b 100644 --- a/mintlify/platform-overview/core-concepts/quote-system.mdx +++ b/mintlify/platform-overview/core-concepts/quote-system.mdx @@ -1,6 +1,8 @@ --- +icon: "/images/icons/receipt-check.svg" title: "Quote System" description: "How exchange rates, pricing, and payment execution work" +"og:image": "/images/og/og-get-started.png" --- Quotes are Grid's mechanism for providing locked-in exchange rates, transparent fee calculations, and payment instructions. Understanding quotes is essential for all cross-currency or crypto-involved transactions. diff --git a/mintlify/platform-overview/core-concepts/transaction-lifecycle.mdx b/mintlify/platform-overview/core-concepts/transaction-lifecycle.mdx index 13769d72..379458df 100644 --- a/mintlify/platform-overview/core-concepts/transaction-lifecycle.mdx +++ b/mintlify/platform-overview/core-concepts/transaction-lifecycle.mdx @@ -1,6 +1,8 @@ --- +icon: "/images/icons/arrows-repeat-circle.svg" title: "Transaction Lifecycle" description: "Follow a payment from creation to settlement" +"og:image": "/images/og/og-get-started.png" --- Understanding the transaction lifecycle helps you build robust payment flows, handle edge cases, and provide accurate status updates to your customers. diff --git a/mintlify/platform-overview/introduction/faq.mdx b/mintlify/platform-overview/introduction/faq.mdx index b67eeb8f..0c7de258 100644 --- a/mintlify/platform-overview/introduction/faq.mdx +++ b/mintlify/platform-overview/introduction/faq.mdx @@ -1,5 +1,8 @@ --- +icon: "/images/icons/bubble-question.svg" title: "FAQ" +mode: "wide" +"og:image": "/images/og/og-get-started.png" --- ## Getting Started diff --git a/mintlify/platform-overview/introduction/what-is-grid.mdx b/mintlify/platform-overview/introduction/what-is-grid.mdx index 54780a24..2749ca93 100644 --- a/mintlify/platform-overview/introduction/what-is-grid.mdx +++ b/mintlify/platform-overview/introduction/what-is-grid.mdx @@ -1,17 +1,45 @@ --- +icon: "/images/icons/square-info.svg" title: "What is Grid?" +mode: "wide" +"og:image": "/images/og/og-get-started.png" --- +import { FeatureCard, FeatureCardGrid, FeatureCardList, FeatureCardContainer } from '/snippets/feature-card.mdx'; + +What is Grid hero +What is Grid hero + Grid is a low-level payment infrastructure API that enables modern financial institutions, businesses, or any developer to send, receive, and settle value globally across fiat currencies, stablecoins, and Bitcoin. With a single, simple API, you can build applications that move money instantly across borders without the complexity of orchestrating multiple payment rails or currencies. ## Features -| | -| -------------------------------------------------------------------------------------------------------------------------------------------- | -| **One API**
Move money anywhere. Fiat to fiat, crypto to fiat, or the other way around, all through a single API. | -| **Global Coverage**
Send and receive across 65+ countries using local instant rails or global crypto rails. | -| **Real-Time Settlement**
Instant, 24/7/365. Powered by Bitcoin and local payment networks. | -| **No Crypto Headaches**
We handle all the on-chain logic, wallet ops, and conversions so you don’t have to. | + + + + Move money anywhere. Fiat to fiat, crypto to fiat, or the other way around, all through a single API. + + + Send and receive across 65+ countries using local instant rails or global crypto rails. + + + Instant, 24/7/365. Powered by Bitcoin and local payment networks. + + + We handle all the on-chain logic, wallet ops, and conversions so you don't have to. + + + ## What to build @@ -47,44 +75,20 @@ Whether you're receiving Bitcoin or sending dollars as pesos to a bank account, ## Next steps - - - Understand Grid's core data model and how entities relate to each other - - - - Learn how exchange rates, pricing, and payment execution work - - - - Explore internal and external accounts and how they work together - - - - Follow a payment from creation through settlement - - - - View supported currencies, countries, and payment methods - - + + + Understand Grid's core data model and how entities relate to each other + + + Learn how exchange rates, pricing, and payment execution work + + + Explore internal and external accounts and how they work together + + + Follow a payment from creation through settlement + + + View supported currencies, countries, and payment methods + + diff --git a/mintlify/platform-overview/use-cases.mdx b/mintlify/platform-overview/use-cases.mdx new file mode 100644 index 00000000..444aa148 --- /dev/null +++ b/mintlify/platform-overview/use-cases.mdx @@ -0,0 +1,68 @@ +--- +icon: "/images/icons/light-bulb.svg" +title: "Use Cases" +description: "Discover what you can build with Grid" +mode: "wide" +"og:image": "/images/og/og-get-started.png" +--- + +import { FeatureCardGrid, ImageCard } from '/snippets/feature-card.mdx'; + +## Payouts & B2B + + + + Pay creators and influencers instantly, anywhere they bank + + + Send salaries and contractor payments globally with locked FX rates + + + Distribute earnings to sellers and service providers worldwide automatically + + + Pay international vendors and suppliers in their local currency, settled in seconds + + + +## Ramps + + + + Let users purchase Bitcoin directly inside your app + + + Convert Bitcoin to fiat and settle to any bank account + + + On-ramp fiat to fund user wallets with stablecoins or BTC + + + Off-ramp digital assets to local bank rails in real time + + + +## Rewards + + + + Give users Bitcoin back on purchases or actions + + + Pay out BTC or fiat when users refer new customers + + + Build point-based or asset-based loyalty with real redemption value + + + +## Global P2P + + + + Move money across countries on the fastest, lowest-cost rails + + + Send and receive via UMA addresses across any participating app + + diff --git a/mintlify/ramps/accounts/depositing-funds.mdx b/mintlify/ramps/accounts/depositing-funds.mdx index d7fde2ac..ee9e505d 100644 --- a/mintlify/ramps/accounts/depositing-funds.mdx +++ b/mintlify/ramps/accounts/depositing-funds.mdx @@ -1,6 +1,8 @@ --- title: "Depositing Funds" description: "Depositing funds into internal accounts" +icon: "/images/icons/arrow-inbox.svg" +"og:image": "/images/og/og-ramps.png" --- import DepositingFunds from '/snippets/depositing-funds.mdx'; diff --git a/mintlify/ramps/accounts/external-accounts.mdx b/mintlify/ramps/accounts/external-accounts.mdx index 98d54bb0..569f4c0c 100644 --- a/mintlify/ramps/accounts/external-accounts.mdx +++ b/mintlify/ramps/accounts/external-accounts.mdx @@ -1,6 +1,8 @@ --- title: "External Accounts" description: "Configure external bank accounts and crypto wallets for ramp destinations" +icon: "/images/icons/bank.svg" +"og:image": "/images/og/og-ramps.png" --- import ExternalAccountsContent from "/snippets/external-accounts.mdx"; diff --git a/mintlify/ramps/accounts/internal-accounts.mdx b/mintlify/ramps/accounts/internal-accounts.mdx index bd56904d..e0657225 100644 --- a/mintlify/ramps/accounts/internal-accounts.mdx +++ b/mintlify/ramps/accounts/internal-accounts.mdx @@ -1,6 +1,8 @@ --- title: "Internal Accounts" description: "Manage internal accounts for holding fiat and crypto balances for ramp operations" +icon: "/images/icons/wallet1.svg" +"og:image": "/images/og/og-ramps.png" --- import InternalAccountsContent from "/snippets/internal-accounts.mdx"; diff --git a/mintlify/ramps/accounts/plaid.mdx b/mintlify/ramps/accounts/plaid.mdx index afbf3a7e..1a827fae 100644 --- a/mintlify/ramps/accounts/plaid.mdx +++ b/mintlify/ramps/accounts/plaid.mdx @@ -1,6 +1,8 @@ --- title: "External Accounts with Plaid" description: "Connect bank accounts securely via Plaid for seamless off-ramp destinations" +icon: "/images/icons/IconPlaid.svg" +"og:image": "/images/og/og-ramps.png" --- import PlaidContent from "/snippets/plaid-integration.mdx"; diff --git a/mintlify/ramps/conversion-flows/fiat-crypto-conversion.mdx b/mintlify/ramps/conversion-flows/fiat-crypto-conversion.mdx index 3dfc8340..f5622d60 100644 --- a/mintlify/ramps/conversion-flows/fiat-crypto-conversion.mdx +++ b/mintlify/ramps/conversion-flows/fiat-crypto-conversion.mdx @@ -1,8 +1,12 @@ --- title: "Fiat-to-Crypto and Crypto-to-Fiat" description: "Build on-ramp and off-ramp flows to convert between fiat currencies and cryptocurrencies" +icon: "/images/icons/repeat.svg" +"og:image": "/images/og/og-ramps.png" --- +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + ## Overview Grid enables seamless conversion between fiat currencies and cryptocurrencies via the Lightning Network. Use quotes to lock exchange rates and get payment instructions for completing transfers. @@ -275,16 +279,14 @@ if (transaction.status === "FAILED") { ## Next steps - - - Send crypto to user-controlled wallets - - - - Monitor transaction status - - - - Complete API documentation - - + + + Send crypto to user-controlled wallets + + + Monitor transaction status + + + Complete API documentation + + diff --git a/mintlify/ramps/conversion-flows/self-custody-wallets.mdx b/mintlify/ramps/conversion-flows/self-custody-wallets.mdx index a09f0c84..7f61fa72 100644 --- a/mintlify/ramps/conversion-flows/self-custody-wallets.mdx +++ b/mintlify/ramps/conversion-flows/self-custody-wallets.mdx @@ -1,8 +1,12 @@ --- title: "Self-Custody Wallet Integration" description: "Send and receive cryptocurrency to and from user-controlled wallets" +icon: "/images/icons/lock.svg" +"og:image": "/images/og/og-ramps.png" --- +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + ## Overview Grid supports sending Bitcoin via Lightning Network to self-custody wallets using Spark wallet addresses. This enables users to maintain full control of their crypto while benefiting from Grid's fiat-to-crypto conversion and payment rails. @@ -405,28 +409,17 @@ console.log("Test transfer status:", testTransfer.status); ## Next steps - - - Learn about on-ramp and off-ramp flows - - - - Manage external accounts including Spark wallets - - - - Set up webhooks to monitor transaction status - - - - Test wallet integrations in sandbox mode - - + + + Learn about on-ramp and off-ramp flows + + + Manage external accounts including Spark wallets + + + Set up webhooks to monitor transaction status + + + Test wallet integrations in sandbox mode + + diff --git a/mintlify/ramps/index.mdx b/mintlify/ramps/index.mdx index 60a4e120..7f9a7f9d 100644 --- a/mintlify/ramps/index.mdx +++ b/mintlify/ramps/index.mdx @@ -1,27 +1,34 @@ --- -title: "Introduction" -description: "Convert between fiat and crypto with Grid's on-ramp and off-ramp infrastructure" +title: "Ramps" +sidebarTitle: "Introduction" +icon: "/images/icons/arrow-inbox.svg" +mode: "wide" +"og:image": "/images/og/og-ramps.png" --- import { topLevelProductName } from '/snippets/variables.mdx'; import { rampsProductName } from '/snippets/variables.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + +Ramps hero With Grid, you can seamlessly convert between fiat currencies and cryptocurrencies through a single, simple API. The {topLevelProductName} automatically handles currency conversion, compliance, and instant settlement via the Lightning Network. - - - Convert fiat to crypto (on-ramp) or crypto to fiat (off-ramp) in seconds - using real-time exchange rates. - - - Grid handles the conversion and settlement process, reducing complexity in - your crypto integration. - - - Leverages the Lightning Network for instant Bitcoin transfers and local - banking rails for fiat settlement worldwide. - - + + + Convert fiat to crypto (on-ramp) or crypto to fiat (off-ramp) in seconds using real-time exchange rates. + + + Grid handles the conversion and settlement process, reducing complexity in your crypto integration. + + + Leverages the Lightning Network for instant Bitcoin transfers and local banking rails for fiat settlement worldwide. + + --- @@ -103,6 +110,8 @@ The Production environment uses live credentials and base URLs for real transact --- - - Ready to integrate {rampsProductName}? Check out our quickstart guide. - + + + Ready to integrate {rampsProductName}? Check out our quickstart guide. + + diff --git a/mintlify/ramps/onboarding/configuring-customers.mdx b/mintlify/ramps/onboarding/configuring-customers.mdx index 621e55c6..b021a493 100644 --- a/mintlify/ramps/onboarding/configuring-customers.mdx +++ b/mintlify/ramps/onboarding/configuring-customers.mdx @@ -1,11 +1,14 @@ --- title: "Configuring Customers" description: "Create and manage customers for ramp conversions" +icon: "/images/icons/people.svg" +"og:image": "/images/og/og-ramps.png" --- import KycRegulated from '/snippets/kyc/kyc-regulated.mdx' import KycUnregulated from '/snippets/kyc/kyc-unregulated.mdx' import KycWebhooks from '/snippets/kyc/kyc-webhooks.mdx' +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx' Customers must complete identity verification before processing conversions. The required information varies based on your platform's regulatory status. @@ -79,28 +82,17 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers' \ ## Next steps - - -Fund crypto for off-ramp conversions - - - - Set up wallet destinations - - - - Build conversion flows - - - -Complete customer API docs - - + + + Fund crypto for off-ramp conversions + + + Set up wallet destinations + + + Build conversion flows + + + Complete customer API docs + + diff --git a/mintlify/ramps/onboarding/implementation-overview.mdx b/mintlify/ramps/onboarding/implementation-overview.mdx index 94a47d01..f1d50d8b 100644 --- a/mintlify/ramps/onboarding/implementation-overview.mdx +++ b/mintlify/ramps/onboarding/implementation-overview.mdx @@ -1,5 +1,7 @@ --- title: "Implementation Overview" +icon: "/images/icons/code.svg" +"og:image": "/images/og/og-ramps.png" --- import { rampsProductName } from '/snippets/variables.mdx'; diff --git a/mintlify/ramps/onboarding/platform-configuration.mdx b/mintlify/ramps/onboarding/platform-configuration.mdx index e55a5765..543e7bae 100644 --- a/mintlify/ramps/onboarding/platform-configuration.mdx +++ b/mintlify/ramps/onboarding/platform-configuration.mdx @@ -1,5 +1,7 @@ --- title: "Platform Configuration" +icon: "/images/icons/settings-gear2.svg" +"og:image": "/images/og/og-ramps.png" --- This guide explains how to configure your platform for ramp operations: get API credentials, configure webhooks, and set up supported currencies for conversions. diff --git a/mintlify/ramps/platform-tools/postman-collection.mdx b/mintlify/ramps/platform-tools/postman-collection.mdx index d11e88a6..9a4e5f97 100644 --- a/mintlify/ramps/platform-tools/postman-collection.mdx +++ b/mintlify/ramps/platform-tools/postman-collection.mdx @@ -1,5 +1,7 @@ --- title: "Postman Collection" +icon: "/images/icons/IconPostman.svg" +"og:image": "/images/og/og-ramps.png" --- import PostmanCollection from '/snippets/postman-collection.mdx'; diff --git a/mintlify/ramps/platform-tools/sandbox-testing.mdx b/mintlify/ramps/platform-tools/sandbox-testing.mdx index e0a12ecd..ee6ce2ab 100644 --- a/mintlify/ramps/platform-tools/sandbox-testing.mdx +++ b/mintlify/ramps/platform-tools/sandbox-testing.mdx @@ -1,6 +1,8 @@ --- title: "Sandbox Testing" description: "Test ramp flows safely without moving real funds" +icon: "/images/icons/hammer.svg" +"og:image": "/images/og/og-ramps.png" --- The Grid Sandbox environment provides a complete testing environment for ramp operations, allowing you to validate on-ramp and off-ramp flows without using real money or cryptocurrency. diff --git a/mintlify/ramps/platform-tools/webhooks.mdx b/mintlify/ramps/platform-tools/webhooks.mdx index 85e319a8..ca8d7609 100644 --- a/mintlify/ramps/platform-tools/webhooks.mdx +++ b/mintlify/ramps/platform-tools/webhooks.mdx @@ -1,6 +1,8 @@ --- title: "Webhooks" description: "Receive real-time notifications for ramp conversions, account updates, and transaction status" +icon: "/images/icons/bell.svg" +"og:image": "/images/og/og-ramps.png" --- Webhooks provide real-time notifications about ramp operations, allowing you to respond immediately to conversion completions, account balance changes, and transaction status updates. diff --git a/mintlify/ramps/quickstart.mdx b/mintlify/ramps/quickstart.mdx index 68b1a946..ba5c5e08 100644 --- a/mintlify/ramps/quickstart.mdx +++ b/mintlify/ramps/quickstart.mdx @@ -1,11 +1,24 @@ --- title: "Quickstart" description: "Complete guide for converting fiat to crypto (on-ramp) and delivering Bitcoin to a Spark wallet" +icon: "/images/icons/rocket.svg" +"og:image": "/images/og/og-ramps.png" --- import KycRegulated from '/snippets/kyc/kyc-regulated.mdx'; import KycUnregulated from '/snippets/kyc/kyc-unregulated.mdx'; +Ramps quickstart hero +Ramps quickstart hero + This guide walks you through the complete process of converting USD to Bitcoin and sending it to a Spark wallet using just-in-time (JIT) funding. ## Prerequisites diff --git a/mintlify/ramps/terminology.mdx b/mintlify/ramps/terminology.mdx index 8e1a67ab..109950fc 100644 --- a/mintlify/ramps/terminology.mdx +++ b/mintlify/ramps/terminology.mdx @@ -1,6 +1,8 @@ --- title: "Core Concepts" description: "Core concepts and terminology for the Grid API" +icon: "/images/icons/file-text.svg" +"og:image": "/images/og/og-ramps.png" --- import Terminology from '/snippets/terminology.mdx'; diff --git a/mintlify/rewards/developer-guides/configuring-customers.mdx b/mintlify/rewards/developer-guides/configuring-customers.mdx index bc15a9af..65530112 100644 --- a/mintlify/rewards/developer-guides/configuring-customers.mdx +++ b/mintlify/rewards/developer-guides/configuring-customers.mdx @@ -1,6 +1,8 @@ --- title: "Configuring Customers" description: "Complete guide to creating and managing customers for Bitcoin rewards" +icon: "/images/icons/people.svg" +"og:image": "/images/og/og-rewards.png" --- import KycRegulated from '/snippets/kyc/kyc-regulated.mdx' diff --git a/mintlify/rewards/developer-guides/distributing-rewards.mdx b/mintlify/rewards/developer-guides/distributing-rewards.mdx index dbce54a0..8bfa24f4 100644 --- a/mintlify/rewards/developer-guides/distributing-rewards.mdx +++ b/mintlify/rewards/developer-guides/distributing-rewards.mdx @@ -1,6 +1,8 @@ --- title: "Paying out Bitcoin rewards" description: "Send Bitcoin rewards to customers using the Grid API" +icon: "/images/icons/gift1.svg" +"og:image": "/images/og/og-rewards.png" --- This guide covers how to distribute Bitcoin rewards to your customers, including quote creation, execution options, and tracking delivery. diff --git a/mintlify/rewards/developer-guides/external-accounts.mdx b/mintlify/rewards/developer-guides/external-accounts.mdx index 5da1cd74..a4723e1b 100644 --- a/mintlify/rewards/developer-guides/external-accounts.mdx +++ b/mintlify/rewards/developer-guides/external-accounts.mdx @@ -1,28 +1,25 @@ --- title: "External Accounts" description: "Add and manage external funding sources and wallets as payment destinations for rewards" +icon: "/images/icons/bank.svg" +"og:image": "/images/og/og-rewards.png" --- import ExternalAccounts from '/snippets/external-accounts.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; ## Next steps - - - Simplify external account setup with Plaid Link for instant bank verification - - - - Learn how to pay out Bitcoin rewards using external accounts - - - - View complete API documentation for external accounts - - + + + Simplify external account setup with Plaid Link for instant bank verification + + + Learn how to pay out Bitcoin rewards using external accounts + + + View complete API documentation for external accounts + + diff --git a/mintlify/rewards/developer-guides/implementation-overview.mdx b/mintlify/rewards/developer-guides/implementation-overview.mdx index 51fe767f..c8ee0536 100644 --- a/mintlify/rewards/developer-guides/implementation-overview.mdx +++ b/mintlify/rewards/developer-guides/implementation-overview.mdx @@ -1,5 +1,7 @@ --- title: "Implementation Overview" +icon: "/images/icons/code.svg" +"og:image": "/images/og/og-rewards.png" --- This page gives you a 10,000‑ft view of an end‑to‑end Bitcoin rewards implementation. It is intentionally generalized to cover the main building blocks. The detailed guides that follow provide concrete fields, edge cases, and step‑by‑step instructions. diff --git a/mintlify/rewards/developer-guides/internal-accounts.mdx b/mintlify/rewards/developer-guides/internal-accounts.mdx index b44a554d..7e00286b 100644 --- a/mintlify/rewards/developer-guides/internal-accounts.mdx +++ b/mintlify/rewards/developer-guides/internal-accounts.mdx @@ -1,28 +1,28 @@ --- title: "Internal Accounts" description: "Learn how to manage and fund internal accounts for holding platform and customer funds" +icon: "/images/icons/wallet1.svg" +"og:image": "/images/og/og-rewards.png" --- import InternalAccounts from '/snippets/internal-accounts.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; ## Next steps - - -Learn how to add customer wallets as reward destinations - - - -Simplify bank account verification with Plaid Link - - - -Use internal account balances to send Bitcoin rewards - - - -View complete API documentation for internal accounts - - + + + Learn how to add customer wallets as reward destinations + + + Simplify bank account verification with Plaid Link + + + Use internal account balances to send Bitcoin rewards + + + View complete API documentation for internal accounts + + diff --git a/mintlify/rewards/developer-guides/listing-transactions.mdx b/mintlify/rewards/developer-guides/listing-transactions.mdx index 822137a8..cf7a30aa 100644 --- a/mintlify/rewards/developer-guides/listing-transactions.mdx +++ b/mintlify/rewards/developer-guides/listing-transactions.mdx @@ -1,8 +1,12 @@ --- title: "Listing Transactions" description: "Query and track Bitcoin reward payment history with filtering and pagination" +icon: "/images/icons/file-text.svg" +"og:image": "/images/og/og-rewards.png" --- +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + Retrieve transaction history for Bitcoin rewards distributed through your platform. Transactions are returned in descending order (most recent first) and are paginated. ## Basic request @@ -262,16 +266,14 @@ Always filter by `type=OUTGOING` when tracking rewards to exclude incoming trans ## Next steps - - - Learn how to create and execute Bitcoin reward payouts - - - - Set up webhook handling for real-time transaction notifications - - - - View complete transaction API documentation - - + + + Learn how to create and execute Bitcoin reward payouts + + + Set up webhook handling for real-time transaction notifications + + + View complete transaction API documentation + + diff --git a/mintlify/rewards/developer-guides/plaid.mdx b/mintlify/rewards/developer-guides/plaid.mdx index 19ab79f6..fcb8cdf0 100644 --- a/mintlify/rewards/developer-guides/plaid.mdx +++ b/mintlify/rewards/developer-guides/plaid.mdx @@ -1,28 +1,25 @@ --- title: "External Accounts with Plaid" description: "Simplify bank account verification with Plaid Link for external account setup" +icon: "/images/icons/IconPlaid.svg" +"og:image": "/images/og/og-rewards.png" --- import PlaidIntegration from '/snippets/plaid-integration.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; ## Next steps - - -Learn more about managing external accounts - - - - Set up webhook handling for account notifications - - - -View complete Plaid API documentation - - + + + Learn more about managing external accounts + + + Set up webhook handling for account notifications + + + View complete Plaid API documentation + + diff --git a/mintlify/rewards/developer-guides/platform-configuration.mdx b/mintlify/rewards/developer-guides/platform-configuration.mdx index 88736911..e038333e 100644 --- a/mintlify/rewards/developer-guides/platform-configuration.mdx +++ b/mintlify/rewards/developer-guides/platform-configuration.mdx @@ -1,6 +1,8 @@ --- title: "Platform Configuration" description: "Configuring platform settings for rewards" +icon: "/images/icons/settings-gear2.svg" +"og:image": "/images/og/og-rewards.png" --- import PlatformConfigAPI from '/snippets/platform-config-currency-api-webhooks.mdx'; diff --git a/mintlify/rewards/index.mdx b/mintlify/rewards/index.mdx index c12556be..e1c8b40c 100644 --- a/mintlify/rewards/index.mdx +++ b/mintlify/rewards/index.mdx @@ -1,22 +1,32 @@ --- -title: 'Introduction' -description: 'Send instant Bitcoin rewards to users worldwide through a single API' +title: "Rewards" +sidebarTitle: "Introduction" +icon: "/images/icons/gift1.svg" +mode: "wide" +"og:image": "/images/og/og-rewards.png" --- import { rewardsProductName, topLevelProductName } from '/snippets/variables.mdx'; +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + +Rewards hero With {rewardsProductName}, you can send instant Bitcoin rewards to your **users' self-custody wallets** worldwide through a single, simple API. {topLevelProductName} automatically handles the entire process, managing the fiat-to-crypto conversion, compliance checks, and instant delivery for you. - - + + The Grid API combines USD-to-BTC conversion and payout into a single, atomic operation, simplifying the process of distributing rewards. - - + + Grid converts your platform's fiat balance into Bitcoin on demand, allowing you to offer crypto rewards without managing digital asset custody or complex exchange integrations. - - - Delivers Bitcoin to your users’ wallets in seconds (like a Spark wallet) giving them immediate ownership and control. - - + + + Delivers Bitcoin to your users' wallets in seconds (like a Spark wallet) giving them immediate ownership and control. + + --- @@ -81,6 +91,8 @@ The Production environment uses live credentials and base URLs for real transact --- - - Ready to integrate {rewardsProductName}? Check out our quickstart guide. - + + + Ready to integrate {rewardsProductName}? Check out our quickstart guide. + + diff --git a/mintlify/rewards/platform-tools/postman-collection.mdx b/mintlify/rewards/platform-tools/postman-collection.mdx index d11e88a6..46af1ade 100644 --- a/mintlify/rewards/platform-tools/postman-collection.mdx +++ b/mintlify/rewards/platform-tools/postman-collection.mdx @@ -1,5 +1,7 @@ --- title: "Postman Collection" +icon: "/images/icons/IconPostman.svg" +"og:image": "/images/og/og-rewards.png" --- import PostmanCollection from '/snippets/postman-collection.mdx'; diff --git a/mintlify/rewards/platform-tools/sandbox-testing.mdx b/mintlify/rewards/platform-tools/sandbox-testing.mdx index 8a050533..d6c964c4 100644 --- a/mintlify/rewards/platform-tools/sandbox-testing.mdx +++ b/mintlify/rewards/platform-tools/sandbox-testing.mdx @@ -1,6 +1,8 @@ --- title: "Sandbox Testing" description: "Test your rewards integration in the Grid sandbox environment" +icon: "/images/icons/hammer.svg" +"og:image": "/images/og/og-rewards.png" --- ## Overview diff --git a/mintlify/rewards/platform-tools/webhooks.mdx b/mintlify/rewards/platform-tools/webhooks.mdx index e636c6ff..bd38bbab 100644 --- a/mintlify/rewards/platform-tools/webhooks.mdx +++ b/mintlify/rewards/platform-tools/webhooks.mdx @@ -1,5 +1,7 @@ --- title: "Webhooks" +icon: "/images/icons/bell.svg" +"og:image": "/images/og/og-rewards.png" --- import Webhooks from '/snippets/webhooks.mdx'; diff --git a/mintlify/rewards/quickstart.mdx b/mintlify/rewards/quickstart.mdx index 4f76ccbc..55060159 100644 --- a/mintlify/rewards/quickstart.mdx +++ b/mintlify/rewards/quickstart.mdx @@ -1,8 +1,21 @@ --- title: "Quickstart" description: "Complete walkthrough for buying Bitcoin and sending it as a reward to an external Spark wallet for self-custody" +icon: "/images/icons/rocket.svg" +"og:image": "/images/og/og-rewards.png" --- +Rewards quickstart hero +Rewards quickstart hero + This guide walks you through the complete process of buying Bitcoin with USD and sending it to a self-custody Spark wallet, from customer onboarding through quote execution. ## Understanding Entity Mapping for Rewards diff --git a/mintlify/rewards/terminology.mdx b/mintlify/rewards/terminology.mdx index 8e1a67ab..2755df4e 100644 --- a/mintlify/rewards/terminology.mdx +++ b/mintlify/rewards/terminology.mdx @@ -1,6 +1,8 @@ --- title: "Core Concepts" description: "Core concepts and terminology for the Grid API" +icon: "/images/icons/file-text.svg" +"og:image": "/images/og/og-rewards.png" --- import Terminology from '/snippets/terminology.mdx'; diff --git a/mintlify/snippets/country-support.mdx b/mintlify/snippets/country-support.mdx index b75467ec..e608ff49 100644 --- a/mintlify/snippets/country-support.mdx +++ b/mintlify/snippets/country-support.mdx @@ -1,21 +1,22 @@ - - - **Available Globally** -Bitcoin (BTC) and Stablecoin transactions supported worldwide with no geographic restrictions. - - - **United States & Europe** -Onboard as a platform with complete access to APIs, hosted KYC/KYB, dashboard, and business integrations. -Send payments to 65 countries on local banking rails, in addition to BTC and stablecoins. - - - **65 Countries** -Receive payments via local rails like SEPA, PIX, UPI, and more. - - +import { FeatureCard, FeatureCardGrid, FeatureCardList, FeatureCardContainer } from '/snippets/feature-card.mdx'; + + + + + Bitcoin (BTC) and Stablecoin transactions supported worldwide with no geographic restrictions. + + + Onboard as a platform with complete access to APIs, hosted KYC/KYB, dashboard, and business integrations. + Send payments to 65 countries on local banking rails, in addition to BTC and stablecoins. + + + Receive payments via local rails like SEPA, PIX, UPI, and more. + + + | Country | ISO Code | Payment Rails | -|---|:---:|:---:| +|---|---|---:| | 🇦🇹 Austria | AT | `SEPA` `SEPA Instant` | | 🇧🇪 Belgium | BE | `SEPA` `SEPA Instant` | | 🇧🇯 Benin | BJ | `Bank Transfer` | @@ -83,17 +84,18 @@ Receive payments via local rails like SEPA, PIX, UPI, and more. | 🇿🇲 Zambia | ZM | `Bank Transfer` | Regional Summary - - - **32 countries** Primary: SEPA/SEPA Instant - - - **17 countries** Primary: Bank Transfer - - - **11 countries** Various instant payment systems - - - **5 countries** PIX, SPEI, ACH, FedNow - - + + + + Primary: SEPA/SEPA Instant + + + Primary: Bank Transfer + + + Various instant payment systems + + + PIX, SPEI, ACH, FedNow + + diff --git a/mintlify/snippets/error-handling.mdx b/mintlify/snippets/error-handling.mdx index df0cec47..51191f86 100644 --- a/mintlify/snippets/error-handling.mdx +++ b/mintlify/snippets/error-handling.mdx @@ -1,3 +1,5 @@ +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + Learn how to handle errors when working with payments and transactions in Grid. Proper error handling ensures a smooth user experience and helps you quickly identify and resolve issues. ## HTTP status codes @@ -526,26 +528,16 @@ try { ## Next steps - - - Learn how to send payments from internal accounts - - - - Query and filter payment history - - - - Match payments with your internal systems - - + + + Learn how to send payments from internal accounts + + + Query and filter payment history + + + Match payments with your internal systems + + diff --git a/mintlify/snippets/feature-card.mdx b/mintlify/snippets/feature-card.mdx new file mode 100644 index 00000000..344de83b --- /dev/null +++ b/mintlify/snippets/feature-card.mdx @@ -0,0 +1,91 @@ +export const FeatureCard = ({ icon, title, children, href, linkHref, linkText, color, tag, tagPosition, layout, variant, iconSize }) => { + const isHorizontal = layout === 'horizontal'; + const isFlat = variant === 'flat'; + const isLargeIcon = iconSize === 'lg'; + const isInlineTag = tagPosition === 'inline'; + const card = ( +
+ {icon && ( +
+ {color ? ( +
+ ) : ( + + )} +
+ )} +
+ {isInlineTag ? ( +
+ {title} + {tag && {tag}} +
+ ) : ( +
{title}
+ )} +
{children}
+ {tag && !isInlineTag &&
{tag}
} + {linkText && ( +
+ {linkHref ? ( + + {linkText} + + ) : ( + + {linkText} + + )} +
+ )} +
+
+ ); + return href ? {card} : card; +}; + +export const FeatureCardGrid = ({ cols = 3, children }) => ( +
+ {children} +
+); + +export const FeatureCardList = ({ children }) => ( +
+ {children} +
+); + +export const FeatureCardContainer = ({ children }) => ( +
+ {children} +
+); + +export const ImageCard = ({ img, title, children, href }) => { + const card = ( +
+
+ {title} +
+
+
{title}
+
{children}
+
+
+ ); + return href ? {card} : card; +}; diff --git a/mintlify/snippets/postman-collection.mdx b/mintlify/snippets/postman-collection.mdx index 649d368e..71799e54 100644 --- a/mintlify/snippets/postman-collection.mdx +++ b/mintlify/snippets/postman-collection.mdx @@ -1,9 +1,11 @@ +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; + Use our hosted Postman collection to explore endpoints and send test requests quickly. - -Launch the collection in Postman. - - - + + + Launch the collection in Postman. + + diff --git a/mintlify/snippets/product-tiles.mdx b/mintlify/snippets/product-tiles.mdx new file mode 100644 index 00000000..940525ba --- /dev/null +++ b/mintlify/snippets/product-tiles.mdx @@ -0,0 +1,234 @@ +{/* ProductTiles Component - Adapted from Aspen theme */} +{/* Creates a tabbed interface with use case list on left and preview image on right */} + +export const ProductTiles = ({ categories }) => { + const [activeCategory, setActiveCategory] = React.useState(categories[0].id); + const [activeItem, setActiveItem] = React.useState(categories[0].items[0]?.id); + + const currentCategory = categories.find((cat) => cat.id === activeCategory); + const currentItem = currentCategory?.items.find((item) => item.id === activeItem); + + return ( +
+ {/* Category tabs */} +
+ {categories.map((cat) => ( + + ))} +
+ + {/* Content grid: items on left, preview on right */} +
+ {/* Left side: list of items */} +
+ {currentCategory?.items.map((item) => ( + + ))} +
+ + {/* Right side: preview image */} +
+ {currentItem?.image ? ( + <> + {currentItem.title} + {currentItem.title} + + ) : ( +
+ Preview +
+ )} +
+
+
+ ); +}; + +{/* Data for Grid docs "What you can build" section */} + +export const gridCategories = [ + { + id: 'payouts', + label: 'Payouts', + items: [ + { + id: 'gig-workers', + title: 'Gig worker payments', + description: 'Pay drivers, couriers, and freelancers instantly', + icon: '/images/icons/car-front-view.svg', + image: '/images/home/payout-preview.png', + href: '/payouts-and-b2b' + }, + { + id: 'marketplace', + title: 'Marketplace payouts', + description: 'Settle with sellers in their local currency', + icon: '/images/icons/store4.svg', + image: '/images/home/payout-preview.png', + href: '/payouts-and-b2b' + }, + { + id: 'suppliers', + title: 'Supplier payments', + description: 'Pay vendors and suppliers across borders', + icon: '/images/icons/shipping.svg', + image: '/images/home/payout-preview.png', + href: '/payouts-and-b2b' + }, + { + id: 'creators', + title: 'Creator earnings', + description: 'Distribute revenue to creators worldwide', + icon: '/images/icons/multi-media.svg', + image: '/images/home/payout-preview.png', + href: '/payouts-and-b2b' + } + ] + }, + { + id: 'ramps', + label: 'Ramps', + items: [ + { + id: 'on-ramp', + title: 'On-ramp', + description: 'Convert fiat to crypto for your users', + icon: '/images/icons/arrow-inbox.svg', + image: '/images/home/payout-preview.png', + href: '/ramps' + }, + { + id: 'off-ramp', + title: 'Off-ramp', + description: 'Convert crypto to fiat instantly', + icon: '/images/icons/banknote1.svg', + image: '/images/home/payout-preview.png', + href: '/ramps' + }, + { + id: 'stablecoin', + title: 'Stablecoin bridge', + description: 'Bridge between different stablecoin networks', + icon: '/images/icons/arrows-repeat-circle.svg', + image: '/images/home/payout-preview.png', + href: '/ramps' + }, + { + id: 'self-custody', + title: 'Self-custody', + description: 'Enable users to maintain their own wallets', + icon: '/images/icons/wallet1.svg', + image: '/images/home/payout-preview.png', + href: '/ramps' + } + ] + }, + { + id: 'rewards', + label: 'Rewards', + items: [ + { + id: 'cashback', + title: 'Cashback', + description: 'Reward customers with instant Bitcoin cashback', + icon: '/images/icons/gift1.svg', + image: '/images/home/payout-preview.png', + href: '/rewards' + }, + { + id: 'loyalty', + title: 'Loyalty programs', + description: 'Build loyalty programs with crypto rewards', + icon: '/images/icons/repeat.svg', + image: '/images/home/payout-preview.png', + href: '/rewards' + }, + { + id: 'referrals', + title: 'Referrals', + description: 'Incentivize referrals with programmable rewards', + icon: '/images/icons/people.svg', + image: '/images/home/payout-preview.png', + href: '/rewards' + }, + { + id: 'gaming', + title: 'Gaming', + description: 'Distribute in-game rewards and winnings', + icon: '/images/icons/lightning.svg', + image: '/images/home/payout-preview.png', + href: '/rewards' + } + ] + }, + { + id: 'global-p2p', + label: 'Global P2P', + items: [ + { + id: 'remittances', + title: 'Remittances', + description: 'Send money across borders with low fees', + icon: '/images/icons/globe.svg', + image: '/images/home/payout-preview.png', + href: '/global-p2p' + }, + { + id: 'bill-pay', + title: 'Bill pay', + description: 'Enable users to pay bills internationally', + icon: '/images/icons/receipt-check.svg', + image: '/images/home/payout-preview.png', + href: '/global-p2p' + }, + { + id: 'peer-transfers', + title: 'Peer transfers', + description: 'Facilitate person-to-person payments globally', + icon: '/images/icons/paper-plane-top-right.svg', + image: '/images/home/payout-preview.png', + href: '/global-p2p' + }, + { + id: 'uma', + title: 'UMA', + description: 'Accept payments via Universal Money Addresses', + icon: '/images/icons/at.svg', + image: '/images/home/payout-preview.png', + href: '/global-p2p' + } + ] + } +]; diff --git a/mintlify/snippets/terminology.mdx b/mintlify/snippets/terminology.mdx index 9c525f53..a48211b5 100644 --- a/mintlify/snippets/terminology.mdx +++ b/mintlify/snippets/terminology.mdx @@ -1,8 +1,17 @@ There are several key entities in the Grid API: **Platform**, **Customers**, **Internal Accounts**, **External Accounts**, **Quotes**, **Transactions**, and **UMA Addresses**. - -Entity relationships diagram showing platform, customers, internal accounts, external accounts, transactions, and UMA addresses - +Entity relationships diagram showing platform, customers, internal accounts, external accounts, transactions, and UMA addresses +Entity relationships diagram showing platform, customers, internal accounts, external accounts, transactions, and UMA addresses ## Businesses, People, and Accounts diff --git a/mintlify/snippets/uma-test-wallet.mdx b/mintlify/snippets/uma-test-wallet.mdx index b5a70cb6..85b9fc68 100644 --- a/mintlify/snippets/uma-test-wallet.mdx +++ b/mintlify/snippets/uma-test-wallet.mdx @@ -1,14 +1,15 @@ -The UMA Test Wallet is an external tool that demonstrates UMA payment flows end to end and gives you a realistic counterparty for development and QA. It helps you understand flows through hands-on interaction, explore recommended UX patterns, and develop against a live UMA FI. +import { FeatureCard, FeatureCardGrid } from '/snippets/feature-card.mdx'; - - -Open the hosted test wallet to try UMA flows in your browser. - +The UMA Test Wallet is an external tool that demonstrates UMA payment flows end to end and gives you a realistic counterparty for development and QA. It helps you understand flows through hands-on interaction, explore recommended UX patterns, and develop against a live UMA FI. - -Browse the code, file issues, and contribute improvements. - - + + + Open the hosted test wallet to try UMA flows in your browser. + + + Browse the code, file issues, and contribute improvements. + + ### What UMA Test Wallet can do - **Experience UMA flows**: Send and receive cross currency UMA payments diff --git a/mintlify/styles/base.css b/mintlify/styles/base.css new file mode 100644 index 00000000..05282afd --- /dev/null +++ b/mintlify/styles/base.css @@ -0,0 +1,2526 @@ +/* =========================================== + Base Styles + + Global typography, navbar, sidebar, and + content area styling. Uses design tokens. + =========================================== */ + +/* =========================================== + Root Color Overrides + Override Mintlify's primary color variables + =========================================== */ + +:root { + --primary: var(--ls-gray-900) !important; + --text-primary: var(--ls-gray-900) !important; + --color-primary: var(--ls-gray-900) !important; + --tw-text-opacity: 1; +} + +html.dark { + --primary: var(--ls-gray-100) !important; + --text-primary: var(--ls-gray-100) !important; + --color-primary: var(--ls-gray-100) !important; +} + +/* =========================================== + Squircle Corners (Progressive Enhancement) + Smooth Apple-style corners. Falls back to + regular border-radius in unsupported browsers. + =========================================== */ + +* { + corner-shape: squircle; +} + +/* =========================================== + Hide Scrollbars Globally + =========================================== */ + +* { + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE/Edge */ +} + +*::-webkit-scrollbar { + display: none; /* Chrome, Safari, Edge */ +} + +/* =========================================== + Global Typography + + Base fonts configured in docs.json. + This handles additional customizations. + =========================================== */ + +/* Enable single-story 'a' (stylistic alternates) */ +* { + font-feature-settings: "salt" on; + text-shadow: none; +} + +/* Headings & Bold: Medium weight (500) */ +h1, h2, h3, h4, h5, h6, +strong, b, th, +.sidebar-group-header, +.eyebrow, +.font-semibold, +[data-component-part="step-title"], +[data-component-part="tab-button"] { + font-weight: 500 !important; + letter-spacing: normal !important; +} + +/* Page title and H2s: Regular weight (400) */ +h1#page-title, +#content h2 { + font-weight: 400 !important; +} + +/* H3s: Book weight (450) */ +#content h3 { + font-weight: 450 !important; +} + +/* Navigation tabs & CTA button: Medium weight */ +.nav-tabs-item, +#topbar-cta-button, #topbar-cta-button *, +#page-context-menu-button, #page-context-menu-button *, +#pagination a, #pagination a * { + font-weight: 500 !important; + text-shadow: none !important; +} + +/* Navbar links: Book weight (450) */ +.navbar-link a, +#navbar a.link:not(.nav-tabs-item) { + font-weight: 450 !important; +} + +/* Code: Suisse Intl Mono */ +code, pre, kbd, samp, .font-mono { + font-family: "Suisse Intl Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important; + font-feature-settings: "salt" on !important; +} + +/* API field names: Mono Bold */ +[data-component-part="field-name"] { + font-family: "Suisse Intl Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important; + font-weight: 700 !important; + font-feature-settings: "salt" on !important; +} + +/* =========================================== + SVG Icons + =========================================== */ + +/* Non-scaling stroke for all SVGs */ +svg, svg * { + vector-effect: non-scaling-stroke; +} + +/* Stroke width for Central Icons */ +svg[class*="icon"] path, +svg[class*="icon"] line, +svg[class*="icon"] circle, +svg[class*="icon"] rect, +svg[class*="icon"] polyline, +svg[class*="icon"] polygon { + stroke-width: 1.5px; +} + +/* Disable lightbox/click on all icon images */ +img[class*="icon"], +svg[class*="icon"] { + pointer-events: none; +} + +/* =========================================== + Navbar - Top Row + Border, padding, and layout + =========================================== */ + +#navbar { + background-color: var(--ls-gray-100) !important; +} + +html.dark #navbar { + background-color: var(--ls-gray-975) !important; +} + +#navbar > div, +#navbar .h-16, +#navbar [class*="h-16"] { + background: transparent !important; +} + +#navbar .h-16, +#navbar [class*="h-16"] { + border-bottom: 0.5px solid var(--ls-black-10) !important; + padding-left: 32px !important; + padding-right: 32px !important; +} + +html.dark #navbar .h-16, +html.dark #navbar [class*="h-16"] { + border-bottom: 0.5px solid var(--ls-white-06) !important; +} + +/* Tabs row padding */ +#navbar .h-12, +#navbar [class*="h-12"] { + padding-left: 32px !important; + padding-right: 32px !important; + background: transparent !important; +} + +html.dark #navbar .h-12, +html.dark #navbar [class*="h-12"], +html.dark #navbar .h-12 *, +html.dark #navbar [class*="h-12"] *, +html.dark #navbar > div, +html.dark #navbar .z-10, +html.dark #navbar [class*="z-10"] { + border-color: var(--ls-white-06) !important; +} + +/* Mobile: Full-width navbar with 20px/24px padding */ +@media (max-width: 1023px) { + #navbar .h-16, + #navbar [class*="h-16"], + #navbar .h-12, + #navbar [class*="h-12"] { + margin-left: 0 !important; + margin-right: 0 !important; + padding-left: 20px !important; + padding-right: 24px !important; + } +} + +/* =========================================== + Navbar - Search Bar + =========================================== */ + +#search-bar-entry { + background: var(--ls-gray-050) !important; + border: 0.5px solid var(--ls-black-10) !important; + border-radius: var(--ls-radius-md) !important; + width: 320px !important; + height: 36px !important; + padding: 8px 12px !important; + font-size: 14px !important; + font-weight: 400 !important; + line-height: 20px !important; + color: var(--ls-gray-500) !important; + display: flex !important; + align-items: center !important; + gap: 8px !important; + transition: all 0.2s ease !important; + box-shadow: none !important; +} + +#search-bar-entry:hover { + border-color: var(--ls-black-20) !important; +} + +#search-bar-entry:hover svg, +#search-bar-entry:hover > div > span:first-child { + color: var(--ls-gray-950) !important; +} + +html.dark #search-bar-entry { + background: rgba(255, 255, 255, 0.05) !important; + border-color: var(--ls-white-06) !important; + color: var(--ls-gray-500) !important; +} + +html.dark #search-bar-entry:hover { + border-color: var(--ls-white-20) !important; +} + +html.dark #search-bar-entry:hover svg, +html.dark #search-bar-entry:hover > div > span:first-child { + color: var(--ls-gray-100) !important; +} + +#search-bar-entry svg { + width: 16px !important; + height: 16px !important; + color: var(--ls-gray-500) !important; + stroke-width: 1.5px !important; + transition: color 0.2s ease !important; +} + +#search-bar-entry span { + color: var(--ls-gray-500) !important; + transition: color 0.2s ease !important; +} + +/* Keyboard shortcut badge */ +#search-bar-entry kbd, +#search-bar-entry [class*="min-w-"] > span:last-child { + background: var(--ls-gray-100) !important; + border: none !important; + border-radius: var(--ls-radius-xs) !important; + padding: 2px 6px !important; + font-size: 12px !important; + font-weight: 400 !important; + line-height: 18px !important; + color: var(--ls-gray-500) !important; + font-family: inherit !important; +} + +html.dark #search-bar-entry kbd, +html.dark #search-bar-entry [class*="min-w-"] > span:last-child { + background: var(--ls-white-06) !important; + color: var(--ls-gray-400) !important; +} + +/* =========================================== + Navbar - Ask AI Button + =========================================== */ + +#assistant-entry, +[class*="ask-ai"], +button[aria-label*="AI"], +[data-component*="ai"], +#ask-ai-button { + background: var(--ls-gray-050) !important; + border: 0.5px solid var(--ls-black-10) !important; + border-radius: var(--ls-radius-md) !important; + height: 36px !important; + padding: 8px 12px !important; + font-size: 14px !important; + font-weight: 400 !important; + color: var(--ls-gray-500) !important; + transition: all 0.2s ease !important; +} + +#assistant-entry:hover, +[class*="ask-ai"]:hover, +button[aria-label*="AI"]:hover, +#ask-ai-button:hover { + border-color: var(--ls-black-20) !important; + color: var(--ls-gray-950) !important; +} + +html.dark #assistant-entry, +html.dark [class*="ask-ai"], +html.dark button[aria-label*="AI"], +html.dark #ask-ai-button { + background: rgba(255, 255, 255, 0.05) !important; + border-color: var(--ls-white-06) !important; +} + +html.dark #assistant-entry:hover, +html.dark [class*="ask-ai"]:hover, +html.dark button[aria-label*="AI"]:hover, +html.dark #ask-ai-button:hover { + border-color: var(--ls-white-20) !important; + color: var(--ls-gray-100) !important; +} + +/* Center search bar and Ask AI button in navbar */ +#navbar .flex-1:has(#search-bar-entry) { + justify-content: center !important; +} + +/* =========================================== + Navbar - Links (GitHub, Contact) + =========================================== */ + +#navbar .h-16 [class*="gap-x-"], +#navbar .h-16 [class*="flex"][class*="items-center"] > *:not(:first-child) { + margin-left: 0 !important; +} + +/* Navbar link buttons gap */ +#navbar .h-16 nav ul { + gap: 8px !important; +} + +#navbar a.link:not(.nav-tabs-item), +#navbar [class*="navbar"] a, +.navbar-link { + display: flex !important; + align-items: center !important; + gap: 6px !important; + height: 32px !important; + padding: 0 4px !important; + border-radius: var(--ls-radius-sm) !important; + font-size: 14px !important; + font-weight: 450 !important; + line-height: 20px !important; + color: var(--ls-gray-950) !important; + text-decoration: none !important; + transition: opacity 0.15s ease !important; + font-feature-settings: "salt" 1 !important; +} + +#navbar a.link:not(.nav-tabs-item):hover, +#navbar [class*="navbar"] a:hover, +.navbar-link:hover { + opacity: 0.7 !important; +} + +#navbar a.link:not(.nav-tabs-item) svg, +#navbar [class*="navbar"] a svg, +.navbar-link svg { + width: 20px !important; + height: 20px !important; + color: var(--ls-gray-950) !important; +} + +html.dark #navbar a.link:not(.nav-tabs-item), +html.dark #navbar [class*="navbar"] a, +html.dark .navbar-link { + color: var(--ls-gray-100) !important; +} + +html.dark #navbar a.link:not(.nav-tabs-item) svg, +html.dark #navbar [class*="navbar"] a svg, +html.dark .navbar-link svg { + color: var(--ls-gray-100) !important; +} + +/* =========================================== + Chat Assistant (Floating Input) + =========================================== */ + +/* Container wrapper - darker/lighter than page bg for contrast */ +.chat-assistant-floating-input > div > div { + background: var(--ls-gray-025) !important; + border: 0.5px solid var(--ls-black-10) !important; + border-radius: var(--ls-radius-lg) !important; +} + +html.dark .chat-assistant-floating-input > div > div { + background: var(--ls-gray-975) !important; + border-color: var(--ls-white-10) !important; +} + +/* Textarea */ +#chat-assistant-textarea { + color: var(--ls-gray-950) !important; +} + +#chat-assistant-textarea::placeholder { + color: var(--ls-gray-400) !important; +} + +html.dark #chat-assistant-textarea { + color: var(--ls-gray-100) !important; +} + +html.dark #chat-assistant-textarea::placeholder { + color: var(--ls-gray-500) !important; +} + +/* Submit button */ +.chat-assistant-floating-input button[type="submit"], +.chat-assistant-floating-input button:has(svg) { + background: var(--ls-gray-950) !important; + color: var(--ls-gray-100) !important; +} + +.chat-assistant-floating-input button[type="submit"] svg, +.chat-assistant-floating-input button:has(svg) svg { + color: var(--ls-gray-100) !important; +} + +html.dark .chat-assistant-floating-input button[type="submit"], +html.dark .chat-assistant-floating-input button:has(svg) { + background: var(--ls-gray-100) !important; + color: var(--ls-gray-950) !important; +} + +html.dark .chat-assistant-floating-input button[type="submit"] svg, +html.dark .chat-assistant-floating-input button:has(svg) svg { + color: var(--ls-gray-950) !important; +} + +/* =========================================== + Navbar - Tabs + =========================================== */ + +/* Inactive state */ +.nav-tabs-item, +a.nav-tabs-item, +#navbar .nav-tabs-item, +.nav-tabs-item:not([class*="text-gray-800"]):not([class*="text-gray-200"]) { + color: var(--ls-gray-500) !important; +} + +/* Hover state */ +.nav-tabs-item:hover, +a.nav-tabs-item:hover, +#navbar .nav-tabs-item:hover { + color: var(--ls-gray-950) !important; +} + +/* Active state */ +.nav-tabs-item.text-gray-800, +.nav-tabs-item[class*="text-gray-800"], +a.nav-tabs-item.text-gray-800, +#navbar .nav-tabs-item.text-gray-800, +.nav-tabs-item[aria-current="page"] { + color: var(--ls-gray-950) !important; +} + +/* Active indicator line */ +.nav-tabs-item::after, +.nav-tabs-item.text-gray-600::after, +.nav-tabs-item[class*="text-gray-600"]::after { + content: "" !important; + position: absolute !important; + bottom: 0 !important; + left: 0 !important; + right: 0 !important; + height: 2px !important; + background-color: transparent !important; + opacity: 0 !important; +} + +.nav-tabs-item.text-gray-800::after, +a.nav-tabs-item.text-gray-800::after, +#navbar .nav-tabs-item.text-gray-800::after, +.nav-tabs-item[aria-current="page"]::after { + background-color: var(--ls-gray-950) !important; + opacity: 1 !important; +} + +/* Dark mode tabs */ +html.dark .nav-tabs-item, +html.dark a.nav-tabs-item, +html.dark #navbar .nav-tabs-item { + color: var(--ls-gray-600) !important; +} + +html.dark .nav-tabs-item:hover, +html.dark a.nav-tabs-item:hover, +html.dark #navbar .nav-tabs-item:hover { + color: var(--ls-gray-100) !important; +} + +/* Active tab in dark mode - override Tailwind's dark:text-gray-200 */ +html.dark .nav-tabs-item[class*="dark:text-gray-200"], +html.dark a.nav-tabs-item[class*="dark:text-gray-200"], +html.dark #navbar .nav-tabs-item[class*="dark:text-gray-200"], +html.dark #navbar a.link.nav-tabs-item[class*="dark:text-gray-200"] { + color: var(--ls-white) !important; +} + +/* Dark mode - hide ALL tab indicators by default */ +html.dark .nav-tabs-item::after, +html.dark #navbar .nav-tabs-item::after { + background-color: var(--ls-gray-050) !important; + opacity: 0 !important; +} + +/* Dark mode - show indicator ONLY for active tab */ +html.dark .nav-tabs-item.text-gray-200::after, +html.dark a.nav-tabs-item.text-gray-200::after, +html.dark .nav-tabs-item[aria-current="page"]::after { + opacity: 1 !important; +} + +/* Active sidebar item: Medium weight */ +a[class*="text-primary"]:not(.nav-tabs-item), +a[class*="text-primary"]:not(.nav-tabs-item) *, +button[class*="text-primary"], +button[class*="text-primary"] * { + font-weight: 500 !important; +} + +/* =========================================== + Sidebar + =========================================== */ + +#sidebar-content { + background-color: var(--ls-gray-100) !important; + border-right: 0.5px solid var(--ls-black-10) !important; + width: 280px !important; + min-width: 280px !important; + max-width: 280px !important; +} + +html.dark #sidebar-content { + background-color: var(--ls-gray-975) !important; + border-right-color: var(--ls-white-06) !important; +} + +/* Mobile Navigation Sidebar - consistent background */ +#mobile-nav, +#mobile-nav > div { + background-color: var(--ls-gray-100) !important; +} + +html.dark #mobile-nav, +html.dark #mobile-nav > div { + background-color: var(--ls-gray-975) !important; +} + +/* Mobile nav items - extend to sidebar edges */ +#mobile-nav #navigation-items { + margin-left: -16px !important; + margin-right: -16px !important; + padding: 0 24px 24px 24px !important; +} + +/* Mobile nav - dropdown button: 1 step brighter background */ +#mobile-nav #navigation-items button[aria-haspopup="menu"] { + background-color: var(--ls-gray-050) !important; + border-radius: var(--ls-radius-md) !important; +} + +html.dark #mobile-nav #navigation-items button[aria-haspopup="menu"] { + background-color: var(--ls-gray-950) !important; +} + +/* Mobile nav tabs dropdown - fix active/inactive colors */ +.mobile-nav-tabs-item { + color: var(--ls-gray-500) !important; +} + +.mobile-nav-tabs-item.text-primary, +.mobile-nav-tabs-item[class*="text-primary"] { + color: var(--ls-gray-950) !important; +} + +html.dark .mobile-nav-tabs-item { + color: var(--ls-gray-500) !important; +} + +html.dark .mobile-nav-tabs-item.text-primary, +html.dark .mobile-nav-tabs-item[class*="text-primary"] { + color: var(--ls-gray-100) !important; +} + +/* Mobile nav - top bar with logo and mode selector */ +div#mobile-nav .flex.items-center.justify-between { + padding-left: 8px !important; + padding-right: 8px !important; +} + +/* Mobile nav - dropdown wrapper: reduce bottom spacing */ +div#mobile-nav div#navigation-items > div:first-child { + margin-bottom: 0 !important; +} + +div#mobile-nav div#navigation-items .flex.flex-wrap { + padding-bottom: 20px !important; + margin-bottom: 0 !important; +} + +/* Mobile nav - sidebar group list: adjust spacing */ +div#mobile-nav ul.sidebar-group, +div#mobile-nav ul#sidebar-group, +#mobile-nav .sidebar-group-header + ul { + margin-top: -14px !important; + padding-top: 0 !important; + padding-bottom: 24px !important; +} + +#navigation-items { + background-color: var(--ls-gray-100) !important; + padding: 24px !important; + display: flex !important; + flex-direction: column !important; + gap: 0 !important; +} + +html.dark #navigation-items { + background-color: var(--ls-gray-975) !important; +} + +#navigation-items > div.text-sm { + display: flex !important; + flex-direction: column !important; + gap: 0 !important; +} + +/* Group containers */ +#navigation-items .mt-6, +#navigation-items .lg\:mt-8, +#navigation-items [class*="mt-6"], +#navigation-items [class*="mt-8"] { + margin-top: 0 !important; + padding-top: 24px !important; + padding-bottom: 24px !important; + position: relative !important; +} + +/* First group */ +#navigation-items > div > div:first-child, +#navigation-items > div.text-sm > div:first-child, +#navigation-items .text-sm > div:first-child, +#navigation-items > .text-sm > div:first-of-type { + padding-top: 0 !important; + padding-bottom: 24px !important; + margin-top: 0 !important; +} + +/* Group dividers */ +#navigation-items .mt-6:not(:first-child)::before, +#navigation-items .lg\:mt-8:not(:first-child)::before, +#navigation-items [class*="mt-6"]:not(:first-child)::before, +#navigation-items [class*="mt-8"]:not(:first-child)::before { + content: "" !important; + position: absolute !important; + top: 0 !important; + left: -24px !important; + right: -24px !important; + height: 0 !important; + border-top: 0.5px solid var(--ls-black-10) !important; +} + +html.dark #navigation-items .mt-6:not(:first-child)::before, +html.dark #navigation-items .lg\:mt-8:not(:first-child)::before, +html.dark #navigation-items [class*="mt-6"]:not(:first-child)::before, +html.dark #navigation-items [class*="mt-8"]:not(:first-child)::before { + border-top-color: var(--ls-white-06) !important; +} + +/* Group labels */ +#navigation-items button[class*="group"], +#navigation-items [data-component-part="group-title"], +.sidebar-group-header, +h5#sidebar-title, +.sidebar-group-header h5, +#navigation-items h5 { + font-size: 12px !important; + font-weight: 400 !important; + line-height: 18px !important; + color: var(--ls-gray-400) !important; + letter-spacing: 0 !important; + text-transform: none !important; + margin-bottom: 2px !important; +} + +html.dark #navigation-items button[class*="group"], +html.dark #navigation-items [data-component-part="group-title"], +html.dark .sidebar-group-header, +html.dark h5#sidebar-title, +html.dark .sidebar-group-header h5, +html.dark #navigation-items h5 { + color: var(--ls-gray-700) !important; +} + +/* Group header container */ +.sidebar-group-header, +div.sidebar-group-header, +#navigation-items .sidebar-group-header { + padding: 4px 8px !important; + padding-left: 8px !important; + margin-left: 0 !important; +} + +/* Nav item list */ +#navigation-items ul, +#navigation-items [class*="group"] + div { + display: flex !important; + flex-direction: column !important; + gap: 2px !important; +} + +/* Nav items */ +#navigation-items a, +#navigation-items li > a { + min-height: 36px !important; + padding: 8px !important; + border-radius: var(--ls-radius-md) !important; + font-size: 14px !important; + font-weight: 400 !important; + line-height: 20px !important; + color: var(--ls-gray-500) !important; + display: flex !important; + align-items: center !important; + gap: 12px !important; + transition: background-color 0.15s ease, color 0.15s ease !important; +} + +/* Active nav item */ +#navigation-items a[class*="text-primary"], +#navigation-items a.active, +#navigation-items a[aria-current="page"] { + color: var(--ls-gray-950) !important; + font-weight: 500 !important; +} + +/* Dark mode - inactive nav items one step darker */ +html.dark #navigation-items a { + color: var(--ls-gray-600) !important; +} + +html.dark #navigation-items a svg { + color: var(--ls-gray-600) !important; +} + +html.dark #navigation-items a[class*="text-primary"], +html.dark #navigation-items a.active, +html.dark #navigation-items a[aria-current="page"] { + color: var(--ls-gray-100) !important; +} + +/* Hover state */ +#navigation-items a:hover { + background-color: rgba(0, 0, 0, 0.03) !important; +} + +html.dark #navigation-items a:hover { + background-color: rgba(255, 255, 255, 0.05) !important; +} + +/* Nav item icons */ +#navigation-items a svg, +#navigation-items a img { + width: 20px !important; + height: 20px !important; + flex-shrink: 0 !important; +} + +#navigation-items a svg { + color: var(--ls-gray-500) !important; +} + +#navigation-items a img { + filter: brightness(0) saturate(100%) invert(50%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(98%) contrast(87%) !important; + opacity: 1 !important; +} + +html.dark #navigation-items a img { + filter: brightness(0) saturate(100%) invert(40%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(100%) contrast(90%) !important; +} + +#navigation-items a svg, +#navigation-items a svg * { + vector-effect: non-scaling-stroke !important; + stroke-width: 1.5px !important; +} + +/* Active nav item icons */ +#navigation-items a[class*="text-primary"] svg, +#navigation-items a.active svg, +#navigation-items a[aria-current="page"] svg { + color: var(--ls-gray-950) !important; +} + +html.dark #navigation-items a[class*="text-primary"] svg, +html.dark #navigation-items a.active svg, +html.dark #navigation-items a[aria-current="page"] svg { + color: var(--ls-gray-100) !important; +} + +#navigation-items a[class*="text-primary"] img, +#navigation-items a.active img, +#navigation-items a[aria-current="page"] img { + filter: brightness(0) saturate(100%) invert(7%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(100%) contrast(95%) !important; +} + +html.dark #navigation-items a[class*="text-primary"] img, +html.dark #navigation-items a.active img, +html.dark #navigation-items a[aria-current="page"] img { + filter: brightness(0) saturate(100%) invert(90%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(105%) contrast(95%) !important; +} + +/* Hide sidebar controls */ +button[class*="sidebar-toggle"], +button[aria-label*="sidebar"], +button[aria-label*="Collapse"], +[class*="sidebar"] button[class*="collapse"], +[class*="sidebar-collapse"], +#sidebar-toggle, +button[class*="toggle-sidebar"], +#sidebar-content > button.absolute, +#sidebar-content > button[class*="absolute"], +button.absolute.top-5.right-5 { + display: none !important; +} + +/* =========================================== + API Reference Sidebar - Expandable Groups + =========================================== */ + +/* Force left alignment on sidebar group elements (overrides Palm theme defaults) */ +#navigation-items [class*="mt-6"], +#navigation-items [class*="mt-8"], +#navigation-items [class*="lg:mt-"], +#sidebar-group, +ul#sidebar-group, +#sidebar-group *, +ul#sidebar-group *, +#navigation-items li.space-y-px, +#navigation-items li.space-y-px *, +#navigation-items li[class*="space-y"], +#navigation-items li[class*="space-y"] * { + text-align: left !important; + justify-content: flex-start !important; + align-items: flex-start !important; +} + +/* Sidebar group container - full width, left aligned */ +#sidebar-group, +ul#sidebar-group { + width: 100% !important; + display: flex !important; + flex-direction: column !important; + align-items: stretch !important; + justify-content: flex-start !important; +} + +/* List items - full width, block display */ +#sidebar-group > li, +ul#sidebar-group > li, +#navigation-items li.space-y-px, +#navigation-items li[class*="space-y"] { + width: 100% !important; + max-width: 100% !important; + display: block !important; + text-align: left !important; +} + +/* Expandable group buttons - full width, left aligned */ +#sidebar-group > li > button, +ul#sidebar-group > li > button, +#navigation-items li.space-y-px > button, +#navigation-items li[class*="space-y"] > button { + position: relative !important; + min-height: 36px !important; + padding: 8px !important; + padding-right: 32px !important; + border-radius: var(--ls-radius-md) !important; + font-size: 14px !important; + font-weight: 400 !important; + line-height: 20px !important; + color: var(--ls-gray-500) !important; + display: block !important; + text-align: left !important; + width: 100% !important; + max-width: 100% !important; + box-sizing: border-box !important; + justify-content: flex-start !important; +} + +html.dark #sidebar-group > li > button, +html.dark ul#sidebar-group > li > button, +html.dark #navigation-items li.space-y-px > button, +html.dark #navigation-items li[class*="space-y"] > button { + color: var(--ls-gray-600) !important; +} + +/* Hide the original SVG chevron */ +#sidebar-group > li > button > svg, +ul#sidebar-group > li > button > svg, +#navigation-items li.space-y-px > button > svg, +#navigation-items li[class*="space-y"] > button > svg { + display: none !important; + visibility: hidden !important; +} + +/* Create new chevron using CSS pseudo-element (Central Icons style) */ +#sidebar-group > li > button::after, +ul#sidebar-group > li > button::after, +#navigation-items li.space-y-px > button::after, +#navigation-items li[class*="space-y"] > button::after { + content: "" !important; + position: absolute !important; + right: 12px !important; + top: 50% !important; + width: 6px !important; + height: 6px !important; + border-right: 1.5px solid var(--ls-gray-300) !important; + border-bottom: 1.5px solid var(--ls-gray-300) !important; + transform: translateY(-50%) rotate(-45deg) !important; + transition: transform 0.2s ease !important; +} + +/* Chevron rotation when expanded (points down) */ +#sidebar-group > li > button[aria-expanded="true"]::after, +ul#sidebar-group > li > button[aria-expanded="true"]::after, +#navigation-items li.space-y-px > button[aria-expanded="true"]::after, +#navigation-items li[class*="space-y"] > button[aria-expanded="true"]::after { + transform: translateY(-70%) rotate(45deg) !important; +} + +/* Hover state for expandable groups - background only, no color change */ +#sidebar-group > li > button:hover, +ul#sidebar-group > li > button:hover, +#navigation-items li.space-y-px > button:hover, +#navigation-items li[class*="space-y"] > button:hover { + background-color: rgba(0, 0, 0, 0.03) !important; +} + +html.dark #sidebar-group > li > button:hover, +html.dark ul#sidebar-group > li > button:hover, +html.dark #navigation-items li.space-y-px > button:hover, +html.dark #navigation-items li[class*="space-y"] > button:hover { + background-color: rgba(255, 255, 255, 0.05) !important; +} + +/* Group buttons stay gray - only active page links get bold/dark styling */ + +/* Nested items in API reference groups */ +#sidebar-group > li ul, +ul#sidebar-group > li ul, +#sidebar-group > li ul li, +ul#sidebar-group > li ul li { + width: 100% !important; + display: block !important; +} + +#sidebar-group > li ul a, +ul#sidebar-group > li ul a, +#navigation-items li.space-y-px ul a, +#navigation-items li[class*="space-y"] ul a { + font-size: 14px !important; + text-align: left !important; + width: 100% !important; + max-width: 100% !important; + display: flex !important; + justify-content: flex-start !important; + align-items: center !important; + box-sizing: border-box !important; +} + +/* Vertical indentation line for nested items in expandable groups */ +#sidebar-group > li > ul, +ul#sidebar-group > li > ul, +#navigation-items li.space-y-px > ul, +#navigation-items li[class*="space-y"] > ul { + position: relative !important; + margin-left: 18px !important; + padding-left: 12px !important; + width: calc(100% - 18px) !important; + border-left: 0.5px solid var(--ls-black-10) !important; +} + +html.dark #sidebar-group > li > ul, +html.dark ul#sidebar-group > li > ul, +html.dark #navigation-items li.space-y-px > ul, +html.dark #navigation-items li[class*="space-y"] > ul { + border-left-color: var(--ls-white-06) !important; +} + +/* =========================================== + API Reference Sidebar - Group Icons + =========================================== */ + +/* Base icon styles for all API groups */ +#sidebar-group > li[data-title] > button, +ul#sidebar-group > li[data-title] > button { + padding-left: 40px !important; +} + +#sidebar-group > li[data-title] > button::before, +ul#sidebar-group > li[data-title] > button::before { + content: "" !important; + position: absolute !important; + left: 8px !important; + top: 50% !important; + transform: translateY(-50%) !important; + width: 20px !important; + height: 20px !important; + background-size: contain !important; + background-repeat: no-repeat !important; + background-position: center !important; + filter: brightness(0) saturate(100%) invert(50%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(98%) contrast(87%) !important; + opacity: 1 !important; +} + +/* Platform Configuration - settings gear */ +#sidebar-group > li[data-title="Platform Configuration"] > button::before, +ul#sidebar-group > li[data-title="Platform Configuration"] > button::before { + background-image: url('/images/icons/settings-gear2.svg') !important; +} + +/* Customers - people */ +#sidebar-group > li[data-title="Customers"] > button::before, +ul#sidebar-group > li[data-title="Customers"] > button::before { + background-image: url('/images/icons/people.svg') !important; +} + +/* Internal Accounts - wallet */ +#sidebar-group > li[data-title="Internal Accounts"] > button::before, +ul#sidebar-group > li[data-title="Internal Accounts"] > button::before { + background-image: url('/images/icons/wallet1.svg') !important; +} + +/* External Accounts - bank */ +#sidebar-group > li[data-title="External Accounts"] > button::before, +ul#sidebar-group > li[data-title="External Accounts"] > button::before { + background-image: url('/images/icons/bank.svg') !important; +} + +/* Same-Currency Transfers - horizontal expand arrows */ +#sidebar-group > li[data-title="Same-Currency Transfers"] > button::before, +ul#sidebar-group > li[data-title="Same-Currency Transfers"] > button::before { + background-image: url('/images/icons/arrow-expand-hor.svg') !important; +} + +/* Cross-Currency Transfers - left-right arrows */ +#sidebar-group > li[data-title="Cross-Currency Transfers"] > button::before, +ul#sidebar-group > li[data-title="Cross-Currency Transfers"] > button::before { + background-image: url('/images/icons/arrow-left-right.svg') !important; +} + +/* Transactions - receipt */ +#sidebar-group > li[data-title="Transactions"] > button::before, +ul#sidebar-group > li[data-title="Transactions"] > button::before { + background-image: url('/images/icons/receipt-check.svg') !important; +} + +/* Webhooks - bell */ +#sidebar-group > li[data-title="Webhooks"] > button::before, +ul#sidebar-group > li[data-title="Webhooks"] > button::before { + background-image: url('/images/icons/bell.svg') !important; +} + +/* Invitations - people add */ +#sidebar-group > li[data-title="Invitations"] > button::before, +ul#sidebar-group > li[data-title="Invitations"] > button::before { + background-image: url('/images/icons/people-add.svg') !important; +} + +/* Sandbox - sandbox icon */ +#sidebar-group > li[data-title="Sandbox"] > button::before, +ul#sidebar-group > li[data-title="Sandbox"] > button::before { + background-image: url('/images/icons/sandbox.svg') !important; +} + +/* Available UMA Providers - at symbol */ +#sidebar-group > li[data-title="Available UMA Providers"] > button::before, +ul#sidebar-group > li[data-title="Available UMA Providers"] > button::before { + background-image: url('/images/icons/at.svg') !important; +} + +/* API Tokens - key */ +#sidebar-group > li[data-title="API Tokens"] > button::before, +ul#sidebar-group > li[data-title="API Tokens"] > button::before { + background-image: url('/images/icons/key2.svg') !important; +} + + +/* =========================================== + Main Content Area + =========================================== */ + +#content-container, +#content-area, +#content, +[class*="content-container"], +main[class*="content"], +div[class*="peer-"][class*="lg:flex"], +div[class*="is-not-custom"] { + background-color: var(--ls-gray-050) !important; +} + +div[class*="lg:flex-1"][class*="lg:min-w-0"], +div[class*="lg:flex-1"][class*="overflow-x-clip"] { + background-color: var(--ls-gray-050) !important; +} + +html.dark #content-container, +html.dark #content-area, +html.dark #content, +html.dark [class*="content-container"], +html.dark main[class*="content"], +html.dark div[class*="peer-"][class*="lg:flex"], +html.dark div[class*="is-not-custom"] { + background-color: var(--ls-gray-950) !important; +} + +html.dark div[class*="lg:flex-1"][class*="lg:min-w-0"], +html.dark div[class*="lg:flex-1"][class*="overflow-x-clip"] { + background-color: var(--ls-gray-950) !important; +} + +/* Content images - override Mintlify's inline border-radius with tokens */ +#content img[style*="border-radius"] { + border-radius: var(--ls-radius-md) !important; +} + +/* Main content wrapper - remove padding/margin to keep gap clean */ +#content-area { + padding-left: 0 !important; + padding-right: 0 !important; + margin-right: 0 !important; +} + +/* Inner pages content + TOC gap */ +#content-container > div[class*="flex-row-reverse"] { + gap: 0 !important; +} + +/* Table of contents sidebar width */ +#content-side-layout { + width: 280px !important; + min-width: 280px !important; + max-width: 280px !important; + padding-left: 0 !important; + margin-left: 0 !important; +} + +/* Table of contents inner layout - 48px total gap from content */ +#table-of-contents-layout { + padding-left: 48px !important; +} + +/* Content container - set width and centering */ +/* 1076px = 980px content + 48px padding on each side */ +#content-container { + max-width: 1076px !important; + width: 100% !important; + margin-left: auto !important; + margin-right: auto !important; + padding-left: 48px !important; + padding-right: 48px !important; +} + +/* Mobile: Reduce content container padding to 24px */ +@media (max-width: 1023px) { + #content-container { + padding-left: 24px !important; + padding-right: 24px !important; + } +} + +/* Prose container - center the content with consistent margins */ +#content-area > article, +#content-area > div > article, +.prose { + margin-left: auto !important; + margin-right: auto !important; +} + +/* Table of contents layout - ensure balanced spacing */ +#table-of-contents-layout, +[class*="table-of-contents-layout"] { + padding-right: 24px !important; +} + +/* Hide main footer completely */ +#footer { + display: none !important; +} + +/* =========================================== + API Reference Page Fixes + + These styles only apply to API reference pages + (pages with #api-playground-2-operation-page). + They should NOT affect the homepage or regular + content pages with TOC. + =========================================== */ + +/* Wider layout for API reference pages only (max 1600px) */ +#content-container:has(#api-playground-2-operation-page) { + max-width: 1600px !important; + padding-right: 48px !important; +} + +/* Override the inner max-w-5xl constraint on API reference pages */ +#content-container:has(#api-playground-2-operation-page) > div.max-w-5xl, +#content-container:has(#api-playground-2-operation-page) > div[class*="max-w-5xl"] { + max-width: 100% !important; +} + +/* Ensure code panel doesn't shrink on API reference pages */ +#content-container:has(#api-playground-2-operation-page) #content-side-layout { + flex-shrink: 0 !important; + min-width: 28rem !important; +} + +/* Ensure content area is flexible on API reference pages */ +#content-container:has(#api-playground-2-operation-page) #content-area { + flex: 1 1 auto !important; + min-width: 0 !important; +} + +/* Add gap between main content and code column ONLY on API reference pages */ +/* Uses :has() to scope the rule to pages containing the API playground */ +#content-container > div[class*="flex-row-reverse"]:has(#api-playground-2-operation-page) { + gap: 48px !important; +} + +/* Override faint divider borders in API reference pages */ +#api-playground-2-operation-page [class*="border-gray-100"] { + border-color: var(--ls-black-10) !important; +} + +html.dark #api-playground-2-operation-page [class*="border-gray-800"] { + border-color: var(--ls-white-06) !important; +} + +/* Ensure API playground content is full width and left-aligned */ +#api-playground-2-operation-page { + width: 100% !important; + text-align: left !important; +} + +#api-playground-2-operation-page .mdx-content, +#api-playground-2-operation-page [class*="api-section"], +#api-playground-2-operation-page [class*="api-section-heading"] { + width: 100% !important; + text-align: left !important; + align-items: flex-start !important; +} + +/* Fix "Example:" row layout - these use flex with gap-1.5 */ +/* Target the specific flex containers that show "Example: value" pairs */ +#api-playground-2-operation-page div.flex[class*="prose"][class*="mt-6"], +#api-playground-2-operation-page div.flex.prose.prose-sm { + justify-content: flex-start !important; + gap: 6px !important; + width: auto !important; +} + +/* Ensure all prose paragraphs and text are full width and left-aligned */ +#api-playground-2-operation-page p, +#api-playground-2-operation-page p.whitespace-pre-line { + width: 100% !important; + max-width: 100% !important; + text-align: left !important; + display: block !important; +} + +/* Fix containers that wrap the prose content */ +#api-playground-2-operation-page [class*="space-y"], +#api-playground-2-operation-page [class*="whitespace-normal"], +#api-playground-2-operation-page [class*="overflow-wrap-anywhere"] { + width: 100% !important; + text-align: left !important; +} + +/* Ensure section subtitles are full width */ +#api-playground-2-operation-page [class*="api-section-heading-subtitle"], +#api-playground-2-operation-page [class*="api-section-heading-subtitle"] > div { + width: 100% !important; +} + +/* =========================================== + Sidebar Footer + =========================================== */ + +/* Sidebar footer section padding */ +#sidebar-content > div:last-of-type { + padding-left: 24px !important; + padding-right: 24px !important; +} + +/* Add "(0, 0, 0)" text to the left of sidebar footer */ +#sidebar-content > div:last-of-type::before { + content: "(0, 0, 0)"; + font-family: "Suisse Intl Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 10px; + color: var(--ls-gray-400); + margin-right: auto; + padding-left: 4px; +} + +html.dark #sidebar-content > div:last-of-type::before { + color: var(--ls-gray-700); +} + +/* =========================================== + Card Components + =========================================== */ + +/* Card container - border radius and border */ +.card, +.card-group .card, +div.card { + border-radius: var(--ls-radius-md) !important; /* 8px */ + border: 0.5px solid var(--ls-black-10) !important; +} + +html.dark .card, +html.dark .card-group .card, +html.dark div.card { + background-color: var(--ls-gray-925) !important; + border-color: var(--ls-white-06) !important; +} + +/* Card icons - invert for dark mode */ +html.dark .card img, +html.dark .card-group .card img, +html.dark div.card img { + filter: brightness(0) invert(1) !important; +} + +/* Card description text - secondary color */ +.card .prose p, +.card .prose span, +.card [data-as="p"], +.card-group .card .prose p, +.card-group .card .prose span { + color: var(--ls-gray-500) !important; +} + +/* Card icons - consistent sizing and stroke */ +.card svg, +.card-group .card svg { + width: 20px !important; + height: 20px !important; +} + +.card svg path, +.card svg line, +.card svg circle, +.card svg rect, +.card svg polyline, +.card svg polygon, +.card-group .card svg path, +.card-group .card svg line, +.card-group .card svg circle, +.card-group .card svg rect, +.card-group .card svg polyline, +.card-group .card svg polygon { + stroke-width: 1.5px !important; +} + +/* =========================================== + Callout Components + =========================================== */ + +/* Callout container - 8px border radius */ +.callout, +div.callout, +[data-callout-type] { + border-radius: var(--ls-radius-md) !important; +} + +/* =========================================== + API Reference - Code Groups + =========================================== */ + +/* Code group container - 8px border radius, no padding, black-10 border */ +#content-side-layout .code-group { + border-radius: var(--ls-radius-md) !important; + padding: 0 !important; + border: 0.5px solid var(--ls-black-10) !important; +} + +html.dark #content-side-layout .code-group { + border-color: var(--ls-white-06) !important; +} + +/* Code group inner container - no border radius */ +#content-side-layout .code-group > div, +#content-side-layout .code-group [class*="rounded"] { + border-radius: 0 !important; +} + +/* Code group tab bar header */ +#content-side-layout .code-group [data-component-part="code-group-tab-bar"] { + height: fit-content !important; + background-color: var(--ls-gray-025) !important; + border-bottom: 0.5px solid var(--ls-black-10) !important; + padding-top: 4px !important; + padding-bottom: 4px !important; +} + +/* Code group tab bar text - book weight */ +#content-side-layout .code-group [data-component-part="code-group-tab-bar"] { + font-weight: 450 !important; +} + +#content-side-layout .code-group [data-component-part="code-group-tab-bar"] span, +#content-side-layout .code-group [data-component-part="code-group-tab-bar"] button, +#content-side-layout .code-group [data-component-part="code-group-tab-bar"] div { + font-weight: 450 !important; +} + +/* Code group tab bar title - 2px left padding */ +#content-side-layout .code-group [data-component-part="code-group-tab-bar"] span.truncate { + padding-left: 4px !important; +} + +html.dark #content-side-layout .code-group [data-component-part="code-group-tab-bar"] { + background-color: var(--ls-gray-975) !important; + border-bottom-color: var(--ls-white-06) !important; +} + +/* Code block content area - darker in dark mode */ +html.dark #content-side-layout .code-group [data-component-part="code-block-root"], +html.dark #content-side-layout .code-block-background, +html.dark #content-side-layout [class*="bg-codeblock"], +html.dark .code-group [class*="dark:bg-codeblock"] { + background-color: var(--ls-gray-975) !important; +} + +/* =========================================== + API Reference - Endpoint Bar (GET /path) + =========================================== */ + +/* Outer and inner containers - same background color */ +#api-playground-2-operation-page .border-standard.rounded-2xl, +#api-playground-2-operation-page .border-standard.rounded-xl { + background-color: var(--ls-white) !important; + border: 0.5px solid var(--ls-black-10) !important; +} + +#api-playground-2-operation-page .border-standard.rounded-2xl { + border-radius: var(--ls-radius-lg) !important; +} + +#api-playground-2-operation-page .border-standard.rounded-xl { + border-radius: var(--ls-radius-sm) !important; +} + +html.dark #api-playground-2-operation-page .border-standard.rounded-2xl, +html.dark #api-playground-2-operation-page .border-standard.rounded-xl, +html.dark #api-playground-2-operation-page .border-standard[class*="rounded-xl"], +html.dark #api-playground-2-operation-page [class*="border-standard"][class*="rounded-xl"] { + background-color: var(--ls-gray-975) !important; + border-color: var(--ls-white-06) !important; +} + +/* Try it button - 6px radius */ +#api-playground-2-operation-page .tryit-button { + border-radius: var(--ls-radius-sm) !important; +} + +/* Expandable child attributes button */ +#api-playground-2-operation-page [data-component-part="expandable-button"] { + background-color: var(--ls-gray-025) !important; +} + +html.dark #api-playground-2-operation-page [data-component-part="expandable-button"] { + background-color: var(--ls-white-06) !important; +} + +/* Expandable details container when open */ +#api-playground-2-operation-page details.expandable, +#api-playground-2-operation-page details.expandable[open], +#api-playground-2-operation-page .expandable { + background-color: var(--ls-gray-025) !important; +} + +html.dark #api-playground-2-operation-page details.expandable, +html.dark #api-playground-2-operation-page details.expandable[open], +html.dark #api-playground-2-operation-page .expandable { + background-color: var(--ls-white-06) !important; +} + +/* Page description text - match body text size */ +#api-playground-2-operation-page header#header .text-lg, +header#header .text-lg { + font-size: 16px !important; + line-height: 24px !important; +} + +/* =========================================== + API Reference - Field Info Pills (chips) + =========================================== */ + +/* Make chips one step darker with border */ +#api-playground-2-operation-page [data-component-part="field-info-pill"] { + background-color: var(--ls-gray-150) !important; + border: 0.5px solid var(--ls-black-10) !important; +} + +html.dark #api-playground-2-operation-page [data-component-part="field-info-pill"] { + background-color: var(--ls-white-06) !important; + border: 0.5px solid var(--ls-white-06) !important; +} + +/* Required/colored pills - add consistent border */ +#api-playground-2-operation-page [data-component-part="field-required-pill"] { + border: 0.5px solid var(--ls-black-10) !important; +} + +html.dark #api-playground-2-operation-page [data-component-part="field-required-pill"] { + border: 0.5px solid var(--ls-white-10) !important; +} + +/* Tab list border - consistent with design system */ +#api-playground-2-operation-page [data-component-part="tabs-list"] { + border-color: var(--ls-black-10) !important; +} + +html.dark #api-playground-2-operation-page [data-component-part="tabs-list"] { + border-color: var(--ls-white-10) !important; +} + +/* Inline code styling */ +#content code:not(pre code), +#content-area code:not(pre code), +.prose code:not(pre code) { + background-color: var(--ls-gray-150) !important; + border: 0.5px solid var(--ls-black-10) !important; +} + +html.dark #content code:not(pre code), +html.dark #content-area code:not(pre code), +html.dark .prose code:not(pre code) { + background-color: var(--ls-white-06) !important; + border-color: var(--ls-white-06) !important; +} + +/* Inline code inside callouts - semi-transparent to work with any callout color */ +#content .callout code:not(pre code), +#content-area .callout code:not(pre code), +.prose .callout code:not(pre code), +#content [data-callout-type] code:not(pre code), +#content-area [data-callout-type] code:not(pre code), +.prose [data-callout-type] code:not(pre code) { + background-color: rgba(0, 0, 0, 0.08) !important; + border: 0.5px solid rgba(0, 0, 0, 0.15) !important; +} + +html.dark #content .callout code:not(pre code), +html.dark #content-area .callout code:not(pre code), +html.dark .prose .callout code:not(pre code), +html.dark #content [data-callout-type] code:not(pre code), +html.dark #content-area [data-callout-type] code:not(pre code), +html.dark .prose [data-callout-type] code:not(pre code) { + background-color: rgba(255, 255, 255, 0.1) !important; + border: 0.5px solid rgba(255, 255, 255, 0.15) !important; +} + +/* =========================================== + Content Area - Code Blocks + =========================================== */ + +/* Code block container - 8px border radius, 0.5px border */ +#content .code-block, +#content-area .code-block, +.prose .code-block { + border-radius: var(--ls-radius-md) !important; + border: 0.5px solid var(--ls-black-10) !important; +} + +html.dark #content .code-block, +html.dark #content-area .code-block, +html.dark .prose .code-block, +html.dark #content .code-group, +html.dark #content-area .code-group, +html.dark .prose .code-group { + border: 0.5px solid var(--ls-white-06) !important; +} + +/* Code block inner container - match outer radius */ +#content .code-block [data-component-part="code-block-root"], +#content-area .code-block [data-component-part="code-block-root"], +.prose .code-block [data-component-part="code-block-root"] { + border-radius: var(--ls-radius-md) !important; +} + +/* =========================================== + Content Area - Code Blocks with Header + =========================================== */ + +/* Code blocks with header - no padding, use overflow:hidden to clip corners */ +#content .code-block:has([data-component-part="code-block-header"]), +#content-area .code-block:has([data-component-part="code-block-header"]), +.prose .code-block:has([data-component-part="code-block-header"]), +#content .code-group, +#content-area .code-group, +.prose .code-group { + border-radius: var(--ls-radius-md) !important; + padding: 0 !important; + overflow: hidden !important; + border: 0.5px solid var(--ls-black-10) !important; +} + +/* Code block/group header - no border radius (clipped by parent) */ +#content .code-block [data-component-part="code-block-header"], +#content-area .code-block [data-component-part="code-block-header"], +.prose .code-block [data-component-part="code-block-header"], +#content .code-group [data-component-part="code-group-tab-bar"], +#content-area .code-group [data-component-part="code-group-tab-bar"], +.prose .code-group [data-component-part="code-group-tab-bar"] { + background-color: var(--ls-gray-025) !important; + border-bottom: 0.5px solid var(--ls-black-10) !important; + font-weight: 450 !important; + border-radius: 0 !important; +} + +html.dark #content .code-block [data-component-part="code-block-header"], +html.dark #content-area .code-block [data-component-part="code-block-header"], +html.dark .prose .code-block [data-component-part="code-block-header"], +html.dark #content .code-group [data-component-part="code-group-tab-bar"], +html.dark #content-area .code-group [data-component-part="code-group-tab-bar"], +html.dark .prose .code-group [data-component-part="code-group-tab-bar"] { + background-color: var(--ls-gray-975) !important; + border-bottom-color: var(--ls-white-06) !important; +} + +/* Code block/group content area - no border radius (clipped by parent) */ +#content .code-block:has([data-component-part="code-block-header"]) [data-component-part="code-block-root"], +#content-area .code-block:has([data-component-part="code-block-header"]) [data-component-part="code-block-root"], +.prose .code-block:has([data-component-part="code-block-header"]) [data-component-part="code-block-root"], +#content .code-group [data-component-part="code-block-root"], +#content-area .code-group [data-component-part="code-block-root"], +.prose .code-group [data-component-part="code-block-root"] { + border-radius: 0 !important; +} + +/* Code block/group content area - darker in dark mode */ +html.dark #content .code-block:has([data-component-part="code-block-header"]) [data-component-part="code-block-root"], +html.dark #content-area .code-block:has([data-component-part="code-block-header"]) [data-component-part="code-block-root"], +html.dark .prose .code-block:has([data-component-part="code-block-header"]) [data-component-part="code-block-root"], +html.dark #content .code-group [data-component-part="code-block-root"], +html.dark #content-area .code-group [data-component-part="code-block-root"], +html.dark .prose .code-group [data-component-part="code-block-root"] { + background-color: var(--ls-gray-975) !important; +} + +/* =========================================== + Pagination Navigation Buttons + =========================================== */ + +#pagination a { + border-radius: var(--ls-radius-md) !important; + background-color: var(--ls-gray-025) !important; + border: 0.5px solid var(--ls-black-10) !important; + transition: background-color 0.15s ease !important; +} + +#pagination a:hover { + background-color: var(--ls-gray-100) !important; +} + +#pagination a, +#pagination a * { + font-weight: 450 !important; +} + +/* Pagination title - 15px font size */ +#pagination a .font-medium { + font-size: 15px !important; + line-height: 22px !important; +} + +html.dark #pagination a { + background-color: var(--ls-gray-925) !important; + border-color: var(--ls-white-06) !important; +} + +html.dark #pagination a:hover { + background-color: var(--ls-gray-900) !important; +} + +/* =========================================== + Page Context Menu (Split Button Group) + =========================================== */ + +/* Remove any border from parent container */ +#page-context-menu, +div#page-context-menu { + border: none !important; + background: transparent !important; +} + +/* Copy page button - rounded left corners, no right border */ +button#page-context-menu-button, +#page-context-menu > button#page-context-menu-button { + background-color: var(--ls-gray-025) !important; + border: 0.5px solid var(--ls-black-10) !important; + border-right: none !important; + border-radius: 0 !important; + border-top-left-radius: var(--ls-radius-sm) !important; + border-bottom-left-radius: var(--ls-radius-sm) !important; +} + +/* Chevron button - rounded right corners, left border is the divider */ +#page-context-menu > button:not(#page-context-menu-button) { + background-color: var(--ls-gray-025) !important; + border: 0.5px solid var(--ls-black-10) !important; + border-radius: 0 !important; + border-top-right-radius: var(--ls-radius-sm) !important; + border-bottom-right-radius: var(--ls-radius-sm) !important; +} + +/* Hover state */ +button#page-context-menu-button:hover, +#page-context-menu > button#page-context-menu-button:hover, +#page-context-menu > button:not(#page-context-menu-button):hover { + background-color: var(--ls-gray-100) !important; +} + +/* Dark mode */ +html.dark button#page-context-menu-button, +html.dark #page-context-menu > button#page-context-menu-button { + background-color: var(--ls-gray-925) !important; + border-color: var(--ls-white-06) !important; + border-right: none !important; +} + +html.dark #page-context-menu > button:not(#page-context-menu-button) { + background-color: var(--ls-gray-925) !important; + border-color: var(--ls-white-06) !important; +} + +/* Dark mode hover */ +html.dark button#page-context-menu-button:hover, +html.dark #page-context-menu > button#page-context-menu-button:hover, +html.dark #page-context-menu > button:not(#page-context-menu-button):hover { + background-color: var(--ls-gray-850) !important; +} + +/* =========================================== + Feature Cards (Product pages) + =========================================== */ + +.feature-cards-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; +} + +@media (max-width: 640px) { + .feature-cards-grid { + grid-template-columns: 1fr; + } +} + +.feature-card { + background-color: var(--ls-white); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-md); + padding: 24px; + display: flex; + flex-direction: column; + gap: 24px; + height: 100%; +} + +html.dark .feature-card { + background-color: var(--ls-gray-925); + border-color: var(--ls-white-06); +} + +.feature-card-icon-wrapper { + background-color: var(--ls-gray-050); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-xs); + padding: 8px; + width: fit-content; + pointer-events: none; +} + +html.dark .feature-card-icon-wrapper { + background-color: var(--ls-white-06); + border-color: var(--ls-white-06); +} + +.feature-card-icon { + width: 20px; + height: 20px; + pointer-events: none; +} + +/* Only apply dark mode filter to img icons, not mask-image colored icons */ +html.dark .feature-card-icon-wrapper img.feature-card-icon { + filter: brightness(0) invert(1); +} + +.feature-card-title { + font-size: 15px; + line-height: 22px; + color: var(--ls-gray-950); +} + +html.dark .feature-card-title { + color: var(--ls-gray-050); +} + +/* Title row with inline tag */ +.feature-card-title-row { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} + +.feature-card-title-row .feature-card-title { + font-size: 15px; + line-height: 22px; + color: var(--ls-gray-950); +} + +html.dark .feature-card-title-row .feature-card-title { + color: var(--ls-gray-050); +} + +.feature-card-content { + display: flex; + flex-direction: column; + flex: 1; +} + +.feature-card-content .feature-card-link-row { + margin-top: auto; + padding-top: 12px; +} + +.feature-card-desc { + font-size: 15px; + line-height: 22px; + color: var(--ls-gray-500); +} + +.feature-card-link-row { + /* spacing handled by margin-top: auto in .feature-card-content context */ +} + +.feature-card-text-link { + font-size: 14px; + font-weight: 450; + line-height: 20px; + text-decoration: none; + transition: opacity 0.2s ease; + display: inline-flex; + align-items: center; + gap: 4px; +} + +.feature-card-text-link:hover { + opacity: 0.7; +} + +.feature-card-coming-soon { + cursor: default; +} + +.feature-card-coming-soon:hover { + opacity: 0.6; +} + +/* Column variants */ +.feature-cards-cols-1 { + grid-template-columns: 1fr; +} + +.feature-cards-cols-2 { + grid-template-columns: repeat(2, 1fr); +} + +.feature-cards-cols-3 { + grid-template-columns: repeat(3, 1fr); +} + +.feature-cards-cols-4 { + grid-template-columns: repeat(4, 1fr); +} + +@media (max-width: 768px) { + .feature-cards-cols-4 { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 640px) { + .feature-cards-cols-2, + .feature-cards-cols-3, + .feature-cards-cols-4 { + grid-template-columns: 1fr; + } +} + +/* Link card styles */ +.feature-card-anchor { + text-decoration: none; + display: block; + height: 100%; +} + +.feature-card-link { + transition: all 0.2s ease; +} + +.feature-card-link:hover { + background-color: var(--ls-gray-025); + transform: scale(1.02); +} + +html.dark .feature-card-link:hover { + background-color: var(--ls-gray-900); +} + +/* Cards without icon */ +.feature-card-no-icon { + gap: 8px; +} + +/* =========================================== + Feature Card - Horizontal Layout + =========================================== */ + +.feature-card-horizontal { + flex-direction: row !important; + align-items: flex-start !important; + gap: 16px !important; +} + +.feature-card-horizontal .feature-card-icon-wrapper { + flex-shrink: 0; +} + +.feature-card-horizontal .feature-card-content { + flex: 1; + min-width: 0; +} + +/* Feature Card List - vertical stack for horizontal cards */ +.feature-cards-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +/* Feature Card Container - card-style wrapper for grouped content */ +.feature-card-container { + background-color: var(--ls-white); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-md); + position: relative; + overflow: hidden; +} + +html.dark .feature-card-container { + background-color: var(--ls-gray-925); + border-color: var(--ls-white-06); +} + +/* Grid inside container - no gap, items have padding instead */ +.feature-card-container .feature-cards-grid { + gap: 0; +} + +.feature-card-container .feature-card { + padding: 24px !important; +} + +/* List inside container - no gap, use padding and dividers */ +.feature-card-container .feature-cards-list { + gap: 0; +} + +/* Horizontal dividers between list items */ +.feature-card-container .feature-cards-list .feature-card:not(:last-child) { + border-bottom: 0.5px solid var(--ls-black-10) !important; + border-radius: 0 !important; +} + +.feature-card-container .feature-cards-list .feature-card:last-child { + border-radius: 0 !important; +} + +html.dark .feature-card-container .feature-cards-list .feature-card:not(:last-child) { + border-bottom-color: var(--ls-white-06) !important; +} + +/* Vertical divider (for 2-column grid) */ +.feature-card-container:has(.feature-cards-cols-2)::before { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 50%; + width: 0; + border-left: 0.5px solid var(--ls-black-10); + z-index: 1; +} + +/* Horizontal divider (for 2x2 grid - 4 items) */ +.feature-card-container:has(.feature-cards-cols-2)::after { + content: ""; + position: absolute; + left: 0; + right: 0; + top: 50%; + height: 0; + border-top: 0.5px solid var(--ls-black-10); + z-index: 1; +} + +html.dark .feature-card-container:has(.feature-cards-cols-2)::before { + border-left-color: var(--ls-white-06); +} + +html.dark .feature-card-container:has(.feature-cards-cols-2)::after { + border-top-color: var(--ls-white-06); +} + +/* =========================================== + Feature Card - Flat Variant (no card styling) + =========================================== */ + +.feature-card-flat { + background-color: transparent !important; + border: none !important; + padding: 0 !important; +} + +html.dark .feature-card-flat { + background-color: transparent !important; + border: none !important; +} + +/* =========================================== + Feature Card - Large Icon Variant (+8px) + =========================================== */ + +.feature-card-icon-lg .feature-card-icon-wrapper { + padding: 12px; +} + +.feature-card-icon-lg .feature-card-icon { + width: 28px; + height: 28px; +} + +/* For colored mask icons in large variant */ +.feature-card-icon-lg .feature-card-icon[style*="mask-image"] { + width: 28px !important; + height: 28px !important; +} + +/* =========================================== + Image Cards (Use cases page) + =========================================== */ + +.image-card { + background-color: var(--ls-white); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-md); + overflow: hidden; + display: flex; + flex-direction: column; + height: 100%; +} + +html.dark .image-card { + background-color: var(--ls-gray-925); + border-color: var(--ls-white-06); +} + +.image-card-img-wrapper { + width: 100%; + aspect-ratio: 1 / 1; + overflow: hidden; + border-radius: 0; +} + +.image-card-img { + width: 100%; + height: 100%; + object-fit: cover; + pointer-events: none; + border-radius: 0; +} + +.image-card-content { + padding: 24px; + display: flex; + flex-direction: column; + gap: 0px; +} + +.image-card-title { + font-size: 15px; + line-height: 22px; + color: var(--ls-gray-950); +} + +html.dark .image-card-title { + color: var(--ls-gray-050); +} + +.image-card-desc { + font-size: 15px; + line-height: 22px; + color: var(--ls-gray-500); +} + +/* Link card styles */ +.image-card-anchor { + text-decoration: none; + display: block; + height: 100%; +} + +.image-card-link { + transition: all 0.2s ease; +} + +.image-card-link:hover { + background-color: var(--ls-gray-025); + transform: scale(1.02); +} + +html.dark .image-card-link:hover { + background-color: var(--ls-gray-900); +} + +/* =========================================== + Steps Component + =========================================== */ + +/* Step number indicators - one step darker than default */ +.steps [class*="size-7"][class*="rounded-full"] { + background-color: var(--ls-gray-150) !important; + border: 0.5px solid var(--ls-black-10) !important; +} + +html.dark .steps [class*="size-7"][class*="rounded-full"] { + background-color: var(--ls-white-10) !important; + border-color: var(--ls-white-06) !important; +} + +/* Feature card tag row - same structure as link-row */ +.feature-card-content .feature-card-tag-row { + margin-top: auto; + padding-top: 12px; +} + +/* Feature card tag - pill style */ +.feature-card-tag { + display: inline-block; + width: fit-content; + background-color: var(--ls-gray-100); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-xs); + padding: 2px 8px; + font-size: 12px; + font-weight: 500; + line-height: 18px; + color: var(--ls-gray-700); +} + +html.dark .feature-card-tag { + background-color: var(--ls-white-06); + border-color: var(--ls-white-06); + color: var(--ls-gray-400); +} + +/* =========================================== + Tab Controllers (API/Dashboard tabs) + =========================================== */ + +/* Tab container border */ +#content ul:has([data-component-part="tab-button"]) { + border-bottom-color: var(--ls-black-10) !important; +} + +html.dark #content ul:has([data-component-part="tab-button"]) { + border-bottom-color: var(--ls-white-06) !important; +} + +/* All tabs - consistent weight to prevent layout shift */ +[data-component-part="tab-button"] { + font-weight: 450 !important; +} + +/* Inactive tab */ +[data-component-part="tab-button"][data-active="false"] { + color: var(--ls-gray-500) !important; + border-color: transparent !important; +} + +[data-component-part="tab-button"][data-active="false"]:hover { + color: var(--ls-gray-700) !important; + border-color: var(--ls-gray-300) !important; +} + +html.dark [data-component-part="tab-button"][data-active="false"] { + color: var(--ls-gray-600) !important; +} + +html.dark [data-component-part="tab-button"][data-active="false"]:hover { + color: var(--ls-gray-400) !important; + border-color: var(--ls-gray-700) !important; +} + +/* Active tab */ +[data-component-part="tab-button"][data-active="true"] { + color: var(--ls-gray-950) !important; + border-color: var(--ls-gray-950) !important; +} + +html.dark [data-component-part="tab-button"][data-active="true"] { + color: var(--ls-white) !important; + border-color: var(--ls-gray-100) !important; +} + +/* =========================================== + Tables + =========================================== */ + +/* Table cell font size */ +#content table td, +#content table th, +.prose table td, +.prose table th { + font-size: 15px !important; + line-height: 22px !important; +} + +/* Table row hover effect */ +#content table tbody tr, +.prose table tbody tr { + transition: background-color 0.15s ease !important; +} + +#content table tbody tr:hover, +.prose table tbody tr:hover { + background-color: var(--ls-gray-075) !important; +} + +html.dark #content table tbody tr:hover, +html.dark .prose table tbody tr:hover { + background-color: var(--ls-white-02) !important; +} + +/* =========================================== + Accordion Component + =========================================== */ + +/* Accordion group container */ +.accordion-group { + border-radius: var(--ls-radius-md) !important; + border: 0.5px solid var(--ls-black-10) !important; + overflow: hidden; +} + +html.dark .accordion-group { + border-color: var(--ls-white-10) !important; +} + +/* Accordion item summary/trigger */ +.accordion-group details > summary { + padding: 16px !important; + background-color: var(--ls-gray-025) !important; + cursor: pointer; + position: relative; + transition: background-color 0.15s ease; +} + +html.dark .accordion-group details > summary { + background-color: var(--ls-white-04) !important; +} + +/* Hover state */ +.accordion-group details > summary:hover { + background-color: var(--ls-gray-075) !important; +} + +html.dark .accordion-group details > summary:hover { + background-color: var(--ls-white-06) !important; +} + +/* Hide Mintlify's chevron SVG */ +.accordion-group details > summary svg { + display: none !important; +} + +/* Create Central Icons style chevron */ +.accordion-group details > summary::before { + content: "" !important; + position: absolute !important; + left: 20px !important; + top: 50% !important; + width: 6px !important; + height: 6px !important; + border-right: 1.5px solid var(--ls-gray-400) !important; + border-bottom: 1.5px solid var(--ls-gray-400) !important; + transform: translateY(-50%) rotate(-45deg) !important; + transition: transform 0.2s ease !important; +} + +html.dark .accordion-group details > summary::before { + border-color: var(--ls-gray-500) !important; +} + +/* Chevron rotation when open */ +.accordion-group details[open] > summary::before { + transform: translateY(-70%) rotate(45deg) !important; +} + +/* Adjust summary text to account for chevron (16px + 6px chevron + 8px gap = 30px) */ +.accordion-group details > summary { + padding-left: 30px !important; +} + +/* Accordion content area */ +.accordion-group details > *:not(summary), +.accordion-group details [data-component-part="accordion-content"] { + padding: 16px !important; + padding-left: 30px !important; + margin: 0 !important; + background-color: var(--ls-gray-025) !important; +} + +html.dark .accordion-group details > *:not(summary), +html.dark .accordion-group details [data-component-part="accordion-content"] { + background-color: var(--ls-white-04) !important; +} + +/* Dividers between accordion items */ +.accordion-group details:not(:last-child) { + border-bottom: 0.5px solid var(--ls-black-10) !important; +} + +html.dark .accordion-group details:not(:last-child) { + border-bottom-color: var(--ls-white-10) !important; +} + +/* Override Mintlify's divide-y on accordion group */ +.accordion-group.divide-y > details { + border-top: none !important; +} + +.accordion-group.divide-y > details:not(:last-child) { + border-bottom: 0.5px solid var(--ls-black-10) !important; +} + +html.dark .accordion-group.divide-y > details:not(:last-child) { + border-bottom-color: var(--ls-white-10) !important; +} + +/* Steps inside accordion - reduce spacing */ +.accordion-group .steps { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.accordion-group .steps > div:first-child { + padding-top: 0 !important; + margin-top: 0 !important; +} + +.accordion-group .steps > div:last-child { + padding-bottom: 0 !important; + margin-bottom: 0 !important; +} + +/* =========================================== + Standalone Accordion (not in accordion-group) + Note: .prose:not(.accordion-group) excludes accordion groups which also have .prose class + =========================================== */ + +/* Container styling */ +#content > details.accordion, +#content-area > details.accordion, +.prose:not(.accordion-group) > details.accordion { + border-radius: var(--ls-radius-md) !important; + border: 0.5px solid var(--ls-black-10) !important; + overflow: hidden; + margin-bottom: 12px; +} + +html.dark #content > details.accordion, +html.dark #content-area > details.accordion, +html.dark .prose:not(.accordion-group) > details.accordion { + border-color: var(--ls-white-10) !important; +} + +/* Summary/trigger styling */ +#content > details.accordion > summary, +#content-area > details.accordion > summary, +.prose:not(.accordion-group) > details.accordion > summary { + padding: 16px !important; + padding-left: 30px !important; + background-color: var(--ls-gray-025) !important; + cursor: pointer; + position: relative; + transition: background-color 0.15s ease; +} + +html.dark #content > details.accordion > summary, +html.dark #content-area > details.accordion > summary, +html.dark .prose:not(.accordion-group) > details.accordion > summary { + background-color: var(--ls-white-04) !important; +} + +/* Hover state */ +#content > details.accordion > summary:hover, +#content-area > details.accordion > summary:hover, +.prose:not(.accordion-group) > details.accordion > summary:hover { + background-color: var(--ls-gray-075) !important; +} + +html.dark #content > details.accordion > summary:hover, +html.dark #content-area > details.accordion > summary:hover, +html.dark .prose:not(.accordion-group) > details.accordion > summary:hover { + background-color: var(--ls-white-06) !important; +} + +/* Hide Mintlify's chevron SVG */ +#content > details.accordion > summary svg, +#content-area > details.accordion > summary svg, +.prose:not(.accordion-group) > details.accordion > summary svg { + display: none !important; +} + +/* Custom chevron */ +#content > details.accordion > summary::before, +#content-area > details.accordion > summary::before, +.prose:not(.accordion-group) > details.accordion > summary::before { + content: "" !important; + position: absolute !important; + left: 20px !important; + top: 50% !important; + width: 6px !important; + height: 6px !important; + border-right: 1.5px solid var(--ls-gray-400) !important; + border-bottom: 1.5px solid var(--ls-gray-400) !important; + transform: translateY(-50%) rotate(-45deg) !important; + transition: transform 0.2s ease !important; +} + +html.dark #content > details.accordion > summary::before, +html.dark #content-area > details.accordion > summary::before, +html.dark .prose:not(.accordion-group) > details.accordion > summary::before { + border-color: var(--ls-gray-500) !important; +} + +/* Chevron rotation when open */ +#content > details.accordion[open] > summary::before, +#content-area > details.accordion[open] > summary::before, +.prose:not(.accordion-group) > details.accordion[open] > summary::before { + transform: translateY(-70%) rotate(45deg) !important; +} + +/* Content area */ +#content > details.accordion > *:not(summary), +#content-area > details.accordion > *:not(summary), +.prose:not(.accordion-group) > details.accordion > *:not(summary), +#content > details.accordion [data-component-part="accordion-content"], +#content-area > details.accordion [data-component-part="accordion-content"], +.prose:not(.accordion-group) > details.accordion [data-component-part="accordion-content"] { + padding: 16px !important; + padding-left: 30px !important; + margin: 0 !important; + background-color: var(--ls-gray-025) !important; +} + +html.dark #content > details.accordion > *:not(summary), +html.dark #content-area > details.accordion > *:not(summary), +html.dark .prose:not(.accordion-group) > details.accordion > *:not(summary), +html.dark #content > details.accordion [data-component-part="accordion-content"], +html.dark #content-area > details.accordion [data-component-part="accordion-content"], +html.dark .prose:not(.accordion-group) > details.accordion [data-component-part="accordion-content"] { + background-color: var(--ls-white-04) !important; +} + +/* =========================================== + Page Hero Images + Mobile: Square aspect ratio with center crop + =========================================== */ + +.page-hero { + width: 100%; + border-radius: var(--ls-radius-md); + margin-bottom: 24px; +} + +@media (max-width: 640px) { + .page-hero { + aspect-ratio: 1 / 1; + object-fit: cover; + object-position: center; + } +} diff --git a/mintlify/styles/fonts.css b/mintlify/styles/fonts.css index 945ca28e..9b989ae8 100644 --- a/mintlify/styles/fonts.css +++ b/mintlify/styles/fonts.css @@ -9,6 +9,9 @@ font-weight: 400; font-style: normal; font-display: block; + ascent-override: 85%; + descent-override: 15%; + line-gap-override: 0%; } /* Book (450) - Button text */ @@ -18,6 +21,9 @@ font-weight: 450; font-style: normal; font-display: block; + ascent-override: 85%; + descent-override: 15%; + line-gap-override: 0%; } /* Medium (500) - Bold/emphasis text */ @@ -27,6 +33,9 @@ font-weight: 500; font-style: normal; font-display: block; + ascent-override: 85%; + descent-override: 15%; + line-gap-override: 0%; } /* Map bold (700) to Medium for consistent typography */ @@ -36,6 +45,9 @@ font-weight: 700; font-style: normal; font-display: block; + ascent-override: 85%; + descent-override: 15%; + line-gap-override: 0%; } /* =========================================== diff --git a/mintlify/styles/homepage.css b/mintlify/styles/homepage.css new file mode 100644 index 00000000..10152a4f --- /dev/null +++ b/mintlify/styles/homepage.css @@ -0,0 +1,1037 @@ +/* =========================================== + Homepage Styles + + All styles specific to the documentation + homepage (index.mdx). Uses design tokens. + =========================================== */ + +/* =========================================== + Homepage Element Hiding + Hide TOC, pagination, footer on homepage + =========================================== */ + +html.is-homepage #table-of-contents, +html.is-homepage [class*="table-of-contents"], +html.is-homepage #table-of-contents-layout, +html.is-homepage [class*="table-of-contents-layout"] { + display: none !important; +} + +html.is-homepage #page-title, +html.is-homepage #header { + display: none !important; + visibility: hidden !important; +} + +html.is-homepage #page-context-menu, +html.is-homepage #page-context-menu-button, +html.is-homepage [class*="page-context-menu"] { + display: none !important; + visibility: hidden !important; +} + +html.is-homepage .eyebrow, +html.is-homepage [class*="eyebrow"] { + display: none !important; +} + +html.is-homepage #pagination, +body.is-homepage #pagination, +html.is-homepage [class*="pagination"], +body.is-homepage [class*="pagination"], +html.is-homepage nav[aria-label*="pagination"], +body.is-homepage nav[aria-label*="pagination"], +html.is-homepage #content-area > #pagination, +body.is-homepage #content-area > #pagination { + display: none !important; + visibility: hidden !important; + height: 0 !important; + overflow: hidden !important; + margin: 0 !important; + padding: 0 !important; +} + +html.is-homepage footer, +body.is-homepage footer, +html.is-homepage #footer, +body.is-homepage #footer, +html.is-homepage [class*="footer"]:not(#sidebar-content *), +body.is-homepage [class*="footer"]:not(#sidebar-content *) { + display: none !important; + visibility: hidden !important; + height: 0 !important; + overflow: hidden !important; + margin: 0 !important; + padding: 0 !important; +} + +html.is-homepage #content-area { + max-width: 100%; +} + +/* Fix content container width and centering on homepage */ +/* 1076px = 980px content + 48px padding on each side */ +html.is-homepage #content-container { + max-width: 1076px !important; + width: 100% !important; + margin-left: auto !important; + margin-right: auto !important; + padding-left: 48px !important; + padding-right: 48px !important; +} + +/* =========================================== + Homepage Content Container + Full control over styling without prose + =========================================== */ + +.homepage-content { + font-size: 14px; + line-height: 1.5; + color: var(--ls-gray-950); +} + +html.dark .homepage-content { + color: var(--ls-gray-100); +} + +/* Section headings */ +.homepage-content h2 { + font-size: 21px; + font-weight: 400 !important; + line-height: 1.3; + letter-spacing: -0.2px; + margin: 0; + padding: 48px 0 24px 8px; + color: var(--ls-black); + font-feature-settings: "salt" 1, "case" 1; + display: inline; +} + +html.dark .homepage-content h2 { + color: var(--ls-gray-100); +} + +.homepage-content h2 + span, +.homepage-content .section-subtitle { + font-size: 21px; + font-weight: 400 !important; + line-height: 1.3; + letter-spacing: -0.2px; + color: var(--ls-gray-400); + font-feature-settings: "salt" 1, "case" 1; + display: inline; + margin-left: 6px; +} + +/* =========================================== + Section Headers + =========================================== */ + +.section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 48px 8px 16px 8px; + width: 100%; +} + +.section-header-text { + display: flex; + align-items: baseline; + gap: 6px; + flex: 1; + flex-wrap: wrap; +} + +/* Prevent subtitle from wrapping internally - if no space, whole thing drops to new line */ +.section-header-text .section-subtitle { + white-space: nowrap; +} + +.section-title { + font-size: 21px; + font-weight: 400 !important; + line-height: 1.3; + letter-spacing: -0.2px; + color: var(--ls-gray-950); + font-feature-settings: "salt" 1, "case" 1; + white-space: nowrap; +} + +html.dark .section-title { + color: var(--ls-gray-100); +} + +.section-header .section-subtitle { + margin-left: 0; +} + +.section-header-arrow { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: var(--ls-radius-sm); + color: var(--ls-gray-300); + background-color: transparent; + transition: background-color 0.15s ease, color 0.15s ease; + flex-shrink: 0; +} + +.section-header-arrow:hover { + background-color: rgba(0, 0, 0, 0.05); + color: var(--ls-gray-950); +} + +.section-header-arrow svg { + width: 20px; + height: 20px; +} + +html.dark .section-header-arrow { + color: var(--ls-gray-300); +} + +html.dark .section-header-arrow:hover { + background-color: var(--ls-white-06); + color: var(--ls-gray-100); +} + +/* What you can build section */ +.section-what-you-can-build { + margin-top: 0; +} + +.section-what-you-can-build .section-header { + padding-top: 48px; +} + +/* =========================================== + Hero Header + =========================================== */ + +.hero-header { + display: flex; + gap: 32px; + align-items: center; + margin-bottom: 48px; +} + +@media (max-width: 768px) { + .hero-header { + flex-direction: column; + gap: 24px; + align-items: flex-start; + } +} + +.hero-header-left { + display: flex; + flex-direction: column; + flex: 1; + gap: 4px; + align-items: flex-start; +} + +.hero-logo { + width: 90px; + height: 25px; + display: block; + margin-left: 3px; +} + +html.dark .hero-logo { + filter: brightness(0) invert(1); +} + +.hero-subtitle { + font-size: 32px; + font-weight: 400; + line-height: 1.2; + letter-spacing: -0.7px; + color: var(--ls-gray-950); + opacity: 0.5; + display: block; + font-feature-settings: "salt" 1, "case" 1; +} + +html.dark .hero-subtitle { + color: var(--ls-white); + opacity: 0.5; +} + +.hero-header-right { + display: flex; + flex-direction: column; + flex: 1; + justify-content: center; +} + +.hero-tagline { + font-size: 15px; + line-height: 1.625; + letter-spacing: 0px; + color: var(--ls-gray-950); + font-feature-settings: "salt" 1; +} + +html.dark .hero-tagline { + color: var(--ls-gray-100); +} + +/* =========================================== + Hero Banner (Sandbox CTA) + =========================================== */ + +.hero-banner { + position: relative; + height: 84px; + border-radius: var(--ls-radius-md); + overflow: hidden; + margin-bottom: 16px; + display: flex; + align-items: center; + padding: 24px; + gap: 24px; + text-decoration: none; + cursor: pointer; +} + +.hero-banner-bg { + position: absolute; + inset: 0; + background-image: url('/images/home/sand.png'); + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + transition: transform 0.4s ease, filter 0.3s ease; + z-index: 0; + transform: scale(1.03); +} + +.hero-banner:hover .hero-banner-bg { + transform: scale(1); + filter: brightness(0.92); +} + +.hero-banner-overlay { + position: relative; + z-index: 1; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + gap: 24px; +} + +.hero-banner-text { + flex: 1; + color: var(--ls-gray-100); + font-size: 16px; + line-height: 24px; + font-feature-settings: "salt" 1; +} + +.hero-banner-text-link { + color: var(--ls-white-50); +} + +.hero-banner-button { + padding: 0 16px; + height: 36px; + min-width: 36px; + background: var(--ls-gray-050); + color: var(--ls-gray-950); + border-radius: var(--ls-radius-sm); + font-size: 14px; + font-weight: 450 !important; + line-height: 20px; + text-decoration: none; + display: flex; + align-items: center; + justify-content: center; + transition: background 0.2s ease; + flex-shrink: 0; +} + +.hero-banner-button:hover { + background: var(--ls-white); +} + +/* Mobile: Stack hero banner content vertically */ +@media (max-width: 640px) { + .hero-banner { + height: auto; + flex-direction: column; + align-items: flex-start; + gap: 16px; + } + + .hero-banner-overlay { + flex-direction: column; + align-items: flex-start; + gap: 16px; + } + + .hero-banner-button { + align-self: flex-start; + } +} + +html.dark .hero-banner-button { + background: var(--ls-gray-950); + color: var(--ls-gray-050); +} + +html.dark .hero-banner-button:hover { + background: var(--ls-gray-900); +} + +/* =========================================== + Info Cards (Understand Grid & Start Building) + =========================================== */ + +.info-cards-grid { + display: flex; + gap: 16px; + padding-bottom: 8px; + margin-bottom: 0; +} + +@media (max-width: 640px) { + .info-cards-grid { + flex-direction: column; + } +} + +.info-card { + flex: 1 0 0; + background: var(--ls-white); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-md); + padding: 24px; + display: flex; + flex-direction: column; + gap: 24px; +} + +html.dark .info-card { + background: var(--ls-gray-925); + border-color: var(--ls-white-06); +} + +.info-card-icon { + width: 24px; + height: 24px; +} + +.info-card-content { + display: flex; + flex-direction: column; + gap: 0; +} + +.info-card-title { + font-size: 16px; + font-weight: 400; + line-height: 24px; + color: var(--ls-gray-950); + font-feature-settings: "salt" 1; +} + +html.dark .info-card-title { + color: var(--ls-gray-050); +} + +.info-card-desc { + font-size: 16px; + line-height: 24px; + color: var(--ls-gray-400); + font-feature-settings: "salt" 1; +} + +.info-card-links { + display: flex; + flex-direction: column; + gap: 8px; +} + +.info-card-link { + font-size: 14px; + font-weight: 450 !important; + line-height: 20px; + text-decoration: none; + transition: opacity 0.2s ease; +} + +.info-card-link:hover { + opacity: 0.7; +} + +/* Understand Grid card - cyan links */ +.info-card:first-child .info-card-link { + color: var(--ls-sky-500); +} + +/* Start building card - orange links */ +.info-card:last-child .info-card-link { + color: var(--ls-orange-500); +} + +/* =========================================== + Capabilities Grid + =========================================== */ + +.capabilities-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + grid-template-rows: repeat(2, auto); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-md); + overflow: hidden; + width: 100%; + margin-bottom: 8px; +} + +html.dark .capabilities-grid { + border-color: var(--ls-white-06); +} + +@media (max-width: 1024px) { + .capabilities-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-rows: repeat(4, auto); + } +} + +@media (max-width: 640px) { + .capabilities-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-rows: repeat(4, auto); + } +} + +.capability-card { + display: flex; + flex-direction: column; + gap: 14px; + padding: 24px 24px 20px 24px; + background: var(--ls-white); + border-right: 0.5px solid var(--ls-black-10); + border-bottom: 0.5px solid var(--ls-black-10); +} + +html.dark .capability-card { + background: var(--ls-gray-925); + border-color: var(--ls-white-06); +} + +.capability-toggle rect:last-child { + transition: transform 0.3s ease; +} + +.capability-card:hover .capability-toggle rect:last-child { + transform: translateX(-16px); +} + +.capability-card:nth-child(4n) { + border-right: none; +} + +.capability-card:nth-last-child(-n+4) { + border-bottom: none; +} + +@media (max-width: 1024px) { + .capability-card:nth-child(4n) { + border-right: 0.5px solid var(--ls-black-10); + } + .capability-card:nth-child(2n) { + border-right: none; + } + .capability-card:nth-last-child(-n+4) { + border-bottom: 0.5px solid var(--ls-black-10); + } + .capability-card:nth-last-child(-n+2) { + border-bottom: none; + } + + html.dark .capability-card:nth-child(4n) { + border-right: 0.5px solid var(--ls-white-06); + } + html.dark .capability-card:nth-last-child(-n+4) { + border-bottom: 0.5px solid var(--ls-white-06); + } +} + +@media (max-width: 640px) { + /* 2-column layout on mobile - same rules as 1024px breakpoint */ + .capability-card:nth-child(4n) { + border-right: 0.5px solid var(--ls-black-10); + } + .capability-card:nth-child(2n) { + border-right: none; + } + .capability-card:nth-last-child(-n+4) { + border-bottom: 0.5px solid var(--ls-black-10); + } + .capability-card:nth-last-child(-n+2) { + border-bottom: none; + } + + html.dark .capability-card:nth-child(4n) { + border-right: 0.5px solid var(--ls-white-06); + } + html.dark .capability-card:nth-last-child(-n+4) { + border-bottom: 0.5px solid var(--ls-white-06); + } +} + +.capability-header { + display: flex; + align-items: center; + gap: 8px; +} + +.capability-toggle { + width: 32px; + height: 16px; + flex-shrink: 0; +} + +.capability-title { + font-size: 14px; + font-weight: 450 !important; + line-height: 20px; + color: var(--ls-gray-950); + font-feature-settings: "salt" 1; +} + +html.dark .capability-title { + color: var(--ls-gray-050); +} + +.capability-desc { + font-size: 12px; + line-height: 18px; + color: var(--ls-gray-500); + font-feature-settings: "salt" 1; +} + +/* =========================================== + Product Tiles (What you can build) + =========================================== */ + +.product-tiles-container { + width: 100%; + background: var(--ls-white); + border: 0.5px solid var(--ls-black-10); + border-radius: var(--ls-radius-md); + overflow: hidden; +} + +html.dark .product-tiles-container { + background: var(--ls-gray-925); + border-color: var(--ls-white-06); +} + +/* Tabs header */ +.product-tiles-container > div:first-child { + padding: 12px !important; + border-bottom: 0.5px solid var(--ls-black-10); + gap: 2px !important; + margin-bottom: 0 !important; + display: flex; + flex-wrap: wrap; +} + +/* Mobile: Scrollable tabs instead of wrapping */ +@media (max-width: 640px) { + .product-tiles-container > div:first-child { + flex-wrap: nowrap; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE/Edge */ + } + + .product-tiles-container > div:first-child::-webkit-scrollbar { + display: none; /* Chrome/Safari */ + } + + .product-tiles-tab { + flex-shrink: 0; + } +} + +html.dark .product-tiles-container > div:first-child { + border-color: var(--ls-white-06); +} + +.product-tiles-tab { + height: 28px; + padding: 0 16px; + font-size: 14px; + font-weight: 450 !important; + line-height: 20px; + border-radius: var(--ls-radius-xs); + border: none; + background: transparent; + color: var(--ls-gray-500); + cursor: pointer; + transition: all 0.2s ease; + font-feature-settings: "salt" 1; +} + +html.dark .product-tiles-tab { + color: var(--ls-gray-400); +} + +.product-tiles-tab:hover { + background: rgba(0, 0, 0, 0.03); +} + +html.dark .product-tiles-tab:hover { + background: rgba(255, 255, 255, 0.05); +} + +.product-tiles-tab.active { + background: var(--ls-gray-025); + color: var(--ls-gray-950); + border: 0.5px solid var(--ls-black-10); + box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.08); +} + +html.dark .product-tiles-tab.active { + background: var(--ls-gray-800); + color: var(--ls-gray-050); + border-color: var(--ls-white-06); +} + +.product-tiles-grid { + display: flex; + gap: 16px; + padding: 16px; + align-items: stretch; +} + +@media (max-width: 1024px) { + .product-tiles-grid { + flex-direction: column; + } +} + +.product-tiles-list { + flex: 1; + display: flex; + flex-direction: column; + gap: 0; + overflow: hidden; +} + +.product-tiles-item { + display: flex; + align-items: center; + gap: 16px; + padding: 16px; + border-radius: var(--ls-radius-xs); + background: transparent; + border: none; + cursor: pointer; + text-align: left; + transition: background 0.2s ease; + width: 100%; + text-decoration: none; + color: inherit; +} + +.product-tiles-item:hover { + background: rgba(0, 0, 0, 0.02); +} + +html.dark .product-tiles-item:hover { + background: rgba(255, 255, 255, 0.03); +} + +.product-tiles-item.active { + background: var(--ls-gray-050); +} + +html.dark .product-tiles-item.active { + background: rgba(255, 255, 255, 0.05); +} + +.product-tiles-icon { + width: 24px; + height: 24px; + flex-shrink: 0; +} + +/* Dark mode: invert icons to white */ +html.dark .product-tiles-icon { + filter: brightness(0) invert(1); +} + +.product-tiles-item-content { + flex: 1; + display: flex; + flex-direction: column; + gap: 0; +} + +.product-tiles-item-title { + font-size: 14px; + font-weight: 400; + line-height: 21px; + color: var(--ls-gray-950); + font-feature-settings: "salt" 1; +} + +html.dark .product-tiles-item-title { + color: var(--ls-gray-050); +} + +.product-tiles-item-desc { + font-size: 14px; + line-height: 21px; + color: var(--ls-gray-500); + font-feature-settings: "salt" 1; +} + +.product-tiles-chevron { + flex-shrink: 0; + color: var(--ls-gray-400); + margin-left: auto; + opacity: 0; + transform: translateX(-4px); + transition: opacity 0.2s ease, transform 0.2s ease; +} + +/* Show chevron when item is active (for mobile tap navigation) */ +.product-tiles-chevron.show { + opacity: 1; + transform: translateX(0); +} + +/* Product tiles "Learn more" link */ +.product-tiles-link { + font-size: 14px; + font-weight: 450; + line-height: 20px; + color: var(--ls-gray-500); + text-decoration: none; + opacity: 0; + max-height: 0; + overflow: hidden; + transition: opacity 0.2s ease, max-height 0.2s ease, margin-top 0.2s ease, color 0.2s ease; + display: block; + margin-top: 0; +} + +.product-tiles-item.active .product-tiles-link { + opacity: 1; + max-height: 24px; + margin-top: 8px; +} + +.product-tiles-link:hover { + color: var(--ls-gray-950); +} + +html.dark .product-tiles-link:hover { + color: var(--ls-gray-100); +} + +.product-tiles-preview { + flex: 1; + background: var(--ls-gray-100); + border-radius: var(--ls-radius-xs); + overflow: hidden; + min-height: 300px; + align-self: stretch; + position: relative; +} + +html.dark .product-tiles-preview { + background: var(--ls-gray-800); +} + +.product-tiles-preview-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0; + transition: opacity 0.25s ease-in-out; +} + +.product-tiles-preview-img.active { + opacity: 1; +} + +.product-tiles-preview-placeholder { + color: var(--ls-gray-400); + font-size: 14px; +} + +/* =========================================== + Resources Grid + =========================================== */ + +.resources-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px; + padding: 8px 8px 24px 8px; + margin-top: 24px; + width: 100%; +} + +@media (max-width: 1024px) { + .resources-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 640px) { + .resources-grid { + grid-template-columns: 1fr; + gap: 32px; + } +} + +.resources-column { + display: flex; + flex-direction: column; + gap: 0; +} + +.resources-column-title { + font-size: 12px; + font-weight: 400; + line-height: 18px; + letter-spacing: 0; + color: var(--ls-gray-400); + padding: 4px 0; + margin-bottom: 4px; + font-feature-settings: "salt" 1; +} + +.resources-link { + display: flex; + align-items: center; + gap: 12px; + padding: 8px 0; + font-size: 14px; + font-weight: 450 !important; + line-height: 20px; + letter-spacing: 0; + color: var(--ls-gray-950); + text-decoration: none; + transition: opacity 0.2s ease; + font-feature-settings: "salt" 1; +} + +html.dark .resources-link { + color: var(--ls-gray-050); +} + +.resources-link:hover { + opacity: 0.7; +} + +.resources-link-icon { + width: 20px; + height: 20px; + flex-shrink: 0; + color: var(--ls-gray-950); +} + +.resources-link-icon path, +.resources-link-icon line { + stroke-width: 1.5px; +} + +html.dark .resources-link-icon { + color: var(--ls-gray-050); + filter: brightness(0) invert(1); +} + +/* =========================================== + Trusted By Section + =========================================== */ + +.trusted-by { + display: flex; + align-items: center; + justify-content: space-between; + gap: auto; + width: 100%; + padding: 48px 8px 8px 8px; +} + +@media (max-width: 768px) { + .trusted-by { + flex-wrap: wrap; + gap: 24px; + justify-content: flex-start; + } +} + +.trusted-by-label { + font-size: 14px; + font-weight: 450; + line-height: 20px; + color: var(--ls-gray-400); + font-feature-settings: "salt" 1; + flex-shrink: 0; +} + +.trusted-by-logos { + display: contents; + pointer-events: none; +} + +@media (max-width: 768px) { + .trusted-by-logos { + display: flex; + gap: 24px; + flex-wrap: wrap; + } +} + +.trusted-by-logo { + flex-shrink: 0; + pointer-events: none; + display: block; + height: 16px; + width: auto; +} + +.trusted-by-logo[alt="SoFi"], +.trusted-by-logo[alt="Nu"] { + height: 20px; +} + +html.dark .trusted-by-logo { + filter: brightness(0) invert(0.6); +} + +/* =========================================== + Divider + =========================================== */ + +.homepage-divider { + width: 100%; + height: 0; + border-bottom: 0.5px solid var(--ls-black-10); + margin: 48px 0; +} + +html.dark .homepage-divider { + border-color: var(--ls-white-06); +} diff --git a/mintlify/styles/styles.css b/mintlify/styles/styles.css index 0b9e4a0d..2029d2a0 100644 --- a/mintlify/styles/styles.css +++ b/mintlify/styles/styles.css @@ -1,342 +1,15 @@ -/* Import design tokens */ -@import "./tokens.css"; - /* =========================================== - Custom Font Styles for Suisse Intl + Grid Documentation Styles - Note: Base fonts (body/heading) are configured - in docs.json using Mintlify's fonts config. - This CSS handles additional customizations. + Main entry point for all custom styles. + Imports are ordered by specificity. =========================================== */ -/* Global: Enable single-story 'a' (stylistic alternates) */ -* { - font-feature-settings: "salt" on; - text-shadow: none; -} - -/* Headings & Bold: Use Medium weight (500), normal tracking */ -h1, h2, h3, h4, h5, h6, -strong, b, th, -.sidebar-group-header, -.eyebrow, -.font-semibold, -[data-component-part="step-title"], -[data-component-part="tab-button"] { - font-weight: 500 !important; - letter-spacing: normal !important; -} - -/* Navigation tabs, navbar links & CTA button: Medium weight */ -.nav-tabs-item, -.navbar-link a, -#topbar-cta-button, #topbar-cta-button *, -#page-context-menu-button, #page-context-menu-button *, -#pagination a, #pagination a * { - font-weight: 500 !important; - text-shadow: none !important; -} - -/* Active sidebar item only: Medium weight (has text-primary class) */ -a[class*="text-primary"]:not(.nav-tabs-item), -a[class*="text-primary"]:not(.nav-tabs-item) *, -button[class*="text-primary"], -button[class*="text-primary"] * { - font-weight: 500 !important; -} - -/* Code: Use Suisse Intl Mono */ -code, pre, kbd, samp, .font-mono { - font-family: "Suisse Intl Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important; - font-feature-settings: "salt" on !important; -} - -/* API field names: Mono Bold */ -[data-component-part="field-name"] { - font-family: "Suisse Intl Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important; - font-weight: 700 !important; - font-feature-settings: "salt" on !important; -} - -/* Homepage: Headings use Regular weight (400) */ -.hero h1, .hero h2, .hero h3, -.hero .title, .hero .highlight, -.usecase h2, .usecase .highlight, -.hero-card h3, .card-content h3 { - font-weight: 400 !important; -} - -/* Hero title letter-spacing */ -.hero .title span { - letter-spacing: -1.2px !important; -} - -/* =========================================== - Existing Styles - =========================================== */ - -html.light .hero { - background: var(--ls-gray-100); - background-image: radial-gradient( - circle, - var(--ls-black-10) 1px, - transparent 1px - ); - background-size: 24px 24px; - background-position: 0 0; - background-repeat: repeat; - border-bottom: 1px solid var(--ls-black-10); - border-top: 1px solid var(--ls-black-10); -} - -html .hero { - background: var(--ls-gray-950); - background-image: radial-gradient(circle, var(--ls-gray-850) 1px, transparent 1px); - background-size: 24px 24px; - background-position: 0 0; - background-repeat: repeat; - border-bottom: 1px solid var(--ls-white-04); - border-top: 1px solid var(--ls-white-04); -} - -.blue-lines { - background-image: url("/images/blue-lines-sm.svg"); - background-position: top left; - background-repeat: no-repeat; - background-size: 100% 100%; - pointer-events: none; -} - -@media (min-width: 640px) { - .blue-lines { - background-image: url("/images/blue-lines.svg"); - background-position: center center; - background-size: auto; - } -} - -html.light .title { - color: var(--ls-gray-950); -} - -html .title { - color: var(--ls-gray-050); -} - -html.light .usecase { - background: var(--ls-gray-050); -} - -html.light .highlight { - color: var(--ls-gray-950); -} - -html .highlight { - color: var(--ls-gray-050); -} -html.light .hero-card { - background: var(--ls-white); -} - -html.dark .hero-card { - background: var(--ls-gray-950); -} - -.hero .call-to-action { - cursor: pointer; - background: var(--ls-sky-500); - color: var(--ls-gray-050); - display: flex; - height: 40px; - padding: 8px 16px; - justify-content: center; - align-items: center; - gap: 4px; - border-radius: var(--ls-radius-xs); - font-size: 16px; - font-style: normal; - font-weight: 500; /* Medium weight for buttons */ - line-height: 24px; -} - -.hero { - padding-top: 64px; - padding-bottom: 64px; - padding-left: 16px; - padding-right: 16px; - margin-bottom: 32px; - gap: 32px; -} - -@media (min-width: 640px) { - .hero { - padding-top: 96px; - padding-bottom: 96px; - padding-left: 32px; - padding-right: 32px; - margin-bottom: 48px; - gap: 48px; - } -} - -@media (min-width: 1024px) { - .hero { - padding-top: 128px; - padding-bottom: 128px; - padding-left: 120px; - padding-right: 120px; - margin-bottom: 64px; - gap: 64px; - } -} - -.hero .subtext { - width: 100%; - max-width: 538px; - color: var(--ls-gray-400); - text-align: center; - font-feature-settings: "salt" on; - font-size: 18px; - font-style: normal; - font-weight: 400; - line-height: 20px; - letter-spacing: -0.6px; -} - -@media (min-width: 640px) { - .hero .subtext { - font-size: 18px; - line-height: 22px; - } -} - -@media (min-width: 1024px) { - .hero .subtext { - font-size: 20px; - line-height: 24px; - } -} - -.usecase { - display: flex; - padding: 32px 16px; - flex-direction: column; - align-items: flex-start; - gap: 32px; - align-self: stretch; -} - -@media (min-width: 640px) { - .usecase { - padding: 48px 32px; - gap: 40px; - } -} - -@media (min-width: 1024px) { - .usecase { - padding: 64px 120px; - gap: 48px; - } -} - -.usecase h2 { - font-size: 24px; - font-style: normal; - font-weight: 400; - line-height: 32px; /* 133.333% */ - letter-spacing: -0.72px; -} - -.section { - display: flex; - width: 100%; - max-width: 1200px; - flex-direction: column; - align-items: flex-start; - gap: 32px; -} - -@media (min-width: 640px) { - .section { - gap: 40px; - } -} - -@media (min-width: 1024px) { - .section { - gap: 48px; - } -} - -.footer { - display: flex; - flex-direction: row; - align-items: center; - gap: 16px; -} - -@media (min-width: 640px) { - .footer { - gap: 20px; - } -} - -@media (min-width: 1024px) { - .footer { - gap: 24px; - } -} - -.hero-card { - display: flex; - padding: 16px; - flex-direction: column; - align-items: flex-start; - align-self: stretch; - border-radius: var(--ls-radius-xs); - min-height: 200px; -} - -@media (min-width: 640px) { - .hero-card { - padding: 20px; - min-height: 220px; - } -} - -@media (min-width: 1024px) { - .hero-card { - padding: 24px; - min-height: 240px; - } -} - -.card-content { - margin-top: 24px; - font-size: 18px; - font-style: normal; - font-weight: 400; - line-height: 24px; - letter-spacing: -0.6px; -} - -@media (min-width: 640px) { - .card-content { - margin-top: 20px; - font-size: 18px; - line-height: 22px; - } -} +/* Design tokens (colors, spacing, radii) */ +@import "./tokens.css"; -@media (min-width: 1024px) { - .card-content { - margin-top: 24px; - font-size: 20px; - line-height: 24px; - } -} +/* Base styles (typography, navbar, sidebar) */ +@import "./base.css"; -#footer > div.flex.items-center.justify-between > div > a { - display: none; -} +/* Homepage-specific styles */ +@import "./homepage.css"; diff --git a/mintlify/styles/tokens.css b/mintlify/styles/tokens.css index 27de4858..ff2f59df 100644 --- a/mintlify/styles/tokens.css +++ b/mintlify/styles/tokens.css @@ -88,3 +88,26 @@ --ls-radius-4xl: 40px; --ls-radius-round: 999px; } + +/* =========================================== + Figma-Matched Radii (Squircle Support) + + When corner-shape: squircle is supported, + multiply radii by 1.8 to match Figma's + corner smoothing algorithm. + =========================================== */ + +@supports (corner-shape: squircle) { + :root { + --ls-radius-2xs: 3.6px; /* 2 × 1.8 */ + --ls-radius-xs: 7.2px; /* 4 × 1.8 */ + --ls-radius-sm: 10.8px; /* 6 × 1.8 */ + --ls-radius-md: 14.4px; /* 8 × 1.8 */ + --ls-radius-lg: 21.6px; /* 12 × 1.8 */ + --ls-radius-xl: 28.8px; /* 16 × 1.8 */ + --ls-radius-2xl: 43.2px; /* 24 × 1.8 */ + --ls-radius-3xl: 57.6px; /* 32 × 1.8 */ + --ls-radius-4xl: 72px; /* 40 × 1.8 */ + /* --ls-radius-none and --ls-radius-round unchanged */ + } +} diff --git a/package-lock.json b/package-lock.json index f5a8dead..8edfb997 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,10 @@ "mint": "^4.2.105" }, "devDependencies": { + "@central-icons-react/all": "^1.1.109", "markdownlint-cli": "^0.44.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", "widdershins": "^4.0.1" } }, @@ -199,6 +202,17 @@ "node": ">=6.9.0" } }, + "node_modules/@central-icons-react/all": { + "version": "1.1.109", + "resolved": "https://registry.npmjs.org/@central-icons-react/all/-/all-1.1.109.tgz", + "integrity": "sha512-+nBCSA0inw5vPPH/Z5Bj/jUIVRNJxw9h1hoqVeOn4h0muXU57UmjbnDGdfqQQI0yMbwcn73zhnYTh2TssnQsow==", + "dev": true, + "hasInstallScript": true, + "license": "SEE LICENSE IN LICENSE.md", + "peerDependencies": { + "react": ">=14.0.0 <= 19" + } + }, "node_modules/@emnapi/runtime": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", @@ -11820,26 +11834,32 @@ } }, "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", - "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", "dependencies": { - "scheduler": "^0.26.0" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.1.1" + "react": "^19.2.4" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", diff --git a/package.json b/package.json index c62ee9cc..98801da4 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "description": "Grid API Schema and Documentation", "scripts": { + "build:icons": "CENTRAL_LICENSE_KEY=$CENTRAL_LICENSE_KEY node scripts/export-icons.js", "build:openapi": "npx @redocly/cli bundle openapi/openapi.yaml -o openapi.yaml && cp openapi.yaml mintlify/openapi.yaml", "prelint:openapi": "npm run build:openapi", "lint:openapi": "npx @redocly/cli bundle openapi/openapi.yaml -o openapi.yaml && npx @redocly/cli lint openapi.yaml && cp openapi.yaml mintlify/openapi.yaml", @@ -20,8 +21,13 @@ }, "devDependencies": { "markdownlint-cli": "^0.44.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", "widdershins": "^4.0.1" }, + "optionalDependencies": { + "@central-icons-react/all": "^1.1.109" + }, "author": "Lightspark Group", "license": "Apache-2.0" } diff --git a/scripts/export-icons.js b/scripts/export-icons.js new file mode 100644 index 00000000..ecfcb1ac --- /dev/null +++ b/scripts/export-icons.js @@ -0,0 +1,144 @@ +#!/usr/bin/env node + +/** + * Export Central Icons as SVG files for use in Mintlify docs. + * + * Usage: CENTRAL_LICENSE_KEY=your-key node scripts/export-icons.js + * + * Icons exported with: + * - Style: round + * - Fill: outlined + * - Radius: 3 (as specified in design requirements) + * - Stroke: 1.5 (as specified in design requirements) + */ + +const fs = require('fs'); +const path = require('path'); + +// Icons to export based on the Figma design mapping +const ICONS_TO_EXPORT = [ + // Overview section + // 'IconSquareInfo', // What is Grid? - EXCLUDED: using custom version from refs/Sidebar/ + 'IconBlocks', // Capabilities + 'IconLightBulb', // Use cases + 'IconBubbleQuestion', // FAQ (using BubbleQuestion instead of CircleQuestionmark) + + // Quickstart section + 'IconPaperPlaneTopRight', // Send a payout + 'IconArrowInbox', // On-ramp to crypto + 'IconGift1', // Send Bitcoin rewards + 'IconAt', // Send to UMA address + 'IconRocket', // Quickstart pages + + // Core concepts section + 'IconAgent', // Entities & Relationships + 'IconReceiptCheck', // Quote System + 'IconWallet1', // Account Model + 'IconArrowsRepeatCircle', // Transaction Lifecycle + 'IconCoins', // Currencies & Payment Rails + 'IconSettingsGear2', // Configuration + + // What you can build section + 'IconCarFrontView', // Gig worker payments + 'IconStore4', // Marketplace payouts + 'IconShipping', // Supplier payments + 'IconMultiMedia', // Creator earnings + + // Resources section + 'IconGithub', // GitHub + 'IconHammer', // Tools + 'IconBubbleAnnotation5', // Contact support + 'IconKey2', // Request sandbox access + 'IconCalendar2', // Talk to sales + 'IconGlobe', // Network/Global + 'IconLinkedin', // LinkedIn + + // Additional icons for other tabs + 'IconFileText', // Documentation + 'IconCode', // Code/API + 'IconShield', // Security + 'IconCreditCard1', // Payments + 'IconBanknote1', // Money/Fiat + 'IconPeople', // Users/Customers + 'IconCheckmark1', // Success/Check + 'IconRepeat', // Repeat/Loop + 'IconLock', // Security/Lock + 'IconLightning', // Fast/Instant + 'IconBank', // Bank + + // API Reference sidebar icons + 'IconSandbox', // Sandbox + 'IconPeopleAdd', // Invitations + 'IconArrowExpandHor', // Same-Currency Transfers + 'IconArrowLeftRight', // Cross-Currency Transfers + 'IconBell', // Webhooks + + // Use case icons (homepage ProductTiles) + 'IconSuitcaseWork', // Payroll & contractors + 'IconBitcoin', // Buy BTC + 'IconMoneyHand', // Sell BTC + 'IconCryptoWallet', // Wallet funding +]; + +// Icon style configuration (matching design requirements) +const ICON_STYLE = 'round-outlined-radius-3-stroke-1.5'; +const ICON_SIZE = 20; + +async function exportIcons() { + const { centralIcons } = require('@central-icons-react/all/icons'); + + const outputDir = path.join(__dirname, '..', 'mintlify', 'images', 'icons'); + + // Create output directory if it doesn't exist + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + + let exported = 0; + let failed = 0; + + for (const iconName of ICONS_TO_EXPORT) { + const iconKey = `${ICON_STYLE}/${iconName}`; + const iconPath = centralIcons[iconKey]; + + if (!iconPath) { + console.warn(`⚠ Warning: Icon ${iconName} not found with key ${iconKey}`); + // Try to find similar keys + const similarKeys = Object.keys(centralIcons).filter(k => k.includes(iconName)).slice(0, 3); + if (similarKeys.length > 0) { + console.warn(` Similar keys found: ${similarKeys.join(', ')}`); + } + failed++; + continue; + } + + try { + // Wrap the path in a full SVG element + const svgString = ` +${iconPath} +`; + + // Convert icon name from PascalCase to kebab-case for filename + const filename = iconName + .replace(/^Icon/, '') + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') + .toLowerCase() + '.svg'; + + const filepath = path.join(outputDir, filename); + + // Write the SVG file + fs.writeFileSync(filepath, svgString); + console.log(`✓ Exported ${iconName} -> ${filename}`); + exported++; + } catch (error) { + console.error(`✗ Failed to export ${iconName}: ${error.message}`); + failed++; + } + } + + console.log(`\nDone! Exported ${exported} icons, ${failed} failed.`); + console.log(`Output directory: ${outputDir}`); +} + +exportIcons().catch(console.error);