Compare commits

..

1 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
7 changed files with 296 additions and 587 deletions

View File

@ -6,18 +6,6 @@
depth: 15 depth: 15
steps: steps:
test:
image: docker
commands:
- apk add curl
- docker build .
when:
- event: push
branch:
exclude: ["main"]
volumes:
- /var/run/docker.sock:/var/run/docker.sock
build: build:
image: docker image: docker
commands: commands:
@ -29,8 +17,6 @@ steps:
- 'curl http://100.113.98.36: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:
- event: push branch: "master"
branch:
include: ["main"]
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock

View File

@ -1,10 +1,10 @@
FROM node:22 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.8.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,27 +126,17 @@ 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 { #info details {
font-size: 15px; font-size: 15px;
padding: 4px;
line-height: 22px; line-height: 22px;
text-align: justify; text-align: justify;
} }
@ -174,40 +147,34 @@ ul.nav li a:hover {
#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

@ -31,7 +31,7 @@
media="screen" media="screen"
rel="stylesheet" rel="stylesheet"
type="text/css" type="text/css"
href="/css/site.css?1709780697849" href="/css/site.css?1698627633277"
/> />
<meta <meta
property="title" property="title"
@ -55,7 +55,6 @@
content="https://www.nycbookstores.org/img/social.jpg" content="https://www.nycbookstores.org/img/social.jpg"
/> />
<meta property="og:url" content="https://www.nycbookstores.org/" /> <meta property="og:url" content="https://www.nycbookstores.org/" />
<meta property="og:type" content="website" />
<meta property="og:title" content="NYC Bookstores" /> <meta property="og:title" content="NYC Bookstores" />
<meta <meta
property="og:description" property="og:description"
@ -65,18 +64,13 @@
property="og:image" property="og:image"
content="https://www.nycbookstores.org/img/social.jpg" content="https://www.nycbookstores.org/img/social.jpg"
/> />
<link rel="canonical" href="https://www.nycbookstores.org/" />
</head> </head>
<body> <body>
<div id="map"></div>
<div id="wrapper"> <div id="wrapper">
<header class="bubble">
<h1>NYC Bookstores</h1> <h1>NYC Bookstores</h1>
<div>
<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
@ -95,10 +89,8 @@
> >
</li> </li>
</ul> </ul>
</div> </header>
<div class="container"> <div id="info" class="bubble">
<div id="map"></div>
<div id="info">
<p> <p>
New York City loves its independent bookstores. It New York City loves its independent bookstores. It
<a <a
@ -106,8 +98,7 @@
target="_blank" target="_blank"
>eulogizes those that have faded</a >eulogizes those that have faded</a
> >
and celebrates when new ventures are launched. And while the and celebrates when new ventures are launched. And while the historic
historic
<a <a
href="https://untappedcities.com/2015/08/26/4th-avenue-the-history-of-nycs-book-row/" href="https://untappedcities.com/2015/08/26/4th-avenue-the-history-of-nycs-book-row/"
target="_blank" target="_blank"
@ -121,8 +112,8 @@
<p> <p>
While Manhattan and Brooklyn still lead the pack, Queens has a While Manhattan and Brooklyn still lead the pack, Queens has a
respectable number of stores, and all five boroughs are represented, respectable number of stores, and all five boroughs are represented,
with the Bronx and Staten Island both hosting lone independent with the Bronx and Staten Island both hosting lone independent stores.
stores. Lower Manhattan has the highest density of booksellers. Lower Manhattan has the highest density of booksellers.
</p> </p>
<p> <p>
The listings here are kept up-to-date to the best of my ability; The listings here are kept up-to-date to the best of my ability;
@ -145,35 +136,34 @@
survives at this point). survives at this point).
</p> </p>
<p> <p>
There are currently <span id="storeCount">118</span> stores indexed There are currently <span id="storeCount">114</span> stores indexed on
on this page. Last updated this page. Last updated <span id="updatedOn">October 29, 2023</span>.
<span id="updatedOn">March 6, 2024</span>.
</p> </p>
<details> <details>
<summary>Recent Changes</summary> <summary>Recent Changes</summary>
<ul id="changesList"> <ul id="changesList">
<li> <li>
January 28, 2024 - move Yu and Me back to its original location October 26, 2023 - Return Three Lives to its original corner
(congrats!) location.
</li> </li>
<li> <li>
January 1, 2024 - Add Bibliotheque and The World's Borough October 26, 2023 - Idlewild Books appears to have transitioned
Bookshop entirely to language classes as opposed to bookselling
</li> </li>
<li> <li>
December 27, 2023 - add La Joie de Vivre, a French/English October 26, 2023 - remove Boulevard Books; correct Alabaster
bookstore in the Flatiron Distirct Bookshop Instagram link
</li>
<li>
October 26, 2023 - Add Topos Too, currently in a "soft opening"
</li> </li>
<li>December 21, 2023 - add canonical link</li>
</ul> </ul>
</details> </details>
</div> </div>
<div id="selected"></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>
@ -226,433 +216,414 @@
<td>90 Kosciuszko St, Brooklyn</td> <td>90 Kosciuszko St, Brooklyn</td>
</tr> </tr>
<tr id="12" class="spotRow"> <tr id="12" class="spotRow">
<td class="name">Bibliotheque</td>
<td>54 Mercer St, New York</td>
</tr>
<tr id="13" class="spotRow">
<td class="name">Black Spring Books</td> <td class="name">Black Spring Books</td>
<td>672 Driggs Ave, Brooklyn</td> <td>672 Driggs Ave, Brooklyn</td>
</tr> </tr>
<tr id="14" 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>
</tr> </tr>
<tr id="15" class="spotRow"> <tr id="14" class="spotRow">
<td class="name">Bonnie Slotnick Cookbooks</td> <td class="name">Bonnie Slotnick Cookbooks</td>
<td>28 East 2nd St, New York</td> <td>28 East 2nd St, New York</td>
</tr> </tr>
<tr id="16" class="spotRow"> <tr id="15" class="spotRow">
<td class="name">Book Club Bar</td> <td class="name">Book Club Bar</td>
<td>197 E 3rd St, New York</td> <td>197 E 3rd St, New York</td>
</tr> </tr>
<tr id="17" class="spotRow"> <tr id="16" class="spotRow">
<td class="name">Book Culture</td> <td class="name">Book Culture</td>
<td>536 W 112th St, New York</td> <td>536 W 112th St, New York</td>
</tr> </tr>
<tr id="18" class="spotRow"> <tr id="17" class="spotRow">
<td class="name">Book Culture LIC</td> <td class="name">Book Culture LIC</td>
<td>26-09 Jackson Ave, Queens</td> <td>26-09 Jackson Ave, Queens</td>
</tr> </tr>
<tr id="19" class="spotRow"> <tr id="18" class="spotRow">
<td class="name">Book Culture on Broadway</td> <td class="name">Book Culture on Broadway</td>
<td>2915 Broadway, New York</td> <td>2915 Broadway, New York</td>
</tr> </tr>
<tr id="20" class="spotRow"> <tr id="19" class="spotRow">
<td class="name">Book Thug Nation</td> <td class="name">Book Thug Nation</td>
<td>100 North 3rd St, Brooklyn</td> <td>100 North 3rd St, Brooklyn</td>
</tr> </tr>
<tr id="21" class="spotRow"> <tr id="20" class="spotRow">
<td class="name">Bookmarc</td> <td class="name">Bookmarc</td>
<td>400 Bleecker St, New York</td> <td>400 Bleecker St, New York</td>
</tr> </tr>
<tr id="22" class="spotRow"> <tr id="21" class="spotRow">
<td class="name">BookMark Shoppe</td> <td class="name">BookMark Shoppe</td>
<td>8415 3rd Avenue, Brooklyn</td> <td>8415 3rd Avenue, Brooklyn</td>
</tr> </tr>
<tr id="23" class="spotRow"> <tr id="22" class="spotRow">
<td class="name">Bookoff</td> <td class="name">Bookoff</td>
<td>49 W 45nd St, New York</td> <td>49 W 45nd St, New York</td>
</tr> </tr>
<tr id="24" class="spotRow"> <tr id="23" class="spotRow">
<td class="name">Bookoff Brooklyn</td> <td class="name">Bookoff Brooklyn</td>
<td>934 3rd Ave, Brooklyn</td> <td>934 3rd Ave, Brooklyn</td>
</tr> </tr>
<tr id="25" class="spotRow"> <tr id="24" class="spotRow">
<td class="name">Books Are Magic (Montague St.)</td> <td class="name">Books Are Magic (Montague St.)</td>
<td>122 Montague St, Brooklyn</td> <td>122 Montague St, Brooklyn</td>
</tr> </tr>
<tr id="26" class="spotRow"> <tr id="25" class="spotRow">
<td class="name">Books Are Magic (Smith St.)</td> <td class="name">Books Are Magic (Smith St.)</td>
<td>225 Smith St, Brooklyn</td> <td>225 Smith St, Brooklyn</td>
</tr> </tr>
<tr id="27" class="spotRow"> <tr id="26" class="spotRow">
<td class="name">Books Of Wonder</td> <td class="name">Books Of Wonder</td>
<td>42 West 17th St, New York</td> <td>42 West 17th St, New York</td>
</tr> </tr>
<tr id="28" class="spotRow"> <tr id="27" 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>157 Huron St, 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>985 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 Ave, 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">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="44" 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="45" 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="46" 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="47" class="spotRow"> <tr id="46" 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="48" 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="49" 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="50" 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="51" 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="52" 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="53" class="spotRow"> <tr id="52" class="spotRow">
<td class="name">La Joie de Vivre</td>
<td>145 W 27th St, New York</td>
</tr>
<tr id="54" 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="55" class="spotRow"> <tr id="53" class="spotRow">
<td class="name">Left Bank Books</td> <td class="name">Left Bank Books</td>
<td>41 Perry St, New York</td> <td>41 Perry St, New York</td>
</tr> </tr>
<tr id="56" class="spotRow"> <tr id="54" class="spotRow">
<td class="name">Lofty Pigeon Books</td> <td class="name">Lofty Pigeon Books</td>
<td>743 Church Ave, Brooklyn</td> <td>743 Church Ave, Brooklyn</td>
</tr> </tr>
<tr id="57" class="spotRow"> <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>134 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 St, 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 class="name">Passageway Books</td>
<td>150 9th Ave, New York</td> <td>150 9th Ave, New York</td>
</tr> </tr>
<tr id="71" class="spotRow"> <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="72" 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="73" class="spotRow"> <tr id="71" class="spotRow">
<td class="name">POWERHOUSE @ IC</td> <td class="name">POWERHOUSE @ IC</td>
<td>220 36th St, Building #2, Brooklyn</td> <td>220 36th St, Building #2, Brooklyn</td>
</tr> </tr>
<tr id="74" 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="75" 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="76" 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="77" 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="78" 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="79" class="spotRow"> <tr id="77" class="spotRow">
<td class="name">Quimby's Bookstore</td> <td class="name">Quimby's Bookstore</td>
<td>536 Metropolitan Ave, Brooklyn</td> <td>536 Metropolitan Ave, Brooklyn</td>
</tr> </tr>
<tr id="80" 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="81" 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="82" 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="83" 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="84" 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="85" class="spotRow"> <tr id="83" class="spotRow">
<td class="name">
Shakespeare &amp; Company (Manhattan Valley/Columbia
University)
</td>
<td>2736 Broadway, New York</td>
</tr>
<tr id="86" 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="87" 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="88" 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="89" 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="90" 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="91" 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="92" class="spotRow"> <tr id="89" class="spotRow">
<td class="name">Taylor &amp; Co. Books</td> <td class="name">Taylor &amp; Co. Books</td>
<td>1021 Cortelyou Rd, Brooklyn</td> <td>1021 Cortelyou Rd, Brooklyn</td>
</tr> </tr>
<tr id="93" 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>
</tr> </tr>
<tr id="94" class="spotRow"> <tr id="91" class="spotRow">
<td class="name">The Austin Book Shop</td> <td class="name">The Austin Book Shop</td>
<td>104-29 Jamaica Ave, Richmond Hill</td> <td>104-29 Jamaica Ave, Richmond Hill</td>
</tr> </tr>
<tr id="95" class="spotRow"> <tr id="92" class="spotRow">
<td class="name">The Book Cellar</td> <td class="name">The Book Cellar</td>
<td>1465 York Ave, New York</td> <td>1465 York Ave, New York</td>
</tr> </tr>
<tr id="96" class="spotRow"> <tr id="93" class="spotRow">
<td class="name">The Center for Fiction</td> <td class="name">The Center for Fiction</td>
<td>15 Lafayette Ave, Brooklyn</td> <td>15 Lafayette Ave, Brooklyn</td>
</tr> </tr>
<tr id="97" class="spotRow"> <tr id="94" class="spotRow">
<td class="name">The Corner Bookstore</td> <td class="name">The Corner Bookstore</td>
<td>1313 Madison Ave, New York</td> <td>1313 Madison Ave, New York</td>
</tr> </tr>
<tr id="98" class="spotRow"> <tr id="95" class="spotRow">
<td class="name">The Drama Book Shop</td> <td class="name">The Drama Book Shop</td>
<td>266 W 39th St, New York</td> <td>266 W 39th St, New York</td>
</tr> </tr>
<tr id="99" class="spotRow"> <tr id="96" class="spotRow">
<td class="name">The Lit. Bar</td> <td class="name">The Lit. Bar</td>
<td>131 Alexander Ave, Bronx</td> <td>131 Alexander Ave, Bronx</td>
</tr> </tr>
<tr id="100" class="spotRow"> <tr id="97" class="spotRow">
<td class="name">The Mysterious Bookshop</td> <td class="name">The Mysterious Bookshop</td>
<td>58 Warren St, New York</td> <td>58 Warren St, New York</td>
</tr> </tr>
<tr id="101" class="spotRow"> <tr id="98" class="spotRow">
<td class="name">The Ripped Bodice</td> <td class="name">The Ripped Bodice</td>
<td>218 5th Ave, Brooklyn</td> <td>218 5th Ave, Brooklyn</td>
</tr> </tr>
<tr id="102" class="spotRow"> <tr id="99" class="spotRow">
<td class="name">The Strand At Columbus Ave</td> <td class="name">The Strand At Columbus Ave</td>
<td>450 Columbus Ave, New York</td> <td>450 Columbus Ave, New York</td>
</tr> </tr>
<tr id="103" class="spotRow"> <tr id="100" class="spotRow">
<td class="name">The Word Is Change</td> <td class="name">The Word Is Change</td>
<td>368 Tompkins Ave, Brooklyn</td> <td>368 Tompkins Ave, Brooklyn</td>
</tr> </tr>
<tr id="104" class="spotRow"> <tr id="101" class="spotRow">
<td class="name">The World's Borough Bookshop</td>
<td>3406 73rd St, Queens</td>
</tr>
<tr id="105" class="spotRow">
<td class="name">Three Lives &amp; Company</td> <td class="name">Three Lives &amp; Company</td>
<td>154 W 10th St, New York</td> <td>154 W 10th St, New York</td>
</tr> </tr>
<tr id="106" class="spotRow"> <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="107" class="spotRow"> <tr id="103" class="spotRow">
<td class="name">Topos Too</td> <td class="name">Topos Too</td>
<td>59-22 Myrtle Ave, Queens</td> <td>59-22 Myrtle Ave, Queens</td>
</tr> </tr>
<tr id="108" class="spotRow"> <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="109" 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="110" 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="111" 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="112" class="spotRow"> <tr id="108" class="spotRow">
<td class="name">Village Works</td> <td class="name">Village Works</td>
<td>12 St. Marks Pl, New York</td> <td>12 St. Marks Pl, New York</td>
</tr> </tr>
<tr id="113" class="spotRow"> <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="114" 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="115" 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="116" 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="117" 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>
@ -712,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
@ -733,17 +703,13 @@
: "" : ""
} }
</p> </p>
<ul>
${ ${
website website
? `<li><a href="${website}" target="_blank">${cleanWebsite( ? `<p><a href="${website}" target="_blank">${cleanWebsite(
website website
)}</a></li>` )}</a></p>`
: "" : ""
} }
<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>` : ""}`;
} }
@ -847,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 [
@ -856,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);
@ -878,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({
@ -910,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]);
}); });
@ -943,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" });
}); });
}); });

