<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:media="http://search.yahoo.com/mrss/"
	
	>

<channel>
	<title>8 Ball Community Library</title>
	<link>https://8ball-library.club</link>
	<description>8 Ball Community Library</description>
	<pubDate>Sat, 22 Nov 2025 00:30:31 +0000</pubDate>
	<generator>https://8ball-library.club</generator>
	<language>en</language>
	
		
	<item>
		<title>Front page</title>
				
		<link>https://8ball-library.club/Front-page</link>

		<pubDate>Sat, 22 Nov 2025 00:30:31 +0000</pubDate>

		<dc:creator>8 Ball Community Library</dc:creator>

		<guid isPermaLink="true">https://8ball-library.club/Front-page</guid>

		<description>Zine Archives
(sorry, it loads slow...just 15 more seconds)
body {
  font-family: sans-serif;
  color: #222;
  background-color: #f9f9f9;
  padding: 1rem;
  margin: 0;
}

#zine-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  margin-bottom: 1.5rem;
}

#zine-filters label {
  display: flex;
  flex-direction: column;
  font-size: 0.9rem;
  min-width: 140px;
  flex: 1;
}

input[type="text"], select {
  padding: 0.5rem;
  border: 1px solid #ccc;
  border-radius: 4px;
  background-color: white;
}

ul#zine-list {
  list-style: none;
  padding: 0;
  margin: 0;
}

ul#zine-list li {
  background: white;
  padding: 1rem;
  margin-bottom: 0.75rem;
  border-radius: 6px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.05);
}

#pagination {
  margin-top: 1rem;
  display: flex;
  gap: 1rem;
  align-items: center;
  flex-wrap: wrap;
}

button {
  padding: 0.4rem 0.8rem;
  border: 1px solid #ccc;
  background: white;
  border-radius: 4px;
  cursor: pointer;
}

button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

#topic-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-bottom: 1rem;
}

.topic-chip {
  padding: 0.4rem 0.6rem;
  background: #eee;
  border-radius: 20px;
  font-size: 0.85rem;
  cursor: pointer;
  user-select: none;
}

.topic-chip.selected {
  background: #333;
  color: white;
}

@media (max-width: 600px) {
  #zine-filters label {
    min-width: 100%;
  }
}




  Search:
    
    
    

