☰

FL Tools View

Lightweight themes and layout improvements for FetLife

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         FL Tools View
// @namespace    https://gitlab.com/typicalbits/fl-tools-view
// @version      0.2.0
// @description  Lightweight themes and layout improvements for FetLife
// @author       TypicalBits
// @icon         data:image/png;base64,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
// @icon64       data:image/png;base64,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
// @license      PolyForm-Noncommercial-1.0.0
// @match        https://fetlife.com/*
// @run-at       document-end
// @noframes
// @grant        GM.getValue
// @grant        GM.setValue
// @homepageURL  https://gitlab.com/fl-tools-lite/fl-tools-view
// @supportURL   https://gitlab.com/fl-tools-lite/fl-tools-view/-/issues
// ==/UserScript==

// Copyright 2026 TypicalBits.
(function () {
'use strict';

// dock.js
// Copyright 2026 TypicalBits. Shared FL Tools Lite coordination.
const LITE_ORDER = ['view','read','calendar','notes','return'];
const LITE_CORNERS = ['bottom-left','bottom-right','top-left','top-right'];
const LITE_COLORS = {view:'#62A8DE',read:'#B9A0F5',calendar:'#65D8EB',notes:'#F39BC8',return:'#CCD4E0'};
const LITE_REPAIR = 'flt-lite:repair-v1';
function claimProduct(document,id) {
  if (!LITE_ORDER.includes(id) || document.querySelector(`[data-flt-lite-claim="${id}"]`)) return null;
  const claim=document.createElement('span');claim.hidden=true;claim.dataset.fltLiteClaim=id;
  document.documentElement.append(claim);
  return {ensure(){if(!claim.isConnected)document.documentElement.append(claim);},release(){claim.remove();}};
}
function setLiteCorner(document,host,corner) {
  host.dataset.corner=corner; document.documentElement.dataset.fltLiteCorner=corner;
  for(const panel of document.querySelectorAll('[data-flt-lite-panel]'))panel.dataset.fltLiteCorner=corner;
}
function ownLiteDock(document,host,storage,restoreSaved=true) {
  const w=document.defaultView; const shadow=host.attachShadow({mode:'open'});
  const style=document.createElement('style');style.textContent=`
  :host{position:fixed;bottom:16px;left:16px;z-index:2147483001;color-scheme:dark;font:12px/1.4 system-ui,sans-serif}
  :host([data-corner="bottom-right"]){left:auto;right:16px}
  :host([data-corner="top-left"]){bottom:auto;top:16px}
  :host([data-corner="top-right"]){left:auto;right:16px;bottom:auto;top:16px}
  :host([data-fallback="true"]){transform:translateY(-58px)}:host([data-fallback="true"][data-corner^="top"]){transform:translateY(58px)}
  .dock{display:flex;flex-wrap:wrap;gap:5px;max-width:calc(100vw - 32px)}
  button{display:flex;align-items:center;justify-content:center;padding:3px;width:46px;height:46px;border:1px solid var(--accent);border-radius:8px;background:#17171a;cursor:pointer;color:var(--accent);font:inherit}
  button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button[aria-expanded="true"]{box-shadow:0 0 0 1px var(--accent)}img{width:38px;height:38px;display:block}
  `;const bar=document.createElement('nav');bar.className='dock';bar.setAttribute('aria-label','FL Tools Lite');shadow.append(style,bar);
  let cornerRevision=0;
  let current=null;const buttons=new Map(); let disposed=false;let writes=Promise.resolve();
  function ports(){return [...host.children].filter(x=>x.hasAttribute('data-flt-lite-port'));}
  function close(port,focus=false){port?.dispatchEvent(new w.Event('flt-lite:close'));buttons.get(port)?.setAttribute('aria-expanded','false');if(current===port)current=null;if(focus)buttons.get(port)?.focus();}
  function open(port){if(current===port){close(port,true);return;}if(current)close(current);current=port;buttons.get(port)?.setAttribute('aria-expanded','true');port.dispatchEvent(new w.Event('flt-lite:open'));}
  function render(){
    const active=ports().sort((a,b)=>LITE_ORDER.indexOf(a.dataset.product)-LITE_ORDER.indexOf(b.dataset.product));
    for(const [port,button]of buttons)if(!active.includes(port)){if(current===port)close(port);button.remove();buttons.delete(port);}
    for(const port of active){
      let button=buttons.get(port);
      if(!button){port.dispatchEvent(new w.Event('flt-lite:close'));button=document.createElement('button');button.type='button';button.dataset.product=port.dataset.product;button.setAttribute('aria-label','Open FL Tools '+port.dataset.label);button.setAttribute('aria-expanded','false');button.style.setProperty('--accent',LITE_COLORS[port.dataset.product]);
        if(port.dataset.icon){const image=document.createElement('img');image.src=port.dataset.icon;image.alt='';button.append(image);}else button.textContent=port.dataset.label;
        button.addEventListener('click',()=>open(port));buttons.set(port,button);
      }
      if(bar.children[active.indexOf(port)]!==button)bar.append(button);
    }
    setLiteCorner(document,host,host.dataset.corner||'bottom-left');
  }
  const route=event=>{const port=event.target;if(port.parentNode!==host||!port.hasAttribute('data-flt-lite-port'))return;
    if(event.type==='flt-lite:register')render();
    if(event.type==='flt-lite:toggle')open(port);
    if(event.type==='flt-lite:hide')close(port,true);
    if(event.type==='flt-lite:focus')buttons.get(port)?.focus();
    if(event.type==='flt-lite:corner'&&LITE_CORNERS.includes(port.dataset.corner)){
      cornerRevision++;const corner=port.dataset.corner;setLiteCorner(document,host,corner);
      if(storage)writes=writes.then(()=>storage.setValue('flt-lite:dock:v1',corner)).catch(()=>{});
    }
  };
  for(const name of ['register','toggle','hide','focus','corner'])host.addEventListener('flt-lite:'+name,route);
  const escape=event=>{if(current&&event.key==='Escape'){close(current,true);event.stopPropagation();}};
  document.addEventListener('keydown',escape);
  const observer=new w.MutationObserver(()=>{if(!disposed)render();});observer.observe(host,{childList:true});render();
  if(storage&&restoreSaved)Promise.resolve().then(()=>storage.getValue('flt-lite:dock:v1','bottom-left')).then(corner=>{if(!disposed&&cornerRevision===0&&host.isConnected&&LITE_CORNERS.includes(corner))setLiteCorner(document,host,corner);}).catch(()=>{});
  return {destroy(){disposed=true;observer.disconnect();document.removeEventListener('keydown',escape);for(const name of ['register','toggle','hide','focus','corner'])host.removeEventListener('flt-lite:'+name,route);},render};
}
function registerDock(document,{id,label,icon,onOpen=()=>{},onClose=()=>{},storage}) {
  const w=document.defaultView;const port=document.createElement('span');port.hidden=true;port.dataset.fltLitePort='';port.dataset.product=id;port.dataset.label=label;port.dataset.icon=icon;
  port.addEventListener('flt-lite:open',onOpen);port.addEventListener('flt-lite:close',onClose);
  let owner=null,ownedHost=null,destroyed=false,scheduled=false;
  function ensure(){
    if(destroyed||!document.body)return;
    let host=document.querySelector('[data-flt-lite-dock="1"]');
    if(!host){const restoreSaved=!document.documentElement.dataset.fltLiteCorner;owner?.destroy();host=document.createElement('div');host.dataset.fltLiteDock='1';host.dataset.corner=document.documentElement.dataset.fltLiteCorner||ownedHost?.dataset.corner||'bottom-left';host.dataset.fallback=String(!!document.querySelector('[data-flt-lite-dock]:not([data-flt-lite-dock="1"])'));document.body.append(host);ownedHost=host;owner=ownLiteDock(document,host,storage,restoreSaved);}
    if(port.parentNode!==host){host.append(port);port.dispatchEvent(new w.Event('flt-lite:register',{bubbles:true}));}
    owner?.render();
  }
  const schedule=()=>{if(scheduled||destroyed)return;scheduled=true;w.queueMicrotask(()=>{scheduled=false;ensure();});};
  const observer=new w.MutationObserver(records=>{if(!port.isConnected||!document.querySelector('[data-flt-lite-dock="1"]'))schedule();});observer.observe(document.documentElement,{childList:true,subtree:true});
  document.addEventListener(LITE_REPAIR,schedule);ensure();
  const send=name=>{ensure();port.dispatchEvent(new w.Event('flt-lite:'+name,{bubbles:true}));};
  return {
    ensure,open(){send('toggle');},close(){send('hide');},focus(){send('focus');},
    setCorner(corner){if(!LITE_CORNERS.includes(corner))return;port.dataset.corner=corner;send('corner');},
    get corner(){return port.parentNode?.dataset.corner||'bottom-left';},
    destroy(){if(destroyed)return;destroyed=true;observer.disconnect();document.removeEventListener(LITE_REPAIR,schedule);onClose();const host=port.parentNode;port.remove();
      if(owner&&host===ownedHost){const survivors=[...host.children];owner.destroy();for(const survivor of survivors)document.body.append(survivor);host.remove();document.dispatchEvent(new w.Event(LITE_REPAIR));}
      else if(host&&!host.querySelector('[data-flt-lite-port]'))host.remove();
      port.removeEventListener('flt-lite:open',onOpen);port.removeEventListener('flt-lite:close',onClose);
    }
  };
}

// settings.js
const SETTINGS_KEY = 'flt-view:settings:v1';
const DEFAULTS = Object.freeze({ theme: 'original', layout: 'original', fitMedia: false });
const THEME_IDS = new Set(['original', 'rosewood', 'harbor', 'grove', 'plum', 'clear']);

function normalizeSettings(value) {
  const input = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
  return {
    theme: THEME_IDS.has(input.theme) ? input.theme : DEFAULTS.theme,
    layout: input.layout === 'refined' ? 'refined' : DEFAULTS.layout,
    fitMedia: input.fitMedia === true,
  };
}

function createSettingsStore(storage) {
  let value = { ...DEFAULTS };
  let error = '';
  let writes = Promise.resolve();
  return {
    get value() { return { ...value }; },
    get error() { return error; },
    async load() {
      try {
        value = normalizeSettings(await storage.getValue(SETTINGS_KEY, DEFAULTS));
        error = '';
      } catch {
        error = 'Settings could not be saved or restored. Changes apply for this visit.';
      }
      return { ...value };
    },
    async save(next) {
      value = normalizeSettings(next);
      const snapshot = { ...value };
      writes = writes.then(async () => {
        try {
          await storage.setValue(SETTINGS_KEY, snapshot);
          error = '';
        } catch {
          error = 'Settings could not be saved or restored. Changes apply for this visit.';
        }
      });
      await writes;
      return { ...value };
    },
  };
}

// palettes.js
// Established FL Tools website colors. Menu colors remain independent.
const PALETTES = Object.freeze([
  { id: 'original', name: 'Original' },
  { id: 'rosewood', name: 'Rosewood', bg: '#14090d', panel: '#211016', raised: '#301821', line: '#633546', text: '#f8e8ee', muted: '#c6a2ae', link: '#f08bad', focus: '#ffc0d3' },
  { id: 'harbor', name: 'Harbor', bg: '#07101a', panel: '#0e1d2b', raised: '#162b3e', line: '#31516a', text: '#e4f0fa', muted: '#9fb7c9', link: '#82c4f2', focus: '#b2dcfa' },
  { id: 'grove', name: 'Grove', bg: '#08120a', panel: '#112419', raised: '#193523', line: '#365c42', text: '#e2f2e5', muted: '#a5bea9', link: '#82d696', focus: '#b1edbf' },
  { id: 'plum', name: 'Plum', bg: '#110914', panel: '#23102a', raised: '#35183f', line: '#61376c', text: '#f2e6f5', muted: '#bda6c3', link: '#d4a6ef', focus: '#e6c7f7' },
  { id: 'clear', name: 'Clear contrast', bg: '#000000', panel: '#0b0b0b', raised: '#171717', line: '#ffffff', text: '#ffffff', muted: '#e4e4e4', link: '#ffffff', focus: '#ffffff' },
]);

// icon.js
const VIEW_ICON = 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2064%22%20role%3D%22img%22%20aria-labelledby%3D%22title%20desc%22%3E%0A%20%20%3Ctitle%20id%3D%22title%22%3EFL%20Tools%20View%20badge%3C%2Ftitle%3E%0A%20%20%3Cdesc%20id%3D%22desc%22%3EFL%20Tools%20suite%20badge%20with%20the%20View%20name.%20Artwork%20is%20border-free%3B%20CSS%20supplies%20the%20launcher%20and%20menu%20frames.%3C%2Fdesc%3E%0A%20%20%3Cdefs%3E%0A%20%20%20%20%3CradialGradient%20id%3D%22surface%22%20cx%3D%2238%25%22%20cy%3D%2228%25%22%20r%3D%2285%25%22%3E%0A%20%20%20%20%20%20%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2325242a%22%2F%3E%0A%20%20%20%20%20%20%3Cstop%20offset%3D%22.58%22%20stop-color%3D%22%2317171a%22%2F%3E%0A%20%20%20%20%20%20%3Cstop%20offset%3D%221%22%20stop-color%3D%22%230e0e10%22%2F%3E%0A%20%20%20%20%3C%2FradialGradient%3E%0A%20%20%20%20%3Cfilter%20id%3D%22labelGlow%22%20x%3D%22-40%25%22%20y%3D%22-60%25%22%20width%3D%22180%25%22%20height%3D%22220%25%22%3E%0A%20%20%20%20%20%20%3CfeGaussianBlur%20in%3D%22SourceGraphic%22%20stdDeviation%3D%22.85%22%20result%3D%22blur%22%2F%3E%0A%20%20%20%20%20%20%3CfeFlood%20flood-color%3D%22%2362A8DE%22%20flood-opacity%3D%22.42%22%20result%3D%22glowColor%22%2F%3E%0A%20%20%20%20%20%20%3CfeComposite%20in%3D%22glowColor%22%20in2%3D%22blur%22%20operator%3D%22in%22%20result%3D%22softGlow%22%2F%3E%0A%20%20%20%20%20%20%3CfeMerge%3E%0A%20%20%20%20%20%20%20%20%3CfeMergeNode%20in%3D%22softGlow%22%2F%3E%0A%20%20%20%20%20%20%20%20%3CfeMergeNode%20in%3D%22SourceGraphic%22%2F%3E%0A%20%20%20%20%20%20%3C%2FfeMerge%3E%0A%20%20%20%20%3C%2Ffilter%3E%0A%20%20%3C%2Fdefs%3E%0A%20%20%3Crect%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2214%22%20fill%3D%22url(%23surface)%22%2F%3E%0A%20%20%3Cimage%20href%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAE90lEQVR4AcyZW4hWVRTH%2FzM5NamVGXQhrKjHLCqsJgeMLhBGQaCkZEqXyWns60JBRUJkD0UQZMVoWSFJt4dIKOqpHoIQqgepXkpKRcuKKCu0LK%2B%2F5ezvzNnn7HPxm%2FMdz8daZ%2B%2B199prrf86%2B%2By9z%2Fl6VfB7SZpfoNKV7tXSqa9IVxcZzwWAkYsx8BBcOxHYrgPS2lFpap5z9MLdB6WeHmmVpD64djpewr3OmiQ9rpxfb1Yft%2B9GLAzAJ2fpdLP9P6nt915mwplZvoIALPvwCjfoNFfWWuyXTncO%2B4%2BRHnH1VBEE8Kp0FZoXwUZTmEftbJhcF0dZJ5l3viCdGHIcBMDDsySuTAYujct11Jm6cZ%2BT%2BzNWwxSAl6XJBDgPjtPlcaGm%2BkDCz%2BKEfFhMAQD5bHqmwhHRdkMk1FAhiSfhxuKgGCOm0SDtltyxBndNAUAxlW3aLmPwBW5M1wsStggnrKRcx6mP6iWwRykA9KYA0GbUsku3%2BQlpEgkbCfkBWHJaqTegeE6gzZqGOFbMsko3%2BQzpbuzPhFMEsLOTjSEAJySVnNxLBlaztc8wZlk7zrVPuFgn2VJ9LpvnhRh7Es4ieza8vhCA4HrrRs1ia99mTPR7eC5%2BhNetkebZrXc6hcVaaRpjlsEfMv6vf6VdLNU%2FsHx%2FxeDMPYcEpmILATgWI2XJNpvF3Np3ufWbCaaVB4QNcjrTcOX%2F0nbGjMLX4ygVFG1Z1JfsCAH4I6lUUp6B3osA2eimAuI4EfgCjgebyOL9tHrLNHIpAnAqthCAbaWsZSvNZCp8zvSwQMV06efOPE%2Fg7zDkFLhjwsbW5OAUAJQ2J5U6kPvJ1koCX7VX%2Bpjx98ETJhKTis0DYIc2HFe5645gb3DCkTsDJPc2V40KDwArgW0g06Pe5lXmcFe9jdYDQLwL4abTLfEAIwA8bNPoOB%2FOoMY0e4e8CAAPmx0hIrkx4aYDOS%2FeFAXMGj0l3tHgureHRAB4gP9scNDx0HbGhQgAe%2FRPdLDUcm0wsSxvj4cXAbhdsjvwrRr%2BI%2BAN8RCR46Le96QGCkyRD%2BJheQDY6VhNhU5cpVH1Lb9In8Qj8gAslTbR%2BSbcVFrBcd1LsAfAot4nLaf8G24UMTu%2B4E3njWRQKQD38LKBUiWnR%2BxURbtJ7JKbJbYr32QKgHUPS69T8k2V69Gng2R%2FaJn0XSiUIACnaC8kR31VIviHeTbtZciF5ReZALgLHI80n41jvT%2BkVmk5wT%2Bb5zETgA0yEGRgAfX34FoJv4%2Fh%2F6kip7kAbDBG7E4sxOBrJtfAe%2FG1lMw%2FXcZXIQAzYiAwOIThB5C9dRi5StrJlJ2LLz5slDNbCkDbFIbt64L9a7m73VZh%2BT1r5BV8V%2FR22iL7RwTAjAFiPYPsrWiLyRXxp5yGZ2ctlXk%2BiCWvO9x3l%2FQ1D4b9g2KfTMJK5VvX%2FCxde4f0W%2Fkh45odAbDhLel3HM%2Bl%2FhzcCfFJVIt4voY537DRdmJC6hiAuTPHw9KD1O0PiT2UY1R83dEjXcnYt4pV8zUmBKBt2gIhoGuQf4WLaCPpHuBZ%2BrJIsUx%2FJQDMEQFtYH21f1C%2BMTnEgHyb5WvQHRhDKkfcVhkA8zwibeXb%2FBzqn8FJGt0h3cp8s7mf7OtYrhSAReHera8j2x%2BZbEz9GaZZi2eGm2Qt1XHlACw0gv2HHfUm6vYC0mJ6PUq9K3QIAAD%2F%2F1wKF9MAAAAGSURBVAMAjeXXP35naSYAAAAASUVORK5CYII%3D%22%20x%3D%2216%22%20y%3D%226%22%20width%3D%2232%22%20height%3D%2232%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%2F%3E%0A%20%20%3Ctext%20x%3D%2232%22%20y%3D%2254%22%20fill%3D%22%2362A8DE%22%20font-family%3D%22Arial%2C%20sans-serif%22%20font-size%3D%2212%22%20font-weight%3D%22800%22%20letter-spacing%3D%22.1%22%20text-anchor%3D%22middle%22%20filter%3D%22url(%23labelGlow)%22%3EVIEW%3C%2Ftext%3E%0A%3C%2Fsvg%3E%0A';

// appearance.js

const VIEW_LAYOUT_CSS = `
html[data-flt-view-layout] [data-test-id="profile-header"]{box-sizing:border-box;width:calc(100% - 32px);max-width:1200px;margin:16px auto;border-radius:14px;overflow:hidden}
html[data-flt-view-layout] [data-test-id="profile-header"] main{padding:20px;gap:20px;min-width:0}
html[data-flt-view-layout] [data-test-id="profile-header"] :is(h1,h2,dd){overflow-wrap:anywhere;min-width:0}
html[data-flt-view-layout] [data-test-id="profile-header"] dl>div{display:grid;grid-template-columns:140px minmax(0,1fr);gap:10px;margin-block:5px}
html[data-flt-view-layout] [data-test-id="profile-header"] dd{margin:0}
html[data-flt-view-layout] #profile-navigation{max-width:1200px;margin-inline:auto;overflow-x:auto;gap:6px}
html[data-flt-view-layout] main article[data-story-uid]{box-sizing:border-box;margin-block:14px;border-radius:12px;overflow-wrap:anywhere}
html[data-flt-view-layout] main article[data-story-uid]>header{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}
html[data-flt-view-layout] main article[data-story-uid]>header>div:has(a[href]):not(:has(img)){flex:1 1 140px;min-width:0;max-width:none;overflow-wrap:anywhere}
html[data-flt-view-layout] main div.grid>div>div.w-full.bg-gray-900,html[data-flt-view-layout] #group_members_list div.w-full.bg-gray-900{box-sizing:border-box;padding:14px;border-radius:12px;min-width:0;overflow-wrap:anywhere}
html[data-flt-view-layout] [data-controller="clickable"][class*="group/event-card"]{box-sizing:border-box;border-radius:12px;overflow-wrap:anywhere}
html[data-flt-view-layout] turbo-frame[id^="event_rsvp_bar_"]{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
html[data-flt-view-layout] turbo-frame[id^="event_rsvp_bar_"] form{margin:0}
@media(max-width:640px){
html[data-flt-view-layout] [data-test-id="profile-header"] main{display:grid;grid-template-columns:minmax(0,1fr);padding:14px;gap:14px}
html[data-flt-view-layout] [data-test-id="profile-header"] dl>div{grid-template-columns:100px minmax(0,1fr);gap:8px}
html[data-flt-view-layout] main article[data-story-uid]>header :is(a,time){overflow-wrap:anywhere}
}
`;
const VIEW_MEDIA_CSS = `
[data-flt-view-media]{box-sizing:border-box!important;max-width:100%!important;max-height:calc(100dvh - 100px)!important;width:auto!important;height:auto!important;object-fit:contain!important}
`;

function viewThemeCSS(p) {
  // Target native page surfaces; do not style suite controls or dialogs.
  const scope = 'html[data-flt-view-theme]';
  const excluded = ':not(:where(.flt-root,.flt-root *,[data-flt-view-root],[data-flt-view-root] *,[role="dialog"],[role="dialog"] *,dialog,dialog *))';
  return `${scope} body{background:${p.bg}!important;color:${p.text}!important}
${scope} :where(main,#main-content,#main-nav,[data-test-id="profile-header"])${excluded}{color:${p.text}}
${scope} :where(.bg-gray-900,.bg-gray-950,.bg-gray-800)${excluded}{background-color:${p.panel}!important}
${scope} :where(.bg-gray-700,.bg-gray-600)${excluded}{background-color:${p.raised}!important}
${scope} :where(.text-gray-100,.text-gray-200,.text-gray-300,.text-white)${excluded}{color:${p.text}!important}
${scope} :where(.text-gray-400,.text-gray-500,.text-gray-600)${excluded}{color:${p.muted}!important}
${scope} :where(.border-gray-600,.border-gray-700,.border-gray-800)${excluded}{border-color:${p.line}!important}
${scope} :where(main,#main-content,[data-test-id="profile-header"]) a${excluded}:not([class*="bg-red"]){color:${p.link}!important}
${scope} :where(main,#main-content,#main-nav) :focus-visible${excluded}{outline:2px solid ${p.focus}!important;outline-offset:2px}
${scope} [data-test-id="profile-header"]${excluded}{background-color:${p.panel}!important}
`;
}

function createAppearance(document) {
  let style = null;
  const markedMedia = new Set();
  function clearMedia() {
    for (const element of markedMedia) element.removeAttribute('data-flt-view-media');
    markedMedia.clear();
  }
  function clear() {
    clearMedia();
    document.documentElement.removeAttribute('data-flt-view-theme');
    document.documentElement.removeAttribute('data-flt-view-layout');
    style?.remove();
    style = null;
  }
  return {
    apply(settings, url) {
      const path = new URL(url, 'https://fetlife.com').pathname;
      const detail = /^\/[^/]+\/(pictures|videos)\/\d+\/?$/.exec(path);
      const palette = PALETTES.find(p => p.id === settings.theme && p.bg);
      const refined = settings.layout === 'refined' && !detail;
      const root = document.documentElement;
      if (palette) root.dataset.fltViewTheme = palette.id;
      else root.removeAttribute('data-flt-view-theme');
      if (refined) root.dataset.fltViewLayout = 'refined';
      else root.removeAttribute('data-flt-view-layout');
      clearMedia();
      if (settings.fitMedia && detail) {
        const selector = detail[1] === 'videos' ? 'video' : 'img:not(.ipp):not([class~="object-cover"])';
        const media = [...document.querySelectorAll('main ' + selector + ',#main-content ' + selector)]
          .filter(el => !el.closest('aside,header,nav,[role="dialog"],dialog,.flt-root,[data-flt-view-root],#pictures_grid,a[href*="/pictures/"],a[href*="/videos/"]'));
        if (media.length === 1) {
          media[0].setAttribute('data-flt-view-media', '');
          markedMedia.add(media[0]);
        }
      }
      const css = (palette ? viewThemeCSS(palette) : '') + (refined ? VIEW_LAYOUT_CSS : '') + (markedMedia.size ? VIEW_MEDIA_CSS : '');
      if (!css) { style?.remove(); style = null; return; }
      if (!style || !style.isConnected) {
        style = document.createElement('style');
        style.setAttribute('data-flt-view-style', '');
        (document.head || root).append(style);
      }
      if (style.textContent !== css) style.textContent = css;
    },
    suspend: clear,
    destroy: clear,
  };
}

// menu.js

const VIEW_MENU_CSS = `
:host{all:initial;position:fixed;left:16px;bottom:16px;z-index:2147483000;font:12px/1.45 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#f8e8ee;color-scheme:dark}
:host([data-flt-lite-corner="bottom-right"]){left:auto;right:16px}:host([data-flt-lite-corner="top-left"]){bottom:auto;top:16px}:host([data-flt-lite-corner="top-right"]){left:auto;right:16px;bottom:auto;top:16px}:host([data-flt-lite-corner^="top"]){--panel-bottom:auto;--panel-top:54px}:host([data-flt-lite-corner$="right"]) .panel{left:auto;right:0}
*,*::before,*::after{box-sizing:border-box}button{font:inherit;color:inherit;cursor:pointer}button:focus-visible{outline:2px solid #9bc9ec;outline-offset:2px}[hidden]{display:none!important}
.launcher{display:flex;align-items:center;justify-content:center;width:46px;height:42px;background:#211016;border:1px solid #62a8de;border-radius:8px;font-weight:700;color:#9bc9ec;box-shadow:0 3px 12px #0005}
.launcher img{display:block;width:36px;height:36px}.heading img{display:block;width:30px;height:30px;flex:none}
.panel{position:absolute;left:0;bottom:var(--panel-bottom,54px);top:var(--panel-top,auto);width:min(320px,calc(100vw - 32px));max-height:calc(100dvh - 88px);overflow:auto;padding:12px;background:#14090d;border:1px solid #633546;border-radius:10px;box-shadow:0 8px 26px #0008}
.heading{display:flex;align-items:center;gap:8px;margin-bottom:10px}.heading strong{flex:1;font-size:14px;min-width:0}.version{font-size:10px;color:#c6a2ae}.close{width:30px;height:30px;padding:0;background:#301821;border:1px solid #633546;border-radius:6px}
.tabs{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:12px}.tabs button,.choice,.reset{min-height:32px;border:1px solid #633546;background:#211016;border-radius:6px;padding:6px 8px;text-align:center}.tabs button[aria-selected="true"],.choice[aria-pressed="true"]{background:#62a8de;border-color:#62a8de;color:#14090d;font-weight:600}
fieldset{border:0;padding:0;margin:0 0 12px;min-width:0}legend{font-weight:600;margin-bottom:6px;padding:0;color:#f8e8ee}.choices{display:grid;grid-template-columns:1fr 1fr;gap:6px}.choice{min-width:0;overflow-wrap:anywhere}.theme{display:flex;align-items:center;justify-content:flex-start;gap:7px;text-align:left}.swatch{width:12px;height:12px;border:1px solid currentColor;border-radius:3px;flex:none}
.row{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:36px}.row span{min-width:0}.switch{position:relative;flex:none;width:34px;height:20px;border:1px solid #633546;border-radius:5px;background:#301821;padding:0}.switch::after{content:"";position:absolute;top:3px;left:3px;width:12px;height:12px;border-radius:3px;background:#c6a2ae}.switch[aria-checked="true"]{background:#62a8de;border-color:#62a8de}.switch[aria-checked="true"]::after{left:17px;background:#14090d}
.note,.status{font-size:11px;color:#c6a2ae;margin:6px 0 10px;overflow-wrap:anywhere}.status{margin:10px 0 0;border-top:1px solid #633546;padding-top:8px}.status:empty{display:none}.reset{width:100%}.settings p{margin-top:0}
@media(prefers-reduced-motion:no-preference){button{transition:background-color .12s ease}}
`;

function createMenu(document, { onChange, onReset, storage }) {
  const host = document.createElement('div');
  host.setAttribute('data-flt-view-root', ''); host.setAttribute('data-flt-lite-panel','');
  const shadow = host.attachShadow({ mode: 'open' });
  const css = document.createElement('style'); css.textContent = VIEW_MENU_CSS; shadow.append(css);
  function element(tag, attrs = {}, text = '') {
    const node = document.createElement(tag);
    for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, value);
    if (text) node.textContent = text;
    return node;
  }
  let value = { ...DEFAULTS }, status = { suspended: false, error: '' }, open = false;
  const launcher = element('button', { class: 'launcher', 'data-launcher': '', 'aria-label': 'Open FL Tools View', 'aria-expanded': 'false', 'aria-controls': 'view-panel', type: 'button' });
  launcher.append(element('img',{src:VIEW_ICON,alt:'',width:'36',height:'36'}));
  const panel = element('section', { class: 'panel', 'data-panel': '', id: 'view-panel', 'aria-label': 'FL Tools View settings' }); panel.hidden = true;
  const heading = element('div', { class: 'heading' });
  heading.append(element('img',{src:VIEW_ICON,alt:'',width:'30',height:'30'}),element('strong', {}, 'FL Tools View'), element('span', { class: 'version' }, '0.2.0'));
  const close = element('button', { class: 'close', type: 'button', 'aria-label': 'Close settings' }, '×'); heading.append(close);
  const tabs = element('div', { class: 'tabs', role: 'tablist', 'aria-label': 'Settings sections' });
  const appearanceTab = element('button', { type: 'button', role: 'tab', id: 'view-appearance-tab', 'aria-controls': 'view-appearance', 'aria-selected': 'true' }, 'Appearance');
  const settingsTab = element('button', { type: 'button', role: 'tab', id: 'view-settings-tab', 'aria-controls': 'view-settings', 'aria-selected': 'false', tabindex: '-1' }, 'Settings');
  tabs.append(appearanceTab, settingsTab);
  const appearance = element('div', { id: 'view-appearance', role: 'tabpanel', 'aria-labelledby': 'view-appearance-tab' });
  const settings = element('div', { id: 'view-settings', class: 'settings', role: 'tabpanel', 'aria-labelledby': 'view-settings-tab' }); settings.hidden = true;
  function field(label) {
    const fieldset = element('fieldset'); const choices = element('div', { class: 'choices' });
    fieldset.append(element('legend', {}, label), choices); appearance.append(fieldset); return choices;
  }
  const themes = field('Website theme');
  for (const p of PALETTES) {
    const button = element('button', { type: 'button', class: 'choice theme', 'data-theme': p.id, 'aria-pressed': 'false' });
    const swatch = element('span', { class: 'swatch', 'aria-hidden': 'true' }); swatch.style.backgroundColor = p.bg || '#202124';
    button.append(swatch, element('span', {}, p.name));
    button.addEventListener('click', () => change({ ...value, theme: p.id })); themes.append(button);
  }
  const layouts = field('Page layout');
  for (const layout of ['original', 'refined']) {
    const button = element('button', { type: 'button', class: 'choice', 'data-layout': layout, 'aria-pressed': 'false' }, layout === 'original' ? 'Original' : 'Refined');
    button.addEventListener('click', () => change({ ...value, layout })); layouts.append(button);
  }
  const row = element('div', { class: 'row' });
  row.append(element('span', { id: 'view-fit-label' }, 'Fit current media'));
  const fit = element('button', { type: 'button', class: 'switch', role: 'switch', 'aria-labelledby': 'view-fit-label', 'aria-checked': 'false' });
  fit.addEventListener('click', () => change({ ...value, fitMedia: !value.fitMedia })); row.append(fit); appearance.append(row);
  appearance.append(element('p', { class: 'note' }, 'Sizes the current picture or video. Navigation stays native.'));
  settings.append(element('p', { class: 'note' }, 'View stores only appearance preferences in your userscript manager. No background requests or profile recording.'));
  const reset = element('button', { type: 'button', class: 'reset', 'data-reset': '' }, 'Restore defaults'); reset.addEventListener('click', onReset); settings.append(reset);
  const statusNode = element('p', { class: 'status', 'data-status': '', role: 'status' });
  panel.append(heading, tabs, appearance, settings, statusNode); shadow.append(panel); document.body.append(host);
  function update(next, nextStatus = status) {
    value = normalizeSettings(next); status = nextStatus;
    for (const button of themes.children) button.setAttribute('aria-pressed', String(button.dataset.theme === value.theme));
    for (const button of layouts.children) button.setAttribute('aria-pressed', String(button.dataset.layout === value.layout));
    fit.setAttribute('aria-checked', String(value.fitMedia));
    statusNode.textContent = [status.suspended ? 'Browse is active. View’s website styling is paused.' : '', status.error || ''].filter(Boolean).join(' ');
  }
  function change(next) { update(next); onChange({ ...value }); }
  function show(next) { open = next; panel.hidden = !open; if(open)close.focus(); }
  const dock = registerDock(document,{id:'view',label:'View',icon:VIEW_ICON,storage,onOpen:()=>show(true),onClose:()=>show(false)});
  function setOpen(next) { if(next && !open)dock.open(); else if(!next)dock.close(); }
  function selectTab(tab) {
    const isAppearance = tab === appearanceTab;
    appearance.hidden = !isAppearance; settings.hidden = isAppearance;
    appearanceTab.setAttribute('aria-selected', String(isAppearance)); settingsTab.setAttribute('aria-selected', String(!isAppearance));
    appearanceTab.tabIndex = isAppearance ? 0 : -1; settingsTab.tabIndex = isAppearance ? -1 : 0;
  }
  for (const tab of [appearanceTab, settingsTab]) {
    tab.addEventListener('click', () => selectTab(tab));
    tab.addEventListener('keydown', event => {
      if (['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {
        event.preventDefault(); const next = event.key === 'Home' ? appearanceTab : event.key === 'End' ? settingsTab : tab === appearanceTab ? settingsTab : appearanceTab;
        selectTab(next); next.focus();
      }
    });
  }
  close.addEventListener('click', () => setOpen(false));
  const corners=element('fieldset');corners.append(element('legend',{},'Dock position'));const cornerChoices=element('div',{class:'choices'});
  for(const corner of ['bottom-left','bottom-right','top-left','top-right']){const button=element('button',{class:'choice',type:'button'},corner.replace('-',' '));button.addEventListener('click',()=>dock.setCorner(corner));cornerChoices.append(button);}
  corners.append(cornerChoices);settings.append(corners);
  update(value);
  return { update, setOpen, ensureMounted() { if (!host.isConnected && document.body) document.body.append(host); dock.ensure(); }, destroy() { dock.destroy(); host.remove(); } };
}

// main.js

const VIEW_INSTANCE = Symbol.for('flt-view:instance');
function startView({ document, window, storage }) {
  if (window[VIEW_INSTANCE]) return window[VIEW_INSTANCE];
  const claim = claimProduct(document,'view');
  if(!claim)return Promise.resolve({duplicate:true,destroy(){}});
  const ready = (async () => {
    const store = createSettingsStore(storage);
    let value = await store.load(), destroyed = false, scheduled = false;
    const appearance = createAppearance(document);
    let menu;
    function refresh() {
      if (destroyed) return;
      claim.ensure(); menu.ensureMounted();
      const suspended = !!document.querySelector('.flt-panel[data-flt-product="browse"],.flt-launcher-button[data-flt-product="browse"]');
      if (suspended) appearance.suspend(); else appearance.apply(value, window.location.href);
      menu.update(value, { suspended, error: store.error });
    }
    async function save(next) {
      value = next; refresh();
      await store.save(next);
      refresh();
    }
    menu = createMenu(document, { onChange: next => { void save(next); }, onReset: () => { void save({ ...DEFAULTS }); }, storage });
    const schedule = () => {
      if (scheduled || destroyed) return;
      scheduled = true;
      window.queueMicrotask(() => { scheduled = false; refresh(); });
    };
    const owned = node => node.nodeType === 1 && (node.matches('[data-flt-view-root],[data-flt-view-style],[data-flt-lite-dock],[data-flt-lite-port],[data-flt-lite-claim],[data-flt-lite-panel]') || !!node.closest('[data-flt-view-root],[data-flt-view-style],[data-flt-lite-dock],[data-flt-lite-port],[data-flt-lite-claim],[data-flt-lite-panel]'));
    const observer = new window.MutationObserver(records => {
      if (records.some(record => !owned(record.target) && (record.type === 'attributes' || [...record.addedNodes, ...record.removedNodes].some(node => !owned(node))))) schedule();
    });
    observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-flt-product'] });
    const events = ['popstate', 'pageshow', 'turbo:load', 'turbo:render', 'turbolinks:load'];
    for (const event of events) window.addEventListener(event, schedule);
    refresh();
    return {
      destroy() {
        destroyed = true; observer.disconnect();
        for (const event of events) window.removeEventListener(event, schedule);
        appearance.destroy(); menu.destroy(); claim.release();
        if (window[VIEW_INSTANCE] === ready) delete window[VIEW_INSTANCE];
      },
    };
  })();
  window[VIEW_INSTANCE] = ready;
  ready.catch(() => { claim.release(); if (window[VIEW_INSTANCE] === ready) delete window[VIEW_INSTANCE]; });
  return ready;
}

void startView({ document, window, storage: GM });

})();