View File

@ -1,7 +1,7 @@
import { load } from "cheerio"; import { load } from "cheerio";
import { readFile, writeFile } from "fs"; import { readFile, writeFile } from "fs";
import process from "child_process"; import process from "child_process";
import stores from "./stores.json" with { type: "json" }; import stores from "./stores.json" assert { type: "json" };
function GetRecentChanges() { function GetRecentChanges() {
const res = process const res = process
@ -17,7 +17,6 @@ function ChangeLog(logs) {
if ( if (
i > 3 || i > 3 ||
l.includes("[skip]") || l.includes("[skip]") ||
l.includes("[ignore]") ||
l.includes("caddy") || l.includes("caddy") ||
l.includes("renovate") l.includes("renovate")
) { ) {

204
package-lock.json generated
View File

@ -18,24 +18,20 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
}, },
"node_modules/cheerio": { "node_modules/cheerio": {
"version": "1.0.0", "version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
"integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
"dependencies": { "dependencies": {
"cheerio-select": "^2.1.0", "cheerio-select": "^2.1.0",
"dom-serializer": "^2.0.0", "dom-serializer": "^2.0.0",
"domhandler": "^5.0.3", "domhandler": "^5.0.3",
"domutils": "^3.1.0", "domutils": "^3.0.1",
"encoding-sniffer": "^0.2.0", "htmlparser2": "^8.0.1",
"htmlparser2": "^9.1.0", "parse5": "^7.0.0",
"parse5": "^7.1.2", "parse5-htmlparser2-tree-adapter": "^7.0.0"
"parse5-htmlparser2-tree-adapter": "^7.0.0",
"parse5-parser-stream": "^7.1.2",
"undici": "^6.19.5",
"whatwg-mimetype": "^4.0.0"
}, },
"engines": { "engines": {
"node": ">=18.17" "node": ">= 6"
}, },
"funding": { "funding": {
"url": "https://github.com/cheeriojs/cheerio?sponsor=1" "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
@ -122,34 +118,22 @@
} }
}, },
"node_modules/domutils": { "node_modules/domutils": {
"version": "3.1.0", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
"integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
"dependencies": { "dependencies": {
"dom-serializer": "^2.0.0", "dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0", "domelementtype": "^2.3.0",
"domhandler": "^5.0.3" "domhandler": "^5.0.1"
}, },
"funding": { "funding": {
"url": "https://github.com/fb55/domutils?sponsor=1" "url": "https://github.com/fb55/domutils?sponsor=1"
} }
}, },
"node_modules/encoding-sniffer": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz",
"integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==",
"dependencies": {
"iconv-lite": "^0.6.3",
"whatwg-encoding": "^3.1.1"
},
"funding": {
"url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
}
},
"node_modules/entities": { "node_modules/entities": {
"version": "4.5.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
"engines": { "engines": {
"node": ">=0.12" "node": ">=0.12"
}, },
@ -158,9 +142,9 @@
} }
}, },
"node_modules/htmlparser2": { "node_modules/htmlparser2": {
"version": "9.1.0", "version": "8.0.1",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
"integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
"funding": [ "funding": [
"https://github.com/fb55/htmlparser2?sponsor=1", "https://github.com/fb55/htmlparser2?sponsor=1",
{ {
@ -170,20 +154,9 @@
], ],
"dependencies": { "dependencies": {
"domelementtype": "^2.3.0", "domelementtype": "^2.3.0",
"domhandler": "^5.0.3", "domhandler": "^5.0.2",
"domutils": "^3.1.0", "domutils": "^3.0.1",
"entities": "^4.5.0" "entities": "^4.3.0"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
} }
}, },
"node_modules/nth-check": { "node_modules/nth-check": {
@ -219,49 +192,6 @@
"funding": { "funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1" "url": "https://github.com/inikulin/parse5?sponsor=1"
} }
},
"node_modules/parse5-parser-stream": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
"integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
"dependencies": {
"parse5": "^7.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/undici": {
"version": "6.19.7",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz",
"integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==",
"engines": {
"node": ">=18.17"
}
},
"node_modules/whatwg-encoding": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
"integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
"dependencies": {
"iconv-lite": "0.6.3"
},
"engines": {
"node": ">=18"
}
},
"node_modules/whatwg-mimetype": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
"integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
"engines": {
"node": ">=18"
}
} }
}, },
"dependencies": { "dependencies": {
@ -271,21 +201,17 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
}, },
"cheerio": { "cheerio": {
"version": "1.0.0", "version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
"integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
"requires": { "requires": {
"cheerio-select": "^2.1.0", "cheerio-select": "^2.1.0",
"dom-serializer": "^2.0.0", "dom-serializer": "^2.0.0",
"domhandler": "^5.0.3", "domhandler": "^5.0.3",
"domutils": "^3.1.0", "domutils": "^3.0.1",
"encoding-sniffer": "^0.2.0", "htmlparser2": "^8.0.1",
"htmlparser2": "^9.1.0", "parse5": "^7.0.0",
"parse5": "^7.1.2", "parse5-htmlparser2-tree-adapter": "^7.0.0"
"parse5-htmlparser2-tree-adapter": "^7.0.0",
"parse5-parser-stream": "^7.1.2",
"undici": "^6.19.5",
"whatwg-mimetype": "^4.0.0"
} }
}, },
"cheerio-select": { "cheerio-select": {
@ -342,46 +268,29 @@
} }
}, },
"domutils": { "domutils": {
"version": "3.1.0", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
"integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
"requires": { "requires": {
"dom-serializer": "^2.0.0", "dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0", "domelementtype": "^2.3.0",
"domhandler": "^5.0.3" "domhandler": "^5.0.1"
}
},
"encoding-sniffer": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz",
"integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==",
"requires": {
"iconv-lite": "^0.6.3",
"whatwg-encoding": "^3.1.1"
} }
}, },
"entities": { "entities": {
"version": "4.5.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
}, },
"htmlparser2": { "htmlparser2": {
"version": "9.1.0", "version": "8.0.1",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
"integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
"requires": { "requires": {
"domelementtype": "^2.3.0", "domelementtype": "^2.3.0",
"domhandler": "^5.0.3", "domhandler": "^5.0.2",
"domutils": "^3.1.0", "domutils": "^3.0.1",
"entities": "^4.5.0" "entities": "^4.3.0"
}
},
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
} }
}, },
"nth-check": { "nth-check": {
@ -408,37 +317,6 @@
"domhandler": "^5.0.2", "domhandler": "^5.0.2",
"parse5": "^7.0.0" "parse5": "^7.0.0"
} }
},
"parse5-parser-stream": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
"integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
"requires": {
"parse5": "^7.0.0"
}
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"undici": {
"version": "6.19.7",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz",
"integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A=="
},
"whatwg-encoding": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
"integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
"requires": {
"iconv-lite": "0.6.3"
}
},
"whatwg-mimetype": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
"integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="
} }
} }
} }

