// ============================================================ // Shipping — Japan Post International Air Packet // Standardised around the 1 kg rate ("1 kit ≈ 1 kg") // Renders into #root // ============================================================ const { useState, useMemo, useEffect } = React; const SHOP_EMAIL = "inquiry@takarascale.jp"; // ---- zones (Japan Post International Air Packet, from 2026-06-01) ---- const ZONES = [ { id: 1, name: "Zone 1", blurb: "China · South Korea · Taiwan", countries: ["China", "South Korea", "Taiwan"] }, { id: 2, name: "Zone 2", blurb: "Rest of Asia", countries: ["Hong Kong", "Singapore", "Thailand", "Malaysia", "Vietnam", "Philippines", "Indonesia", "India", "UAE? (see note)"] }, { id: 3, name: "Zone 3", blurb: "Europe · Oceania · Canada · Mexico · Middle East", countries: ["United Kingdom", "Germany", "France", "Italy", "Spain", "Netherlands", "Belgium", "Switzerland", "Sweden", "Australia", "New Zealand", "Canada", "Mexico", "UAE", "Saudi Arabia"] }, { id: 4, name: "Zone 4", blurb: "United States (incl. territories)", countries: ["United States", "Guam", "Puerto Rico", "Hawaii"] }, { id: 5, name: "Zone 5", blurb: "Latin America (excl. Mexico) · Africa", countries: ["Brazil", "Argentina", "Chile", "South Africa", "Egypt", "Kenya", "Nigeria"] }, ]; // full rate table: weight(g cap) -> [z1,z2,z3,z4,z5] (incl. ¥370 tracking) const RATES = [ [100, 720, 750, 880, 1200, 920], [200, 820, 870, 1060, 1410, 1180], [300, 920, 990, 1240, 1620, 1440], [400, 1020, 1110, 1420, 1830, 1700], [500, 1120, 1230, 1600, 2040, 1960], [600, 1220, 1350, 1780, 2250, 2220], [700, 1320, 1470, 1960, 2460, 2480], [800, 1420, 1590, 2140, 2670, 2740], [900, 1520, 1710, 2320, 2880, 3000], [1000, 1620, 1830, 2500, 3090, 3260], [1100, 1720, 1950, 2680, 3300, 3520], [1200, 1820, 2070, 2860, 3510, 3780], [1300, 1920, 2190, 3040, 3720, 4040], [1400, 2020, 2310, 3220, 3930, 4300], [1500, 2120, 2430, 3400, 4140, 4560], [1600, 2220, 2550, 3580, 4350, 4820], [1700, 2320, 2670, 3760, 4560, 5080], [1800, 2420, 2790, 3940, 4770, 5340], [1900, 2520, 2910, 4120, 4980, 5600], [2000, 2620, 3030, 4300, 5190, 5860], ]; const STD_WEIGHT = 1000; // 1 kit ≈ 1 kg packed const stdRow = RATES.find((r) => r[0] === STD_WEIGHT); // ---- currency (foreign only; default USD — JPY not shown on this page) ---- const CURRENCIES = { USD: { sym: "$", perYen: 1 / 150, label: "$ USD" }, EUR: { sym: "€", perYen: 1 / 165, label: "€ EUR" }, GBP: { sym: "£", perYen: 1 / 190, label: "£ GBP" }, AUD: { sym: "A$", perYen: 1 / 100, label: "A$ AUD" }, CAD: { sym: "C$", perYen: 1 / 110, label: "C$ CAD" }, }; const CURRENCY_KEYS = Object.keys(CURRENCIES); let activeCur = "USD"; // set by each render function applyRates(rates) { for (const k of CURRENCY_KEYS) { if (typeof rates[k] === "number" && rates[k] > 0) CURRENCIES[k].perYen = rates[k]; } } async function loadRates() { const now = Date.now(); try { const cached = JSON.parse(localStorage.getItem("tsa_rates") || "null"); if (cached && cached.r && now - cached.t < 12 * 3600 * 1000) { applyRates(cached.r); return true; } } catch (e) {} try { const res = await fetch("https://open.er-api.com/v6/latest/JPY"); const data = await res.json(); if (data && data.rates) { applyRates(data.rates); try { localStorage.setItem("tsa_rates", JSON.stringify({ t: now, r: data.rates })); } catch (e) {} return true; } } catch (e) {} return false; } // money() — selected (foreign) currency, no decimals; tidy rounding function money(n) { if (n == null) return "—"; const c = CURRENCIES[activeCur] || CURRENCIES.USD; const v = n * c.perYen; const r = v >= 50 ? Math.round(v / 5) * 5 : Math.round(v); return c.sym + r.toLocaleString("en-US"); } // rate for a given total grams + zone index (1-based) function rateFor(grams, zoneId) { const row = RATES.find((r) => grams <= r[0]); if (!row) return null; // over 2 kg return row[zoneId]; } // ---------- header / footer ---------- function SiteHeader() { return (
TAKARA SCALE AGENCY Worldwide shipping from Japan
Back to store
); } function SiteFooter() { return ( ); } // ---------- calculator ---------- function Calculator() { const [zoneId, setZoneId] = useState(4); const [kits, setKits] = useState(1); const grams = kits * STD_WEIGHT; const overLimit = grams > 2000; const rate = rateFor(grams, zoneId); const perKit = rateFor(STD_WEIGHT, zoneId); const zone = ZONES.find((z) => z.id === zoneId); return (
Destination
Number of kits
{kits}
{!overLimit ? (
Estimated shipping · {zone.name} {money(rate)}
{kits} kit{kits > 1 ? "s" : ""} Flat per-kit rate: {money(perKit)} Fully tracked · all-inclusive
) : (
More than 2 kits in one packet.

{kits} kits exceed a single packet. We split larger orders into multiple tracked packets or quote International Parcel / EMS — just ask and we'll work out the cheapest combination for your country.

Get a combined quote →
)}

