Code Tabs Test Page

Code Tabs Component Test

This page tests the new multi-language code tabs component.

Basic Example

1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { create } from '@metaplex-foundation/mpl-core'
3
4const umi = createUmi('https://api.devnet.solana.com')
5
6const asset = await create(umi, {
7 name: 'My NFT',
8 uri: 'https://example.com/metadata.json'
9}).sendAndConfirm(umi)
10
11console.log('Asset created:', asset.publicKey)

TypeScript Example

1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { create, CreateArgs } from '@metaplex-foundation/mpl-core'
3import { PublicKey } from '@metaplex-foundation/umi'
4
5const umi = createUmi('https://api.devnet.solana.com')
6
7const args: CreateArgs = {
8 name: 'My NFT',
9 uri: 'https://example.com/metadata.json',
10}
11
12const asset = await create(umi, args).sendAndConfirm(umi)
13
14console.log('Asset created:', asset.publicKey.toString())

Features to Test

  1. Language Switching - Click between tabs to switch languages
  2. Persistence - Refresh the page, your language choice should be remembered
  3. Syntax Highlighting - Code should be properly highlighted
  4. Copy Button - Copy button should work in each tab
  5. Keyboard Navigation - Use Tab/Arrow keys to navigate
  6. Mobile - Test on mobile viewport

Expected Behavior

  • ✅ Tabs appear above the code block
  • ✅ Active tab is highlighted
  • ✅ Clicking a tab switches the visible code
  • ✅ Language preference persists across page reloads
  • ✅ Syntax highlighting works for all languages
  • ✅ Copy button is visible and functional
  • ✅ Keyboard accessible (tab to focus, arrow keys to switch)
  • ✅ Screen reader compatible (ARIA labels present)

Single Language (No Tabs)

Regular code blocks should still work:

// This is a regular code block without tabs
const x = 1
console.log(x)

🎯 PROOF OF CONCEPT: Centralized Code Examples

This section demonstrates loading code from a centralized location!

Example 1: Create an Asset

Code loaded from src/examples/core/create-asset/ (native .js and .rs files)

All Frameworks (Kit, Umi, Shank, Anchor)

1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { create } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4
5// Initialize UMI
6const umi = createUmi('https://api.devnet.solana.com')
7 .use(mplCore())
8
9// Create a new NFT asset
10const asset = await create(umi, {
11 name: 'My NFT',
12 uri: 'https://example.com/metadata.json'
13}).sendAndConfirm(umi)
14
15console.log('Asset created:', asset.publicKey)

Only JavaScript Frameworks (Kit + Umi)

1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { create } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4
5// Initialize UMI
6const umi = createUmi('https://api.devnet.solana.com')
7 .use(mplCore())
8
9// Create a new NFT asset
10const asset = await create(umi, {
11 name: 'My NFT',
12 uri: 'https://example.com/metadata.json'
13}).sendAndConfirm(umi)
14
15console.log('Asset created:', asset.publicKey)

Only Rust Frameworks (Shank + Anchor)

1use mpl_core::instructions::CreateV1;
2use solana_sdk::signer::Signer;
3
4// Create a new NFT asset
5let create_ix = CreateV1 {
6 name: "My NFT".to_string(),
7 uri: "https://example.com/metadata.json".to_string(),
8 ..Default::default()
9};
10
11let instruction = create_ix.instruction();
12
13println!("Asset instruction created");

Just Umi

1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { create } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4
5// Initialize UMI
6const umi = createUmi('https://api.devnet.solana.com')
7 .use(mplCore())
8
9// Create a new NFT asset
10const asset = await create(umi, {
11 name: 'My NFT',
12 uri: 'https://example.com/metadata.json'
13}).sendAndConfirm(umi)
14
15console.log('Asset created:', asset.publicKey)

Example 2: Transfer an Asset

Code loaded from src/examples/core/transfer-asset/ (native .js and .rs files)

All Frameworks - Transfer Asset

1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { transfer } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4import { publicKey } from '@metaplex-foundation/umi'
5
6// Initialize UMI
7const umi = createUmi('https://api.devnet.solana.com')
8 .use(mplCore())
9
10// Transfer an existing NFT asset to a new owner
11const result = await transfer(umi, {
12 asset: publicKey('AssetAddressHere...'),
13 newOwner: publicKey('RecipientAddressHere...'),
14}).sendAndConfirm(umi)
15
16console.log('Asset transferred:', result.signature)

JavaScript Only - Transfer Asset

1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { transfer } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4import { publicKey } from '@metaplex-foundation/umi'
5
6// Initialize UMI
7const umi = createUmi('https://api.devnet.solana.com')
8 .use(mplCore())
9
10// Transfer an existing NFT asset to a new owner
11const result = await transfer(umi, {
12 asset: publicKey('AssetAddressHere...'),
13 newOwner: publicKey('RecipientAddressHere...'),
14}).sendAndConfirm(umi)
15
16console.log('Asset transferred:', result.signature)

Rust Only - Transfer Asset

1use mpl_core::instructions::TransferV1;
2use solana_sdk::{pubkey::Pubkey, signer::Signer};
3
4// Asset and recipient addresses
5let asset = Pubkey::from_str("AssetAddressHere...").unwrap();
6let new_owner = Pubkey::from_str("RecipientAddressHere...").unwrap();
7
8// Transfer an existing NFT asset to a new owner
9let transfer_ix = TransferV1 {
10 asset,
11 new_owner,
12 ..Default::default()
13};
14
15let instruction = transfer_ix.instruction();
16
17println!("Transfer instruction created");

Benefits of Centralized Examples

Single Source of Truth - Code lives in src/examples/core/create-asset.js Multi-Language Docs - Same code across EN/JA/KO pages Easy Maintenance - Edit once, updates everywhere Testable - Can run examples in CI Reusable - Same example on multiple pages Framework Filtering - Show only relevant frameworks


Next Steps

If this test page works correctly:

  1. Migrate high-traffic pages to use CodeTabs
  2. Add more language examples
  3. Create documentation for content editors
  4. Set up analytics tracking