Sunday Market

Component showcase

Live gallery of every visual component available in MDX wiki pages — code snippet on the left, rendered output below. Copy-paste ready.

Every component below is registered globally in src/mdx-components.tsx — drop the JSX tag straight into any .mdx file under content/wiki/. No imports needed.

Full developer reference: src/app/api/mc/README.md.


Inline primitives

Small components that flow inline with prose.

<McIcon> — inline item glyph

A typical mining trip earns a stack of <McIcon id="iron_ingot" />,
plus the occasional <McIcon id="diamond" /> if you're lucky.
At <McIcon id="netherite_ingot" size={32} /> you've made it.

A typical mining trip earns a stack of Iron Ingot, plus the occasional Diamond if you're lucky. At Netherite Ingot you've made it.

<Keys> — keyboard shortcut

Press <Keys keys="Shift + F3" /> for chunk borders.
Hold <Keys keys={['Ctrl', 'Click']} /> to multi-select.

Press ShiftF3 for chunk borders. Hold CtrlClick to multi-select.

<DimensionTag> — Overworld / Nether / End pill

Spawn is in the <DimensionTag dim="overworld" />.
Fortresses live in the <DimensionTag dim="nether" />.
End-game floats in the <DimensionTag dim="end" />.

Spawn is in the Overworld. Fortresses live in the Nether. End-game floats in the End.

<Coords> — world coordinates

Spawn portal: <Coords x={100} y={64} z={-200} dim="overworld" />
End-city marker: <Coords x={1280} y={75} z={-960} dim="end" />

Spawn portal: X:100Y:64Z:-200

End-city marker: X:1280Y:75Z:-960

<RankBadge> — chat-style rank prefix

Each preset uses the actual in-game gradient colors pulled from the rank system.

- <RankBadge rank="visitor" /> Day-one — gray gradient
- <RankBadge rank="member" /> 20h played — green gradient
- <RankBadge rank="citizen" /> 100h played — cyan gradient
- <RankBadge rank="myth" /> 500h played — purple gradient
- <RankBadge rank="legend" /> 1000h played — gold gradient
- <RankBadge rank="helper" /> staff — yellow gradient
- <RankBadge rank="moderator" /> staff — magenta gradient
- <RankBadge rank="admin" /> staff — red gradient
- <RankBadge rank="owner" /> Mothra — deep red gradient
- <RankBadge name="Beta Tester" from="#7785ff" to="#3a4ebd" /> custom gradient
  • Visitor Day-one — gray gradient
  • Member 20h played — green gradient
  • Citizen 100h played — cyan gradient
  • Myth 500h played — purple gradient
  • Legend 1000h played — gold gradient
  • Helper staff — yellow gradient
  • Moderator staff — magenta gradient
  • Admin staff — red gradient
  • Owner Mothra — deep red gradient
  • Beta Tester custom gradient

<Cooldown> — inline cooldown chip

`/pay` carries a <Cooldown duration="5s" /> cooldown.
Mob kills pay out coins, capped at <Cooldown duration="3-8s" />.
PvP kills pay coins with <Cooldown duration="10 min/victim" /> per target.
`/balance` is <Cooldown duration="instant" />.

/pay carries a 5s cooldown. Mob kills pay out coins, capped at 3-8s. PvP kills pay coins with 10 min/victim per target. /balance is instant.

<HealthBar> / <XpBar> — stat bars

Last Call kicks in below <HealthBar value={5} max={20} />.
Mending sips XP — keep <XpBar level={30} progress={0.4} /> minimum on hand.

Last Call kicks in below 5/20. Mending sips XP — keep 30 minimum on hand.


Cards

Block-level callouts with structured information.

<Enchant> — enchantment card

<Enchant
  name="Last Call"
  maxLevel={3}
  appliesTo={['sword', 'axe']}
  signature
  conflictsWith={['Sharpness V']}
>
  Damage scales up as your HP drops. Below 25% HP, every hit lands at +60% (Lvl I), +90% (II), or +120% (III). Built for the "I'm cooked anyway" comeback swing.
