40 Commits

Author SHA1 Message Date
d8a5d93342 new map-focused redesign
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-29 21:34:26 -04:00
2a72d1cecb correct Ripped Bodice URL [skip]
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 14:29:25 +00:00
537be9ed04 Return Three Lives to its original corner location.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 02:11:37 +00:00
f23f669f76 Idlewild Books appears to have transitioned entirely to language classes as opposed to bookselling
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 02:05:02 +00:00
e32bbee062 remove Boulevard Books; correct Alabaster Bookshop Instagram link
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 02:02:16 +00:00
9228769274 Add Topos Too, currently in a "soft opening"
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-26 23:43:01 +00:00
0b850b97e1 Relocate Adanne Bookshop to Ralph Ave
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-21 20:52:09 +00:00
72f517fdbb Add Village Works on St. Marks
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-21 18:14:13 +00:00
e2392081bf Merge pull request 'Update caddy Docker tag to v2.7.5' (#7) from renovate/caddy-2.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #7
2023-10-20 01:39:25 +00:00
52be65f6ba Update caddy Docker tag to v2.7.5
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-17 17:01:06 +00:00
3af97b1d4d [skip] set partial: false
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-11 21:54:14 -04:00
0297cca236 [skip] hide internal commits, only show four lines
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-11 21:51:22 -04:00
03e0a54399 upgrade build configuration [skip] 2023-10-11 21:46:46 -04:00
18d7a3e7b1 add this fancy recent changes module
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-11 21:37:28 -04:00
a33c4ca92b move Burnt Books into Hey Kids!, update archestratus to note there's no cafe anymore
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-09 02:37:41 +00:00
b2ad4697f0 add Lofty Pigeon Books
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-01 00:59:15 +00:00
084a613467 Move Yu and Me to Essex Market
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-09-20 03:48:15 +00:00
60b0023a9d update Archestratus location
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-09-07 02:14:08 +00:00
44e4ae5fa9 Merge pull request 'Update caddy Docker tag to v2.7.4' (#6) from renovate/caddy-2.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #6
2023-08-19 00:54:48 +00:00
63efd8c449 Update caddy Docker tag to v2.7.4
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-08-18 17:01:02 +00:00
bd390adcc1 Merge pull request 'Update caddy Docker tag to v2.7.3' (#5) from renovate/caddy-2.x into master
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Reviewed-on: #5
2023-08-14 20:31:21 +00:00
439b1fe95e Update caddy Docker tag to v2.7.3
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-08-14 18:00:50 +00:00
898e2b6136 Merge pull request 'Update caddy Docker tag to v2.7.2' (#4) from renovate/caddy-2.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #4
2023-08-05 01:13:45 +00:00
60b2df5e90 Add The Ripped Bodice
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is running
2023-08-05 01:10:13 +00:00
a595129d6d Update caddy Docker tag to v2.7.2
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-08-04 16:00:50 +00:00
7efe413ce4 catland moved down a storefront
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-07-14 13:24:42 +00:00
f07bda7dfa move astoria bookshop to its new location
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-07-14 13:21:54 +00:00
aad72fd649 remove Greenlight in Flatbush (closed in May)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-06-18 01:57:34 +00:00
51b369dfbc update runner location
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-05-07 14:19:46 +00:00
c8600fc92d remove GA
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-05-07 14:18:27 +00:00
9268a94fb0 Add Taylor & Co. Books
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-23 23:21:38 +00:00
54ffbadf2e add description to Left Bank Books, since I was finally able to visit.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-22 21:46:37 +00:00
b9508dbc68 Add passageway books in Chelsea
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-22 21:43:39 +00:00
94d7b26ab9 Merge pull request 'Update node Docker tag to v20' (#3) from renovate/node-20.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #3
2023-04-21 02:22:42 +00:00
df8be56edc Update node Docker tag to v20
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-21 00:00:42 +00:00
3308da03e0 remove Avoid-The-Day, it closed
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
thanks to scott for the update
2023-04-17 21:36:22 +00:00
7a6c7f4df2 update hash-based routing tracking
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-16 16:46:36 +00:00
d9ef8e9655 add local "plausible" analytics
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-15 14:53:44 +00:00
e5dc4296d3 Merge pull request 'Configure Renovate' (#1) from renovate/configure into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #1
2023-04-06 00:27:28 +00:00
05f88dbf22 Add renovate.json
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline failed
2023-04-06 00:21:52 +00:00
7 changed files with 419 additions and 391 deletions

View File

@@ -1,4 +1,11 @@
pipeline: clone:
git:
image: woodpeckerci/plugin-git
settings:
partial: false
depth: 15
steps:
build: build:
image: docker image: docker
commands: commands:
@@ -6,8 +13,8 @@
- docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD registry.yetaga.in - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD registry.yetaga.in
- docker build -t registry.yetaga.in/bookstores:latest . - docker build -t registry.yetaga.in/bookstores:latest .
- docker push registry.yetaga.in/bookstores:latest - docker push registry.yetaga.in/bookstores:latest
- 'curl http://172.17.0.1:4000/api/fetch -H "Authorization: Bearer $COMPOSE_TOKEN"' - 'curl http://100.113.98.36:4000/api/fetch -H "Authorization: Bearer $COMPOSE_TOKEN"'
- 'curl http://172.17.0.1:4000/api/update -H "Authorization: Bearer $COMPOSE_TOKEN"' - 'curl http://100.113.98.36:4000/api/update -H "Authorization: Bearer $COMPOSE_TOKEN"'
secrets: [docker_username, docker_password, compose_token] secrets: [docker_username, docker_password, compose_token]
when: when:
branch: "master" branch: "master"

View File

@@ -1,10 +1,10 @@
FROM node:19-slim AS builder FROM node:20 AS builder
COPY . /src COPY . /src
WORKDIR /src WORKDIR /src
RUN npm install && node ./index.js RUN npm install && node ./index.js
FROM caddy:2.6.4 FROM caddy:2.7.5
COPY img /usr/share/caddy/img COPY img /usr/share/caddy/img
COPY css /usr/share/caddy/css COPY css /usr/share/caddy/css

View File

@@ -1,38 +1,33 @@
/* Page Specific CSS */
body { body {
font-family: "Lato", sans-serif; font-family: "Lato", sans-serif;
background: #fff; background: #fff;
color: #333; color: #333;
font-size: 18px; font-size: 16px;
margin: 0px; margin: 0px;
padding: 20px 0px; padding: 0px;
} }
h1 { h1 {
font-size: 80px; font-size: 40px;
font-family: "Acme", sans-serif; font-family: "Acme", sans-serif;
font-weight: normal; font-weight: normal;
margin: 0px; margin: 0px;
} }
h2 { h2 {
font-size: 40px; font-size: 30px;
font-family: "Acme", sans-serif; font-family: "Acme", sans-serif;
font-weight: normal; font-weight: normal;
margin: 0px 0px; margin: 0px 0px;
} }
h3 { h3 {
font-family: "Acme", sans-serif; font-family: "Acme", sans-serif;
font-size: 30px; font-size: 20px;
margin: 10px 0px; margin: 10px 0px;
} }
h4 { h4 {
font-family: "Lato", sans-serif; font-family: "Lato", sans-serif;
font-size: 24px; font-size: 14px;
} }
img {
width: 100%;
}
p a, p a,
a { a {
color: #333; color: #333;
@@ -43,10 +38,6 @@ a {
a:hover { a:hover {
color: #47ccfc; color: #47ccfc;
} }
small {
padding: 10px 0px;
font-size: 10px;
}
p { p {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
@@ -56,22 +47,14 @@ li {
line-height: 19px; line-height: 19px;
font-size: 15px; font-size: 15px;
} }
ol {
line-height: 24px;
}
.clearfix {
clear: both;
}
.hidden { .hidden {
display: none; display: none;
} }
#map { #map {
height: 500px; height: 100vh;
width: 480px; width: 100%;
min-width: 300px;
background: #ffffff; background: #ffffff;
float: left;
} }
#map a { #map a {
border: none; border: none;
@@ -83,13 +66,19 @@ ol {
} }
#wrapper { #wrapper {
margin: 0px auto; max-width: 500px;
padding: 40px; position: absolute;
max-width: 1000px; top: 10px;
right: 10px;
bottom: 10px;
overflow: scroll;
} }
.container { .bubble {
margin: 24px 0px; background-color: white;
margin: 10px 0px;
padding: 10px;
border-radius: 3px;
} }
ul.nav { ul.nav {
@@ -105,7 +94,7 @@ ul.nav li {
} }
ul.nav li:not(:first-child) { ul.nav li:not(:first-child) {
border-left: 1px #333 solid; border-left: 1px #333 solid;
padding-left: 10px; padding-left: 5px;
} }
ul.nav li h2 { ul.nav li h2 {
font-family: "Lato"; font-family: "Lato";
@@ -126,15 +115,9 @@ ul.nav li a:hover {
font-weight: 700; font-weight: 700;
} }
#selected {
max-width: 500px;
width: 100%;
float: left;
padding: 5px 10px;
}
#selected .description { #selected .description {
padding-top: 7px;
font-size: 16px; font-size: 16px;
padding: 4px 0px;
line-height: 22px; line-height: 22px;
text-align: justify; text-align: justify;
} }
@@ -143,61 +126,55 @@ ul.nav li a:hover {
margin: 15px 0px; margin: 15px 0px;
padding: 0px; padding: 0px;
} }
#info {
max-width: 500px;
width: 100%;
float: left;
padding: 5px 10px;
}
.storeDetails { .storeDetails {
font-size: 15px; font-size: 15px;
display: inline; display: inline;
padding-right: 6px;
} }
#info p { #info p {
font-size: 15px; font-size: 15px;
padding: 4px;
line-height: 22px; line-height: 22px;
text-align: justify; text-align: justify;
} }
#info details {
font-size: 15px;
line-height: 22px;
text-align: justify;
}
#info details summary {
text-decoration: underline;
cursor: pointer;
}
#Stores { #Stores {
margin: 0 auto; margin: 0 auto;
width: 80%;
} }
#Stores tr { #Stores tr {
cursor: pointer; cursor: pointer;
} }
#Stores tr td { #Stores tr td {
padding: 4px 10px; padding: 2px 0px;
} }
#Stores tr:not(:last-child) td { #Stores tr:not(:last-child) td {
border-bottom: 1px #ddd solid; border-bottom: 1px #ddd solid;
} }
@media only screen and (-webkit-min-device-pixel-ratio: 2) and (min-width: 320px) and (max-width: 1120px) { @media only screen and (-webkit-min-device-pixel-ratio: 2) and (min-width: 320px) and (max-width: 1120px) {
h1 {
font-size: 60px;
}
body {
margin: 0px;
padding: 5px;
}
#wrapper { #wrapper {
max-width: 480px; position: static;
padding-top: 20px; padding: 10px;
}
.bubble {
margin: 0px;
padding: 0px;
border-radius: 0px;
}
#map {
height: 400px;
} }
#Stores, #Stores,
#map {
min-width: 224px;
width: 100%;
}
#map, #map,
#info, #info,
#selected { #selected {
width: 100%; width: 100%;
margin: 10px 0px;
padding: 0;
} }
} }