Based on Japan Post International Air Packet (fully tracked). One flat rate per kit — final cost is confirmed by email before you pay; USD figures are indicative only.

); } // ---------- full rate table ---------- function RateTable() { const kitRows = [1, 2]; // one Air Packet holds up to 2 kits return (
{ZONES.map((z) => ( ))} {kitRows.map((k) => ( {ZONES.map((z) => )} ))}
Per order {z.name} {z.blurb}
{k} kit{k > 1 ? "s" : ""} {k === 1 && standard} {money(rateFor(STD_WEIGHT * k, z.id))}

Japan Post International Air Packet, effective 1 June 2026. Rates include international tracking. Orders of 3+ kits ship as multiple tracked packets — ask for a combined quote.

); } // ---------- page ---------- function ShippingPage() { const [currency, setCurrency] = useState(() => { try { const s = localStorage.getItem("tsa_cur"); if (s && CURRENCIES[s]) return s; } catch (e) {} return "USD"; // default to USD on the shipping page }); activeCur = currency; const [, bump] = useState(0); useEffect(() => { try { localStorage.setItem("tsa_cur", currency); } catch (e) {} }, [currency]); useEffect(() => { loadRates().then((ok) => { if (ok) bump((n) => n + 1); }); }, []); return (
Worldwide shipping from Japan · One flat per-kit rate, tracked door to mailbox
Shipping

One kit, one flat rate.

We ship worldwide with Japan Post International Air Packet — fully tracked, delivered to your mailbox. One simple price per kit, no surprises at checkout — and typically well below what eBay charges for the same kit sent from Japan.

{/* standardised per-kit rate strip */}

The standard rate — per kit

This is what one kit costs to ship, by region. No surprises at checkout — and usually cheaper than eBay's Japan shipping.

{ZONES.map((z, i) => (
{z.name} {z.blurb} {money(stdRow[i + 1])} per kit
))}

Estimate your shipping

Pick your region and how many kits — one flat rate per kit.

Full rate table

Every shipping price, per kit, by region — fully tracked.

Ready to send one home?

Find a kit in stock and we'll confirm your all-in total — kit plus shipping — before you pay anything.

); } ReactDOM.createRoot(document.getElementById("root")).render();