diff --git a/.github/workflows/validate-docs.yml b/.github/workflows/validate-docs.yml
index a077ff1..d3e8b40 100644
--- a/.github/workflows/validate-docs.yml
+++ b/.github/workflows/validate-docs.yml
@@ -17,6 +17,9 @@ jobs:
- name: Validate docs.json is valid JSON
run: jq empty docs.json
+ - name: Validate snippet theme defaults
+ run: node scripts/check-snippet-theme-default.mjs
+
- name: Verify all referenced pages exist
run: |
set -euo pipefail
diff --git a/AGENTS.md b/AGENTS.md
index fcd1263..e1d089e 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -33,6 +33,14 @@
- Use `` / `` for parallel code samples (hardhat vs. foundry, ethers vs. viem, etc.)
- Always give `` blocks explicit language tags
+## Mintlify JSX styling
+
+- In `snippets/*.jsx` and rendered JSX in `.mdx` pages, write Tailwind utility lists as literal attributes. Prefer `className="..."`; static string and template expressions without interpolation are also extractor-safe.
+- Do not store utility lists in variables or assemble `className` dynamically. For conditional styling, use explicit JSX branches, inline styles, or a semantic data/class hook backed by `style.css`.
+- A component may forward the exact `className` prop when it destructures `className` in its parameters and every caller supplies a literal utility list.
+- Theme-aware snippets must seed hydration from `docs.json` `appearance.default` and synchronize the DOM theme in `useLayoutEffect`.
+- Run `node scripts/check-snippet-theme-default.mjs` after editing a theme-aware snippet.
+
## Content boundaries
- Cosmos-SDK content is deprecated (see SIP-3) — keep the deprecation notice visible on `cosmos-sdk/index.mdx`
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e124b99..78b29e5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -30,3 +30,9 @@ See the [README](README.md) for more details on local setup.
- **Lead with the goal**: Start instructions with what the user wants to accomplish
- **Use consistent terminology**: Don't alternate between synonyms for the same concept
- **Include examples**: Show, don't just tell
+
+## JSX styling
+
+Mintlify only generates Tailwind utilities it can extract from JSX. In `snippets/*.jsx` and rendered JSX in `.mdx` pages, keep class lists in literal attributes. Prefer `className="..."`; static string and template expressions without interpolation are also safe. Do not keep utility lists in variables or assemble `className` dynamically. Use explicit JSX branches, inline styles, or a semantic hook in `style.css` for conditional styles.
+
+For theme-aware snippets, run `node scripts/check-snippet-theme-default.mjs`.
diff --git a/evm/in-app-swaps.mdx b/evm/in-app-swaps.mdx
index 5ce06b0..1498e25 100644
--- a/evm/in-app-swaps.mdx
+++ b/evm/in-app-swaps.mdx
@@ -4,6 +4,8 @@ sidebarTitle: 'In-App Swaps'
description: 'Guide to integrating the Symphony swap widget into your Sei application for seamless token exchanges.'
keywords: ['swap widget', 'in-app swaps', 'token exchange', 'dex integration', 'symphony']
---
+import { ThemeAwareIframe } from '/snippets/theme-aware-iframe.jsx';
+
Integrating in-app swap functionality into your Sei application enables users to exchange tokens directly within your platform, enhancing user experience and engagement.
## Overview
@@ -28,7 +30,7 @@ Swap widgets are embeddable UI components that abstract the complexity of intera
### Live Demo
-
+
### Size Requirements
diff --git a/evm/index.mdx b/evm/index.mdx
index a69bde8..7950d60 100644
--- a/evm/index.mdx
+++ b/evm/index.mdx
@@ -86,19 +86,19 @@ Choose from official Sei Foundation endpoints or community-maintained alternativ
| Endpoint | Provider | Type | Rate limit | Notes |
| --- | --- | --- | --- | --- |
- | `https://evm-rpc.sei-apis.com` | Sei Foundation | public | 10 req/s | Recommended for development |
- | `https://evm-rpc-sei.stingray.plus` | Staketab | public | — | Community maintained |
- | `https://sei-evm-rpc.publicnode.com` | PublicNode | public | 5 req/s | Community maintained |
- | `https://seievm-rpc.polkachu.com` | Polkachu | public | — | Community maintained |
- | `https://jsonrpc.lavenderfive.com:443/sei` | LavenderFive | public | — | Community maintained |
+ | `https://evm-rpc.sei-apis.com` | Sei Foundation | public | 10 req/s | Recommended for development |
+ | `https://evm-rpc-sei.stingray.plus` | Staketab | public | — | Community maintained |
+ | `https://sei-evm-rpc.publicnode.com` | PublicNode | public | 5 req/s | Community maintained |
+ | `https://seievm-rpc.polkachu.com` | Polkachu | public | — | Community maintained |
+ | `https://jsonrpc.lavenderfive.com:443/sei` | LavenderFive | public | — | Community maintained |
| Endpoint | Provider | Type | Rate limit | Notes |
| --- | --- | --- | --- | --- |
- | `https://evm-rpc-testnet.sei-apis.com` | Sei Foundation | public | 20 req/s | Recommended for testing |
- | `https://evm-rpc-testnet-sei.stingray.plus` | Staketab | public | — | Community maintained |
- | `https://seievm-testnet-rpc.polkachu.com` | Polkachu | public | — | Community maintained |
- | `https://sei-testnet.drpc.org` | dRPC | public | — | Community maintained |
+ | `https://evm-rpc-testnet.sei-apis.com` | Sei Foundation | public | 20 req/s | Recommended for testing |
+ | `https://evm-rpc-testnet-sei.stingray.plus` | Staketab | public | — | Community maintained |
+ | `https://seievm-testnet-rpc.polkachu.com` | Polkachu | public | — | Community maintained |
+ | `https://sei-testnet.drpc.org` | dRPC | public | — | Community maintained |
diff --git a/learn/general-brand-kit.mdx b/learn/general-brand-kit.mdx
index 4e7d4f6..e21e359 100644
--- a/learn/general-brand-kit.mdx
+++ b/learn/general-brand-kit.mdx
@@ -27,7 +27,7 @@ Sei is a parallelized EVM Layer 1. Sei Giga is designed to extend that architect
---
-
+
01 — Logo
@@ -77,11 +77,11 @@ The **symbol** is the standalone Sei mark. Use it on its own only when the wordm
The **token mark** appears in Maroon. Black and white are fallbacks for constrained environments.
-
## Powered by Sei
@@ -121,7 +121,7 @@ For ecosystem and partner surfaces. Keep the lockup intact and match the clearsp
---
-
+
02 — Color
@@ -177,9 +177,9 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
50
#CCCCCC
-
+
100
-
#999999
+
#999999
200
@@ -199,7 +199,7 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
-
+
03 — Typography
@@ -207,22 +207,22 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
**Lateral** is our primary typeface. Use it for headlines, product UI, and anything that needs presence. Give it room when setting editorially.
-
@@ -231,35 +231,35 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
## Secondary Typefaces
-
-
+
+
Items Text
-
+
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 .,:;!?&@*
-
- Book
+
+ Book
-
+
Secondary font · Editorial · Quotes · Foundation
-
-
+
+
ABC Repro Mono
-
+
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 .,:;!?&@*
-
- Regular
+
+ Regular
-
+
Tertiary font · Data · Tickers · Captions
@@ -267,7 +267,7 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
---
-
+
04 — Usage
@@ -275,14 +275,14 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
To maintain the logo's clarity and prominence, follow the clearspace guidelines. A certain amount of space is required around the lockup to prevent surrounding artwork, imagery, or the edge of a page from crowding it.
-
-
+
+
-
-
Use only approved colors.Black, white, Maroon 100, or Gold 100 — nothing else.
-
Keep proportions locked.Symbol and wordmark ship as one unit. Don't rescale their relationship.
-
Respect clearspace and minimum size.X on all sides, 25 px tall minimum.
+
+
Use only approved colors.Black, white, Maroon 100, or Gold 100 — nothing else.
+
Keep proportions locked.Symbol and wordmark ship as one unit. Don't rescale their relationship.
+
Respect clearspace and minimum size.X on all sides, 25 px tall minimum.
diff --git a/snippets/nonce-lane-diagrams.jsx b/snippets/nonce-lane-diagrams.jsx
index af3e9d4..bb93474 100644
--- a/snippets/nonce-lane-diagrams.jsx
+++ b/snippets/nonce-lane-diagrams.jsx
@@ -1,8 +1,8 @@
export const SequentialNonceQueue = () => {
const ink = 'currentColor';
- const ok = '#10b981';
- const bad = '#ef4444';
- const warn = '#f59e0b';
+ const ok = 'var(--sei-diagram-ok, #1a7a00)';
+ const bad = 'var(--sei-diagram-error, #c20a00)';
+ const warn = 'var(--sei-diagram-warning, #b45309)';
const nonces = [
{ n: 5, s: 'landed', c: ok },
{ n: 6, s: 'dropped, never landed', c: bad },
@@ -51,7 +51,7 @@ export const SequentialNonceQueue = () => {
throughput scales with wallets, and so do fragmented balances, duplicated approvals, and keys that hold funds
-
A transaction that lands and reverts consumes its nonce and blocks nothing. A transaction that never lands leaves a gap, and every later nonce waits behind it. On Sei a pending-nonce read comes from the mempool rather than aliasing latest, and it is too unreliable to rebuild an in-flight queue from. Splitting funds across hot wallets buys width at the cost of custody surface.
+
A transaction that lands and reverts consumes its nonce and blocks nothing. A transaction that never lands leaves a gap, and every later nonce waits behind it. On Sei a pending-nonce read comes from the mempool rather than aliasing latest, and it is too unreliable to rebuild an in-flight queue from. Splitting funds across hot wallets buys width at the cost of custody surface.
);
};
@@ -59,8 +59,8 @@ export const SequentialNonceQueue = () => {
export const NonceLanes = () => {
const ink = 'currentColor';
const accent = 'var(--sei-maroon-50)';
- const ok = '#10b981';
- const bad = '#ef4444';
+ const ok = 'var(--sei-diagram-ok, #1a7a00)';
+ const bad = 'var(--sei-diagram-error, #c20a00)';
const chip = (x, y, label, state, key) => {
const c = state === 'ok' ? ok : state === 'bad' ? bad : ink;
return (
@@ -125,7 +125,7 @@ export const NonceLanes = () => {
strictly ordered within a lane, left to right
-
EntryPoint v0.8 stores a UserOperation nonce as a 192-bit key plus a 64-bit sequence and tracks one sequence per key. Operations on different keys never queue behind each other; operations on the same key stay sequential. The repository calls a key a lane and forbids lane 0.
+
EntryPoint v0.8 stores a UserOperation nonce as a 192-bit key plus a 64-bit sequence and tracks one sequence per key. Operations on different keys never queue behind each other; operations on the same key stay sequential. The repository calls a key a lane and forbids lane 0.
One type-4 transaction writes the designator into the EOA's code slot. The address, balances, and approvals do not move. When the EntryPoint calls the account, the EVM runs LaneAccount's code in the EOA's context, so the venue sees the funded address as msg.sender.
+
One type-4 transaction writes the designator into the EOA's code slot. The address, balances, and approvals do not move. When the EntryPoint calls the account, the EVM runs LaneAccount's code in the EOA's context, so the venue sees the funded address as msg.sender.
UserOperations are not transactions. Gas-only relayers wrap each bundle in an EntryPoint.handleOps transaction and pay for it. Each relayer still has one sequential EVM nonce, but a relayer key can only lose its own gas: it cannot create a valid operation without the funded account's signature.
+
UserOperations are not transactions. Gas-only relayers wrap each bundle in an EntryPoint.handleOps transaction and pay for it. Each relayer still has one sequential EVM nonce, but a relayer key can only lose its own gas: it cannot create a valid operation without the funded account's signature.
);
};
@@ -256,9 +256,9 @@ export const NonceLanePipeline = () => {
export const NonceLaneBundleLifecycle = () => {
const ink = 'currentColor';
const accent = 'var(--sei-maroon-50)';
- const ok = '#10b981';
- const warn = '#f59e0b';
- const bad = '#ef4444';
+ const ok = 'var(--sei-diagram-ok, #1a7a00)';
+ const warn = 'var(--sei-diagram-warning, #b45309)';
+ const bad = 'var(--sei-diagram-error, #c20a00)';
const steps = [
{ t: 'take bundle', s: 'from the queue' },
{ t: 'simulate', s: 'eth_estimateGas' },
@@ -315,16 +315,16 @@ export const NonceLaneBundleLifecycle = () => {
on restart, the last exact raw transaction is rebroadcast first, then reconciled against lane sequences and the relayer's confirmed nonce
-
Write-ahead ordering is deliberate: the signed outer transaction is journaled before it reaches the network, so a crash between signing and broadcast cannot lose or duplicate work. Replacement always reuses the relayer nonce, which is why a stuck bundle cannot create a nonce gap.
+
Write-ahead ordering is deliberate: the signed outer transaction is journaled before it reaches the network, so a crash between signing and broadcast cannot lose or duplicate work. Replacement always reuses the relayer nonce, which is why a stuck bundle cannot create a nonce gap.
);
};
export const NonceLaneFailureIsolation = () => {
const ink = 'currentColor';
- const ok = '#10b981';
- const bad = '#ef4444';
- const warn = '#f59e0b';
+ const ok = 'var(--sei-diagram-ok, #1a7a00)';
+ const bad = 'var(--sei-diagram-error, #c20a00)';
+ const warn = 'var(--sei-diagram-warning, #b45309)';
const lane = (x, y, label, sub, c, dashed, key) => (
@@ -367,7 +367,7 @@ export const NonceLaneFailureIsolation = () => {
leaves its lane sequence untouched; neighboring lanes stay valid and the journal requeues it
-
The three failures have different blast radii. An execution revert costs one lane sequence and nothing else. A validation failure costs the outer transaction attempt but no sequences. A dropped bundle costs nothing on chain, which is exactly the case that strands a sequential account.
+
The three failures have different blast radii. An execution revert costs one lane sequence and nothing else. A validation failure costs the outer transaction attempt but no sequences. A dropped bundle costs nothing on chain, which is exactly the case that strands a sequential account.