{"release_id":"01a1998d-9802-0000-b0f7-33a23307f4ed","chunk_id":"01a1998d-9999-7462-b88c-d93d719c842c","file":"142.VFbHZdf6.mjs","mappings":"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","names":["CASTS","AGES","PLACES","ACTIONS","CAMERAS","SOUNDS","DEFAULT_CHOICE","placesFor","cast","actionsFor","placeId","place","p","a","settle","c","places","actions","action","camera","x","sound","s","subject","buildPrompt","choice","body","pick","list","random","shuffle","GENERATOR_FAQ","GENERATOR_EXAMPLES","origin","studioOrigin","SITE_URL","url","jsonLd","jsonLdScript","breadcrumbList","STUDIO_BRAND","studioSeoByPath","f","$.state","$.proxy","prompt","$.derived","$.get","whose","update","patch","$.set","copied","copiedTimer","copy","ok","area","trackStudioPrompt","selectClass","labelClass","$.head","$$anchor","StudioPage","main","root_2","nav","ol","li","a_1","h1","$.sibling","section","div","label","span","$.set_class","select","$.clsx","option","root_3","$.set_text","text_2","option_value","$.reset","$.init_select","div_1","label_1","span_1","select_1","$.each","option_1","root_4","label_2","root_5","span_2","select_2","option_2","root_6","select_2_value","e","$$render","consequent","label_3","span_3","select_3","option_3","root_7","text_6","option_3_value","label_4","span_4","select_4","option_4","root_8","text_7","option_4_value","label_5","span_5","select_5","option_5","root_9","text_8","option_5_value","label_6","span_6","select_6","option_6","root_10","text_9","option_6_value","div_2","p_1","div_3","button","button_1","a_2","section_1","ul","$.index","ex","i","text","li_1","root_11","p_2","div_4","a_3","$.child","$.set_attribute","$0","promptHref","$.delegated","section_2","div_5","div_6","root_12","h3","p_3","text_13","text_14","section_3","p_4","select_value","select_1_value","select_3_value","select_4_value","select_5_value","select_6_value","$1"],"sources":["../../../../../../src/lib/studio-prompt-generator.ts","../../../../../../src/routes/prompts/generator/+page.svelte"],"sourcesContent":["/** PornPilot's NSFW AI prompt generator: the words behind /prompts/generator\n *  (RAT-632).\n *\n *  \"nsfw prompt generator\" (2.9K a month, US, KD 14) and \"nsfw ai prompt\n *  generator\" (1.3K, KD 19) are answered on Google by fan-fiction generators\n *  and small tools (Semrush, 2026-10-31). This one writes video prompts the\n *  studio reads well, which is the one thing those do not.\n *\n *  There is no free text anywhere in it. Every piece — the people, the place,\n *  the action, the camera, the sound — was written here in advance, and the\n *  test beside this file builds every combination the page can produce and\n *  runs each through the studio's own under-age gate and the Epic D word list.\n *  So whatever the page hands over is something the studio will take.\n *\n *  The pieces follow the library ($lib/studio-prompts): the kinds of scene the\n *  render log says people keep, one action per shot, everyone an adult with an\n *  age, the camera named, the sound written in. Doggy, standing and squirting\n *  are left out for the reason the library gives. */\n\nexport type CastId = 'mw' | 'pov' | 'ww' | 'mm' | 'w' | 'm';\nexport type AgeId = 'twenties' | 'thirties' | 'forties';\n\nexport interface Cast {\n\tid: CastId;\n\tlabel: string;\n\t/** Two ages to choose: a man's and a woman's. Everyone else shares one. */\n\ttwoAges: boolean;\n}\n\nexport const CASTS: readonly Cast[] = [\n\t{ id: 'mw', label: 'A man and a woman', twoAges: true },\n\t{ id: 'pov', label: 'POV: her, seen through his eyes', twoAges: false },\n\t{ id: 'ww', label: 'Two women', twoAges: false },\n\t{ id: 'mm', label: 'Two men', twoAges: false },\n\t{ id: 'w', label: 'A woman alone', twoAges: false },\n\t{ id: 'm', label: 'A man alone', twoAges: false }\n];\n\nexport const AGES: readonly AgeId[] = ['twenties', 'thirties', 'forties'];\n\nexport interface Place {\n\tid: string;\n\tlabel: string;\n\ttext: string;\n\t/** Somewhere to lie down. A shot that needs one is not offered without it. */\n\tlie: boolean;\n}\n\nexport const PLACES: readonly Place[] = [\n\t{\n\t\tid: 'hotel',\n\t\tlabel: 'Hotel room, morning',\n\t\ttext: 'in a hotel room, morning light through the curtains',\n\t\tlie: true\n\t},\n\t{ id: 'candles', label: 'A bed lit by candles', text: 'on a bed lit by candles', lie: true },\n\t{\n\t\tid: 'couch',\n\t\tlabel: 'Leather couch, lamplight',\n\t\ttext: 'on a leather couch in warm lamp light',\n\t\tlie: true\n\t},\n\t{\n\t\tid: 'cabin',\n\t\tlabel: 'Cabin in the rain',\n\t\ttext: 'on a sheepskin rug in a wooden cabin, rain on the window',\n\t\tlie: true\n\t},\n\t{\n\t\tid: 'rooftop',\n\t\tlabel: 'Rooftop at sunset',\n\t\ttext: 'on a daybed on a private rooftop at sunset',\n\t\tlie: true\n\t},\n\t{\n\t\tid: 'sauna',\n\t\tlabel: 'Wooden sauna',\n\t\ttext: 'on the top bench of a wooden sauna, steam in the air',\n\t\tlie: true\n\t},\n\t{ id: 'shower', label: 'Steamy shower', text: 'in a steamy glass shower', lie: false },\n\t{ id: 'pool', label: 'Pool at night', text: 'in a heated pool at night', lie: false }\n];\n\nexport interface Action {\n\tid: string;\n\tlabel: string;\n\ttext: string;\n\t/** Needs somewhere to lie down (see Place.lie). */\n\tlie: boolean;\n}\n\nexport const ACTIONS: Readonly<Record<CastId, readonly Action[]>> = {\n\tmw: [\n\t\t{ id: 'undress', label: 'Kissing, undressing', text: 'kissing slowly as he undresses her', lie: false },\n\t\t{ id: 'oil', label: 'Warm oil on her breasts', text: 'he rubs warm oil into her breasts', lie: true },\n\t\t{ id: 'riding', label: 'She rides him', text: 'she rides him slowly, his hands on her waist', lie: true },\n\t\t{ id: 'spooning', label: 'Slow sex, spooning', text: 'having slow sex spooning', lie: true },\n\t\t{\n\t\t\tid: 'blowjob',\n\t\t\tlabel: 'She gives him a blowjob',\n\t\t\ttext: 'she gives him a slow blowjob, looking up at him',\n\t\t\tlie: false\n\t\t}\n\t],\n\tpov: [\n\t\t{\n\t\t\tid: 'gaze',\n\t\t\tlabel: 'Looking up into the camera',\n\t\t\ttext: 'on her back, looking up into the camera as he slides into her',\n\t\t\tlie: true\n\t\t},\n\t\t{\n\t\t\tid: 'breasts',\n\t\t\tlabel: 'Her breasts moving',\n\t\t\ttext: 'her breasts moving with every slow thrust, holding eye contact with the camera',\n\t\t\tlie: true\n\t\t},\n\t\t{ id: 'hips', label: 'Pulling him closer', text: 'pulling him closer by the hips', lie: true }\n\t],\n\tww: [\n\t\t{\n\t\t\tid: 'strap',\n\t\t\tlabel: 'Kissing, a strap slipping',\n\t\t\ttext: \"kissing, one sliding the other's dress off her shoulder\",\n\t\t\tlie: false\n\t\t},\n\t\t{\n\t\t\tid: 'breasts',\n\t\t\tlabel: 'Kissing her breasts',\n\t\t\ttext: \"one kissing and licking the other's breasts\",\n\t\t\tlie: false\n\t\t},\n\t\t{\n\t\t\tid: 'stomach',\n\t\t\tlabel: 'Kissing down her stomach',\n\t\t\ttext: \"one kissing her way down the other's stomach\",\n\t\t\tlie: true\n\t\t},\n\t\t{\n\t\t\tid: 'touch',\n\t\t\tlabel: 'Touching and kissing',\n\t\t\ttext: \"touching each other's breasts and kissing\",\n\t\t\tlie: false\n\t\t}\n\t],\n\tmm: [\n\t\t{\n\t\t\tid: 'shirt',\n\t\t\tlabel: 'Kissing, a shirt coming off',\n\t\t\ttext: \"kissing, one pulling the other's shirt over his head\",\n\t\t\tlie: false\n\t\t},\n\t\t{ id: 'stroke', label: 'One stroking the other', text: \"one stroking the other's cock\", lie: false },\n\t\t{ id: 'blowjob', label: 'A slow blowjob', text: 'one giving the other a slow blowjob', lie: false },\n\t\t{ id: 'sex', label: 'Sex, one on his back', text: 'having sex, one on his back', lie: true }\n\t],\n\tw: [\n\t\t{\n\t\t\tid: 'undress',\n\t\t\tlabel: 'Slowly undressing',\n\t\t\ttext: 'slowly undressing, looking at the camera over her shoulder',\n\t\t\tlie: false\n\t\t},\n\t\t{ id: 'breasts', label: 'Playing with her breasts', text: 'playing with her breasts', lie: false }\n\t],\n\tm: [\n\t\t{ id: 'stroke', label: 'Jerking off', text: 'jerking off slowly', lie: false },\n\t\t{\n\t\t\tid: 'shirt',\n\t\t\tlabel: 'Pulling his shirt off',\n\t\t\ttext: 'pulling his shirt off, looking at the camera',\n\t\t\tlie: false\n\t\t}\n\t]\n};\n\nexport interface Camera {\n\tid: string;\n\tlabel: string;\n\ttext: string;\n}\n\n/** Not offered for POV, where the adapter decides the camera: it is his eyes. */\nexport const CAMERAS: readonly Camera[] = [\n\t{ id: 'none', label: \"The writer's choice\", text: '' },\n\t{ id: 'side', label: 'From the side', text: 'shot from the side' },\n\t{ id: 'close', label: 'Close', text: 'the camera close' },\n\t{ id: 'above', label: 'From above', text: 'the camera from above' }\n];\n\nexport interface Sound {\n\tid: string;\n\tlabel: string;\n\t/** Per cast, because who makes the sound depends on who is there. */\n\ttext: Readonly<Record<CastId, string>>;\n}\n\nexport const SOUNDS: readonly Sound[] = [\n\t{\n\t\tid: 'none',\n\t\tlabel: \"The writer's choice\",\n\t\ttext: { mw: '', pov: '', ww: '', mm: '', w: '', m: '' }\n\t},\n\t{\n\t\tid: 'moan',\n\t\tlabel: 'Moaning',\n\t\ttext: {\n\t\t\tmw: 'she moans softly',\n\t\t\tpov: 'moaning softly',\n\t\t\tww: 'both moaning softly',\n\t\t\tmm: 'both moaning',\n\t\t\tw: 'moaning softly',\n\t\t\tm: 'groaning softly'\n\t\t}\n\t},\n\t{\n\t\tid: 'line',\n\t\tlabel: 'A whispered line',\n\t\ttext: {\n\t\t\tmw: 'she whispers \"don\\'t stop\"',\n\t\t\tpov: 'whispering \"don\\'t stop\"',\n\t\t\tww: 'one whispers \"don\\'t stop\"',\n\t\t\tmm: 'one whispers \"slower\"',\n\t\t\tw: 'whispering \"come here\"',\n\t\t\tm: 'whispering \"come here\"'\n\t\t}\n\t},\n\t{\n\t\tid: 'breath',\n\t\tlabel: 'Breathing hard',\n\t\ttext: {\n\t\t\tmw: 'both breathing hard',\n\t\t\tpov: 'breathing hard',\n\t\t\tww: 'both breathing hard',\n\t\t\tmm: 'both breathing hard',\n\t\t\tw: 'breathing hard',\n\t\t\tm: 'breathing hard'\n\t\t}\n\t}\n];\n\nexport interface Choice {\n\tcast: CastId;\n\t/** The man's age where there are two, otherwise everyone's. */\n\tage: AgeId;\n\t/** The woman's age, for a man and a woman. */\n\tage2: AgeId;\n\tplace: string;\n\taction: string;\n\tcamera: string;\n\tsound: string;\n}\n\n/** What the page opens on, the same on the server and in the browser. */\nexport const DEFAULT_CHOICE: Choice = {\n\tcast: 'mw',\n\tage: 'thirties',\n\tage2: 'twenties',\n\tplace: 'candles',\n\taction: 'riding',\n\tcamera: 'side',\n\tsound: 'line'\n};\n\nexport function placesFor(cast: CastId): readonly Place[] {\n\t// POV is missionary: she is lying down.\n\treturn cast === 'pov' ? PLACES.filter((p) => p.lie) : PLACES;\n}\n\nexport function actionsFor(cast: CastId, placeId: string): readonly Action[] {\n\tconst place = PLACES.find((p) => p.id === placeId);\n\treturn ACTIONS[cast].filter((a) => !a.lie || (place?.lie ?? true));\n}\n\n/** The nearest choice that can be built: anything the current cast or place\n *  does not allow falls back to the first thing that it does. */\nexport function settle(c: Choice): Choice {\n\tconst places = placesFor(c.cast);\n\tconst place = places.some((p) => p.id === c.place) ? c.place : places[0].id;\n\tconst actions = actionsFor(c.cast, place);\n\tconst action = actions.some((a) => a.id === c.action) ? c.action : actions[0].id;\n\tconst camera = c.cast === 'pov' || !CAMERAS.some((x) => x.id === c.camera) ? 'none' : c.camera;\n\tconst sound = SOUNDS.some((s) => s.id === c.sound) ? c.sound : 'none';\n\treturn { ...c, place, action, camera, sound };\n}\n\nfunction subject(c: Choice): string {\n\tswitch (c.cast) {\n\t\tcase 'mw':\n\t\t\treturn `a man in his ${c.age} and a woman in her ${c.age2}`;\n\t\tcase 'pov':\n\t\tcase 'w':\n\t\t\treturn `a woman in her ${c.age}`;\n\t\tcase 'ww':\n\t\t\treturn `two women in their ${c.age}`;\n\t\tcase 'mm':\n\t\t\treturn `two men in their ${c.age}`;\n\t\tcase 'm':\n\t\t\treturn `a man in his ${c.age}`;\n\t}\n}\n\n/** One prompt, in the order the studio's writer reads best: who and where,\n *  then the one action, then the camera, then the sound. */\nexport function buildPrompt(choice: Choice): string {\n\tconst c = settle(choice);\n\tconst place = PLACES.find((p) => p.id === c.place)!;\n\tconst action = ACTIONS[c.cast].find((a) => a.id === c.action)!;\n\tconst sound = SOUNDS.find((s) => s.id === c.sound)!.text[c.cast];\n\tif (c.cast === 'pov') {\n\t\treturn `POV, missionary ${place.text}: ${subject(c)} ${action.text}${sound ? `, ${sound}` : ''}`;\n\t}\n\tconst camera = CAMERAS.find((x) => x.id === c.camera)!.text;\n\tconst body = [`${subject(c)} ${place.text}`, action.text, camera].filter(Boolean).join(', ');\n\treturn sound ? `${body}; ${sound}` : body;\n}\n\nfunction pick<T>(list: readonly T[], random: () => number): T {\n\treturn list[Math.floor(random() * list.length)];\n}\n\n/** A random choice that can be built. `random` is injectable for the test. */\nexport function shuffle(random: () => number = Math.random): Choice {\n\tconst cast = pick(CASTS, random).id;\n\tconst place = pick(placesFor(cast), random).id;\n\treturn settle({\n\t\tcast,\n\t\tage: pick(AGES, random),\n\t\tage2: pick(AGES, random),\n\t\tplace,\n\t\taction: pick(actionsFor(cast, place), random).id,\n\t\tcamera: pick(CAMERAS, random).id,\n\t\tsound: pick(SOUNDS, random).id\n\t});\n}\n\n/** Every choice the page can produce — the test walks all of them. */\nexport function* everyChoice(): Generator<Choice> {\n\tfor (const cast of CASTS)\n\t\tfor (const age of AGES)\n\t\t\tfor (const age2 of cast.twoAges ? AGES : [age])\n\t\t\t\tfor (const place of placesFor(cast.id))\n\t\t\t\t\tfor (const action of actionsFor(cast.id, place.id))\n\t\t\t\t\t\tfor (const camera of cast.id === 'pov' ? [CAMERAS[0]] : CAMERAS)\n\t\t\t\t\t\t\tfor (const sound of SOUNDS)\n\t\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\t\tcast: cast.id,\n\t\t\t\t\t\t\t\t\tage,\n\t\t\t\t\t\t\t\t\tage2,\n\t\t\t\t\t\t\t\t\tplace: place.id,\n\t\t\t\t\t\t\t\t\taction: action.id,\n\t\t\t\t\t\t\t\t\tcamera: camera.id,\n\t\t\t\t\t\t\t\t\tsound: sound.id\n\t\t\t\t\t\t\t\t};\n}\n\nexport const GENERATOR_FAQ: readonly { q: string; a: string }[] = [\n\t{\n\t\tq: 'Is the NSFW AI prompt generator free?',\n\t\ta: 'Yes, and so is writing in the studio. A clip costs tokens only when you render it.'\n\t},\n\t{\n\t\tq: 'Why can’t I pick doggy style or squirting?',\n\t\ta: 'Doggy style and standing positions have no dedicated adapter, and squirting is beyond the model for now, so they come out less reliably. The generator only offers shots the studio renders well; you can still write the others by hand.'\n\t},\n\t{\n\t\tq: 'Can I use the prompts in other AI video generators?',\n\t\ta: 'They are plain English, so they make a starting point anywhere, but mainstream generators such as Sora or Veo refuse explicit prompts. These are written for PornPilot.'\n\t},\n\t{\n\t\tq: 'How is this different from the prompt library?',\n\t\ta: 'The library is finished prompts, each written by hand. The generator builds new ones from the same kinds of parts, so you choose the cast, the place and the shot yourself.'\n\t}\n];\n\n/** Ten it made, shown on the page under the tool: one or more per cast, a\n *  spread of places, cameras and sounds. Fixed, so the page reads the same to\n *  everyone, crawlers included. */\nexport const GENERATOR_EXAMPLES: readonly Choice[] = [\n\t{ cast: 'mw', age: 'thirties', age2: 'twenties', place: 'cabin', action: 'spooning', camera: 'close', sound: 'moan' },\n\t{ cast: 'mw', age: 'forties', age2: 'thirties', place: 'shower', action: 'undress', camera: 'side', sound: 'breath' },\n\t{ cast: 'mw', age: 'twenties', age2: 'twenties', place: 'hotel', action: 'blowjob', camera: 'above', sound: 'none' },\n\t{ cast: 'pov', age: 'thirties', age2: 'thirties', place: 'rooftop', action: 'breasts', camera: 'none', sound: 'moan' },\n\t{ cast: 'pov', age: 'twenties', age2: 'twenties', place: 'couch', action: 'hips', camera: 'none', sound: 'line' },\n\t{ cast: 'ww', age: 'twenties', age2: 'twenties', place: 'pool', action: 'breasts', camera: 'close', sound: 'moan' },\n\t{ cast: 'ww', age: 'thirties', age2: 'thirties', place: 'candles', action: 'stomach', camera: 'above', sound: 'line' },\n\t{ cast: 'mm', age: 'thirties', age2: 'thirties', place: 'sauna', action: 'blowjob', camera: 'side', sound: 'breath' },\n\t{ cast: 'w', age: 'forties', age2: 'forties', place: 'hotel', action: 'undress', camera: 'close', sound: 'none' },\n\t{ cast: 'm', age: 'twenties', age2: 'twenties', place: 'shower', action: 'stroke', camera: 'close', sound: 'moan' }\n];\n","<script lang=\"ts\">\n\t/** PornPilot's NSFW AI prompt generator (RAT-632): /prompts/generator.\n\t *\n\t *  A tool, not a text: the people, the place, the action, the camera and the\n\t *  sound, chosen from parts written and checked in advance\n\t *  ($lib/studio-prompt-generator), put together the way the studio's writer\n\t *  reads best, and handed to the composer in one tap. The page opens on a\n\t *  fixed prompt so the server and the browser render the same thing; shuffle\n\t *  and the choices only ever move it to another prompt the test has already\n\t *  checked. */\n\timport { trackStudioPrompt } from '$lib/analytics';\n\timport StudioPage from '$lib/components/studio/StudioPage.svelte';\n\timport { SITE_URL, breadcrumbList, jsonLdScript } from '$lib/seo';\n\timport { STUDIO_BRAND, studioOrigin } from '$lib/studio-host';\n\timport { studioSeoByPath } from '$lib/studio-seo';\n\timport { promptHref } from '$lib/studio-prompts';\n\timport {\n\t\tAGES,\n\t\tCAMERAS,\n\t\tCASTS,\n\t\tDEFAULT_CHOICE,\n\t\tGENERATOR_EXAMPLES,\n\t\tGENERATOR_FAQ,\n\t\tSOUNDS,\n\t\tactionsFor,\n\t\tbuildPrompt,\n\t\tplacesFor,\n\t\tsettle,\n\t\tshuffle,\n\t\ttype AgeId,\n\t\ttype CastId,\n\t\ttype Choice\n\t} from '$lib/studio-prompt-generator';\n\n\tconst HEADING = 'NSFW AI prompt generator';\n\n\tconst origin = studioOrigin() ?? SITE_URL;\n\tconst url = `${origin}/prompts/generator`;\n\n\tconst jsonLd =\n\t\tjsonLdScript(\n\t\t\tbreadcrumbList([\n\t\t\t\t{ name: STUDIO_BRAND, url: origin },\n\t\t\t\t{ name: 'NSFW AI prompts', url: `${origin}/prompts` },\n\t\t\t\t{ name: 'Prompt generator', url }\n\t\t\t])\n\t\t) +\n\t\tjsonLdScript({\n\t\t\t'@context': 'https://schema.org',\n\t\t\t'@type': 'WebApplication',\n\t\t\tname: 'NSFW AI Prompt Generator',\n\t\t\turl,\n\t\t\tdescription: studioSeoByPath['/prompts/generator'].description,\n\t\t\tapplicationCategory: 'MultimediaApplication',\n\t\t\toperatingSystem: 'Any',\n\t\t\tisFamilyFriendly: false,\n\t\t\toffers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },\n\t\t\tisPartOf: { '@type': 'WebSite', name: STUDIO_BRAND, url: origin }\n\t\t}) +\n\t\tjsonLdScript({\n\t\t\t'@context': 'https://schema.org',\n\t\t\t'@type': 'FAQPage',\n\t\t\tmainEntity: GENERATOR_FAQ.map((f) => ({\n\t\t\t\t'@type': 'Question',\n\t\t\t\tname: f.q,\n\t\t\t\tacceptedAnswer: { '@type': 'Answer', text: f.a }\n\t\t\t}))\n\t\t});\n\n\tlet choice = $state<Choice>({ ...DEFAULT_CHOICE });\n\tconst prompt = $derived(buildPrompt(choice));\n\tconst cast = $derived(CASTS.find((c) => c.id === choice.cast) ?? CASTS[0]);\n\t/** Whose age the first list sets, in the words the prompt will use. */\n\tconst whose = $derived(\n\t\tchoice.cast === 'mw' || choice.cast === 'm'\n\t\t\t? 'his'\n\t\t\t: choice.cast === 'ww' || choice.cast === 'mm'\n\t\t\t\t? 'their'\n\t\t\t\t: 'her'\n\t);\n\tconst places = $derived(placesFor(choice.cast));\n\tconst actions = $derived(actionsFor(choice.cast, choice.place));\n\n\t/** Every change goes through settle, so a choice the cast or the place does\n\t *  not allow moves to the nearest one that it does instead of sticking. */\n\tfunction update(patch: Partial<Choice>) {\n\t\tchoice = settle({ ...choice, ...patch });\n\t}\n\n\tlet copied = $state(false);\n\tlet copiedTimer: ReturnType<typeof setTimeout> | undefined;\n\n\t/** As on the library: copied inside the click, with the textarea route for a\n\t *  browser that will not hand over the clipboard. */\n\tasync function copy() {\n\t\tlet ok = false;\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(prompt);\n\t\t\tok = true;\n\t\t} catch {\n\t\t\tconst area = document.createElement('textarea');\n\t\t\tarea.value = prompt;\n\t\t\tarea.setAttribute('readonly', '');\n\t\t\tarea.style.position = 'fixed';\n\t\t\tarea.style.opacity = '0';\n\t\t\tdocument.body.appendChild(area);\n\t\t\tarea.select();\n\t\t\ttry {\n\t\t\t\tok = document.execCommand('copy');\n\t\t\t} catch {\n\t\t\t\tok = false;\n\t\t\t}\n\t\t\tarea.remove();\n\t\t}\n\t\tif (!ok) return;\n\t\tcopied = true;\n\t\tclearTimeout(copiedTimer);\n\t\tcopiedTimer = setTimeout(() => (copied = false), 1600);\n\t\ttrackStudioPrompt('copied', { prompt: 'generator', group: choice.cast });\n\t}\n\n\tconst selectClass =\n\t\t'pp-select mt-1.5 w-full appearance-none rounded-xl bg-[var(--st-bg)] py-2.5 pr-9 pl-3.5 text-[15px] text-[var(--st-text)] ring-1 ring-[var(--st-line)] focus:ring-2 focus:ring-[var(--st-text)] focus:outline-none disabled:opacity-50';\n\tconst labelClass = 'block text-xs font-semibold text-[var(--st-faint)]';\n</script>\n\n<svelte:head>\n\t{@html jsonLd}\n</svelte:head>\n\n<StudioPage>\n\t<main class=\"mx-auto max-w-3xl px-5 pt-6 pb-24\">\n\t\t<nav aria-label=\"Breadcrumb\" class=\"text-xs text-[var(--st-faint)]\">\n\t\t\t<ol class=\"flex flex-wrap items-center gap-1.5\">\n\t\t\t\t<li><a href=\"/\" class=\"transition-colors hover:text-[var(--st-text)]\">{STUDIO_BRAND}</a></li>\n\t\t\t\t<li aria-hidden=\"true\">/</li>\n\t\t\t\t<li>\n\t\t\t\t\t<a href=\"/prompts\" class=\"transition-colors hover:text-[var(--st-text)]\">NSFW AI prompts</a>\n\t\t\t\t</li>\n\t\t\t\t<li aria-hidden=\"true\">/</li>\n\t\t\t\t<li aria-current=\"page\">Generator</li>\n\t\t\t</ol>\n\t\t</nav>\n\n\t\t<h1\n\t\t\tclass=\"mt-6 font-display text-[clamp(2.25rem,6vw,3.25rem)] leading-[1.06] font-semibold tracking-[-0.042em] text-balance\"\n\t\t>\n\t\t\t{HEADING}\n\t\t</h1>\n\t\t<p class=\"mt-4 max-w-[36rem] text-[17px] leading-relaxed text-[var(--st-body)]\">\n\t\t\tPick who is in the shot, where they are, what happens, where the camera is and what you hear. The\n\t\t\tgenerator writes it as one prompt, in the order the studio reads best — copy it, or open it in the\n\t\t\tstudio and make the clip.\n\t\t</p>\n\t\t<p class=\"mt-3 text-xs text-[var(--st-faint)]\">Free · Fictional adults only, all 18+</p>\n\n\t\t<!-- The tool. Native selects: on a phone they open the system picker, which\n\t\t\t is the fastest way through six short lists, and they need no script to\n\t\t\t be read. -->\n\t\t<section aria-label=\"Prompt generator\" class=\"mt-8 rounded-2xl bg-[var(--st-surface)] p-4 sm:p-6\">\n\t\t\t<div class=\"grid gap-4 sm:grid-cols-2\">\n\t\t\t\t<label class=\"block\">\n\t\t\t\t\t<span class={labelClass}>Who</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\tclass={selectClass}\n\t\t\t\t\t\tvalue={choice.cast}\n\t\t\t\t\t\tonchange={(e) => update({ cast: e.currentTarget.value as CastId })}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#each CASTS as c (c.id)}\n\t\t\t\t\t\t\t<option value={c.id}>{c.label}</option>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t\t<div class=\"grid grid-cols-2 gap-3\">\n\t\t\t\t\t<label class=\"block\">\n\t\t\t\t\t\t<span class={labelClass}>{whose[0].toUpperCase() + whose.slice(1)} age</span>\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\tclass={selectClass}\n\t\t\t\t\t\t\tvalue={choice.age}\n\t\t\t\t\t\t\tonchange={(e) => update({ age: e.currentTarget.value as AgeId })}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#each AGES as a (a)}\n\t\t\t\t\t\t\t\t<option value={a}>{a[0].toUpperCase() + a.slice(1)}</option>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</label>\n\t\t\t\t\t{#if cast.twoAges}\n\t\t\t\t\t\t<label class=\"block\">\n\t\t\t\t\t\t\t<span class={labelClass}>Her age</span>\n\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\tclass={selectClass}\n\t\t\t\t\t\t\t\tvalue={choice.age2}\n\t\t\t\t\t\t\t\tonchange={(e) => update({ age2: e.currentTarget.value as AgeId })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{#each AGES as a (a)}\n\t\t\t\t\t\t\t\t\t<option value={a}>{a[0].toUpperCase() + a.slice(1)}</option>\n\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t\t<label class=\"block\">\n\t\t\t\t\t<span class={labelClass}>Where</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\tclass={selectClass}\n\t\t\t\t\t\tvalue={choice.place}\n\t\t\t\t\t\tonchange={(e) => update({ place: e.currentTarget.value })}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#each places as p (p.id)}\n\t\t\t\t\t\t\t<option value={p.id}>{p.label}</option>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t\t<label class=\"block\">\n\t\t\t\t\t<span class={labelClass}>What happens</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\tclass={selectClass}\n\t\t\t\t\t\tvalue={choice.action}\n\t\t\t\t\t\tonchange={(e) => update({ action: e.currentTarget.value })}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#each actions as a (a.id)}\n\t\t\t\t\t\t\t<option value={a.id}>{a.label}</option>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t\t<label class=\"block\">\n\t\t\t\t\t<span class={labelClass}>Camera</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\tclass={selectClass}\n\t\t\t\t\t\tvalue={choice.camera}\n\t\t\t\t\t\tdisabled={choice.cast === 'pov'}\n\t\t\t\t\t\tonchange={(e) => update({ camera: e.currentTarget.value })}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#each CAMERAS as c (c.id)}\n\t\t\t\t\t\t\t<option value={c.id}>{choice.cast === 'pov' && c.id === 'none' ? 'POV: his eyes' : c.label}</option>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t\t<label class=\"block\">\n\t\t\t\t\t<span class={labelClass}>Sound</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\tclass={selectClass}\n\t\t\t\t\t\tvalue={choice.sound}\n\t\t\t\t\t\tonchange={(e) => update({ sound: e.currentTarget.value })}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#each SOUNDS as s (s.id)}\n\t\t\t\t\t\t\t<option value={s.id}>{s.label}</option>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div class=\"mt-6 rounded-xl bg-[var(--st-bg)] p-4 ring-1 ring-[var(--st-line)]\">\n\t\t\t\t<p class=\"text-xs font-semibold text-[var(--st-faint)]\">Your prompt</p>\n\t\t\t\t<p class=\"mt-1.5 text-[15px] leading-relaxed\" aria-live=\"polite\">{prompt}</p>\n\t\t\t</div>\n\t\t\t<div class=\"mt-4 flex flex-wrap items-center justify-end gap-2\">\n\t\t\t\t<button type=\"button\" class=\"btn btn-quiet\" onclick={() => (choice = shuffle())}>Shuffle</button>\n\t\t\t\t<button type=\"button\" class=\"btn btn-secondary\" onclick={copy}>\n\t\t\t\t\t{copied ? 'Copied' : 'Copy'}\n\t\t\t\t</button>\n\t\t\t\t<!-- The one press that matters, the width of a phone where the row breaks. -->\n\t\t\t\t<a\n\t\t\t\t\thref={promptHref(prompt)}\n\t\t\t\t\tclass=\"btn btn-primary w-full sm:w-auto\"\n\t\t\t\t\tonclick={() => trackStudioPrompt('opened', { prompt: 'generator', group: choice.cast })}\n\t\t\t\t\t>Open in studio</a\n\t\t\t\t>\n\t\t\t</div>\n\t\t</section>\n\n\t\t<section aria-labelledby=\"how-title\" class=\"mt-16\">\n\t\t\t<h2 id=\"how-title\" class=\"font-display text-2xl font-semibold tracking-[-0.03em]\">\n\t\t\t\tHow the generator builds a prompt\n\t\t\t</h2>\n\t\t\t<p class=\"mt-3 max-w-[36rem] text-[15px] leading-relaxed text-[var(--st-body)]\">\n\t\t\t\tIt writes the way the studio's writer reads: who and where first, then one action, then the\n\t\t\t\tcamera, then the sound. Everyone gets an adult age — \"a woman in her twenties\", \"two men in their\n\t\t\t\tthirties\" — because the studio wants it said. Each shot comes with a place that suits it, so a\n\t\t\t\tscene that needs a bed is not offered in a pool. In POV the camera is his eyes, so there is no\n\t\t\t\tcamera to choose. And the actions are the kinds of scene the studio renders well, picked from the\n\t\t\t\tclips people keep.\n\t\t\t</p>\n\t\t</section>\n\n\t\t<section aria-labelledby=\"examples-title\" class=\"mt-16\">\n\t\t\t<h2 id=\"examples-title\" class=\"font-display text-2xl font-semibold tracking-[-0.03em]\">\n\t\t\t\tTen prompts it made\n\t\t\t</h2>\n\t\t\t<p class=\"mt-2 max-w-[36rem] text-[15px] leading-relaxed text-[var(--st-body)]\">\n\t\t\t\tA spread of what comes out, at least one for every kind of scene. Open any of them in the studio.\n\t\t\t</p>\n\t\t\t<ul class=\"mt-5 grid gap-2.5 sm:grid-cols-2\">\n\t\t\t\t{#each GENERATOR_EXAMPLES as ex, i (i)}\n\t\t\t\t\t{@const text = buildPrompt(ex)}\n\t\t\t\t\t<li class=\"flex flex-col justify-between gap-4 rounded-xl p-4 ring-1 ring-[var(--st-line)]\">\n\t\t\t\t\t\t<p class=\"text-[15px] leading-relaxed\">{text}</p>\n\t\t\t\t\t\t<div class=\"flex justify-end\">\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={promptHref(text)}\n\t\t\t\t\t\t\t\tclass=\"btn btn-sm btn-secondary\"\n\t\t\t\t\t\t\t\tonclick={() =>\n\t\t\t\t\t\t\t\t\ttrackStudioPrompt('opened', { prompt: `generator-example-${i + 1}`, group: ex.cast })}\n\t\t\t\t\t\t\t\t>Open in studio</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t</ul>\n\t\t</section>\n\n\t\t<section aria-labelledby=\"never-title\" class=\"mt-16\">\n\t\t\t<h2 id=\"never-title\" class=\"font-display text-2xl font-semibold tracking-[-0.03em]\">\n\t\t\t\tWhat it will not write\n\t\t\t</h2>\n\t\t\t<p class=\"mt-3 max-w-[36rem] text-[15px] leading-relaxed text-[var(--st-body)]\">\n\t\t\t\tNothing you type goes into it. Every word was written in advance and checked: everyone is an\n\t\t\t\tadult, nobody is a real person, and nothing suggests anyone did not agree. So whatever it hands\n\t\t\t\tover, the studio will take. Want something it does not offer? Change the prompt in the studio —\n\t\t\t\tthe same checks apply there.\n\t\t\t</p>\n\t\t</section>\n\n\t\t<section aria-labelledby=\"faq-title\" class=\"mt-16\">\n\t\t\t<h2 id=\"faq-title\" class=\"font-display text-2xl font-semibold tracking-[-0.03em]\">Questions</h2>\n\t\t\t<div class=\"mt-5 grid gap-6\">\n\t\t\t\t{#each GENERATOR_FAQ as f (f.q)}\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h3 class=\"font-display text-[15px] font-semibold\">{f.q}</h3>\n\t\t\t\t\t\t<p class=\"mt-1 max-w-[36rem] text-[15px] leading-relaxed text-[var(--st-body)]\">{f.a}</p>\n\t\t\t\t\t</div>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t</section>\n\n\t\t<section class=\"mt-16 rounded-2xl bg-[var(--st-surface)] p-6\">\n\t\t\t<h2 class=\"font-display text-xl font-semibold tracking-[-0.02em]\">Prefer a finished one?</h2>\n\t\t\t<p class=\"mt-2 max-w-[34rem] text-[15px] leading-relaxed text-[var(--st-body)]\">\n\t\t\t\tThe <a href=\"/prompts\" class=\"text-[var(--st-text)] underline underline-offset-2\"\n\t\t\t\t\t>NSFW AI prompts</a\n\t\t\t\t> library has prompts written by hand for every kind of scene. And {STUDIO_BRAND} itself is an\n\t\t\t\t<a href=\"/\" class=\"text-[var(--st-text)] underline underline-offset-2\">NSFW AI video generator</a>:\n\t\t\t\tdescribe one shot and get it back with sound.\n\t\t\t</p>\n\t\t\t<div class=\"mt-5 flex flex-wrap items-center gap-2\">\n\t\t\t\t<a href=\"/\" class=\"btn btn-primary\">Open the studio</a>\n\t\t\t\t<a href=\"/prompts\" class=\"btn btn-secondary\">Browse the prompts</a>\n\t\t\t</div>\n\t\t</section>\n\t</main>\n</StudioPage>\n\n<style>\n\t/* The system arrow goes with appearance-none, and without it a dark field\n\t * does not read as a list on iOS. The studio's faint grey, drawn in place. */\n\t:global(select.pp-select) {\n\t\tbackground-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5 6 7.5 9 4.5' stroke='%2386868b' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: right 0.85rem center;\n\t\tbackground-size: 0.75rem;\n\t}\n</style>\n"],"version":3}