Box:
    AllAC1 - Adult ContentE1 - 8-Ball PublishedE2 - 8-Ball PublishedF1 - FoodI1 - Informational/InstructiveMU1 - MusicP1 - PhotoP2 - PhotoP3 - PhotoP4 - PhotoP5 - PhotoP6 - PhotoP7 - PhotoPA1 - Politics/ActivismPA2- Political ActivismPOP1 - Pop CultureQC1 - Queer CultureVA1 - Visual Art GeneralVA10 - Visual Art Drawing/Illustration/PaintingVA11 - Visual Art Drawing/Illustration/PaintingVA12 - Visual Art ComicsVA2 - Visual Art CollageVA3 - Visual Art ComicsVA4 - Visual Art Drawing/Illustration/PaintingVA5 - Visual Art GraffitiVA7 - Visual ArtVA7 - Visual Art GeneralVA8 - Visual Art CollageVA9 - Visual Art CollageW1 - WritingW2 - WritingW3 - WritingW4 - WritingAC1 - Adult ContentAC2 - Adult ContentE1 - 8-Ball PublishedE2 - 8-Ball PublishedF1 - FoodI1 - Informational/InstructiveMU1 - MusicP1 - PhotoP2 - PhotoP3 - PhotoP4 - PhotoP5 - PhotoP6 - PhotoP7 - PhotoPA1 - Politics/ActivismPA2 - Politics/ActivismPA2- Political ActivismPOP1 - Pop CultureQC1 - Queer CultureVA1 - Visual Art GeneralVA10 - Visual Art Drawing/Illustration/PaintingVA11 - Visual Art Drawing/Illustration/PaintingVA12 - Visual Art ComicsVA2 - Visual Art CollageVA3 - Visual Art ComicsVA4 - Visual Art Drawing/Illustration/PaintingVA5 - Visual Art GraffitiVA7 - Visual ArtVA7 - Visual Art GeneralVA8 - Visual Art CollageVA9 - Visual Art CollageW1 - WritingW2 - WritingW3 - WritingW4 - Writing
  



  Filter by Topic:

  8-BallActivismAdult ContentAdvertisementAfricaArtAsiaBindingBlack &#38;amp; WhiteBodyBook FairBoredomCapitalismCelebrityCollageColorColorfulCommunityCopsCrimeCultureDrawingEuropeFashionFilmGenderHistoryIllustrationInternetMagazineMissed connectionsMuseumMusicNatureNew York CityNewspaperNudityPaperPerformancePhotoPhotographyPoetryPolicePoliticsPrintPunkQueerReligionSexSpaceSportsSurrealSurveillanceTattooUSAUniversityWriting



      
        100 Drawinigs by Mitsu Okubo • Mitsu Okubo
        AC1 - Adult Content
        Drawing, Nudity
      
    
      
        A feeld Project V1 pursuit of happiness • various contributors 
        AC1 - Adult Content
        Writing
      
    
      
        Agitporn • agitporn@gmail.com
        AC1 - Adult Content
        Politics, Photography
      
    
      
        Allegory of Envy • Unknown Author
        AC1 - Adult Content
        Drawing, Culture
      
    
      
        American Cream Issue 4 • Patsy Desert Rose, Sunset Lohr
        AC1 - Adult Content
        Culture, Nudity, Photography
      
    
      
        Ashtray • G.B. Jones
        AC1 - Adult Content
        Collage, Culture, Music
      
    
      
        Auto Body • Unknown
        AC1 - Adult Content
        Collage, Nudity
      
    
      
        Betty Pages Issue 6 • Greg Theakston
        AC1 - Adult Content
        Photography
      
    
      
        Body Works • Victor Dildy
        AC1 - Adult Content
        Photography
      
    
      
        Body Works • Victor Dildy
        AC1 - Adult Content
        Black &#38;amp; White, Body, Photography
      
    
      
        bqtly (Babes Quarterly) • Jamie Falkowski, Dan Dealy, KEAPHOPE collective
        AC1 - Adult Content
        Advertisement, Black &#38;amp; White, Color, Magazine, New York City, Nudity, Photography, Sex, USA, Writing
      
    
      
        Breasts • Jurgen Maelfeyt
        AC1 - Adult Content
        Black &#38;amp; White, Photography
      
    
      
        Burning Blue (Badlands New Lovers Series) • Cara Benedetto
        AC1 - Adult Content
        
      
    
      
        By Land / Into The Wild / Eclipse / For All The World • Peter J. Cohen and T&#38;amp;A
        AC1 - Adult Content
        Photography, Nudity, Color, Film
      
    
      
        Chakal • Zuriel Bustanente
        AC1 - Adult Content
        Queer, Nudity, Photography
      
    
      
        Chakal • Zuried Bustamante
        AC1 - Adult Content
        Nudity, Photography
      
    
      
        Crystalvision • Unknown Author
        AC1 - Adult Content
        Collage, Writing
      
    
      
        Cum Laude • Tomas Lebon
        AC1 - Adult Content
        Adult Content
      
    
      
        Dat Ass Zine Vol. 1 • Marilyn Rondon
        AC1 - Adult Content
        Adult Content
      
    
      
        Dead Pan • Jane Moseley
        AC1 - Adult Content
        Black &#38;amp; White
      
    


  ︎︎︎ Previous
  Page 1 of 116
  Next ︎︎︎