View File

@@ -1,20 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script <script
async="" defer=""
src="https://www.googletagmanager.com/gtag/js?id=G-BNVKSB6DVW" data-domain="nycbookstores.org"
src="https://stats.yetaga.in/js/script.hash.outbound-links.js"
></script> ></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "G-BNVKSB6DVW");
</script>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" /> <meta http-equiv="x-ua-compatible" content="ie=edge" />
<title> <title>
@@ -40,7 +31,7 @@
media="screen" media="screen"
rel="stylesheet" rel="stylesheet"
type="text/css" type="text/css"
href="/css/site.css?1678239113605" href="/css/site.css?1698627633277"
/> />
<meta <meta
property="title" property="title"
@@ -75,15 +66,11 @@
/> />
</head> </head>
<body> <body>
<div id="map"></div>
<div id="wrapper"> <div id="wrapper">
<h1>NYC Bookstores</h1> <header class="bubble">
<div> <h1>NYC Bookstores</h1>
<ul class="nav"> <ul class="nav">
<li>
<h2 id="subhed">
The Many Independent Bookstores of New York City
</h2>
</li>
<li> <li>
<a id="viewInfo" href="#info" onclick="event.preventDefault()" <a id="viewInfo" href="#info" onclick="event.preventDefault()"
>intro</a >intro</a
@@ -102,73 +89,87 @@
> >
</li> </li>
</ul> </ul>
</div> </header>
<div class="container"> <div id="info" class="bubble">
<div id="map"></div> <p>
<div id="info"> New York City loves its independent bookstores. It
<p> <a
New York City loves its independent bookstores. It href="https://www.nytimes.com/2006/10/15/nyregion/thecity/15book.html"
<a target="_blank"
href="https://www.nytimes.com/2006/10/15/nyregion/thecity/15book.html" >eulogizes those that have faded</a
target="_blank" >
>eulogizes those that have faded</a and celebrates when new ventures are launched. And while the historic
> <a
and celebrates when new ventures are launched. And while the href="https://untappedcities.com/2015/08/26/4th-avenue-the-history-of-nycs-book-row/"
historic target="_blank"
<a >Book Row may have passed away in the 80s</a
href="https://untappedcities.com/2015/08/26/4th-avenue-the-history-of-nycs-book-row/" >, there are still many indie bookstores dotting the map, across all
target="_blank" five boroughs. Here, I have attempted to collect all of the
>Book Row may have passed away in the 80s</a currently-open general-interest independent booksellers in NYC. Any
>, there are still many indie bookstores dotting the map, across all store with regular-ish hours (excluding religious booksellers and
five boroughs. Here, I have attempted to collect all of the appointment-only rare book sellers) is included.
currently-open general-interest independent booksellers in NYC. Any </p>
store with regular-ish hours (excluding religious booksellers and <p>
appointment-only rare book sellers) is included. While Manhattan and Brooklyn still lead the pack, Queens has a
</p> respectable number of stores, and all five boroughs are represented,
<p> with the Bronx and Staten Island both hosting lone independent stores.
While Manhattan and Brooklyn still lead the pack, Queens has a Lower Manhattan has the highest density of booksellers.
respectable number of stores, and all five boroughs are represented, </p>
with the Bronx and Staten Island both hosting lone independent <p>
stores. Lower Manhattan has the highest density of booksellers. The listings here are kept up-to-date to the best of my ability;
</p> however, I make no promises about either the accuracy or reliability
<p> of the information. If you spot an error, or I've missed a shop,
The listings here are kept up-to-date to the best of my ability; please let me know by
however, I make no promises about either the accuracy or reliability <a href="mailto:delta.mu.alpha@gmail.com" target="_blank">email</a>,
of the information. If you spot an error, or I've missed a shop, <a href="https://icosahedron.website/@lazyreader" target="_blank"
please let me know by >mastodon</a
<a href="mailto:delta.mu.alpha@gmail.com" target="_blank">email</a>, >, or
<a href="https://icosahedron.website/@lazyreader" target="_blank" <a href="https://www.twitter.com/alazyreader" target="_blank"
>mastodon</a >twitter</a
>, or >. Originally based on the "<a
<a href="https://www.twitter.com/alazyreader" target="_blank" href="https://github.com/jlord/hack-spots"
>twitter</a target="_blank"
>. Originally based on the "<a >Hack Spots</a
href="https://github.com/jlord/hack-spots" >" website by
target="_blank" <a href="https://www.twitter.com/jllord" target="_blank">@jllord</a>
>Hack Spots</a (although I don't believe any of the actual underlying code still
>" website by survives at this point).
<a href="https://www.twitter.com/jllord" target="_blank">@jllord</a> </p>
(although I don't believe any of the actual underlying code still <p>
survives at this point). There are currently <span id="storeCount">114</span> stores indexed on
</p> this page. Last updated <span id="updatedOn">October 29, 2023</span>.
<p> </p>
There are currently <span id="storeCount">111</span> stores indexed <details>
on this page. Last updated <summary>Recent Changes</summary>
<span id="updatedOn">March 7, 2023</span>. <ul id="changesList">
</p> <li>
</div> October 26, 2023 - Return Three Lives to its original corner
<div id="selected"></div> location.
</li>
<li>
October 26, 2023 - Idlewild Books appears to have transitioned
entirely to language classes as opposed to bookselling
</li>
<li>
October 26, 2023 - remove Boulevard Books; correct Alabaster
Bookshop Instagram link
</li>
<li>
October 26, 2023 - Add Topos Too, currently in a "soft opening"
</li>
</ul>
</details>
</div> </div>
<div class="clearfix"></div> <div id="selected" class="bubble hidden"></div>
<div class="container"> <div class="bubble">
<div id="Stores"> <div id="Stores">
<table> <table>
<tbody> <tbody>
<tr id="0" class="spotRow"> <tr id="0" class="spotRow">
<td class="name">1804 Books</td> <td class="name">1804 Books</td>
<td>320 W 37th Street, New York</td> <td>320 W 37th St, New York</td>
</tr> </tr>
<tr id="1" class="spotRow"> <tr id="1" class="spotRow">
<td class="name">192 Books</td> <td class="name">192 Books</td>
@@ -176,7 +177,7 @@
</tr> </tr>
<tr id="2" class="spotRow"> <tr id="2" class="spotRow">
<td class="name">Adanne</td> <td class="name">Adanne</td>
<td>234 Water Street, Brooklyn</td> <td>115 Ralph Ave, Brooklyn</td>
</tr> </tr>
<tr id="3" class="spotRow"> <tr id="3" class="spotRow">
<td class="name">Aeon Bookstore</td> <td class="name">Aeon Bookstore</td>
@@ -192,7 +193,7 @@
</tr> </tr>
<tr id="6" class="spotRow"> <tr id="6" class="spotRow">
<td class="name">Archestratus</td> <td class="name">Archestratus</td>
<td>160 Huron St, Brooklyn</td> <td>164 Huron St, Brooklyn</td>
</tr> </tr>
<tr id="7" class="spotRow"> <tr id="7" class="spotRow">
<td class="name">Argosy Books</td> <td class="name">Argosy Books</td>
@@ -200,24 +201,24 @@
</tr> </tr>
<tr id="8" class="spotRow"> <tr id="8" class="spotRow">
<td class="name">Astoria Bookshop</td> <td class="name">Astoria Bookshop</td>
<td>31-29 31st St, Astoria</td> <td>36-19 30th St, Astoria</td>
</tr> </tr>
<tr id="9" class="spotRow"> <tr id="9" class="spotRow">
<td class="name">Avoid The Day Bookstore &amp; Cafe</td>
<td>99-04 A Rockaway Beach Blvd, Rockaway Park</td>
</tr>
<tr id="10" class="spotRow">
<td class="name">Berl's Brooklyn Poetry Shop</td> <td class="name">Berl's Brooklyn Poetry Shop</td>
<td>126A Front St, Brooklyn</td> <td>126A Front St, Brooklyn</td>
</tr> </tr>
<tr id="11" class="spotRow"> <tr id="10" class="spotRow">
<td class="name">Better Read Than Dead</td> <td class="name">Better Read Than Dead</td>
<td>867 Broadway, Brooklyn</td> <td>867 Broadway, Brooklyn</td>
</tr> </tr>
<tr id="12" class="spotRow"> <tr id="11" class="spotRow">
<td class="name">Better Read Than Dead &amp; Burly Coffee</td> <td class="name">Better Read Than Dead &amp; Burly Coffee</td>
<td>90 Kosciuszko St, Brooklyn</td> <td>90 Kosciuszko St, Brooklyn</td>
</tr> </tr>
<tr id="12" class="spotRow">
<td class="name">Black Spring Books</td>
<td>672 Driggs Ave, Brooklyn</td>
</tr>
<tr id="13" class="spotRow"> <tr id="13" class="spotRow">
<td class="name">Bluestockings Cooperative</td> <td class="name">Bluestockings Cooperative</td>
<td>116 Suffolk Street, New York</td> <td>116 Suffolk Street, New York</td>
@@ -275,261 +276,259 @@
<td>42 West 17th St, New York</td> <td>42 West 17th St, New York</td>
</tr> </tr>
<tr id="27" class="spotRow"> <tr id="27" class="spotRow">
<td class="name">Boulevard Books</td>
<td>7518 13th Ave, Brooklyn</td>
</tr>
<tr id="28" class="spotRow">
<td class="name">Bravo's Book Nook</td> <td class="name">Bravo's Book Nook</td>
<td>115 MacDougal St, New York</td> <td>115 MacDougal St, New York</td>
</tr> </tr>
<tr id="29" class="spotRow"> <tr id="28" class="spotRow">
<td class="name">Burnt Books</td> <td class="name">Burnt Books</td>
<td>1014 Manhattan Ave, Brooklyn</td> <td>157 Huron St, Brooklyn</td>
</tr> </tr>
<tr id="30" class="spotRow"> <tr id="29" class="spotRow">
<td class="name">Cafe con Libros</td> <td class="name">Cafe con Libros</td>
<td>724 Prospect Place, Brooklyn</td> <td>724 Prospect Place, Brooklyn</td>
</tr> </tr>
<tr id="31" class="spotRow"> <tr id="30" class="spotRow">
<td class="name">Catland</td> <td class="name">Catland</td>
<td>987 Flushing Ave, Brooklyn</td> <td>985 Flushing Ave, Brooklyn</td>
</tr> </tr>
<tr id="32" class="spotRow"> <tr id="31" class="spotRow">
<td class="name">Chartwell Booksellers</td> <td class="name">Chartwell Booksellers</td>
<td>55 E 52nd St, New York</td> <td>55 E 52nd St, New York</td>
</tr> </tr>
<tr id="33" class="spotRow"> <tr id="32" class="spotRow">
<td class="name">Codex Books</td> <td class="name">Codex Books</td>
<td>1 Bleecker St, New York</td> <td>1 Bleecker St, New York</td>
</tr> </tr>
<tr id="34" class="spotRow"> <tr id="33" class="spotRow">
<td class="name">Community Bookstore</td> <td class="name">Community Bookstore</td>
<td>143 7th Ave, Brooklyn</td> <td>143 7th Ave, Brooklyn</td>
</tr> </tr>
<tr id="35" class="spotRow"> <tr id="34" class="spotRow">
<td class="name">Cups and Books</td> <td class="name">Cups and Books</td>
<td>2024 Bedford Ave, Brooklyn</td> <td>2024 Bedford Ave, Brooklyn</td>
</tr> </tr>
<tr id="36" class="spotRow"> <tr id="35" class="spotRow">
<td class="name">Dashwood Books</td> <td class="name">Dashwood Books</td>
<td>33 Bond St, New York</td> <td>33 Bond St, New York</td>
</tr> </tr>
<tr id="37" class="spotRow"> <tr id="36" class="spotRow">
<td class="name">Dear Friend Books</td> <td class="name">Dear Friend Books</td>
<td>343A Tompkins Avenue, Brooklyn</td> <td>343A Tompkins Ave, Brooklyn</td>
</tr> </tr>
<tr id="38" class="spotRow"> <tr id="37" class="spotRow">
<td class="name">Desert Island Comics</td> <td class="name">Desert Island Comics</td>
<td>540 Metropolitan Ave, Brooklyn</td> <td>540 Metropolitan Ave, Brooklyn</td>
</tr> </tr>
<tr id="39" class="spotRow"> <tr id="38" class="spotRow">
<td class="name">East Village Books</td> <td class="name">East Village Books</td>
<td>99 St. Mark's Place, New York</td> <td>99 St. Mark's Place, New York</td>
</tr> </tr>
<tr id="40" class="spotRow"> <tr id="39" class="spotRow">
<td class="name">ETG Book Cafe</td> <td class="name">ETG Book Cafe</td>
<td>208 Bay St, Staten Island</td> <td>208 Bay St, Staten Island</td>
</tr> </tr>
<tr id="41" class="spotRow"> <tr id="40" class="spotRow">
<td class="name">Freebird Books</td> <td class="name">Freebird Books</td>
<td>123 Columbia St, Brooklyn</td> <td>123 Columbia St, Brooklyn</td>
</tr> </tr>
<tr id="42" class="spotRow"> <tr id="41" class="spotRow">
<td class="name">Greenlight Bookstore</td> <td class="name">Greenlight Bookstore</td>
<td>686 Fulton St, Brooklyn</td> <td>686 Fulton St, Brooklyn</td>
</tr> </tr>
<tr id="43" class="spotRow"> <tr id="42" class="spotRow">
<td class="name">
Greenlight Bookstore (Prospect Lefferts Gardens)
</td>
<td>632 Flatbush Ave, Brooklyn</td>
</tr>
<tr id="44" class="spotRow">
<td class="name">Here's A Book Store</td> <td class="name">Here's A Book Store</td>
<td>1964 Coney Island Ave, Brooklyn</td> <td>1964 Coney Island Ave, Brooklyn</td>
</tr> </tr>
<tr id="45" class="spotRow"> <tr id="43" class="spotRow">
<td class="name">Hey Kids! Comics</td> <td class="name">Hey Kids! Comics</td>
<td>157 Huron St, Brooklyn</td> <td>157 Huron St, Brooklyn</td>
</tr> </tr>
<tr id="46" class="spotRow"> <tr id="44" class="spotRow">
<td class="name">Housing Works Bookstore Café</td> <td class="name">Housing Works Bookstore Café</td>
<td>126 Crosby St, New York</td> <td>126 Crosby St, New York</td>
</tr> </tr>
<tr id="47" class="spotRow"> <tr id="45" class="spotRow">
<td class="name">Human Relations Books</td> <td class="name">Human Relations Books</td>
<td>1067 Flushing Ave, Brooklyn</td> <td>1067 Flushing Ave, Brooklyn</td>
</tr> </tr>
<tr id="48" class="spotRow"> <tr id="46" class="spotRow">
<td class="name">Idlewild Books</td>
<td>170 7th Avenue S, New York</td>
</tr>
<tr id="49" class="spotRow">
<td class="name">James Cummins Bookseller</td> <td class="name">James Cummins Bookseller</td>
<td>699 Madison Ave, 7th Floor, New York</td> <td>699 Madison Ave, 7th Floor, New York</td>
</tr> </tr>
<tr id="50" class="spotRow"> <tr id="47" class="spotRow">
<td class="name">Joanne Hendricks Cookbooks</td> <td class="name">Joanne Hendricks Cookbooks</td>
<td>488 Greenwich St, New York</td> <td>488 Greenwich St, New York</td>
</tr> </tr>
<tr id="51" class="spotRow"> <tr id="48" class="spotRow">
<td class="name">Karma Bookstore</td> <td class="name">Karma Bookstore</td>
<td>136 East Third St, New York</td> <td>136 East Third St, New York</td>
</tr> </tr>
<tr id="52" class="spotRow"> <tr id="49" class="spotRow">
<td class="name">Kew &amp; Willow Books</td> <td class="name">Kew &amp; Willow Books</td>
<td>81-63 Lefferts Boulevard, New York</td> <td>81-63 Lefferts Boulevard, New York</td>
</tr> </tr>
<tr id="53" class="spotRow"> <tr id="50" class="spotRow">
<td class="name">Kinokunya</td> <td class="name">Kinokunya</td>
<td>1073 Avenue of the Americas, New York</td> <td>1073 Avenue of the Americas, New York</td>
</tr> </tr>
<tr id="54" class="spotRow"> <tr id="51" class="spotRow">
<td class="name">Kitchen Arts &amp; Letters</td> <td class="name">Kitchen Arts &amp; Letters</td>
<td>1435 Lexington Ave, New York</td> <td>1435 Lexington Ave, New York</td>
</tr> </tr>
<tr id="55" class="spotRow"> <tr id="52" class="spotRow">
<td class="name">Leaves Bookstore</td> <td class="name">Leaves Bookstore</td>
<td>140 Nassau Ave, Brooklyn</td> <td>140 Nassau Ave, Brooklyn</td>
</tr> </tr>
<tr id="56" class="spotRow"> <tr id="53" class="spotRow">
<td class="name">Left Bank Books</td> <td class="name">Left Bank Books</td>
<td>41 Perry Street, New York</td> <td>41 Perry St, New York</td>
</tr> </tr>
<tr id="57" class="spotRow"> <tr id="54" class="spotRow">
<td class="name">Lofty Pigeon Books</td>
<td>743 Church Ave, Brooklyn</td>
</tr>
<tr id="55" class="spotRow">
<td class="name">Logos Bookstore</td> <td class="name">Logos Bookstore</td>
<td>1575 York Ave, New York</td> <td>1575 York Ave, New York</td>
</tr> </tr>
<tr id="58" class="spotRow"> <tr id="56" class="spotRow">
<td class="name">Mast Books</td> <td class="name">Mast Books</td>
<td>72 Avenue A, New York</td> <td>72 Avenue A, New York</td>
</tr> </tr>
<tr id="59" class="spotRow"> <tr id="57" class="spotRow">
<td class="name">McNally Jackson Books</td> <td class="name">McNally Jackson Books</td>
<td>52 Prince St, New York</td> <td>134 Prince St, New York</td>
</tr> </tr>
<tr id="60" class="spotRow"> <tr id="58" class="spotRow">
<td class="name">McNally Jackson Books City Point</td> <td class="name">McNally Jackson Books City Point</td>
<td>445 Albee Square W, Unit G112, Brooklyn</td> <td>445 Albee Square W, Unit G112, Brooklyn</td>
</tr> </tr>
<tr id="61" class="spotRow"> <tr id="59" class="spotRow">
<td class="name">McNally Jackson Books Seaport</td> <td class="name">McNally Jackson Books Seaport</td>
<td>4 Fulton St, New York</td> <td>4 Fulton St, New York</td>
</tr> </tr>
<tr id="62" class="spotRow"> <tr id="60" class="spotRow">
<td class="name">McNally Jackson Books Williamsburg</td> <td class="name">McNally Jackson Books Williamsburg</td>
<td>76 North 4th St, Brooklyn</td> <td>76 North 4th St, Brooklyn</td>
</tr> </tr>
<tr id="63" class="spotRow"> <tr id="61" class="spotRow">
<td class="name">McNally Jackson Rockefeller Center</td> <td class="name">McNally Jackson Rockefeller Center</td>
<td>1 Rockefeller Plaza, New York</td> <td>1 Rockefeller Plaza, New York</td>
</tr> </tr>
<tr id="64" class="spotRow"> <tr id="62" class="spotRow">
<td class="name">Melville House Publishers</td> <td class="name">Melville House Publishers</td>
<td>46 John St, Brooklyn</td> <td>46 John St, Brooklyn</td>
</tr> </tr>
<tr id="65" class="spotRow"> <tr id="63" class="spotRow">
<td class="name">Mercer Street Books &amp; Records</td> <td class="name">Mercer Street Books &amp; Records</td>
<td>206 Mercer St, New York</td> <td>206 Mercer St, New York</td>
</tr> </tr>
<tr id="66" class="spotRow"> <tr id="64" class="spotRow">
<td class="name">Mil Mundos Books</td> <td class="name">Mil Mundos Books</td>
<td>323 Linden St, Brooklyn</td> <td>323 Linden St, Brooklyn</td>
</tr> </tr>
<tr id="67" class="spotRow"> <tr id="65" class="spotRow">
<td class="name">Molasses Books</td> <td class="name">Molasses Books</td>
<td>770 Hart St, Brooklyn</td> <td>770 Hart St, Brooklyn</td>
</tr> </tr>
<tr id="68" class="spotRow"> <tr id="66" class="spotRow">
<td class="name">Namaste Bookshop</td> <td class="name">Namaste Bookshop</td>
<td>2 W 14th St, New York</td> <td>2 W 14th St, New York</td>
</tr> </tr>
<tr id="69" class="spotRow"> <tr id="67" class="spotRow">
<td class="name">P&amp;T Knitwear</td> <td class="name">P&amp;T Knitwear</td>
<td>180 Orchard Street, New York</td> <td>180 Orchard St, New York</td>
</tr> </tr>
<tr id="70" class="spotRow"> <tr id="68" class="spotRow">
<td class="name">Passageway Books</td>
<td>150 9th Ave, New York</td>
</tr>
<tr id="69" class="spotRow">
<td class="name">Pillow-Cat Books</td> <td class="name">Pillow-Cat Books</td>
<td>328 East 9th St, New York</td> <td>328 East 9th St, New York</td>
</tr> </tr>
<tr id="71" class="spotRow"> <tr id="70" class="spotRow">
<td class="name">Posman Books Chelsea Market</td> <td class="name">Posman Books Chelsea Market</td>
<td>75 9th Avenue, New York</td> <td>75 9th Avenue, New York</td>
</tr> </tr>
<tr id="72" class="spotRow"> <tr id="71" class="spotRow">
<td class="name">POWERHOUSE @ IC</td> <td class="name">POWERHOUSE @ IC</td>
<td>220 36th Street, Building #2, Brooklyn</td> <td>220 36th St, Building #2, Brooklyn</td>
</tr> </tr>
<tr id="73" class="spotRow"> <tr id="72" class="spotRow">
<td class="name">POWERHOUSE Arena</td> <td class="name">POWERHOUSE Arena</td>
<td>28 Adams St, Brooklyn</td> <td>28 Adams St, Brooklyn</td>
</tr> </tr>
<tr id="74" class="spotRow"> <tr id="73" class="spotRow">
<td class="name">POWERHOUSE on 8th</td> <td class="name">POWERHOUSE on 8th</td>
<td>1111 8th Ave, Brooklyn</td> <td>1111 8th Ave, Brooklyn</td>
</tr> </tr>
<tr id="75" class="spotRow"> <tr id="74" class="spotRow">
<td class="name">Printed Matter</td> <td class="name">Printed Matter</td>
<td>231 11th Ave, New York</td> <td>231 11th Ave, New York</td>
</tr> </tr>
<tr id="76" class="spotRow"> <tr id="75" class="spotRow">
<td class="name">Printed Matter St. Marks</td> <td class="name">Printed Matter St. Marks</td>
<td>38 St. Marks Pl, New York</td> <td>38 St. Marks Pl, New York</td>
</tr> </tr>
<tr id="77" class="spotRow"> <tr id="76" class="spotRow">
<td class="name">Quest Bookshop</td> <td class="name">Quest Bookshop</td>
<td>240 E 53rd St, New York</td> <td>240 E 53rd St, New York</td>
</tr> </tr>
<tr id="78" class="spotRow"> <tr id="77" class="spotRow">
<td class="name">Quimby's Bookstore</td> <td class="name">Quimby's Bookstore</td>
<td>536 Metropolitan Avenue, Brooklyn</td> <td>536 Metropolitan Ave, Brooklyn</td>
</tr> </tr>
<tr id="79" class="spotRow"> <tr id="78" class="spotRow">
<td class="name">Recirculation</td> <td class="name">Recirculation</td>
<td>876 Riverside Dr, New York</td> <td>876 Riverside Dr, New York</td>
</tr> </tr>
<tr id="80" class="spotRow"> <tr id="79" class="spotRow">
<td class="name">Respect For Life Books-N-Things</td> <td class="name">Respect For Life Books-N-Things</td>
<td>537 Nostrand Ave, Brooklyn</td> <td>537 Nostrand Ave, Brooklyn</td>
</tr> </tr>
<tr id="81" class="spotRow"> <tr id="80" class="spotRow">
<td class="name">Revolution Books</td> <td class="name">Revolution Books</td>
<td>437 Malcolm X Blvd, New York</td> <td>437 Malcolm X Blvd, New York</td>
</tr> </tr>
<tr id="82" class="spotRow"> <tr id="81" class="spotRow">
<td class="name">Rizzoli Bookstore</td> <td class="name">Rizzoli Bookstore</td>
<td>1133 Broadway, New York</td> <td>1133 Broadway, New York</td>
</tr> </tr>
<tr id="83" class="spotRow"> <tr id="82" class="spotRow">
<td class="name">Shakespeare &amp; Company</td> <td class="name">Shakespeare &amp; Company</td>
<td>939 Lexington Ave, New York</td> <td>939 Lexington Ave, New York</td>
</tr> </tr>
<tr id="84" class="spotRow"> <tr id="83" class="spotRow">
<td class="name"> <td class="name">
Shakespeare &amp; Company (Upper West Side) Shakespeare &amp; Company (Upper West Side)
</td> </td>
<td>2020 Broadway, New York</td> <td>2020 Broadway, New York</td>
</tr> </tr>
<tr id="85" class="spotRow"> <tr id="84" class="spotRow">
<td class="name">Sister's Uptown Bookstore</td> <td class="name">Sister's Uptown Bookstore</td>
<td>1942 Amsterdam Ave, New York</td> <td>1942 Amsterdam Ave, New York</td>
</tr> </tr>
<tr id="86" class="spotRow"> <tr id="85" class="spotRow">
<td class="name">Spoonbill &amp; Sugartown, Booksellers</td> <td class="name">Spoonbill &amp; Sugartown, Booksellers</td>
<td>218 Bedford Ave, Brooklyn</td> <td>218 Bedford Ave, Brooklyn</td>
</tr> </tr>
<tr id="87" class="spotRow"> <tr id="86" class="spotRow">
<td class="name">Standards Manual</td> <td class="name">Standards Manual</td>
<td>212 Franklin Street, Brooklyn</td> <td>212 Franklin Street, Brooklyn</td>
</tr> </tr>
<tr id="88" class="spotRow"> <tr id="87" class="spotRow">
<td class="name">Strand Bookstore</td> <td class="name">Strand Bookstore</td>
<td>828 Broadway, New York</td> <td>828 Broadway, New York</td>
</tr> </tr>
<tr id="89" class="spotRow"> <tr id="88" class="spotRow">
<td class="name">Sweet Pickle Books</td> <td class="name">Sweet Pickle Books</td>
<td>47 Orchard St, New York</td> <td>47 Orchard St, New York</td>
</tr> </tr>
<tr id="89" class="spotRow">
<td class="name">Taylor &amp; Co. Books</td>
<td>1021 Cortelyou Rd, Brooklyn</td>
</tr>
<tr id="90" class="spotRow"> <tr id="90" class="spotRow">
<td class="name">Terrace Books</td> <td class="name">Terrace Books</td>
<td>242 Prospect Park West, Brooklyn</td> <td>242 Prospect Park West, Brooklyn</td>
@@ -563,56 +562,68 @@
<td>58 Warren St, New York</td> <td>58 Warren St, New York</td>
</tr> </tr>
<tr id="98" class="spotRow"> <tr id="98" class="spotRow">
<td class="name">The Strand At Columbus Ave</td> <td class="name">The Ripped Bodice</td>
<td>450 Columbus Avenue, New York</td> <td>218 5th Ave, Brooklyn</td>
</tr> </tr>
<tr id="99" class="spotRow"> <tr id="99" class="spotRow">
<td class="name">The Word Is Change</td> <td class="name">The Strand At Columbus Ave</td>
<td>368 Tompkins Avenue, Brooklyn</td> <td>450 Columbus Ave, New York</td>
</tr> </tr>
<tr id="100" class="spotRow"> <tr id="100" class="spotRow">
<td class="name">Three Lives &amp; Company</td> <td class="name">The Word Is Change</td>
<td>238 West 10th St, New York</td> <td>368 Tompkins Ave, Brooklyn</td>
</tr> </tr>
<tr id="101" class="spotRow"> <tr id="101" class="spotRow">
<td class="name">Three Lives &amp; Company</td>
<td>154 W 10th St, New York</td>
</tr>
<tr id="102" class="spotRow">
<td class="name">Topos Bookstore Cafe</td> <td class="name">Topos Bookstore Cafe</td>
<td>788 Woodward Ave, Brooklyn</td> <td>788 Woodward Ave, Brooklyn</td>
</tr> </tr>
<tr id="102" class="spotRow"> <tr id="103" class="spotRow">
<td class="name">Topos Too</td>
<td>59-22 Myrtle Ave, Queens</td>
</tr>
<tr id="104" class="spotRow">
<td class="name">Troubled Sleep Books</td> <td class="name">Troubled Sleep Books</td>
<td>129 6th Ave, Brooklyn</td> <td>129 6th Ave, Brooklyn</td>
</tr> </tr>
<tr id="103" class="spotRow"> <tr id="105" class="spotRow">
<td class="name">Turn The Page... Again</td> <td class="name">Turn The Page... Again</td>
<td>39-15a Bell Blvd, Flushing</td> <td>39-15a Bell Blvd, Flushing</td>
</tr> </tr>
<tr id="104" class="spotRow"> <tr id="106" class="spotRow">
<td class="name">Unnameable Books</td> <td class="name">Unnameable Books</td>
<td>600 Vanderbilt Ave, Brooklyn</td> <td>600 Vanderbilt Ave, Brooklyn</td>
</tr> </tr>
<tr id="105" class="spotRow"> <tr id="107" class="spotRow">
<td class="name">Ursus Books</td> <td class="name">Ursus Books</td>
<td>50 East 78th St, Suite 1C, New York</td> <td>50 East 78th St, Suite 1C, New York</td>
</tr> </tr>
<tr id="106" class="spotRow"> <tr id="108" class="spotRow">
<td class="name">Village Works</td>
<td>12 St. Marks Pl, New York</td>
</tr>
<tr id="109" class="spotRow">
<td class="name">Westsider Rare &amp; Used Books</td> <td class="name">Westsider Rare &amp; Used Books</td>
<td>2246 Broadway, New York</td> <td>2246 Broadway, New York</td>
</tr> </tr>
<tr id="107" class="spotRow"> <tr id="110" class="spotRow">
<td class="name">Westsider Records</td> <td class="name">Westsider Records</td>
<td>233 West 72nd St, New York</td> <td>233 West 72nd St, New York</td>
</tr> </tr>
<tr id="108" class="spotRow"> <tr id="111" class="spotRow">
<td class="name">Word Bookstore</td> <td class="name">Word Bookstore</td>
<td>126 Franklin St, Brooklyn</td> <td>126 Franklin St, Brooklyn</td>
</tr> </tr>
<tr id="109" class="spotRow"> <tr id="112" class="spotRow">
<td class="name">Word Up Books</td> <td class="name">Word Up Books</td>
<td>2113 Amsterdam Ave, New York</td> <td>2113 Amsterdam Ave, New York</td>
</tr> </tr>
<tr id="110" class="spotRow"> <tr id="113" class="spotRow">
<td class="name">Yu and Me Books</td> <td class="name">Yu and Me Books</td>
<td>44 Mulberry St, New York</td> <td>115 Delancey St Stall #11, New York</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -672,7 +683,6 @@
${city}, NY ${postcode} ${city}, NY ${postcode}
</p> </p>
<p> <p>
View in:
<a <a
href="https://maps.google.com/maps?q=${encodeURIComponent( href="https://maps.google.com/maps?q=${encodeURIComponent(
name name
@@ -693,17 +703,13 @@
: "" : ""
} }
</p> </p>
<ul> ${
${ website
website ? `<p><a href="${website}" target="_blank">${cleanWebsite(
? `<li><a href="${website}" target="_blank">${cleanWebsite( website
website )}</a></p>`
)}</a></li>` : ""
: "" }
}
<li class="storeDetails">Events: ${events}</li>
<li class="storeDetails">Caf&eacute;: ${cafe}</li>
</ul>
${description ? `<p class="description">${description}</p>` : ""}`; ${description ? `<p class="description">${description}</p>` : ""}`;
} }
@@ -807,6 +813,10 @@
} }
} }
function isStacked() {
return screen.width < 1120;
}
function boundingBox(point) { function boundingBox(point) {
// add some buffer to a point to give the user some leeway // add some buffer to a point to give the user some leeway
return [ return [
@@ -816,7 +826,11 @@
} }
function updateSelectedStore(store, pushState = false) { function updateSelectedStore(store, pushState = false) {
map.flyTo({ center: [store.long, store.lat], zoom: 12 }); map.flyTo({
center: [store.long, store.lat],
offset: [isStacked() ? 0 : -250, 0],
zoom: 13,
});
popup.setLngLat([store.long, store.lat]).setHTML(store.name).addTo(map); popup.setLngLat([store.long, store.lat]).setHTML(store.name).addTo(map);
@@ -838,8 +852,6 @@
} }
function loadMap(data) { function loadMap(data) {
var geolocate = new mapboxgl.GeolocateControl();
var points = []; var points = [];
data.forEach((value, key) => { data.forEach((value, key) => {
points.push({ points.push({
@@ -870,7 +882,6 @@
}, },
}); });
map.addControl(new mapboxgl.NavigationControl(), "top-left"); map.addControl(new mapboxgl.NavigationControl(), "top-left");
map.addControl(geolocate, "top-right");
updateViewBySlug(window.location.hash.split("#")[1]); updateViewBySlug(window.location.hash.split("#")[1]);
}); });
@@ -903,20 +914,12 @@
map.getCanvas().style.cursor = features.length ? "pointer" : ""; map.getCanvas().style.cursor = features.length ? "pointer" : "";
}); });
geolocate.on("geolocate", function (e) {
map.setZoom(14);
popup
.setLngLat([e.coords.longitude, e.coords.latitude])
.setHTML("Current Location")
.addTo(map);
});
setContent("Stores", TableViewTemplate(data)); setContent("Stores", TableViewTemplate(data));
document.querySelectorAll("#Stores tbody tr").forEach((element) => { document.querySelectorAll("#Stores tbody tr").forEach((element) => {
element.addEventListener("click", () => { element.addEventListener("click", () => {
updateSelectedStore(data[element.id], true); updateSelectedStore(data[element.id], true);
document document
.getElementById("subhed") .getElementById(isStacked() ? "map" : "selected")
.scrollIntoView({ behavior: "smooth" }); .scrollIntoView({ behavior: "smooth" });
}); });
}); });
@@ -924,29 +927,5 @@
document.getElementById("viewInfo").addEventListener("click", showInfo); document.getElementById("viewInfo").addEventListener("click", showInfo);
} }
</script> </script>
<script>
(function (i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function () {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(
window,
document,
"script",
"https://www.google-analytics.com/analytics.js",
"ga"
);
ga("create", "UA-100418882-1", "auto");
ga("send", "pageview");
</script>
</body> </body>
</html> </html>

View File

@@ -1,7 +1,39 @@
import { load } from "cheerio"; import { load } from "cheerio";
import { readFile, writeFile } from "fs"; import { readFile, writeFile } from "fs";
import process from "child_process";
import stores from "./stores.json" assert { type: "json" }; import stores from "./stores.json" assert { type: "json" };
function GetRecentChanges() {
const res = process
.execSync('git log -15 --pretty=format:"%ct %s"')
.toString();
return res.split("\n");
}
function ChangeLog(logs) {
let res = "\n";
let i = 0;
logs.forEach((l) => {
if (
i > 3 ||
l.includes("[skip]") ||
l.includes("caddy") ||
l.includes("renovate")
) {
return;
}
i++;
const s = l.split(" ");
const date = new Date(s[0] * 1000).toLocaleDateString("en-US", {
year: "numeric",
month: "long",
day: "numeric",
});
res = res + `<li>${date} - ${s.slice(1).join(" ")}</li>\n`;
});
return res;
}
function TableViewTemplate(rows) { function TableViewTemplate(rows) {
let table = "<table>"; let table = "<table>";
rows.forEach((row, key) => { rows.forEach((row, key) => {
@@ -20,6 +52,7 @@ function TableRowTemplate({ rowNumber, name, address, city }) {
} }
readFile("./index.html", function (err, data) { readFile("./index.html", function (err, data) {
const changeList = GetRecentChanges();
if (err) { if (err) {
throw err; throw err;
} }
@@ -40,6 +73,7 @@ readFile("./index.html", function (err, data) {
day: "numeric", day: "numeric",
}) })
); );
$("#changesList").html(ChangeLog(changeList));
const cssurl = $("link[type='text/css']").attr("href").split("?")[0]; const cssurl = $("link[type='text/css']").attr("href").split("?")[0];
$("link[type='text/css']").attr("href", cssurl + "?" + new Date().getTime()); $("link[type='text/css']").attr("href", cssurl + "?" + new Date().getTime());
writeFile("./index.html", $.html(), (err) => { writeFile("./index.html", $.html(), (err) => {

3
renovate.json Normal file
View File

@@ -0,0 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}

View File

@@ -43,13 +43,13 @@
}, },
{ {
"name": "Astoria Bookshop", "name": "Astoria Bookshop",
"address": "31-29 31st St", "address": "36-19 30th St",
"city": "Astoria", "city": "Astoria",
"state": "NY", "state": "NY",
"postcode": "11106", "postcode": "11106",
"description": "The Astoria Bookshop is a general-interest bookstore with a decently-sized children's department. It also hosts book clubs and signings.", "description": "The Astoria Bookshop is a general-interest bookstore with a decently-sized children's department. It also hosts book clubs and signings.",
"lat": "40.763494", "lat": "40.7563539364933",
"long": "-73.923838", "long": "-73.93073227116471",
"country": "USA", "country": "USA",
"website": "https://www.astoriabookshop.com/", "website": "https://www.astoriabookshop.com/",
"events": "Yes", "events": "Yes",
@@ -149,7 +149,7 @@
"lat": "40.733032", "lat": "40.733032",
"long": "-73.98996", "long": "-73.98996",
"country": "USA", "country": "USA",
"website": "https://www.instagram.com/alabasterbooks/", "website": "https://www.instagram.com/alabasterbookshop/",
"events": "No", "events": "No",
"cafe": "No" "cafe": "No"
}, },
@@ -195,20 +195,6 @@
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
}, },
{
"name": "Greenlight Bookstore (Prospect Lefferts Gardens)",
"address": "632 Flatbush Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11225",
"description": "",
"lat": "40.657927",
"long": "-73.960535",
"country": "USA",
"website": "https://www.greenlightbookstore.com/",
"events": "Yes",
"cafe": "No"
},
{ {
"name": "Dashwood Books", "name": "Dashwood Books",
"address": "33 Bond St", "address": "33 Bond St",
@@ -309,13 +295,13 @@
}, },
{ {
"name": "Three Lives & Company", "name": "Three Lives & Company",
"address": "238 West 10th St", "address": "154 W 10th St",
"city": "New York", "city": "New York",
"state": "NY", "state": "NY",
"postcode": "10014", "postcode": "10014",
"description": "Unselfconsciously old-fashioned, Three Lives (the name comes from the trio of women founders as well as the Gertrude Stein novel) occupies a former deli. A gorgeous space with dark wood everywhere, they sell mainly literary fiction, with a selection of literary magazines and travel guides as well. The staff are enthusiastic and deeply knowledgable. Temporarily moved from 154 West 10th St.", "description": "Unselfconsciously old-fashioned, Three Lives (the name comes from the trio of women founders as well as the Gertrude Stein novel) occupies a former deli. A gorgeous space with dark wood everywhere, they sell mainly literary fiction, with a selection of literary magazines and travel guides as well. The staff are enthusiastic and deeply knowledgable.",
"lat": "40.733749", "lat": "40.734402117180856",
"long": "-74.005438", "long": "-74.00149889306957",
"country": "USA", "country": "USA",
"website": "http://www.threelives.com/", "website": "http://www.threelives.com/",
"events": "Yes", "events": "Yes",
@@ -433,20 +419,6 @@
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
}, },
{
"name": "Idlewild Books",
"address": "170 7th Avenue S",
"city": "New York",
"state": "NY",
"postcode": "10014",
"description": "Idlewild Books started off as a store for travel guides and books for armchair travelers; over time, the selection has started to cater more to those interested in learning another language, but the Manhattan location has maintained a large selection of books from and about far-flung corners of the globe. Langauge classes are also available here and at the other two locations in the city.",
"lat": "40.7355778",
"long": "-74.0017457",
"country": "USA",
"website": "https://www.idlewildbooks.com/",
"events": "Yes",
"cafe": "No"
},
{ {
"name": "Posman Books Chelsea Market", "name": "Posman Books Chelsea Market",
"address": "75 9th Avenue", "address": "75 9th Avenue",
@@ -685,20 +657,6 @@
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
}, },
{
"name": "Boulevard Books",
"address": "7518 13th Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11228",
"description": "",
"lat": "40.61998",
"long": "-74.0080949",
"country": "USA",
"website": "https://facebook.com/boulevardbookstore/",
"events": "Yes",
"cafe": "Yes"
},
{ {
"name": "Better Read Than Dead", "name": "Better Read Than Dead",
"address": "867 Broadway", "address": "867 Broadway",
@@ -813,13 +771,13 @@
}, },
{ {
"name": "Catland", "name": "Catland",
"address": "987 Flushing Ave", "address": "985 Flushing Ave",
"city": "Brooklyn", "city": "Brooklyn",
"state": "NY", "state": "NY",
"postcode": "11206", "postcode": "11206",
"description": "New York City has an occult bookstore again, thanks to Catland. This store caters to those interested in the various schools of modern magical thought, and we're not talking about stage magic. New titles are available from various occult publishers, including imports from Europe and other hard-to-find titles, and there are also used and out-of-print resources. The store also sells candles, minerals, and other paraphenalia for the serious occultist, and has an adjacent event space for... other purposes.", "description": "New York City has an occult bookstore again, thanks to Catland. This store caters to those interested in the various schools of modern magical thought, and we're not talking about stage magic. New titles are available from various occult publishers, including imports from Europe and other hard-to-find titles, and there are also used and out-of-print resources. The store also sells candles, minerals, and other paraphenalia for the serious occultist, and has an adjacent event space for... other purposes.",
"lat": "40.70313", "lat": "40.70308451154855",
"long": "-73.933208", "long": "-73.9332990716122",
"country": "USA", "country": "USA",
"website": "https://www.catlandbooks.com/", "website": "https://www.catlandbooks.com/",
"events": "Yes", "events": "Yes",
@@ -869,17 +827,17 @@
}, },
{ {
"name": "Archestratus", "name": "Archestratus",
"address": "160 Huron St", "address": "164 Huron St",
"city": "Brooklyn", "city": "Brooklyn",
"state": "NY", "state": "NY",
"postcode": "11222", "postcode": "11222",
"description": "Archestratus is a combination cookbook bookstore, café, and restaurant on Thursday evenings serving Sicilian-inspired food. A gorgeous, bright space with a wide selection of cookbooks, both new and used, as well as fiction and non-fiction on and relating to gustatory pleasure. Includes stationary, a small selection of pantry items, and a children's section.", "description": "Archestratus is a combination cookbook-bookstore and grocery. A gorgeous, bright space with a wide selection of cookbooks, both new and used, as well as fiction and non-fiction on and relating to gustatory pleasure. Includes stationary, a small selection of pantry items, and a children's section.",
"lat": "40.732808", "lat": "40.73291914466089",
"long": "-73.955144", "long": "-73.955081286067",
"country": "USA", "country": "USA",
"website": "https://www.archestrat.us/", "website": "https://www.archestrat.us/",
"events": "Yes", "events": "Yes",
"cafe": "Yes" "cafe": "Sandwiches and Groceries"
}, },
{ {
"name": "Quest Bookshop", "name": "Quest Bookshop",
@@ -1203,20 +1161,6 @@
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
}, },
{
"name": "Avoid The Day Bookstore & Cafe",
"address": "99-04 A Rockaway Beach Blvd",
"city": "Rockaway Park",
"state": "NY",
"postcode": "11694",
"description": "",
"lat": "40.584264",
"long": "-73.820613",
"country": "USA",
"website": "https://www.avoidtheday.org/",
"events": "Yes",
"cafe": "Yes"
},
{ {
"name": "Bravo's Book Nook", "name": "Bravo's Book Nook",
"address": "115 MacDougal St", "address": "115 MacDougal St",
@@ -1303,17 +1247,17 @@
}, },
{ {
"name": "Yu and Me Books", "name": "Yu and Me Books",
"address": "44 Mulberry St", "address": "115 Delancey St Stall #11",
"city": "New York", "city": "New York",
"state": "NY", "state": "NY",
"postcode": "10013", "postcode": "10002",
"description": "", "description": "Temporarily located in Essex Market after a fire ruined their original Chinatown location.",
"lat": "40.7150026491681", "lat": "40.71799108242515",
"long": "-73.99949344452915", "long": "-73.98821173877292",
"country": "USA", "country": "USA",
"website": "https://www.yuandmebooks.com/", "website": "https://www.yuandmebooks.com/",
"events": "Yes", "events": "Yes",
"cafe": "Yes?" "cafe": "No"
}, },
{ {
"name": "Bookoff Brooklyn", "name": "Bookoff Brooklyn",
@@ -1359,17 +1303,17 @@
}, },
{ {
"name": "Burnt Books", "name": "Burnt Books",
"address": "1014 Manhattan Ave", "address": "157 Huron St",
"city": "Brooklyn", "city": "Brooklyn",
"state": "NY", "state": "NY",
"postcode": "11222", "postcode": "11222",
"description": "Inside the bodega at this address.", "description": "Inside Hey Kids! Comics.",
"lat": "40.733568440405016", "lat": "40.73311524313807",
"long": "-73.95461455767136", "long": "-73.95524501396707",
"country": "USA", "country": "USA",
"website": "https://www.instagram.com/burnt_books_/", "website": "https://www.instagram.com/burnt_books_/",
"events": "No", "events": "No",
"cafe": "Yes?" "cafe": "No"
}, },
{ {
"name": "Hey Kids! Comics", "name": "Hey Kids! Comics",
@@ -1471,13 +1415,13 @@
}, },
{ {
"name": "Adanne", "name": "Adanne",
"address": "234 Water St", "address": "115 Ralph Ave",
"city": "Brooklyn", "city": "Brooklyn",
"state": "NY", "state": "NY",
"postcode": "11201", "postcode": "11221",
"description": "", "description": "",
"lat": "40.70288951770088", "lat": "40.686078937932145",
"long": "-73.98444221660601", "long": "-73.92321820991805",
"country": "USA", "country": "USA",
"website": "https://adanne.co/", "website": "https://adanne.co/",
"events": "Yes", "events": "Yes",
@@ -1531,7 +1475,7 @@
"city": "New York", "city": "New York",
"state": "NY", "state": "NY",
"postcode": "10014", "postcode": "10014",
"description": "", "description": "A revival of an older shop by the same name in the same neighborhood, Left Bank Books is a used-book seller specializing in fiction, art and photo books, as well as 'first or interesting editions of books in good condition'. The storefront is small and tidy, with a varied, interesting selection.",
"lat": "40.73571487088914", "lat": "40.73571487088914",
"long": "-74.00279887704167", "long": "-74.00279887704167",
"country": "USA", "country": "USA",
@@ -1566,5 +1510,89 @@
"website": "https://www.blackspringbookstore.com/", "website": "https://www.blackspringbookstore.com/",
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
},
{
"name": "Passageway Books",
"address": "150 9th Ave",
"city": "New York",
"state": "NY",
"postcode": "10011",
"description": "",
"lat": "40.74412894095414",
"long": "-74.00282753618434",
"country": "USA",
"website": "https://www.instagram.com/passageway_books/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Taylor & Co. Books",
"address": "1021 Cortelyou Rd",
"city": "Brooklyn",
"state": "NY",
"postcode": "11218",
"description": "",
"lat": "40.63931763103944",
"long": "-73.96838123421915",
"country": "USA",
"website": "https://www.taylorcobooks.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "The Ripped Bodice",
"address": "218 5th Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11215",
"description": "",
"lat": "40.67614895922998",
"long": "-73.98099066262628",
"country": "USA",
"website": "https://www.therippedbodicela.com/ripped-bodice-brooklyn",
"events": "Yes",
"cafe": "No"
},
{
"name": "Lofty Pigeon Books",
"address": "743 Church Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11218",
"description": "",
"lat": "40.646037403744415",
"long": "-73.97189664018556",
"country": "USA",
"website": "https://www.loftypigeonbooks.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Village Works",
"address": "12 St. Marks Pl",
"city": "New York",
"state": "NY",
"postcode": "10003",
"description": "",
"lat": "40.72914082270099",
"long": "-73.98920772389302",
"country": "USA",
"website": "https://www.villageworksnyc.com/",
"events": "Yes",
"cafe": "Soon?"
},
{
"name": "Topos Too",
"address": "59-22 Myrtle Ave",
"city": "Queens",
"state": "NY",
"postcode": "11385",
"description": "",
"lat": "40.70042656211568",
"long": "-73.89895900901953",
"country": "USA",
"website": "https://www.toposbookstore.com/",
"events": "?",
"cafe": "No"
} }
] ]