</Enchant>

Last CallSignature

Lvl 3
SwordAxe

Damage scales up as your HP drops. Below 25% HP, every hit lands at +60% (Lvl I), +90% (II), or +120% (III). Built for the "I'm cooked anyway" comeback swing.

Conflicts with: Sharpness V

<Command> — slash-command reference

<Command
  cmd="/pay"
  description="Send coins to another player. Coins move instantly; the recipient gets a chat notification."
  args={[
    { name: 'player', desc: 'recipient name (case-insensitive)' },
    { name: 'amount', desc: 'coins to send' },
    { name: 'reason', desc: 'optional message attached to the transfer', optional: true },
  ]}
  examples={['/pay Mothra 500', '/pay Mothra 100 thanks for the help']}
  permission="member"
/>
/pay <player> <amount> [reason]member+
Send coins to another player. Coins move instantly; the recipient gets a chat notification.
player
recipient name (case-insensitive)
amount
coins to send
reasonoptional
optional message attached to the transfer
Examples/pay Mothra 500/pay Mothra 100 thanks for the help

<ChatExample> / <ChatLine> — fake in-game chat

Pairs with <RankBadge>. Each line shows rank prefix + name + » + message, exactly like the in-game chat renders it.

<ChatExample>
  <ChatLine rank="legend" name="Mothra">just hit max vault slots — 810 grid is unreal</ChatLine>
  <ChatLine rank="member" name="Frank">how many hours to unlock that?</ChatLine>
  <ChatLine rank="legend" name="Mothra">200hrs gets you Legend, vault slots come with it</ChatLine>
  <ChatLine system>★ Mothra has reached the Legend rank.</ChatLine>
</ChatExample>

<GearSet> — armor set with set bonuses

<GearSet
  name="Nether Affinity"
  pieces={['netherite_helmet', 'netherite_chestplate', 'netherite_leggings', 'netherite_boots']}
  bonuses={[
    { count: 2, effect: 'Fire Resistance while in the Nether' },
    { count: 4, effect: '+25% damage dealt, −15% damage taken in Nether' },
  ]}
  description="Drops piecewise from Nether fortresses; assemble all four to unlock the full kit."
/>
Nether Affinity
HeadNetherite HelmetNetherite Helmet
ChestNetherite ChestplateNetherite Chestplate
LegsNetherite LeggingsNetherite Leggings
FeetNetherite BootsNetherite Boots
Set bonuses
  • 2-piece Fire Resistance while in the Nether
  • 4-piece +25% damage dealt, −15% damage taken in Nether

Drops piecewise from Nether fortresses; assemble all four to unlock the full kit.

<RankComparison> — feature matrix across ranks

Replaces wide markdown rank-comparison tables. Headers render as <RankBadge>, cells coerce booleans to ✓/✗.

<RankComparison
  ranks={['visitor', 'member', 'citizen', 'myth', 'legend']}
  features={[
    { label: 'Hours required', values: { visitor: '0h', member: '20h', citizen: '100h', myth: '500h', legend: '1000h' } },
    { label: 'Vault slots',     values: { visitor: '54', member: '162', citizen: '324', myth: '486', legend: '810' } },
    { label: 'Recovery window',  values: { visitor: '5 min', member: '10 min', citizen: '15 min', myth: '30 min', legend: '60 min' } },
    { label: 'Brand chat color', values: { visitor: false, member: true, citizen: true, myth: true, legend: true } },
    { label: 'Pet teleport',    values: { visitor: false, member: false, citizen: false, myth: false, legend: true } },
  ]}
/>
VisitorMemberCitizenMythLegend
Hours required0h20h100h500h1000h
Vault slots54162324486810
Recovery window5 min10 min15 min30 min60 min
Brand chat color
Pet teleport

<CommandSequence> / <Step> — ordered tutorial

<CommandSequence>
  <Step cmd="/shop create" note="Stand on the chest you want to sell from before running this." />
  <Step cmd="/shop price 64 100" desc="Set 64 items per stack, 100 coins each." />
  <Step cmd="/balance" desc="Check what you've earned so far." />
  <Step cmd="/withdraw 1000" desc="Pull 1000 coins out as a banknote you can carry or trade." />
