| 1 | /** Public launch selection. Prices are targets until an approved destination rate is quoted. */ |
| 2 | export const MERCH_SIZES = ["S", "M", "L", "XL", "2XL", "3XL"] as const; |
| 3 | export const MERCH_PRODUCTS = [ |
| 4 | { id: "signature", title: "Codewhale Signature", caption: "Small left-chest signature", image: "/merch/signature-core.svg", kind: "regular", collection: "launch" }, |
| 5 | { id: "classic", title: "Codewhale Classic", caption: "The whale and the name", image: "/merch/classic-core.svg", kind: "regular", collection: "launch" }, |
| 6 | { id: "wordmark", title: "Codewhale Wordmark", caption: "Just the name", image: "/merch/wordmark-core.svg", kind: "regular", collection: "launch" }, |
| 7 | { id: "ocean-line", title: "Ocean line", caption: "A quiet horizon", image: "/merch/ocean-line-core.svg", kind: "regular", collection: "launch" }, |
| 8 | { id: "use-pocket", title: "use codewhale.", caption: "Small left-chest print", image: "/merch/use-pocket-core.svg", kind: "regular", collection: "launch" }, |
| 9 | { id: "field", title: "Codewhale Field", caption: "Front and back · separate quote", image: "/merch/field-front-core.svg", kind: "concept", collection: "later" }, |
| 10 | { id: "stage-dive", title: "Open source. Open mic.", caption: "Desk gear · stage dive / deep dive", image: "/merch/developer-desk-kit.png", kind: "concept", collection: "later" }, |
| 11 | { id: "use-codewhale", title: "use codewhale.", caption: "Small whale. Short line.", image: "/merch/use-codewhale-simple.svg", kind: "regular", collection: "launch" }, |
| 12 | { id: "compiling", title: "Compiling…", caption: "Just one more crate.", image: "/merch/compiling-simple.svg", kind: "regular", collection: "launch" }, |
| 13 | { id: "whale-bro", title: "鲸鱼兄弟", caption: "Whale Bro", image: "/merch/whale-bro-simple.svg", kind: "regular", collection: "launch" }, |
| 14 | { id: "contributor", title: "Built together.", caption: "Contributor edition · at cost", image: "/merch/open-ocean-patchwork.png", kind: "contributor", collection: "launch" }, |
| 15 | { id: "china-tour", title: "China Tour 2026", caption: "October 15–19 · Datawhale", image: "/merch/china-tour.png", kind: "regular", collection: "seasonal" }, |
| 16 | { id: "ocean-ombre", title: "Ocean ombré", caption: "Aqua to midnight", image: "/merch/ocean-ombre-reversed.png", kind: "concept", collection: "later" }, |
| 17 | { id: "hoodie", title: "Simple whale hoodie", caption: "Small left-chest mark · sample first", image: "/merch/hoodie-simple.svg", kind: "concept", collection: "later" }, |
| 18 | { id: "deskmat", title: "Open source deskmat", caption: "80 × 30 cm · cloth and rubber", image: "/merch/developer-desk-kit.png", kind: "concept", collection: "later" }, |
| 19 | { id: "mousepad", title: "Cache me if you can.", caption: "Mousepad · size to be selected", image: "/merch/developer-desk-kit.png", kind: "concept", collection: "later" }, |
| 20 | { id: "stickers", title: "Developer stickers", caption: "Compiling… · just one more crate", image: "/merch/developer-desk-kit.png", kind: "concept", collection: "later" }, |
| 21 | { id: "plush", title: "Codewhale plush doll", caption: "20 cm seated mascot · prototype planned", image: "/merch/seated-plush-concept.png", kind: "concept", collection: "prototype" }, |
| 22 | { id: "accessories", title: "Little companions", caption: "Tote · mug · stickers", image: "/merch/mascot-accessories.png", kind: "concept", collection: "later" }, |
| 23 | ] as const; |
| 24 | export type MerchProductId = typeof MERCH_PRODUCTS[number]["id"]; |
| 25 | export const MERCH_COUNTRIES = [ |
| 26 | { code: "CN", name: "China" }, { code: "US", name: "United States" }, |
| 27 | { code: "CA", name: "Canada" }, { code: "GB", name: "United Kingdom" }, |
| 28 | { code: "DE", name: "Germany" }, { code: "FR", name: "France" }, |
| 29 | { code: "NL", name: "Netherlands" }, { code: "ES", name: "Spain" }, |
| 30 | { code: "IT", name: "Italy" }, { code: "SE", name: "Sweden" }, |
| 31 | { code: "IE", name: "Ireland" }, { code: "AU", name: "Australia" }, |
| 32 | { code: "NZ", name: "New Zealand" }, { code: "JP", name: "Japan" }, |
| 33 | { code: "KR", name: "South Korea" }, { code: "SG", name: "Singapore" }, |
| 34 | { code: "MY", name: "Malaysia" }, { code: "TH", name: "Thailand" }, |
| 35 | { code: "VN", name: "Vietnam" }, { code: "PH", name: "Philippines" }, |
| 36 | { code: "ID", name: "Indonesia" }, { code: "HK", name: "Hong Kong" }, |
| 37 | { code: "TW", name: "Taiwan" }, |
| 38 | ] as const; |
| 39 | // Countries are candidates for quoting, not a promise that a particular SKU/carrier serves every address. |
| 40 | export const MERCH_TARGET_PRICE = { cny: 6900, usd: 1500 } as const; |
| 41 |