(function () {
  const scriptURL = "https://script.google.com/macros/s/AKfycbwTu96cjBq0yhoFcmw_vsnAg53aFnRL8NeGiqILtLBfBVYzEABmLpJ_RaqlR5OagMAfCw/exec"; 
  
  let allZines = [], filteredZines = [], currentPage = 1;
  const zinesPerPage = 20;
  let selectedTopics = new Set();

  const elements = {
    list: document.getElementById("zine-list"),
    search: document.getElementById("search-input"),
    box: document.getElementById("box-filter"),
    topicChips: document.getElementById("topic-chips"),
    prev: document.getElementById("prev-page"),
    next: document.getElementById("next-page"),
    info: document.getElementById("page-info")
  };

  function renderZinesPage(zines, page) {
    const start = (page - 1) * zinesPerPage;
    const end = start + zinesPerPage;
    const pageZines = zines.slice(start, end);

    elements.list.innerHTML = pageZines.map(z =&#62; `
      
        ${z.TITLE &#124;&#124; "Untitled"} • ${z.AUTHOR &#124;&#124; "Unknown Author"}
        ${z.BOX &#124;&#124; ""}
        ${z.TOPIC &#124;&#124; ""}
      
    `).join("") &#124;&#124; "No results found.";

    elements.info.textContent = `Page ${page} of ${Math.ceil(zines.length / zinesPerPage)}`;
    elements.prev.disabled = page = zines.length;
  }

  function updateFilters() {
    const search = elements.search.value.toLowerCase().trim();
    const box = elements.box.value;

    filteredZines = allZines.filter(z =&#62; {
    const title = typeof z.TITLE === "string" ? z.TITLE.toLowerCase() : "";
    const author = typeof z.AUTHOR === "string" ? z.AUTHOR.toLowerCase() : "";
    const matchesSearch = !search &#124;&#124; title.includes(search) &#124;&#124; author.includes(search);

    const topicList = (z.TOPIC &#124;&#124; "").split(",").map(t =&#62; t.trim());
    const matchesTopics = selectedTopics.size === 0 &#124;&#124; topicList.some(topic =&#62; selectedTopics.has(topic));

    const boxList = (z.BOX &#124;&#124; "").split(",").map(b =&#62; b.trim());
    const matchesBox = !box &#124;&#124; boxList.includes(box);

  return matchesSearch &#38;&#38; matchesTopics &#38;&#38; matchesBox;
        });

    currentPage = 1;
    renderZinesPage(filteredZines, currentPage);
  }

  function populateOptions(data, field, select, commaSplit = false) {
    const values = commaSplit
      ? data.flatMap(z =&#62; (z[field] &#124;&#124; "").split(",").map(v =&#62; v.trim()))
      : data.map(z =&#62; z[field]);
    const unique = Array.from(new Set(values.filter(Boolean))).sort();
    unique.forEach(v =&#62; {
      const opt = document.createElement("option");
      opt.value = v;
      opt.textContent = v;
      select.appendChild(opt);
    });
  }

function renderTopicChips(data) {
  const allTopics = data.flatMap(z =&#62; (z.TOPIC &#124;&#124; "").split(",").map(t =&#62; t.trim()));
  const uniqueTopics = Array.from(new Set(allTopics.filter(Boolean))).sort();

  elements.topicChips.innerHTML = "";
  uniqueTopics.forEach(topic =&#62; {
    const chip = document.createElement("div");
    chip.className = "topic-chip";
    chip.textContent = topic;
    if (selectedTopics.has(topic)) {
      chip.classList.add("selected");
    }
    chip.addEventListener("click", () =&#62; {
      if (selectedTopics.has(topic)) {
        selectedTopics.delete(topic);
      } else {
        selectedTopics.add(topic);
      }
      renderTopicChips(data); // re-render chips to update .selected state
      updateFilters();        // re-filter the list
    });
    elements.topicChips.appendChild(chip);
  });
}

  fetch(scriptURL)
    .then(res =&#62; res.ok ? res.json() : Promise.reject(res.statusText))
    .then(data =&#62; {
      allZines = Array.isArray(data) ? data : [];
      filteredZines = [...allZines];
      renderZinesPage(filteredZines, currentPage);

      populateOptions(allZines, "BOX", elements.box, true);
      renderTopicChips(allZines);

      elements.search.addEventListener("input", debounce(updateFilters, 300));
      elements.box.addEventListener("change", updateFilters);
      elements.prev.addEventListener("click", () =&#62; {
        if (currentPage &#62; 1) {
          currentPage--;
          renderZinesPage(filteredZines, currentPage);
        }
      });
      elements.next.addEventListener("click", () =&#62; {
        if ((currentPage * zinesPerPage) &#60; filteredZines.length) {
          currentPage++;
          renderZinesPage(filteredZines, currentPage);
        }
      });
    })
    .catch(err =&#62; {
      console.error("Error loading zines:", err);
      elements.list.innerHTML = "Error loading zines.";
    });

  function debounce(fn, delay) {
    let timeout;
    return function () {
      clearTimeout(timeout);
      timeout = setTimeout(() =&#62; fn.apply(this, arguments), delay);
    };
  }
})();
</description>
		
	</item>
		
	</channel>
</rss>