</CommandSequence>
  1. /shop createStand on the chest you want to sell from before running this.
  2. /shop price 64 100Set 64 items per stack, 100 coins each.
  3. /balanceCheck what you've earned so far.
  4. /withdraw 1000Pull 1000 coins out as a banknote you can carry or trade.

<EnchantConflicts> — mutual-exclusion matrix

Shows which enchants can't co-exist on the same item.

<EnchantConflicts
  groups={[
    ['Sharpness', 'Smite', 'Bane of Arthropods'],
    ['Protection', 'Fire Protection', 'Blast Protection', 'Projectile Protection'],
    ['Infinity', 'Mending'],
    ['Riptide', 'Loyalty', 'Channeling'],
  ]}
  caption="Pick one per row — the rest go on a different item or get re-rolled."
/>
Pick one per item — the rest can't coexist.
  • SharpnessSmiteBane of Arthropods
  • ProtectionFire ProtectionBlast ProtectionProjectile Protection
  • InfinityMending
  • RiptideLoyaltyChanneling
Pick one per row — the rest go on a different item or get re-rolled.

<MobCard> — mob info card

<MobCard
  name="Pillager Captain"
  id="pillager_spawn_egg"
  hp={24}
  damage={5}
  drops={['emerald', 'crossbow', 'ominous_banner']}
  spawns="Pillager Outposts"
  description="The banner-bearing leader. Killing one triggers a Raid in any nearby village within 100 blocks."
/>

Pillager Captain

HP
24
Damage
5
DropsEmeraldCrossbowOminous Banner

Spawns: Pillager Outposts

The banner-bearing leader. Killing one triggers a Raid in any nearby village within 100 blocks.


Recipes

<Recipe> — crafting grid

<Recipe
  ingredients={[
    ['iron_ingot', 'iron_ingot', 'iron_ingot'],
    [null,        'stick',       null],
    [null,        'stick',       null],
  ]}
  output="iron_pickaxe"
  caption="Standard iron pickaxe — same as vanilla."
/>
Iron Pickaxe
Standard iron pickaxe — same as vanilla.

Omit output to render just the 3×3 box (useful when prose already names the result):

<Recipe
  ingredients={[
    ['oak_planks', 'oak_planks', null],
    ['oak_planks', 'oak_planks', null],
    ['oak_planks', 'oak_planks', null],
  ]}
/>

<BrewRecipe> — Sunday Market tavern pipeline

<BrewRecipe
  ingredients={['wheat:3', 'sugar:1']}
  cookTime="8 min"
  distill={2}
  age={{ wood: 'oak', minutes: 30 }}
  output="potion"
  caption="Signature Pale Ale — 7% ABV in-fiction."
/>
  1. 1
    Cook in cauldron
    CauldronWater BucketWheat×3Sugar

    Cook for 8 min over a heat source.

  2. 2
    Distill in brewing stand
    Brewing Stand2 cycles
  3. 3
    Age in barrel
    Oak Planks30 minutes in a oak barrel
  4. 4
    Bottle
    PotionPotion
Signature Pale Ale — 7% ABV in-fiction.

A simpler brew with just cook + bottle (no distill, no age):

<BrewRecipe
  ingredients={['apple:2', 'sugar:1']}
  cookTime="4 min"
  output="potion"
  caption="Apple cider — fast, no aging required."
/>
  1. 1
    Cook in cauldron
    CauldronWater BucketApple×2Sugar

    Cook for 4 min over a heat source.

  2. 2
    Bottle
    PotionPotion
Apple cider — fast, no aging required.

Compositional

Multi-element components that compose with child tags.

<LootTable> / <LootTier> / <Loot>