View File

@ -531,6 +531,20 @@
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
}, },
{
"name": "Printed Matter St. Marks",
"address": "38 St. Marks Pl",
"city": "New York",
"state": "NY",
"postcode": "10003",
"description": "",
"lat": "40.728418",
"long": "-73.987515",
"country": "USA",
"website": "https://www.printedmatter.org/locations/st-marks",
"events": "Yes",
"cafe": "No"
},
{ {
"name": "192 Books", "name": "192 Books",
"address": "192 10th Ave", "address": "192 10th Ave",
@ -617,15 +631,15 @@
}, },
{ {
"name": "Terrace Books", "name": "Terrace Books",
"address": "1624 10th Ave", "address": "242 Prospect Park West",
"city": "Brooklyn", "city": "Brooklyn",
"state": "NY", "state": "NY",
"postcode": "11215", "postcode": "11215",
"description": "", "description": "",
"lat": "40.658837917110674", "lat": "40.6594197",
"long": "-73.97862196042948", "long": "-73.9815551",
"country": "USA", "country": "USA",
"website": "https://www.communitybookstore.net/", "website": "https://www.communitybookstore.net/terrace-books",
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
}, },
@ -1233,13 +1247,13 @@
}, },
{ {
"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.7149679450257", "lat": "40.71799108242515",
"long": "-73.99957025134032", "long": "-73.98821173877292",
"country": "USA", "country": "USA",
"website": "https://www.yuandmebooks.com/", "website": "https://www.yuandmebooks.com/",
"events": "Yes", "events": "Yes",
@ -1311,7 +1325,7 @@
"lat": "40.73319717015666", "lat": "40.73319717015666",
"long": "-73.95519994232862", "long": "-73.95519994232862",
"country": "USA", "country": "USA",
"website": "https://www.heykidscomics.net/", "website": "https://www.heykidscomics.net/the-store",
"events": "Yes", "events": "Yes",
"cafe": "No" "cafe": "No"
}, },
@ -1580,103 +1594,5 @@
"website": "https://www.toposbookstore.com/", "website": "https://www.toposbookstore.com/",
"events": "?", "events": "?",
"cafe": "No" "cafe": "No"
},
{
"name": "The World's Borough Bookshop",
"address": "3406 73rd St",
"city": "Queens",
"state": "NY",
"postcode": "11372",
"description": "",
"lat": "40.752560480822325",
"long": "-73.89347162552359",
"country": "USA",
"website": "https://www.theworldsboroughbookshop.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Bibliotheque",
"address": "54 Mercer St",
"city": "New York",
"state": "NY",
"postcode": "10013",
"description": "",
"lat": "40.72186506996318",
"long": "-74.0008362961281",
"country": "USA",
"website": "https://www.bibliothequenyc.com/",
"events": "No",
"cafe": "Yes"
},
{
"name": "Shakespeare & Company (Manhattan Valley/Columbia University)",
"address": "2736 Broadway",
"city": "New York",
"state": "NY",
"postcode": "10025",
"description": "",
"lat": "40.800259699774",
"long": "-73.96768731230581",
"country": "USA",
"website": "https://shop.shakeandco.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Liz's Book Bar",
"address": "315 Smith St",
"city": "Brooklyn",
"state": "NY",
"postcode": "11231",
"description": "",
"lat": "40.68121559370364",
"long": "-73.99405889694158",
"country": "USA",
"website": "https://www.lizsbookbar.com/",
"events": "Yes",
"cafe": "Yes"
},
{
"name": "Honey Moon Coffee Shop",
"address": "517 Onderdonk Ave",
"city": "Ridgewood",
"state": "NY",
"postcode": "11385",
"description": "Sells a selection of books curated by Molasses Books in the back.",
"lat": "40.70609496846375",
"long": "-73.91045381955465",
"country": "USA",
"website": "https://honeymooncoffee.shop/",
"events": "Yes",
"cafe": "Yes"
},
{
"name": "Sullaluna Bistrot & Bookshop",
"address": "41 Carmine St",
"city": "New York",
"state": "NY",
"postcode": "10014",
"description": "Books for sale throughout the bistro.",
"lat": "40.73011439736975",
"long": "-74.00356955956845",
"country": "USA",
"website": "https://www.instagram.com/sullaluna.nyc/",
"events": "Yes",
"cafe": "Yes"
},
{
"name": "The Nonbinarian Bookstore",
"address": "1130 President St",
"city": "Brooklyn",
"state": "NY",
"postcode": "11225",
"description": "",
"lat": "40.66811970169711",
"long": "-73.953206317044",
"country": "USA",
"website": "https://thenonbinarian.gay/",
"events": "Yes",
"cafe": "No"
} }
] ]