{"release_id":"01a1998d-9802-0000-b0f7-33a23307f4ed","chunk_id":"01a1998d-993a-7f93-bd69-388c6276b82e","file":"KiDhhEAg.mjs","mappings":"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","names":["WIDTH_RATIO","FIT_BANDS","FIT_LABEL","msg","nominalWidthMm","girthCm","widthRangeMm","fitOf","widthMm","r","b","girthRangeCm","CHECKED","SOURCES","trojan","CONDOMS","MYONE_WIDTHS","MYONE_LENGTHS","MYONE_LETTERS","myoneSize","lengthCm","want","a","letters","letter","l","lengthAdvice"],"sources":["../../../../../../src/lib/tools/condoms.ts"],"sourcesContent":["import { msg } from '$lib/i18n/mark';\n\n/**\n * Condom size from girth (RAT-576). A condom's nominal width is its width laid\n * flat — half its circumference — and it should be a little narrower than half\n * the penis, so it grips: MyONE describes the right condom as \"slightly tighter\n * than your penis circumference\", and Condomerie's table pairs 52–54 mm with a\n * 110–120 mm girth and 55–60 mm with 120–135 mm. Both work out to a nominal\n * width of about 45% of the girth, which also puts the average girth (11.7 cm)\n * on the 52–53 mm Condomerie calls an average condom.\n */\n\nexport const WIDTH_RATIO = 0.455;\n\n/** nominal width / girth, and what a condom of that width feels like */\nconst FIT_BANDS = [\n\t{ below: 0.42, fit: 'tight' },\n\t{ below: 0.44, fit: 'snug' },\n\t{ below: 0.48, fit: 'right' },\n\t{ below: 0.5, fit: 'roomy' },\n\t{ below: Infinity, fit: 'loose' }\n] as const;\nexport type Fit = (typeof FIT_BANDS)[number]['fit'];\n\nexport const FIT_LABEL: Record<Fit, string> = {\n\ttight: msg('too tight'),\n\tsnug: msg('snug'),\n\tright: msg('right fit'),\n\troomy: msg('roomy'),\n\tloose: msg('too loose')\n};\n\nexport const nominalWidthMm = (girthCm: number) => Math.round(girthCm * 10 * WIDTH_RATIO);\n\n/** The widths that fit a girth: from snug to roomy. */\nexport function widthRangeMm(girthCm: number): [number, number] {\n\treturn [Math.ceil(girthCm * 10 * 0.44), Math.floor(girthCm * 10 * 0.48)];\n}\n\nexport function fitOf(widthMm: number, girthCm: number): Fit {\n\tconst r = widthMm / (girthCm * 10);\n\treturn FIT_BANDS.find((b) => r < b.below)!.fit;\n}\n\n/** The girths a width fits, in cm. */\nexport function girthRangeCm(widthMm: number): [number, number] {\n\treturn [widthMm / 0.48 / 10, widthMm / 0.44 / 10];\n}\n\n// ── the chart ────────────────────────────────────────────────────────────────\n\nexport const CHECKED = '2026-10-11';\n\nexport const SOURCES = {\n\ttrojan: {\n\t\tname: 'Trojan',\n\t\turl: 'https://www.trojanbrands.com/en/sex-information/can-i-wear-magnum'\n\t},\n\tmyone: { name: 'MyONE', url: 'https://onecondoms.com/blogs/education/condom-size-chart' },\n\tcondomerie: {\n\t\tname: 'Condomerie',\n\t\turl: 'https://condomerie.com/en/condoms/nominal-width/which-nominal-width-is-right-for-me'\n\t}\n} as const;\nexport type SourceKey = keyof typeof SOURCES;\n\nexport interface Condom {\n\tbrand: string;\n\tmodel: string;\n\twidthMm: number;\n\tlengthMm: [number, number] | null;\n\t/** shape, where it changes the fit */\n\tnote?: string;\n\tsource: SourceKey;\n\tsourceUrl: string;\n}\n\nconst trojan = SOURCES.trojan.url;\n\nexport const CONDOMS: Condom[] = [\n\t{\n\t\tbrand: 'SKYN',\n\t\tmodel: 'Original',\n\t\twidthMm: 53,\n\t\tlengthMm: [180, 180],\n\t\tsource: 'condomerie',\n\t\tsourceUrl: 'https://condomerie.com/en/manix-skyn-original'\n\t},\n\t{\n\t\tbrand: 'SKYN',\n\t\tmodel: 'Elite',\n\t\twidthMm: 53,\n\t\tlengthMm: [180, 180],\n\t\tsource: 'condomerie',\n\t\tsourceUrl: 'https://condomerie.com/en/manix-skyn-elite'\n\t},\n\t{\n\t\tbrand: 'Trojan',\n\t\tmodel: 'Magnum Ecstasy',\n\t\twidthMm: 53,\n\t\tlengthMm: [190, 210],\n\t\tnote: msg('bulb-shaped: 73 mm at the head'),\n\t\tsource: 'trojan',\n\t\tsourceUrl: trojan\n\t},\n\t{\n\t\tbrand: 'Trojan',\n\t\tmodel: 'Magnum',\n\t\twidthMm: 55,\n\t\tlengthMm: [180, 200],\n\t\tnote: msg('flared: 62 mm at the head'),\n\t\tsource: 'trojan',\n\t\tsourceUrl: trojan\n\t},\n\t{\n\t\tbrand: 'Durex',\n\t\tmodel: 'Thin Feel',\n\t\twidthMm: 56,\n\t\tlengthMm: [205, 205],\n\t\tsource: 'condomerie',\n\t\tsourceUrl: 'https://condomerie.com/en/durex-thin-feel-extra-lube-feel-sensual'\n\t},\n\t{\n\t\tbrand: 'Durex',\n\t\tmodel: 'Extra Safe',\n\t\twidthMm: 56,\n\t\tlengthMm: [205, 205],\n\t\tsource: 'condomerie',\n\t\tsourceUrl: 'https://condomerie.com/en/durex-extra-safe'\n\t},\n\t{\n\t\tbrand: 'Trojan',\n\t\tmodel: 'Magnum BareSkin',\n\t\twidthMm: 57,\n\t\tlengthMm: [190, 210],\n\t\tsource: 'trojan',\n\t\tsourceUrl: trojan\n\t},\n\t{\n\t\tbrand: 'Trojan',\n\t\tmodel: 'Magnum XL',\n\t\twidthMm: 58,\n\t\tlengthMm: [180, 200],\n\t\tnote: msg('flared: 63 mm at the head'),\n\t\tsource: 'trojan',\n\t\tsourceUrl: trojan\n\t},\n\t{\n\t\tbrand: 'Durex',\n\t\tmodel: 'XXL',\n\t\twidthMm: 60,\n\t\tlengthMm: null,\n\t\tsource: 'condomerie',\n\t\tsourceUrl: 'https://condomerie.com/en/condoms/nominal-width/60-mm-condom'\n\t}\n];\n\n/** MyONE makes nine widths, each in its own run of lengths (52 sizes). */\nexport const MYONE_WIDTHS = [45, 47, 49, 51, 53, 55, 57, 60, 64];\nconst MYONE_LENGTHS = {\n\tC: 120,\n\tD: 132,\n\tE: 144,\n\tF: 156,\n\tG: 168,\n\tH: 181,\n\tJ: 194,\n\tK: 207,\n\tL: 220,\n\tM: 235\n} as const;\ntype Letter = keyof typeof MYONE_LENGTHS;\nconst MYONE_LETTERS: Record<number, Letter[]> = {\n\t45: ['C', 'D', 'E'],\n\t47: ['C', 'D', 'E', 'F'],\n\t49: ['C', 'D', 'E', 'F', 'G'],\n\t51: ['C', 'D', 'E', 'F', 'G', 'H'],\n\t53: ['C', 'D', 'E', 'F', 'G', 'H'],\n\t55: ['D', 'E', 'F', 'G', 'H', 'J'],\n\t57: ['D', 'E', 'F', 'G', 'H', 'J', 'K'],\n\t60: ['E', 'F', 'G', 'H', 'J', 'K', 'L'],\n\t64: ['E', 'F', 'G', 'H', 'J', 'K', 'L', 'M']\n};\n\n/** The MyONE size for a girth and length: the nearest width, and the shortest\n *  length that covers the erect length (or the longest that width comes in). */\nexport function myoneSize(\n\tgirthCm: number,\n\tlengthCm: number\n): { code: string; widthMm: number; lengthMm: number } {\n\tconst want = nominalWidthMm(girthCm);\n\tconst widthMm = MYONE_WIDTHS.reduce((a, b) => (Math.abs(b - want) < Math.abs(a - want) ? b : a));\n\tconst letters = MYONE_LETTERS[widthMm];\n\tconst letter =\n\t\tletters.find((l) => MYONE_LENGTHS[l] >= lengthCm * 10) ?? letters[letters.length - 1];\n\treturn { code: `${widthMm}${letter}`, widthMm, lengthMm: MYONE_LENGTHS[letter] };\n}\n\nexport type LengthAdvice = 'long' | 'short' | 'standard';\n/** Most condoms are 180–205 mm unrolled. */\nexport function lengthAdvice(lengthCm: number): LengthAdvice {\n\tif (lengthCm > 19) return 'long';\n\tif (lengthCm < 12) return 'short';\n\treturn 'standard';\n}\n"],"version":3}