<LootTable>
  <LootTier rarity="common">
    <Loot id="iron_ingot" count="2-5" weight={50} />
    <Loot id="bread" count="1-3" weight={30} />
    <Loot id="bone" count="1-2" weight={20} />
  </LootTier>
  <LootTier rarity="uncommon">
    <Loot id="gold_ingot" count="1-2" weight={15} />
    <Loot id="enchanted_golden_apple" weight={3} />
  </LootTier>
  <LootTier rarity="rare">
    <Loot id="diamond" count="1-2" weight={5} />
    <Loot id="enchanted_book" weight={3} />
  </LootTier>
  <LootTier rarity="legendary">
    <Loot id="netherite_ingot" weight={1} />
    <Loot id="totem_of_undying" weight={1} />
  </LootTier>
</LootTable>
Common
Iron IngotIron Ingot×2-550%
BreadBread×1-330%
BoneBone×1-220%
Uncommon
Gold IngotGold Ingot×1-215%
Enchanted Golden AppleEnchanted Golden Apple3%
Rare
DiamondDiamond×1-25%
Enchanted BookEnchanted Book3%
Legendary
Netherite IngotNetherite Ingot1%
Totem Of UndyingTotem Of Undying1%

<TierLadder> / <Tier> — progression strip

<TierLadder>
  <Tier id="wooden_sword" stats={{ Damage: 5, Durability: 60 }} />
  <Tier id="stone_sword"  stats={{ Damage: 6, Durability: 132 }} />
  <Tier id="iron_sword"   stats={{ Damage: 7, Durability: 251 }} />
  <Tier id="diamond_sword" stats={{ Damage: 8, Durability: 1562 }} />
  <Tier id="netherite_sword" stats={{ Damage: 9, Durability: 2032 }} highlight />
</TierLadder>
Wooden Sword
Wooden Sword
Damage5
Durability60
Stone Sword
Stone Sword
Damage6
Durability132
Iron Sword
Iron Sword
Damage7
Durability251
Diamond Sword
Diamond Sword
Damage8
Durability1562
Netherite Sword
Netherite Sword
Damage9
Durability2032

<Hotbar> — 9-slot loadout

<Hotbar
  slots={[
    'netherite_sword',
    'netherite_pickaxe',
    'netherite_axe',
    'crossbow',
    'cooked_beef',
    'golden_apple',
    'totem_of_undying',
    'ender_pearl',
    'water_bucket',
  ]}
  selected={0}
/>

<Inventory> — full inventory layout

<Inventory
  slots={[
    'iron_ingot', 'gold_ingot', 'diamond', null, 'emerald', null, null, null, null,
    'cobblestone', 'oak_planks', 'glass', null, null, null, null, null, null,
    'bread', 'cooked_beef', 'golden_apple', null, null, null, null, null, null,
  ]}
  hotbar={[
    'netherite_sword',
    'netherite_pickaxe',
    'crossbow',
    null,
    'cooked_beef',
    null,
    null,
    null,
    'totem_of_undying',
  ]}
/>

<Trade> — villager trade offer

<Trade
  give={[{ id: 'emerald', count: 5 }, { id: 'paper', count: 12 }]}
  receive={{ id: 'enchanted_book' }}
  villager="librarian"
  level="apprentice"
/>
EmeraldEmerald×5
PaperPaper×12
Enchanted BookEnchanted Book
librarianapprentice
<Trade
  give={[{ id: 'emerald', count: 32 }]}
  receive={{ id: 'diamond_pickaxe' }}
  villager="weaponsmith"
  level="master"
/>
EmeraldEmerald×32
Diamond PickaxeDiamond Pickaxe
weaponsmithmaster

<PortalDiagram> — Overworld ↔ Nether coord conversion

Pass either side; the other auto-computes via the 8:1 rule.

<PortalDiagram overworld={{ x: 1280, y: 64, z: -2048 }} />
OverworldX:1280Y:64Z:-2048
NetherX:160Y:64Z:-256
8 blocks Overworld = 1 block Nether (Y stays the same).
<PortalDiagram nether={{ x: 100, y: 64, z: -100 }} />
OverworldX:800Y:64Z:-800
NetherX:100Y:64Z:-100
8 blocks Overworld = 1 block Nether (Y stays the same).

<YLevelChart> / <Layer> — vertical depth visualizer

