返回 CodeWhale
catalog.ts
根目录 / web / lib / merch / catalog.ts
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
41 lines TYPESCRIPT