☰

FL Tools View

Lightweight themes and layout improvements for FetLife

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램을 먼저 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==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 });

})();