// Prodz — mock data. Bilingual fields are { it, en }; resolve with tr(L, value). const IMG = { fashion: 'assets/imagery/feature-night.jpg', studio: 'assets/imagery/reel-frame.png', interior: 'assets/imagery/cover-editorial.jpg', portrait: 'assets/imagery/prod-thumb-1.jpg', camera: 'assets/imagery/gear-camera.jpg', lens: 'assets/imagery/gear-lens.jpg', av1: 'data:image/jpeg;base64,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', av2: 'data:image/jpeg;base64,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', }; const PEOPLE = { me: { id: 'me', name: 'Vale Marchetti', role: { it: 'Direttrice della fotografia', en: 'Cinematographer' }, city: 'Milano', avatar: IMG.portrait, ring: 'teal' }, sofia: { id: 'sofia', name: 'Sofia Greco', role: { it: 'Regista', en: 'Director' }, city: 'Roma', avatar: IMG.av1, ring: 'gold', online: true }, nina: { id: 'nina', name: 'Nina Costa', role: { it: 'Modella', en: 'Model' }, city: 'Milano', avatar: IMG.av2, ring: 'none' }, ale: { id: 'ale', name: 'Alessandro Moretti', role: { it: 'Direttore della fotografia', en: 'Cinematographer' }, city: 'Milano', avatar: null, ring: 'none', online: true }, marco: { id: 'marco', name: 'Marco Bianchi', role: { it: 'Gaffer', en: 'Gaffer' }, city: 'Torino', avatar: null, ring: 'none' }, elena: { id: 'elena', name: 'Elena Conti', role: { it: 'Stylist', en: 'Stylist' }, city: 'Firenze', avatar: null, ring: 'teal' }, giulia:{ id: 'giulia',name: 'Giulia Ferrari', role: { it: 'Producer', en: 'Producer' }, city: 'Milano', avatar: null, ring: 'none' }, luca: { id: 'luca', name: 'Luca Romano', role: { it: 'Fonico di presa diretta', en: 'Location sound' }, city: 'Bologna', avatar: null, ring: 'none' }, }; const PRODUCTIONS = [ { id: 'noir', title: 'Collezione Noir', meta: { it: 'Editoriale moda · Parigi', en: 'Fashion editorial · Paris' }, image: IMG.fashion, trending: true }, { id: 'studio', title: 'Sessioni in Studio', meta: { it: 'Commercial · Berlino', en: 'Commercial · Berlin' }, image: IMG.studio }, { id: 'luce', title: "Luce d'Interni", meta: { it: 'Architettura · Oslo', en: 'Architectural · Oslo' }, image: IMG.interior }, ]; // Locations — Home only, sponsorable. "In evidenza / Featured" is the transparent label (brief §2.3). const LOCATIONS = [ { id: 'loft', title: 'Loft Industriale Lambrate', meta: { it: 'Milano · 320 m² · luce naturale', en: 'Milan · 320 m² · natural light' }, image: IMG.interior, sponsored: true, price: { it: 'da 480 €/giorno', en: 'from €480/day' } }, { id: 'teatro', title: 'Teatro di Posa A', meta: { it: 'Milano · ciclorama 12 m', en: 'Milan · 12 m cyclorama' }, image: IMG.studio, sponsored: false, price: { it: 'da 650 €/giorno', en: 'from €650/day' } }, { id: 'campo', title: 'Brughiera Aperta', meta: { it: 'Piemonte · esterno', en: 'Piedmont · exterior' }, image: IMG.fashion, sponsored: false, price: { it: 'permesso richiesto', en: 'permit required' } }, ]; // Set Moments — bound to a production (brief §1.7): generated on import, never orphan. const MOMENTS = [ { id: 'm1', label: { it: 'BTS', en: 'BTS' }, image: IMG.studio, prod: 'studio', you: true }, { id: 'm2', label: { it: 'Luci', en: 'Lights' }, image: IMG.fashion, prod: 'noir' }, { id: 'm3', label: { it: 'Cast', en: 'Cast' }, image: IMG.av1, prod: 'noir' }, { id: 'm4', label: { it: 'Set', en: 'Set' }, image: IMG.interior, prod: 'luce' }, { id: 'm5', label: { it: 'Gear', en: 'Gear' }, image: IMG.camera, prod: 'studio' }, { id: 'm6', label: { it: 'Trucco', en: 'Makeup' }, image: IMG.av2, prod: 'noir' }, ]; const THREADS = [ { id: 't1', author: 'ale', prod: 'noir', tags: ['LOW LIGHT', 'EDITORIAL'], title: { it: 'Miglior obiettivo per ritratti in poca luce?', en: 'Best lens for low-light portraits?' }, body: { it: "Sto testando l'85mm f/1.4 ma sono curioso di sapere cosa preferite per l'editoriale — la resa del bokeh sul 105mm mi tenta.", en: "I've been testing the 85mm f/1.4 but I'm curious what others prefer for editorial — the 105mm bokeh is tempting." }, time: { it: '2 h fa', en: '2h ago' }, likes: 24, replies: 12, saves: 5 }, { id: 't2', author: 'sofia', prod: 'noir', tags: ['COLOR', 'GRADING'], title: { it: 'Color grading sugli incarnati editoriali', en: 'Colour grading editorial skin tones' }, body: { it: 'Ocra desaturati vs alteluci calde — condivido il mio stack di LUT per la Collezione Noir.', en: 'Desaturated ochres vs warm highlights — sharing my LUT stack for Collezione Noir.' }, time: { it: '5 h fa', en: '5h ago' }, likes: 48, replies: 9, saves: 14 }, { id: 't3', author: 'giulia', prod: 'studio', tags: ['PERMESSI', 'LOGISTICA'], title: { it: 'Permessi per riprese nel centro storico', en: 'Permits for shooting in the old town' }, body: { it: "Qualcuno ha esperienza con i tempi del Comune per le riprese in zona a traffico limitato? Ci serve per fine mese.", en: 'Anyone with experience on city-hall timelines for restricted-traffic zones? We need it by month-end.' }, time: { it: '1 g fa', en: '1d ago' }, likes: 17, replies: 21, saves: 8 }, ]; const THREAD_REPLIES = { t1: [ { author: 'sofia', op: false, time: { it: '1 h fa', en: '1h ago' }, text: { it: 'Per editoriale resto sull’85mm, ma per i primissimi piani il 105mm separa benissimo i piani.', en: 'For editorial I stay on the 85mm, but for tight close-ups the 105mm separates planes beautifully.' } }, { author: 'elena', op: false, time: { it: '48 min fa', en: '48m ago' }, text: { it: 'Occhio alla resa sui tessuti: con f/1.4 perdi i dettagli dei pizzi. Io chiudo a f/2.', en: 'Watch fabric rendering: at f/1.4 you lose lace detail. I stop down to f/2.' } }, ], t2: [ { author: 'ale', op: false, time: { it: '3 h fa', en: '3h ago' }, text: { it: 'Stack utilissimo, grazie. La curva sugli ocra è esattamente quello che cercavo.', en: 'Super useful stack, thanks. The ochre curve is exactly what I was after.' } }, ], }; // Shoutouts — discovery of opportunities (collab + job call) as a swipe stack (brief §1.5). const SHOUTOUTS = [ { id: 's1', kind: 'job', author: 'Studio Lumen', role: { it: 'Casa di produzione', en: 'Production house' }, city: 'Milano', surface: 'cream', paid: true, date: { it: '24 – 26 Mag', en: 'May 24 – 26' }, tags: ['EDITORIAL', 'FASHION'], title: { it: 'Fotografo per shooting moda', en: 'Photographer for fashion shoot' }, blurb: { it: 'Cerchiamo un fotografo esperto di moda per un editoriale di alta gamma, tre giorni in studio e in esterni.', en: 'Looking for an experienced fashion photographer for a high-end editorial — three days, studio and exteriors.' } }, { id: 's2', kind: 'collab', author: 'Sofia Greco', role: { it: 'Regista', en: 'Director' }, city: 'Roma', person: 'sofia', surface: 'dark', paid: false, date: { it: 'Giu', en: 'Jun' }, tags: ['MUSIC VIDEO', 'NIGHT'], title: { it: 'Collab: DP per video musicale', en: 'Collab: DP for music video' }, blurb: { it: 'Due notti, mood neon e luci motivate. Cerco una direttrice della fotografia per un progetto autoriale.', en: 'Two nights, neon mood and motivated light. Looking for a DP for an auteur project.' } }, { id: 's3', kind: 'job', author: 'Verde Studio', role: { it: 'Agenzia', en: 'Agency' }, city: 'Londra', surface: 'mint', paid: true, date: { it: '12 Giu', en: 'Jun 12' }, tags: ['MUSIC', 'GAFFER'], title: { it: 'Gaffer per video musicale', en: 'Gaffer for music video' }, blurb: { it: 'Cerchiamo un gaffer per due notti di riprese ad alta energia, rig pioggia previsto.', en: 'Seeking a gaffer for two nights of high-energy shooting, rain rig planned.' } }, { id: 's4', kind: 'collab', author: 'Marco Bianchi', role: { it: 'Gaffer', en: 'Gaffer' }, city: 'Torino', person: 'marco', surface: 'dark', paid: false, date: { it: 'Flessibile', en: 'Flexible' }, tags: ['SHORT FILM', 'INDIE'], title: { it: 'Collab: cortometraggio indie', en: 'Collab: indie short film' }, blurb: { it: 'Sto montando una troupe per un corto auto-prodotto. Cerco reparto camera e fotografia, scambio crediti + portfolio.', en: 'Building a crew for a self-produced short. Looking for camera and lighting dept — credit + portfolio exchange.' } }, { id: 's5', kind: 'job', author: 'Atlante Films', role: { it: 'Casa di produzione', en: 'Production house' }, city: 'Napoli', surface: 'cream', paid: true, date: { it: '1 – 4 Lug', en: 'Jul 1 – 4' }, tags: ['DOC', 'OPERATORE'], title: { it: 'Operatore per documentario', en: 'Operator for documentary' }, blurb: { it: 'Documentario osservativo sul porto. Quattro giornate, set leggero, sensibilità autoriale.', en: 'Observational doc about the harbour. Four days, light kit, authorial sensibility.' } }, ]; // Inbox — every collab/job-call conversation lands here (brief §1.8 funnel). const CONVERSATIONS = [ { id: 'c1', person: 'sofia', kind: 'collab', subject: { it: 'Collezione Noir', en: 'Collezione Noir' }, unread: 2, time: { it: '10:24', en: '10:24' }, preview: { it: 'Perfetto, lavoriamo su naturali motivati augmentati con 2K HMI.', en: "Perfect, let's lean into motivated naturals augmented with 2K HMIs." }, messages: [ { me: false, time: '10:18', text: { it: 'Ciao! Ho visto il tuo profilo, mi piacerebbe averti come DP sulla Collezione Noir.', en: 'Hi! Saw your profile — I’d love you as DP on Collezione Noir.' } }, { me: true, time: '10:21', text: { it: 'Mi interessa molto. Che approccio luce avete in mente?', en: "I'm very interested. What lighting approach do you have in mind?" } }, { me: false, time: '10:24', text: { it: 'Naturali motivati, sorgenti esistenti augmentate con 2K HMI. Tre giorni, fine maggio.', en: 'Motivated naturals, existing sources augmented with 2K HMIs. Three days, late May.' } }, ] }, { id: 'c2', person: null, org: 'Studio Lumen', kind: 'job', subject: { it: 'Job Call · Fotografo moda', en: 'Job Call · Fashion photographer' }, unread: 0, time: { it: 'Ieri', en: 'Yesterday' }, preview: { it: 'Grazie per la candidatura — ti ricontattiamo per il portfolio review.', en: 'Thanks for applying — we’ll follow up for a portfolio review.' }, messages: [ { me: true, time: '17:02', text: { it: 'Salve, mi candido come fotografo per lo shooting moda. Portfolio nel profilo.', en: 'Hello, applying as photographer for the fashion shoot. Portfolio on my profile.' } }, { me: false, time: '17:40', text: { it: 'Grazie per la candidatura — ti ricontattiamo per il portfolio review.', en: 'Thanks for applying — we’ll follow up for a portfolio review.' } }, ] }, { id: 'c3', person: 'marco', kind: 'collab', subject: { it: 'Cortometraggio indie', en: 'Indie short film' }, unread: 0, time: { it: 'Lun', en: 'Mon' }, preview: { it: 'Ci sto! Mando il piano di lavorazione appena pronto.', en: 'I’m in! I’ll send the shooting schedule once ready.' }, messages: [ { me: false, time: '09:12', text: { it: 'Ti va di entrare nel reparto fotografia del corto?', en: 'Want to join the lighting dept on the short?' } }, { me: true, time: '09:30', text: { it: 'Ci sto! Mando il piano di lavorazione appena pronto.', en: 'I’m in! I’ll send the shooting schedule once ready.' } }, ] }, ]; // Network — "La tua rete": activity feed of people you follow (brief §1.3). const NETWORK_ACTIVITY = [ { id: 'a1', person: 'sofia', type: 'production', time: { it: '2 h fa', en: '2h ago' }, image: IMG.fashion, text: { it: 'ha pubblicato una produzione', en: 'published a production' }, target: { it: 'Collezione Noir', en: 'Collezione Noir' } }, { id: 'a2', person: 'ale', type: 'thread', time: { it: '4 h fa', en: '4h ago' }, text: { it: 'ha aperto un thread', en: 'opened a thread' }, target: { it: 'Miglior obiettivo per ritratti in poca luce?', en: 'Best lens for low-light portraits?' } }, { id: 'a3', person: 'marco', type: 'jobcall', time: { it: '6 h fa', en: '6h ago' }, text: { it: 'ha lanciato una job call', en: 'posted a job call' }, target: { it: 'Cortometraggio indie · reparto luci', en: 'Indie short · lighting dept' } }, { id: 'a4', person: 'elena', type: 'comment', time: { it: 'Ieri', en: 'Yesterday' }, text: { it: 'ha commentato un thread', en: 'commented on a thread' }, target: { it: 'Color grading sugli incarnati editoriali', en: 'Colour grading editorial skin tones' } }, ]; // People you may know — suggestions by role, city, interests. const SUGGESTIONS = ['nina', 'giulia', 'luca', 'elena']; const INTERESTS = [ { it: 'Moda', en: 'Fashion' }, { it: 'Ritratto', en: 'Portrait' }, { it: 'Documentario', en: 'Documentary' }, { it: 'Musica', en: 'Music video' }, { it: 'Commercial', en: 'Commercial' }, { it: 'Cortometraggio', en: 'Short film' }, { it: 'Architettura', en: 'Architecture' }, { it: 'Reportage', en: 'Reportage' }, { it: 'Automotive', en: 'Automotive' }, ]; const ROLES = [ { it: 'Direttore della fotografia', en: 'Cinematographer' }, { it: 'Fotografo', en: 'Photographer' }, { it: 'Regista', en: 'Director' }, { it: 'Gaffer', en: 'Gaffer' }, { it: 'Producer', en: 'Producer' }, { it: 'Stylist', en: 'Stylist' }, { it: 'Fonico', en: 'Sound' }, { it: 'Modella/o', en: 'Model' }, { it: 'Art Director', en: 'Art Director' }, { it: 'Montatore', en: 'Editor' }, { it: 'Location Manager', en: 'Location Manager' }, ]; const GOALS = [ { icon: 'Briefcase', label: { it: 'Trovare lavoro retribuito', en: 'Find paid work' } }, { icon: 'Users', label: { it: 'Costruire la mia rete', en: 'Build my network' } }, { icon: 'Handshake', label: { it: 'Collaborare a test creativi', en: 'Collaborate on creative tests' } }, { icon: 'Image', label: { it: 'Mostrare il portfolio', en: 'Showcase my portfolio' } }, { icon: 'MapPin', label: { it: 'Affittare la mia location', en: 'Rent out my location' } }, ]; const CITIES = ['Milano', 'Roma', 'Torino', 'Napoli', 'Bologna', 'Firenze', 'Parigi', 'Londra', 'Berlino', 'Madrid']; // ---- Gear marketplace (brief §2.1: availability / rental of equipment) ---- const GEAR = [ { id: 'g1', name: 'Sony FX6', kind: { it: 'Cinema camera', en: 'Cinema camera' }, owner: 'ale', city: 'Milano', img: IMG.camera, cat: 'CAMERA', price: { it: '90 €/g', en: '€90/d' }, ready: true, icon: 'Camera' }, { id: 'g2', name: 'Sigma 85mm f/1.4 Art', kind: { it: 'Obiettivo', en: 'Lens' }, owner: 'me', city: 'Milano', img: IMG.lens, cat: 'LENS', price: { it: '25 €/g', en: '€25/d' }, ready: true, icon: 'Aperture' }, { id: 'g3', name: 'Aputure 600d Pro', kind: { it: 'Illuminazione', en: 'Lighting' }, owner: 'marco', city: 'Torino', img: null, cat: 'LIGHT', price: { it: '40 €/g', en: '€40/d' }, ready: false, icon: 'Lightbulb' }, { id: 'g4', name: 'DJI Ronin 4D', kind: { it: 'Stabilizzatore', en: 'Gimbal' }, owner: 'giulia', city: 'Milano', img: IMG.studio, cat: 'RIG', price: { it: '70 €/g', en: '€70/d' }, ready: true, icon: 'Move3d' }, { id: 'g5', name: 'RED Komodo 6K', kind: { it: 'Cinema camera', en: 'Cinema camera' }, owner: 'sofia', city: 'Roma', img: IMG.interior,cat: 'CAMERA', price: { it: '120 €/g', en: '€120/d' }, ready: true, icon: 'Camera' }, { id: 'g6', name: 'Sennheiser MKH 416', kind: { it: 'Microfono', en: 'Microphone' }, owner: 'luca', city: 'Bologna', img: null, cat: 'AUDIO', price: { it: '20 €/g', en: '€20/d' }, ready: true, icon: 'Mic' }, ]; const GEAR_CATS = ['CAMERA', 'LENS', 'LIGHT', 'RIG', 'AUDIO']; // Locations gain a category for the marketplace filter; extend the catalogue. LOCATIONS[0].cat = 'INDUSTRIALE'; LOCATIONS[1].cat = 'STUDIO'; LOCATIONS[2].cat = 'ESTERNI'; const LOCATIONS_ALL = LOCATIONS.concat([ { id: 'villa', title: 'Villa Liberty', meta: { it: 'Como · interni d’epoca', en: 'Como · period interiors' }, image: IMG.fashion, sponsored: false, price: { it: 'da 900 €/giorno', en: 'from €900/day' }, cat: 'INTERNI' }, { id: 'rooftop', title: 'Rooftop Skyline', meta: { it: 'Milano · vista città', en: 'Milan · city view' }, image: IMG.studio, sponsored: true, price: { it: 'da 540 €/giorno', en: 'from €540/day' }, cat: 'ESTERNI' }, { id: 'garage', title: 'Garage Officina', meta: { it: 'Torino · industriale', en: 'Turin · industrial' }, image: IMG.interior, sponsored: false, price: { it: 'da 300 €/giorno', en: 'from €300/day' }, cat: 'INDUSTRIALE' }, ]); const LOCATION_CATS = ['STUDIO', 'INTERNI', 'ESTERNI', 'INDUSTRIALE']; // Per-production media + crew + gear + comments for the full-screen detail view. const PRODUCTION_MEDIA = { noir: { media: [{ type: 'image', src: IMG.fashion }, { type: 'video', src: IMG.interior, dur: '0:18' }, { type: 'image', src: IMG.av1 }], moments: ['m2', 'm3', 'm6'], crew: [{ id: 'sofia', role: { it: 'Regista', en: 'Director' } }, { id: 'me', role: { it: 'Direttrice fotografia', en: 'Cinematographer' } }, { id: 'elena', role: { it: 'Stylist', en: 'Stylist' } }, { id: 'nina', role: { it: 'Modella', en: 'Model' } }], gear: ['g1', 'g2', 'g3'], comments: [{ author: 'ale', text: { it: 'Luce pazzesca su questo set.', en: 'Insane light on this set.' }, time: { it: '2 h', en: '2h' } }, { author: 'giulia', text: { it: 'Che mood. Complimenti al reparto.', en: 'What a mood. Props to the crew.' }, time: { it: '5 h', en: '5h' } }], }, studio: { media: [{ type: 'image', src: IMG.studio }, { type: 'image', src: IMG.camera }, { type: 'video', src: IMG.fashion, dur: '0:24' }], moments: ['m1', 'm5'], crew: [{ id: 'giulia', role: { it: 'Producer', en: 'Producer' } }, { id: 'me', role: { it: 'Direttrice fotografia', en: 'Cinematographer' } }, { id: 'marco', role: { it: 'Gaffer', en: 'Gaffer' } }], gear: ['g4', 'g5'], comments: [{ author: 'sofia', text: { it: 'Setup pulitissimo.', en: 'Super clean setup.' }, time: { it: '1 g', en: '1d' } }], }, luce: { media: [{ type: 'image', src: IMG.interior }, { type: 'image', src: IMG.fashion }], moments: ['m4'], crew: [{ id: 'me', role: { it: 'Direttrice fotografia', en: 'Cinematographer' } }, { id: 'luca', role: { it: 'Fonico', en: 'Sound' } }], gear: ['g1', 'g6'], comments: [{ author: 'elena', text: { it: 'Le ombre qui sono perfette.', en: 'The shadows here are perfect.' }, time: { it: '3 g', en: '3d' } }], }, }; // Job calls / collab I posted (own profile → Shoutouts tab: review · link · edit). const MY_SHOUTOUTS = [ { id: 'ms1', kind: 'job', status: 'open', prod: 'noir', paid: true, date: { it: '24 – 26 Mag', en: 'May 24 – 26' }, applicants: 7, tags: ['EDITORIAL', 'NIGHT'], title: { it: 'Cerco gaffer per editoriale notturno', en: 'Gaffer wanted for night editorial' } }, { id: 'ms2', kind: 'collab', status: 'open', prod: 'studio', paid: false, date: { it: 'Giu', en: 'Jun' }, applicants: 3, tags: ['PORTRAIT', 'TEST'], title: { it: 'Collab: test ritratto in studio', en: 'Collab: studio portrait test' } }, { id: 'ms3', kind: 'job', status: 'closed', prod: 'luce', paid: true, date: { it: 'Apr', en: 'Apr' }, applicants: 12, tags: ['DOC', 'OPERATORE'], title: { it: 'Operatore steadicam per documentario', en: 'Steadicam operator for documentary' } }, ]; // Recommendations store seed. Each person carries an aggregate ({ sum, count } → // average out of 5) PLUS the individual recommendations (who left it + content), // shown when you tap the "Recs" stat. const RX = (it, en) => ({ it, en }); const RECS_SEED = { me: { sum: 91, count: 19, entries: [ { by: 'sofia', stars: 5, time: RX('2 g', '2d'), text: RX('Una DP eccezionale: legge la luce come pochi e tiene insieme il set anche sotto pressione.', 'An exceptional DP — reads light like few others and holds the set together under pressure.') }, { by: 'giulia', stars: 5, time: RX('1 sett', '1w'), text: RX('Professionale e velocissima. La rifarei lavorare su ogni progetto.', 'Professional and fast. I’d hire her again on any project.') }, { by: 'ale', stars: 4, time: RX('2 sett', '2w'), text: RX('Grande gusto cromatico, ottima in low light.', 'Great color taste, excellent in low light.') }, { by: 'elena', stars: 5, time: RX('1 mese', '1mo'), text: RX('Collaborazione fluida, sempre attenta al mood dello styling.', 'Smooth collaboration, always tuned to the styling mood.') }, ] }, sofia: { sum: 56, count: 12, entries: [ { by: 'me', stars: 5, time: RX('3 g', '3d'), text: RX('Regista visionaria, set sempre ispirato.', 'Visionary director, always an inspired set.') } ] }, nina: { sum: 22, count: 5, entries: [ { by: 'me', stars: 4, time: RX('1 sett', '1w'), text: RX('Grande presenza in camera.', 'Great presence on camera.') } ] }, ale: { sum: 38, count: 8, entries: [] }, marco: { sum: 14, count: 3, entries: [] }, elena: { sum: 27, count: 6, entries: [ { by: 'me', stars: 5, time: RX('2 sett', '2w'), text: RX('Styling impeccabile.', 'Impeccable styling.') } ] }, giulia: { sum: 19, count: 4, entries: [] }, luca: { sum: 9, count: 2, entries: [] }, }; // People you follow → "Network" stat counts ONLY these (not auto-collaborators). const FOLLOWING_COUNT = 84; // Concrete followed people (the rest of the 84 are implied). Tapping "Network" // on your profile lists these. const FOLLOWING = ['sofia', 'nina', 'ale', 'marco', 'elena', 'giulia', 'luca']; // People you've actually collaborated with, derived from shared productions in // PRODUCTION_MEDIA. Tapping "Collab" lists these, with the shared productions. function collaboratorsOf(id) { const out = {}; Object.keys(PRODUCTION_MEDIA).forEach((prodId) => { const crew = (PRODUCTION_MEDIA[prodId].crew || []); if (crew.some((c) => c.id === id)) { crew.forEach((c) => { if (c.id !== id && PEOPLE[c.id]) (out[c.id] = out[c.id] || []).push(prodId); }); } }); let list = Object.keys(out).map((pid) => ({ id: pid, prods: out[pid] })); // fallback for people without seeded productions → show a small slice of the directory if (list.length === 0) list = Object.keys(PEOPLE).filter((p) => p !== id && p !== 'me').slice(0, 4).map((pid) => ({ id: pid, prods: [] })); return list; } // Set Moments as 24h stories from people you follow. First frame = production-bound moment. const STORIES = [ { person: 'sofia', time: { it: '2 h fa', en: '2h ago' }, frames: [ { image: IMG.fashion, prod: 'noir', caption: { it: 'Ultimo ciak, Collezione Noir', en: 'Last take, Collezione Noir' } }, { image: IMG.av1, prod: 'noir', caption: { it: 'Cast pronto', en: 'Cast ready' } } ] }, { person: 'marco', time: { it: '4 h fa', en: '4h ago' }, frames: [ { image: IMG.studio, prod: 'studio', caption: { it: 'Rig luci montato', en: 'Lighting rig up' } } ] }, { person: 'elena', time: { it: '6 h fa', en: '6h ago' }, frames: [ { image: IMG.av2, prod: 'noir', caption: { it: 'Styling del giorno', en: 'Styling of the day' } }, { image: IMG.interior, prod: 'luce', caption: { it: 'Dettagli set', en: 'Set details' } } ] }, { person: 'giulia', time: { it: '9 h fa', en: '9h ago' }, frames: [ { image: IMG.camera, prod: 'studio', caption: { it: 'Gear check', en: 'Gear check' } } ] }, ]; Object.assign(window, { IMG, PEOPLE, PRODUCTIONS, LOCATIONS, LOCATIONS_ALL, LOCATION_CATS, MOMENTS, THREADS, THREAD_REPLIES, SHOUTOUTS, CONVERSATIONS, NETWORK_ACTIVITY, SUGGESTIONS, INTERESTS, ROLES, GOALS, CITIES, GEAR, GEAR_CATS, PRODUCTION_MEDIA, MY_SHOUTOUTS, RECS_SEED, FOLLOWING_COUNT, FOLLOWING, collaboratorsOf, STORIES });