<YLevelChart>
  <Layer y={-58} label="Diamond peaks" item="diamond" />
  <Layer y={-32} label="Deepslate transition" />
  <Layer y={11}  label="Diorite / granite / andesite" />
  <Layer y={32}  label="Iron + coal common" item="iron_ingot" />
  <Layer y={62}  label="Sea level" item="water_bucket" />
  <Layer y={128} label="Stone caps end" />
</YLevelChart>
Y=-58Diamond peaks
Y=-32Deepslate transition
Y=11Diorite / granite / andesite
Y=32Iron + coal common
Y=62Sea level
Y=128Stone caps end

<SignBoard> — Minecraft sign rendering

<SignBoard wood="oak" lines={[
  'Welcome to',
  "Mothra's Shop",
  '— bring emeralds —',
  '/warp mothra',
]} caption="Front-of-shop sign." />

<SignBoard wood="dark_oak" lines={[
  'TAVERN',
  'open daily',
  '6pm – 2am',
  '/warp tavern',
]} />
Welcome to
Mothra's Shop
— bring emeralds —
/warp mothra
Front-of-shop sign.
TAVERN
open daily
6pm – 2am
/warp tavern

<ChestLayout> — single or double chest grid

<ChestLayout label="Starter kit" slots={[
  'iron_sword', 'iron_pickaxe', 'iron_axe', 'iron_shovel', null, 'cooked_beef', 'bread', 'water_bucket', 'compass',
  'oak_planks', 'crafting_table', 'furnace', null, null, null, null, null, null,
  'oak_log', 'cobblestone', 'torch', null, null, null, null, null, null,
]} />
Starter kit

<TagCloud> — keyword chips for landing pages

<TagCloud tags={[
  { label: 'Crossplay',     href: '/wiki/crossplay',     color: 'red' },
  { label: 'Worldgen',      href: '/wiki/worldgen',      color: 'yellow' },
  { label: 'Combat',        href: '/wiki/combat',        color: 'blue' },
  { label: 'Economy',       href: '/wiki/economy',       color: 'red' },
  { label: 'Storage',       href: '/wiki/storage',       color: 'yellow' },
  { label: 'Tavern',        href: '/wiki/tavern',        color: 'blue' },
  { label: 'Enchantments',  href: '/wiki/enchantments' },
  { label: 'Automation',    href: '/wiki/automation' },
  { label: 'Travel',        href: '/wiki/travel' },
]} />

Putting it together — a real wiki section

Here's how the components compose into something a wiki writer would actually publish:

Last Call — the signature combat enchant

Last CallSignature

Lvl 3
SwordAxe

Hits harder below 5/20. Useful when you've got a Bloody Mothra brew already burning and you need one more swing.

Recommended PvE loadout for boss fights:

Drops to expect from the boss room:

Rare
Enchanted BookEnchanted Book×1-250%
DiamondDiamond×2-430%
Legendary
Netherite ScrapNetherite Scrap5%

Last Call — the signature combat enchant

Last CallSignature

Lvl 3
SwordAxe

Hits harder below 5/20. Useful when you've got a Bloody Mothra brew already burning and you need one more swing.

Recommended PvE loadout for boss fights:

Drops to expect from the boss room:

Rare
Enchanted BookEnchanted Book×1-250%
DiamondDiamond×2-430%
Legendary
Netherite ScrapNetherite Scrap5%

See also

  • src/app/api/mc/README.md — full TypeScript framework + API reference
  • src/components/wiki/ — component source code
  • src/lib/mc-assets.ts — texture URL helper + API client
  • src/lib/mc-registry.ts — server-side item registry helpers

How to Join Sunday Market

Server address

marketsunday.com
  1. 1Launch Minecraft Java Edition.
  2. 2Click Multiplayer.
  3. 3Click Add Server.
  4. 4Server Name: Sunday Market. Server Address: paste the address above.
  5. 5Click Done, then double-click the entry to connect.
  6. Any client from 1.7 upward works — the version-translation layer maps older and newer clients to the server's Minecraft 1.21.