Switched to Hugo
6
.gitignore
vendored
|
@ -1,4 +1,2 @@
|
||||||
venv/
|
.hugo_build.lock
|
||||||
log.txt
|
public
|
||||||
src/rss.xml
|
|
||||||
__pycache__/
|
|
||||||
|
|
3
.gitmodules
vendored
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "themes/hugo-xterm"]
|
||||||
|
path = themes/hugo-xterm
|
||||||
|
url = https://github.com/manid2/hugo-xterm.git
|
5
archetypes/default.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
+++
|
||||||
|
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||||
|
date = {{ .Date }}
|
||||||
|
draft = true
|
||||||
|
+++
|
19
content/_index.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
+++
|
||||||
|
title = "Vanten"
|
||||||
|
date = "2024-07-20T22:26:48+02:00"
|
||||||
|
draft = false
|
||||||
|
+++
|
||||||
|
|
||||||
|
# Hii
|
||||||
|
|
||||||
|
I'm vanten. A software engineer and child from Sweden.
|
||||||
|
|
||||||
|
|
||||||
|
My geekcode:
|
||||||
|
```text
|
||||||
|
-----BEGIN GEEK CODE BLOCK-----
|
||||||
|
version: 3.1
|
||||||
|
gcs/gg d--(---) s+ a---- C++ UL+++ P L+++>++++ E- W++ N+ o? K? w--
|
||||||
|
O? M- V? PS++ PE-- Y+ PGP++ t- 5? X? R tv b+ DI? D+ G e-- h! r-
|
||||||
|
------END GEEK CODE BLOCK------
|
||||||
|
```
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 253 B |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 820 B After Width: | Height: | Size: 820 B |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 531 B After Width: | Height: | Size: 531 B |
Before Width: | Height: | Size: 439 B After Width: | Height: | Size: 439 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 581 B After Width: | Height: | Size: 581 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 471 B After Width: | Height: | Size: 471 B |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 411 B After Width: | Height: | Size: 411 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 483 B After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
5
content/posts/_index.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
+++
|
||||||
|
title = 'Posts'
|
||||||
|
date = 2024-07-21T14:52:15+02:00
|
||||||
|
draft = true
|
||||||
|
+++
|
12
content/posts/postage.md
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
+++
|
||||||
|
title = "Postage"
|
||||||
|
date = "2024-07-20T22:26:48+02:00"
|
||||||
|
tags = ["lowlevel"]
|
||||||
|
draft = true
|
||||||
|
summary = "IPoL (IP over Letters) + kernel module == true"
|
||||||
|
+++
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
I was talking with some friends...
|
||||||
|
|
21
hugo.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
baseURL = 'https://vanten-s.com/'
|
||||||
|
languageCode = 'en-us'
|
||||||
|
title = 'Vanten'
|
||||||
|
theme = 'vanten'
|
||||||
|
|
||||||
|
[markup]
|
||||||
|
[markup.highlight]
|
||||||
|
anchorLineNos = false
|
||||||
|
codeFences = true
|
||||||
|
guessSyntax = false
|
||||||
|
hl_Lines = ''
|
||||||
|
hl_inline = false
|
||||||
|
lineAnchors = ''
|
||||||
|
lineNoStart = 1
|
||||||
|
lineNos = true
|
||||||
|
lineNumbersInTable = true
|
||||||
|
noClasses = false
|
||||||
|
noHl = false
|
||||||
|
style = 'false'
|
||||||
|
tabWidth = 4
|
||||||
|
|
51
main.py
|
@ -1,51 +0,0 @@
|
||||||
import frmWrk.website as website
|
|
||||||
import feed_generator
|
|
||||||
import pathlib
|
|
||||||
from time import sleep
|
|
||||||
|
|
||||||
article_base_html = ""
|
|
||||||
with open("src/article.html") as article_html:
|
|
||||||
article_base_html = article_html.read()
|
|
||||||
|
|
||||||
articles_base_html = ""
|
|
||||||
with open("src/articles.html") as articles_html:
|
|
||||||
articles_base_html = articles_html.read()
|
|
||||||
|
|
||||||
def article_list():
|
|
||||||
article_paths = (pathlib.Path.cwd() / "feed_articles").glob("[0-9]*")
|
|
||||||
article_paths_sorted = sorted(article_paths, key=lambda x: x.name, reverse=True)
|
|
||||||
|
|
||||||
metadatas = [(feed_generator.convert_markdown_to_html(path)[1], path.parts[-1]) for path in article_paths_sorted]
|
|
||||||
print(metadatas)
|
|
||||||
|
|
||||||
elements = ['<li><a href="articles.html?{guid}">{title} ({guid})</a></li>'.format(title=metadata[0]["title"][0], guid=metadata[1]) for metadata in metadatas]
|
|
||||||
|
|
||||||
return articles_base_html.format(elements="\n".join(elements))
|
|
||||||
|
|
||||||
def article(path):
|
|
||||||
if not "?" in path:
|
|
||||||
return article_list()
|
|
||||||
|
|
||||||
article_name = path.split("?")[1]
|
|
||||||
article_html = feed_generator.convert_markdown_to_html(pathlib.Path("feed_articles") / article_name)
|
|
||||||
|
|
||||||
return article_base_html.format(body=article_html[0])
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
webserver = website.WebServer("", 3000, "./src", overwrites={"/articles.html": article})
|
|
||||||
|
|
||||||
webserver.start()
|
|
||||||
|
|
||||||
while True:
|
|
||||||
feed = feed_generator.make_rss_feed("feed_articles", "Vantens", "https://vanten-s.com/", "Vantens personal feed")
|
|
||||||
with open("src/rss.xml", "w") as f:
|
|
||||||
f.write(feed)
|
|
||||||
|
|
||||||
try:
|
|
||||||
sleep(15)
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
break
|
|
||||||
|
|
||||||
webserver.close()
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
markdown
|
|
|
@ -0,0 +1 @@
|
||||||
|
{"Target":"styles.css","MediaType":"text/css","Data":{}}
|
7
shell.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{ pkgs ? import <nixpkgs> {} }:
|
||||||
|
|
||||||
|
pkgs.mkShell rec {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
hugo
|
||||||
|
];
|
||||||
|
}
|
|
@ -1,73 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<title>Article</title>
|
|
||||||
<link rel="stylesheet" href="assets/main.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/fontawesome.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/brands.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/solid.css">
|
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/hack-font/3.3.0/web/hack.min.css">
|
|
||||||
<link rel="icon" href="/assets/favicon.png">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="body" style="padding-right: 5em; max-width: 35em;">
|
|
||||||
{body}
|
|
||||||
</div>
|
|
||||||
<ul class="navbar">
|
|
||||||
<li>
|
|
||||||
<a href="mailto:vanten-s@vanten-s.com">
|
|
||||||
<span class="popup">Mail</span>
|
|
||||||
<i class="fa-solid fa-envelope fa"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a rel="me" href="https://fedi.vanten-s.com/@vanten_s">
|
|
||||||
<span class="popup">Mastodon</span>
|
|
||||||
<i class="fa-brands fa-mastodon fa"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="key.asc">
|
|
||||||
<span class="popup">GPG Key</span>
|
|
||||||
<i class="fa-solid fa-key"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://matrix.to/#/@vanten-s:matrix.org">
|
|
||||||
<span class="popup">Matrix</span>
|
|
||||||
<i class="fa-solid fa-comment"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://forgejo.vanten-s.com/vanten-s">
|
|
||||||
<span class="popup">Forgejo</span>
|
|
||||||
<i class="fa-brands fa-git-alt"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="rss.xml">
|
|
||||||
<span class="popup">RSS Feed</span>
|
|
||||||
<i class="fa-solid fa-square-rss"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="articles.html">
|
|
||||||
<span class="popup">Posts</span>
|
|
||||||
<i class="fa-solid fa-blog"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/">
|
|
||||||
<span class="popup">Home</span>
|
|
||||||
<i class="fa-solid fa-home"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/uwubible.txt">
|
|
||||||
<span class="popup">UwU Bible</span>
|
|
||||||
<i class="fa-solid fa-book-bible"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,72 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<title>Articles</title>
|
|
||||||
<link rel="stylesheet" href="assets/main.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/fontawesome.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/brands.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/solid.css">
|
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/hack-font/3.3.0/web/hack.min.css">
|
|
||||||
<link rel="icon" href="/assets/favicon.png">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Posts</h1>
|
|
||||||
{elements}
|
|
||||||
<ul class="navbar">
|
|
||||||
<li>
|
|
||||||
<a href="mailto:vanten-s@vanten-s.com">
|
|
||||||
<span class="popup">Mail</span>
|
|
||||||
<i class="fa-solid fa-envelope fa"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a rel="me" href="https://fedi.vanten-s.com/@vanten_s">
|
|
||||||
<span class="popup">Mastodon</span>
|
|
||||||
<i class="fa-brands fa-mastodon fa"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="key.asc">
|
|
||||||
<span class="popup">GPG Key</span>
|
|
||||||
<i class="fa-solid fa-key"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://matrix.to/#/@vanten-s:matrix.org">
|
|
||||||
<span class="popup">Matrix</span>
|
|
||||||
<i class="fa-solid fa-comment"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://forgejo.vanten-s.com/vanten-s">
|
|
||||||
<span class="popup">Forgejo</span>
|
|
||||||
<i class="fa-brands fa-git-alt"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="rss.xml">
|
|
||||||
<span class="popup">RSS Feed</span>
|
|
||||||
<i class="fa-solid fa-square-rss"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="articles.html">
|
|
||||||
<span class="popup">Posts</span>
|
|
||||||
<i class="fa-solid fa-blog"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/">
|
|
||||||
<span class="popup">Home</span>
|
|
||||||
<i class="fa-solid fa-home"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/uwubible.txt">
|
|
||||||
<span class="popup">UwU Bible</span>
|
|
||||||
<i class="fa-solid fa-book-bible"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Before Width: | Height: | Size: 2.1 KiB |
6372
src/assets/fontAwesome/css/fontawesome.css
vendored
|
@ -1,19 +0,0 @@
|
||||||
/*!
|
|
||||||
* Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com
|
|
||||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
* Copyright 2023 Fonticons, Inc.
|
|
||||||
*/
|
|
||||||
:root, :host {
|
|
||||||
--fa-style-family-classic: 'Font Awesome 6 Free';
|
|
||||||
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Font Awesome 6 Free';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
font-display: block;
|
|
||||||
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
|
||||||
|
|
||||||
.fas,
|
|
||||||
.fa-solid {
|
|
||||||
font-weight: 900; }
|
|
|
@ -1,120 +0,0 @@
|
||||||
:root {
|
|
||||||
--base: #1e1e2e;
|
|
||||||
--mantle: #181825;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--link: #94e2d5;
|
|
||||||
--surface: #313244;
|
|
||||||
--pink: #f5c2e7;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: Hack, monospace;
|
|
||||||
background-color: var(--mantle);
|
|
||||||
color: var(--text);
|
|
||||||
padding: 5em;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
padding: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar {
|
|
||||||
/* Positioning */
|
|
||||||
top: 0;
|
|
||||||
margin-top: 0;
|
|
||||||
right: 0;
|
|
||||||
position: fixed;
|
|
||||||
|
|
||||||
/* Size */
|
|
||||||
height: 100vh;
|
|
||||||
width: 4.5em;
|
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
/* Markers */
|
|
||||||
list-style-type: none;
|
|
||||||
|
|
||||||
background-color: var(--surface);
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar > li {
|
|
||||||
width: 3em;
|
|
||||||
height: 3em;
|
|
||||||
margin: 0.5em;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
background-color: var(--mantle);
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
border-radius: 100%;
|
|
||||||
outline: var(--pink) 0.2rem solid;
|
|
||||||
transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar > li:hover {
|
|
||||||
border-radius: 30%;
|
|
||||||
background-color: var(--link);
|
|
||||||
outline: var(--pink) 0 solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar > li:hover > a {
|
|
||||||
color: var(--base);
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar > li > a > i {
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar > li > a > .popup {
|
|
||||||
position: absolute;
|
|
||||||
right: 6em;
|
|
||||||
scale: 0;
|
|
||||||
background-color: var(--base);
|
|
||||||
color: var(--link);
|
|
||||||
padding: .5em;
|
|
||||||
white-space: nowrap;
|
|
||||||
font-weight: bold;
|
|
||||||
border-radius: 0.75rem;
|
|
||||||
outline: var(--pink) 0.2rem solid;
|
|
||||||
transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar > li:hover > a > .popup {
|
|
||||||
scale: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: var(--link);
|
|
||||||
text-decoration: underline var(--mantle) auto;
|
|
||||||
transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline var(--link) auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons {
|
|
||||||
display: flex;
|
|
||||||
width: 40em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons > img {
|
|
||||||
padding: 0.15em;
|
|
||||||
width: 88px;
|
|
||||||
height: 31px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons > a > img {
|
|
||||||
padding: 0.15em;
|
|
||||||
width: 88px;
|
|
||||||
height: 31px;
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGooKx47UKeIGxy8uqgaQzsJ48n/6hC/gtmHls+3f0a9 svante@nixos
|
|
172
src/index.html
|
@ -1,172 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<title>Homepage</title>
|
|
||||||
<link rel="stylesheet" href="assets/main.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/fontawesome.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/brands.css">
|
|
||||||
<link rel="stylesheet" href="assets/fontAwesome/css/solid.css">
|
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/hack-font/3.3.0/web/hack.min.css">
|
|
||||||
<link rel="icon" href="/assets/favicon.png">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Vanten</h1>
|
|
||||||
<p>Software dev, OSS enthusiast, server admin and 13 year old</p>
|
|
||||||
<p>Maybe script kiddie idk</p>
|
|
||||||
|
|
||||||
<h3>Weird computer thingys that I know</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Rust </li>
|
|
||||||
<li>Python </li>
|
|
||||||
<li>Some C++ </li>
|
|
||||||
<li>Java </li>
|
|
||||||
<li>Bash </li>
|
|
||||||
<li>Processor design </li>
|
|
||||||
<li>Server administration</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Projects</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://forgejo.vanten-s.com/vanten-s/vanten-s.com">This website</a> </li>
|
|
||||||
<li><a href="https://forgejo.vanten-s.com/vanten-s/e2e-irc" >An end-to-end encrypted IRC bouncer</a></li>
|
|
||||||
<li><a href="https://forgejo.vanten-s.com/vanten-s/plonkus" >The Plonkus language</a> </li>
|
|
||||||
<li><a href="https://github.com/vanten-s/frmWrk" >The webserver this is running on</a> </li>
|
|
||||||
<li><a href="https://github.com/vanten-s/8bit-computer" >Pretty simple 8 bit processor</a> </li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Weird things that run on my server</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="rss.xml" >RSS feed</a></li>
|
|
||||||
<li><a href="https://forgejo.vanten-s.com/">Forgejo</a> </li>
|
|
||||||
<li><a href="https://fedi.vanten-s.com" >Firefish</a></li>
|
|
||||||
<li><a href="ircs://irc.vanten-s.com" >IRC</a> </li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|_|0|_|<br>
|
|
||||||
|_|_|0|<br>
|
|
||||||
|0|0|0|<br>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="buttons">
|
|
||||||
<img src="buttons/animegay.gif">
|
|
||||||
<img src="buttons/antifa.gif">
|
|
||||||
<img src="buttons/anythingbut.gif">
|
|
||||||
<img src="buttons/crushit.gif">
|
|
||||||
<img src="buttons/dbd.gif">
|
|
||||||
<img src="buttons/ddg.gif">
|
|
||||||
<img src="buttons/discord-no-way.gif">
|
|
||||||
<img src="buttons/doomrl.gif">
|
|
||||||
<a href="https://cyber.dabamos.de/88x31/">
|
|
||||||
<img src="buttons/eightyeight.gif">
|
|
||||||
</a>
|
|
||||||
<img src="buttons/evilnet.gif">
|
|
||||||
<img src="buttons/fediverse.gif">
|
|
||||||
<img src="buttons/fspeech.gif">
|
|
||||||
<img src="buttons/graphic-design.gif">
|
|
||||||
<img src="buttons/hehimm.png">
|
|
||||||
<img src="buttons/home-assistant.gif">
|
|
||||||
<a href="https://leap123.neocities.org">
|
|
||||||
<img src="buttons/leap123.gif">
|
|
||||||
</a>
|
|
||||||
<img src="buttons/linux-now.gif">
|
|
||||||
<a href="https://neocities.org">
|
|
||||||
<img src="buttons/neocities.gif">
|
|
||||||
</a>
|
|
||||||
<img src="buttons/nft.gif">
|
|
||||||
<img src="buttons/nocookie.gif">
|
|
||||||
<img src="buttons/no_fkn_thanks.gif">
|
|
||||||
<img src="buttons/onyx.gif">
|
|
||||||
<img src="buttons/say-no-to-web3.gif">
|
|
||||||
<img src="buttons/scouting.gif">
|
|
||||||
<img src="buttons/tiktok.gif">
|
|
||||||
<img src="buttons/transnow2.gif">
|
|
||||||
<img src="buttons/ublock.png">
|
|
||||||
<img src="buttons/vanten-s.gif">
|
|
||||||
<img src="buttons/vim_a.gif">
|
|
||||||
<img src="buttons/vim.gif">
|
|
||||||
<img src="buttons/vim.vialle.love.anim.gif">
|
|
||||||
<img src="buttons/web11badge.gif">
|
|
||||||
<img src="buttons/web3.gif">
|
|
||||||
<img src="buttons/webpassion.gif">
|
|
||||||
<img src="buttons/wikipedia.gif">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<ul class="navbar">
|
|
||||||
<li>
|
|
||||||
<a href="mailto:vanten-s@vanten-s.com">
|
|
||||||
<span class="popup">Mail</span>
|
|
||||||
<i class="fa-solid fa-envelope fa"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a rel="me" href="https://fedi.vanten-s.com/@vanten_s">
|
|
||||||
<span class="popup">Mastodon</span>
|
|
||||||
<i class="fa-brands fa-mastodon fa"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="key.asc">
|
|
||||||
<span class="popup">GPG Key</span>
|
|
||||||
<i class="fa-solid fa-key"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://matrix.to/#/@vanten-s:matrix.org">
|
|
||||||
<span class="popup">Matrix</span>
|
|
||||||
<i class="fa-solid fa-comment"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://forgejo.vanten-s.com/vanten-s">
|
|
||||||
<span class="popup">Forgejo</span>
|
|
||||||
<i class="fa-brands fa-git-alt"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="rss.xml">
|
|
||||||
<span class="popup">RSS Feed</span>
|
|
||||||
<i class="fa-solid fa-square-rss"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="articles.html">
|
|
||||||
<span class="popup">Posts</span>
|
|
||||||
<i class="fa-solid fa-blog"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/">
|
|
||||||
<span class="popup">Home</span>
|
|
||||||
<i class="fa-solid fa-home"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="/uwubible.txt">
|
|
||||||
<span class="popup">UwU Bible</span>
|
|
||||||
<i class="fa-solid fa-book-bible"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://fediring.net/next?host=vanten-s.com">
|
|
||||||
<span class="popup">Next</span>
|
|
||||||
<i class="fa-solid fa-up-long"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://fediring.net/previous?host=vanten-s.com">
|
|
||||||
<span class="popup">Previous</span>
|
|
||||||
<i class="fa-solid fa-down-long"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://fediring.net">
|
|
||||||
<span class="popup">Fediring</span>
|
|
||||||
<i class="fa-solid fa-circle-nodes"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
41
src/key.asc
|
@ -1,41 +0,0 @@
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
mQGNBGSr42ABDAC4mZ8Li7Z8P2BHkAU8Rku5og9nmUn19hGQIXQuI+8/e7MAlKOm
|
|
||||||
E74d83S5ZY0E/42Ne5w0+JpCrS+sDZio0sNmr62S5OMYBWVGdfJXIedG9WaMzRyg
|
|
||||||
ZwoN1qdFGnKJmK/f7qJpCwHLvJRLq50L0XNVclynBycCwuF3baSuZUf5jAkbTAFQ
|
|
||||||
oYECr/kQlBh2Cectv4h3TfeW0WS4OU5KCVWD17Rn0qu56ahlMhFic8K7LkU7CPT2
|
|
||||||
1a0xsFyOixy/j5KmTF2Oit6uZU8vr59SydiVfaris+fal1FSeT1E1a3DmmhsXQka
|
|
||||||
sXP22+ar9tJbHwgI1200Epa1eQzIy72YVW2YDyJ8T3iEkC9q35AYxKadDLwjnUpD
|
|
||||||
zEudEtZ+g/onk0qB7TqXcnSp92kAAcXhVLGwid1tX9QhFespryZP/dawNR5F3jM1
|
|
||||||
+6fTQhCX4Yci+NEWscS1p64Kuow8SEmoaLJVfTX3fCpInGr8+6xtmOIzQ34WVqnV
|
|
||||||
9mWrO834JEpnwDkAEQEAAbQVdmFudGVuLXNAdmFudGVuLXMuY29tiQHUBBMBCAA+
|
|
||||||
FiEEWNejRYw2Vm4giKBK3jBgOWiE0/IFAmSr42ACGwMFCQPCZwAFCwkIBwIGFQoJ
|
|
||||||
CAsCBBYCAwECHgECF4AACgkQ3jBgOWiE0/LA5wv9GayoDU/Hjbdo4knmWDgsmZMe
|
|
||||||
Oq6vqIs3Z6kusAl8mRH80Hs1bWMFIPMxgbnvQhSJl4POA0kSv++Y9pR374z+yx+s
|
|
||||||
e/9BbnFLLIxLozSrGGnYU74uMQqNVV2pmCJs8hSf3VV/YwvgMIi4CeHEzUMCFFsz
|
|
||||||
RcOO0iayF0EeEtVeI6riQ5fJVk6THrSpD4hUy0h/dUSZ+wF/zZ5z1NN4n/jOw2kx
|
|
||||||
oqfDJftDBi0qYfNVBQy/RvpaBH2QWE8cCQlO7IiHo2IdPcsQZLYEINZ9PIXjvrcE
|
|
||||||
qQbHh5kc3ZG9emtHgm6BSPJlsolJ6Jo2zWkD7Bscg62JkX32JbOkpE3+T61V2I5o
|
|
||||||
TQPXvA660z6nUO9d0/3rUf8mfoRTotquiKmcjttklGRNOAnmbeAuf3Po3FzQqZA+
|
|
||||||
fLgrVECyhnURNLZ+8/KyX1K7kQ86hvd9vzt2qGjfaA0vVD8mRW9vzWJQgVhEAlf8
|
|
||||||
zfUSlGPUMRbiGBdz8t95Pz2056uOURCuc4O0ykeCuQGNBGSr42ABDADRziSWvMJe
|
|
||||||
0t+pj2dv/C1TJxez8ZH/0XoOGEcZ310IK7zv6r/oSpqGDb1438tatScsY0cl/ZZ5
|
|
||||||
+2ry2VDBTX0H2HkQKSMgdldXiOo3t1JvjLKfdowsvi77BYvLFjHOfb9HbqiiU218
|
|
||||||
arjDDnu98xYTTXu2bbvhCB6Rynfbs8ySC9I7goeC47mdDc9khN2Ofc+GZxbloYut
|
|
||||||
+Nt8U/6D2ut3wEuqEalEPo/ahpoX9guoLCF81/82fOPQCsmsKm2ta5HSOyJg1O4o
|
|
||||||
lfKzsVvhu3BkbDmJjY9alVhrD7KO5dmfGQCwiVm3eWfBr281zTXhKjgFcdeVI+sO
|
|
||||||
iQmUWcMf79hG3bdaHJmnREboFjJteefrJEoM0N1vfqTpZ7vith57fKUicTfiQjp9
|
|
||||||
UVP/zO13b00zJ6tZnnicEbeuh74HpwX6eMTdl6epS00oihDE4RWc2qdIE0SfoOV+
|
|
||||||
8qypZSquCKfYdk1s/FAFHKRnq4znZP5VjwuXb9FR/GDwZe157OYANxUAEQEAAYkB
|
|
||||||
vAQYAQgAJhYhBFjXo0WMNlZuIIigSt4wYDlohNPyBQJkq+NgAhsMBQkDwmcAAAoJ
|
|
||||||
EN4wYDlohNPydBsL+wYUacj3fn1DvVF071z8N2a0JriUlduwx3P7inJ7pBiXOd7Y
|
|
||||||
TFW95TGuJXtOLR8XNAIpXiju9um6EGpfzpI1jH6JEIx3/Jicmm+bxkdlmKsK+b+L
|
|
||||||
cSC3qWfIMVlZZM1uJv56bcFzNlw41IwhT33UbU22wl/KzW9GrO+alxWqUIAZJPiQ
|
|
||||||
20f/9vCjN8Dn7IbeIf5ugHWivMmvNWROHKRJWkIGRA5YXxzpJbEcaaZrLErBdbO6
|
|
||||||
L1e8Rfg6dq/dDvkGANQeoHBpjMaOd4s0uOB1mLEBoYYYrr27X3G1S80O0DhtmtWh
|
|
||||||
Hmd7CgiXY8avL4xnRYFUflZzv4paVneTOnGM0699uB/T2ucy/hCnvSZLTbagomTt
|
|
||||||
7FTIbd8zWc1HRFc6xJg34/siEXzDtZ39sVCRk55EzKlUwjlMpcwZZAWOJSCngJZ+
|
|
||||||
Uk2jFhT4WnHnw+dtcoc27g/2fyFOnR0zmc5pP6BBTFO1aNW4TP59dL4aJL+RiG5L
|
|
||||||
SeRKQTIIJ325dPY0mg==
|
|
||||||
=kPFF
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
|
@ -1,32 +0,0 @@
|
||||||
fetch("./locations.json").then((locations_unparsed) => {
|
|
||||||
locations_unparsed.json().then((places) => handle_response(places));
|
|
||||||
});
|
|
||||||
|
|
||||||
function handle_response(places) {
|
|
||||||
console.log(places);
|
|
||||||
Object.keys(places).forEach(name => {
|
|
||||||
let document_element = document.createElement("li");
|
|
||||||
document_element.className = "element";
|
|
||||||
let link_element = document.createElement("a");
|
|
||||||
link_element.href = "./map.html?" + name;
|
|
||||||
link_element.innerHTML = places[name].display_name;
|
|
||||||
document_element.appendChild(link_element);
|
|
||||||
document.getElementById("search_list").appendChild(document_element);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function eliminate_results() {
|
|
||||||
let input = document.getElementById("search_bar").value;
|
|
||||||
input = input.toLowerCase();
|
|
||||||
console.log("Typed a charachter");
|
|
||||||
let x = document.getElementsByClassName('element');
|
|
||||||
|
|
||||||
for (i = 0; i < x.length; i++) {
|
|
||||||
if (!x[i].innerHTML.toLowerCase().includes(input)) {
|
|
||||||
x[i].style.display = "none";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
x[i].style.display = "list-item";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>TreeHug - Search</title>
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="./style.css" />
|
|
||||||
<link rel="icon" type="image/x-icon" href="treehug.png">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<input type="text" placeholder="Search..." id="search_bar" class="search_bar" onkeyup="eliminate_results()">
|
|
||||||
<ul id="search_list"></ul>
|
|
||||||
<script src="fetch_places.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,86 +0,0 @@
|
||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
||||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
||||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
||||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
||||||
function step(op) {
|
|
||||||
if (f) throw new TypeError("Generator is already executing.");
|
|
||||||
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
||||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
||||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
||||||
switch (op[0]) {
|
|
||||||
case 0: case 1: t = op; break;
|
|
||||||
case 4: _.label++; return { value: op[1], done: false };
|
|
||||||
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
||||||
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
||||||
default:
|
|
||||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
||||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
||||||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
||||||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
||||||
if (t[2]) _.ops.pop();
|
|
||||||
_.trys.pop(); continue;
|
|
||||||
}
|
|
||||||
op = body.call(thisArg, _);
|
|
||||||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
||||||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var RADIUS = 2000.0;
|
|
||||||
var MAX_RESULTS = 20;
|
|
||||||
var INCLUDED_TYPES = ["park"];
|
|
||||||
var map;
|
|
||||||
var pos = { lat: 30, lng: -110 };
|
|
||||||
function initMap() {
|
|
||||||
return __awaiter(this, void 0, void 0, function () {
|
|
||||||
var Map;
|
|
||||||
return __generator(this, function (_a) {
|
|
||||||
switch (_a.label) {
|
|
||||||
case 0: return [4 /*yield*/, google.maps.importLibrary("maps")];
|
|
||||||
case 1:
|
|
||||||
Map = (_a.sent()).Map;
|
|
||||||
map = new Map(document.getElementById("map"), {
|
|
||||||
center: pos,
|
|
||||||
zoom: 8,
|
|
||||||
mapId: "DEMO_MAP",
|
|
||||||
});
|
|
||||||
return [2 /*return*/];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function handle_response(places) {
|
|
||||||
var place_id = document.URL.split('?')[1];
|
|
||||||
var place = places[place_id];
|
|
||||||
var place_location = { lat: place.lat, lng: place.lng };
|
|
||||||
new google.maps.Marker({
|
|
||||||
position: place_location,
|
|
||||||
map: map,
|
|
||||||
title: place.display_name,
|
|
||||||
});
|
|
||||||
map.setCenter(place_location);
|
|
||||||
Object.keys(places).forEach(function (name) {
|
|
||||||
var document_element = document.createElement("li");
|
|
||||||
document_element.className = "element";
|
|
||||||
var link_element = document.createElement("a");
|
|
||||||
link_element.href = "./map.html?" + name;
|
|
||||||
link_element.innerHTML = places[name].display_name;
|
|
||||||
document_element.appendChild(link_element);
|
|
||||||
// @ts-ignore
|
|
||||||
document.getElementById("search_list").appendChild(document_element);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
initMap().then(function () {
|
|
||||||
fetch("./locations.json").then(function (locations_unparsed) {
|
|
||||||
locations_unparsed.json().then(function (places) { return handle_response(places); });
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,46 +0,0 @@
|
||||||
const RADIUS = 2000.0;
|
|
||||||
const MAX_RESULTS = 20;
|
|
||||||
const INCLUDED_TYPES = ["park"];
|
|
||||||
|
|
||||||
let map: google.maps.Map;
|
|
||||||
let pos: google.maps.LatLngLiteral = {lat: 30, lng: -110};
|
|
||||||
|
|
||||||
async function initMap() {
|
|
||||||
const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;
|
|
||||||
|
|
||||||
map = new Map(document.getElementById("map") as HTMLElement, {
|
|
||||||
center: pos,
|
|
||||||
zoom: 8,
|
|
||||||
mapId: "DEMO_MAP",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function handle_response(places: {[index: string]: {lat: number, lng: number, display_name: string}}) {
|
|
||||||
let place_id = document.URL.split('?')[1];
|
|
||||||
let place = places[place_id];
|
|
||||||
let place_location: google.maps.LatLngLiteral = { lat: place.lat, lng: place.lng};
|
|
||||||
new google.maps.Marker({
|
|
||||||
position: place_location,
|
|
||||||
map,
|
|
||||||
title: place.display_name,
|
|
||||||
});
|
|
||||||
map.setCenter(place_location);
|
|
||||||
|
|
||||||
Object.keys(places).forEach(name => {
|
|
||||||
let document_element = document.createElement("li");
|
|
||||||
document_element.className = "element";
|
|
||||||
let link_element = document.createElement("a");
|
|
||||||
link_element.href = "./map.html?" + name;
|
|
||||||
link_element.innerHTML = places[name].display_name;
|
|
||||||
document_element.appendChild(link_element);
|
|
||||||
// @ts-ignore
|
|
||||||
document.getElementById("search_list").appendChild(document_element);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
initMap().then(() => {
|
|
||||||
fetch("./locations.json").then((locations_unparsed) => {
|
|
||||||
locations_unparsed.json().then((places) => handle_response(places));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
"rana_bibliotek": {
|
|
||||||
"lat": 66.31144686667197,
|
|
||||||
"lng": 14.138761809521128,
|
|
||||||
"display_name": "Rana Bibliotek"
|
|
||||||
},
|
|
||||||
"nordland_fylkesbibliotek": {
|
|
||||||
"lat": 66.31132186276196,
|
|
||||||
"lng": 14.138815453697577,
|
|
||||||
"display_name": "Nordland Fylkesbibliotek"
|
|
||||||
},
|
|
||||||
"storhauge_start": {
|
|
||||||
"lat": 66.32937944214652,
|
|
||||||
"lng": 14.2029277866417,
|
|
||||||
"display_name": "Storhauge Start"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>TreeHug - Map</title>
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
|
|
||||||
<script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
|
|
||||||
<script src="node_modules/@googlemaps/markerclusterer/dist/index.min.js"></script>
|
|
||||||
|
|
||||||
<link rel="stylesheet" type="text/css" href="./style.css" />
|
|
||||||
<link rel="icon" type="image/x-icon" href="treehug.png">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="map"></div>
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
<script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
|
|
||||||
({key: "AIzaSyCneCqjzobnZ-ksYh85eosk1whovucTjQE", v: "weekly"});</script>
|
|
||||||
<script type="module" src="./index.js"></script>
|
|
||||||
|
|
||||||
<input type="text" placeholder="Search..." id="search_bar" class="search_bar" onkeyup="eliminate_results()">
|
|
||||||
<ul id="search_list"></ul>
|
|
||||||
<script>
|
|
||||||
function eliminate_results() {
|
|
||||||
let input = document.getElementById("search_bar").value;
|
|
||||||
input = input.toLowerCase();
|
|
||||||
console.log("Typed a charachter");
|
|
||||||
let x = document.getElementsByClassName('element');
|
|
||||||
|
|
||||||
for (let i = 0; i < x.length; i++) {
|
|
||||||
if (!x[i].innerHTML.toLowerCase().includes(input)) {
|
|
||||||
x[i].style.display = "none";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
x[i].style.display = "list-item";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
40
src/treehug/node_modules/.package-lock.json
generated
vendored
|
@ -1,40 +0,0 @@
|
||||||
{
|
|
||||||
"name": "TreeHug",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"node_modules/@googlemaps/markerclusterer": {
|
|
||||||
"version": "2.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@googlemaps/markerclusterer/-/markerclusterer-2.5.0.tgz",
|
|
||||||
"integrity": "sha512-WpHLCZxP7QmB4Hc5kyODGdTfJPsZiOIbcvbYhcS/VeiRNDVjf6CRQ8ViQjwrG5OySC66rtOdj4RVhUXsd1tNTQ==",
|
|
||||||
"dependencies": {
|
|
||||||
"fast-deep-equal": "^3.1.3",
|
|
||||||
"supercluster": "^8.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/google.maps": {
|
|
||||||
"version": "3.54.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.54.6.tgz",
|
|
||||||
"integrity": "sha512-cTGbsddDgEwZ/6xPywI7HKbeYJkfXFg92HdYnlE0HO3gT/030CVdUHLO2uQOkEo0YMp6TRPqTlAnRGNbQJu8vw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/fast-deep-equal": {
|
|
||||||
"version": "3.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
|
||||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
|
|
||||||
},
|
|
||||||
"node_modules/kdbush": {
|
|
||||||
"version": "4.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
|
|
||||||
"integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA=="
|
|
||||||
},
|
|
||||||
"node_modules/supercluster": {
|
|
||||||
"version": "8.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz",
|
|
||||||
"integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==",
|
|
||||||
"dependencies": {
|
|
||||||
"kdbush": "^4.0.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
202
src/treehug/node_modules/@googlemaps/markerclusterer/LICENSE
generated
vendored
|
@ -1,202 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
105
src/treehug/node_modules/@googlemaps/markerclusterer/README.md
generated
vendored
|
@ -1,105 +0,0 @@
|
||||||
# Google Maps JavaScript MarkerClusterer
|
|
||||||
|
|
||||||
[![npm](https://img.shields.io/npm/v/@googlemaps/markerclusterer)](https://www.npmjs.com/package/@googlemaps/markerclusterer)
|
|
||||||
![Build](https://github.com/googlemaps/js-markerclusterer/workflows/Test/badge.svg)
|
|
||||||
![Release](https://github.com/googlemaps/js-markerclusterer/workflows/Release/badge.svg)
|
|
||||||
[![codecov](https://codecov.io/gh/googlemaps/js-markerclusterer/branch/main/graph/badge.svg)](https://codecov.io/gh/googlemaps/js-markerclusterer)
|
|
||||||
![GitHub contributors](https://img.shields.io/github/contributors/googlemaps/js-markerclusterer?color=green)
|
|
||||||
[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
|
|
||||||
[![](https://github.com/jpoehnelt/in-solidarity-bot/raw/main/static//badge-flat.png)](https://github.com/apps/in-solidarity)
|
|
||||||
|
|
||||||
## Description
|
|
||||||
|
|
||||||
The library creates and manages per-zoom-level clusters for large amounts of markers.
|
|
||||||
|
|
||||||
[**Try the demo**](https://googlemaps.github.io/js-markerclusterer/public/defaults/)
|
|
||||||
|
|
||||||
![screenshot](https://user-images.githubusercontent.com/3392975/135143029-20abd824-0f3e-4e28-bad3-327acf7aec04.png)
|
|
||||||
|
|
||||||
See the [history section](#history) and [migration section](#migration) for how this library relates to [@google/markerclusterer][@google/markerclusterer] and [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus].
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
Available via npm as the package [@googlemaps/markerclusterer](https://www.npmjs.com/package/@googlemaps/markerclusterer).
|
|
||||||
|
|
||||||
```
|
|
||||||
npm i @googlemaps/markerclusterer
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternativly you may add the umd package directly to the html document using the unpkg link.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="https://unpkg.com/@googlemaps/markerclusterer/dist/index.min.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
When adding via unpkg, the `MarkerClusterer` can be accessed at `markerClusterer.MarkerClusterer`.
|
|
||||||
|
|
||||||
#### TypeScript
|
|
||||||
|
|
||||||
This library uses the official TypeScript typings for Google Maps Platform, [@types/google.maps](https://www.npmjs.com/package/@types/google.maps).
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm i -D @types/google.maps
|
|
||||||
```
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
The [reference documentation](https://googlemaps.github.io/js-markerclusterer/) is generated from the TypeScript definitions.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```js
|
|
||||||
import { MarkerClusterer } from "@googlemaps/markerclusterer";
|
|
||||||
|
|
||||||
// use default algorithm and renderer
|
|
||||||
const markerCluster = new MarkerClusterer({ map, markers });
|
|
||||||
```
|
|
||||||
|
|
||||||
View the package in action:
|
|
||||||
|
|
||||||
- [Algorithm Comparisons](https://googlemaps.github.io/js-markerclusterer/public/algorithms) - This example demonstrates the different algorithms. Please note that spacing and many other options can be changed for each algorithm.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- [Renderer Usage](https://googlemaps.github.io/js-markerclusterer/public/renderers) - This example demonstrates different renderers similar to the image below.
|
|
||||||
|
|
||||||
![Screen Shot 2021-09-28 at 1 41 06 PM](https://user-images.githubusercontent.com/3392975/135154898-a5abb5a4-3022-44e0-92d2-5dcefa247e87.png)
|
|
||||||
|
|
||||||
## History
|
|
||||||
|
|
||||||
This library has a heritage in [@google/markerclusterer][@google/markerclusterer] and [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus], originally made available on [code.google.com](https://code.google.com/archive/) and then transferred to GitHub at https://github.com/googlemaps/v3-utility-library. The following is an approximate timeline.
|
|
||||||
|
|
||||||
- 201X - [@google/markerclusterer][@google/markerclusterer] was created.
|
|
||||||
- 201X - [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus] was created.
|
|
||||||
- 2019 - Libraries were published to NPM.
|
|
||||||
- 2019 - [@google/markerclusterer][@google/markerclusterer] was deprecated for [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus].
|
|
||||||
- 2020 - [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus] was refactored to TypeScript.
|
|
||||||
- 2020 - [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus] was moved to a separate repository.
|
|
||||||
- 2021 - [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus] was rewritten as [@googlemaps/markerclusterer (**new**)][@googlemaps/markerclusterer].
|
|
||||||
- TBD - [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus] is deprecated for [@googlemaps/markerclusterer (**new**)][@googlemaps/markerclusterer].
|
|
||||||
|
|
||||||
## Migration
|
|
||||||
|
|
||||||
The API of [@googlemaps/markerclusterer][@googlemaps/markerclusterer] has changed in a number of ways from [@googlemaps/markerclustererplus][@googlemaps/markerclustererplus].
|
|
||||||
|
|
||||||
- The `MarkerClusterer` class now accepts an `algorithm` and `renderer` parameter to allow for more flexibility. The interface looks like the following:
|
|
||||||
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
algorithm?: Algorithm;
|
|
||||||
map?: google.maps.Map;
|
|
||||||
markers?: google.maps.Marker[];
|
|
||||||
renderer?: Renderer;
|
|
||||||
onClusterClick?: onClusterClickHandler;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- The `MarkerClusterer` accepts a single options argument instead of positional parameters.
|
|
||||||
- The traditional `GridAlgorithm` is still supported, **but is not the default**. The default is [supercluster](https://www.npmjs.com/package/supercluster) which uses [k-d trees](https://en.wikipedia.org/wiki/K-d_tree) for improved performance.
|
|
||||||
- Styling of clusters has been simplifed and moved to the renderer interface.
|
|
||||||
- The `MarkerClusterer` class is still an instance of `google.maps.OverlayView`, but uses `google.maps.Marker`s instead of `google.maps.Overlay` to render the clusters. This solves issues related to the usage of map panes and click handlers.
|
|
||||||
- @googlemaps/markerclusterer supports Marker and Map [a11y improvements](https://cloud.google.com/blog/products/maps-platform/improved-accessibility-maps-javascript-api).
|
|
||||||
|
|
||||||
[@googlemaps/markerclustererplus]: https://www.npmjs.com/package/@googlemaps/markerclustererplus
|
|
||||||
[@google/markerclusterer]: https://www.npmjs.com/package/@google/markerclusterer
|
|
||||||
[@googlemaps/markerclusterer]: https://www.npmjs.com/package/@googlemaps/markerclusterer
|
|
113
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/core.d.ts
generated
vendored
|
@ -1,113 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/// <reference types="google.maps" />
|
|
||||||
import { Cluster } from "../cluster";
|
|
||||||
import { Marker } from "../marker-utils";
|
|
||||||
export interface AlgorithmInput {
|
|
||||||
/**
|
|
||||||
* The map containing the markers and clusters.
|
|
||||||
*/
|
|
||||||
map: google.maps.Map;
|
|
||||||
/**
|
|
||||||
* An array of markers to be clustered.
|
|
||||||
*
|
|
||||||
* There are some specific edge cases to be aware of including the following:
|
|
||||||
* * Markers that are not visible.
|
|
||||||
*/
|
|
||||||
markers: Marker[];
|
|
||||||
/**
|
|
||||||
* The `mapCanvasProjection` enables easy conversion from lat/lng to pixel.
|
|
||||||
*
|
|
||||||
* @see [MapCanvasProjection](https://developers.google.com/maps/documentation/javascript/reference/overlay-view#MapCanvasProjection)
|
|
||||||
*/
|
|
||||||
mapCanvasProjection: google.maps.MapCanvasProjection;
|
|
||||||
}
|
|
||||||
export interface AlgorithmOutput {
|
|
||||||
/**
|
|
||||||
* The clusters returned based upon the {@link AlgorithmInput}.
|
|
||||||
*/
|
|
||||||
clusters: Cluster[];
|
|
||||||
/**
|
|
||||||
* A boolean flag indicating that the clusters have not changed.
|
|
||||||
*/
|
|
||||||
changed?: boolean;
|
|
||||||
}
|
|
||||||
export interface Algorithm {
|
|
||||||
/**
|
|
||||||
* Calculates an array of {@link Cluster}.
|
|
||||||
*/
|
|
||||||
calculate: ({ markers, map }: AlgorithmInput) => AlgorithmOutput;
|
|
||||||
}
|
|
||||||
export interface AlgorithmOptions {
|
|
||||||
maxZoom?: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
export declare abstract class AbstractAlgorithm implements Algorithm {
|
|
||||||
protected maxZoom: number;
|
|
||||||
constructor({ maxZoom }: AlgorithmOptions);
|
|
||||||
/**
|
|
||||||
* Helper function to bypass clustering based upon some map state such as
|
|
||||||
* zoom, number of markers, etc.
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* cluster({markers, map}: AlgorithmInput): Cluster[] {
|
|
||||||
* if (shouldBypassClustering(map)) {
|
|
||||||
* return this.noop({markers})
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
protected noop<T extends Pick<AlgorithmInput, "markers">>({ markers, }: T): Cluster[];
|
|
||||||
/**
|
|
||||||
* Calculates an array of {@link Cluster}. Calculate is separate from
|
|
||||||
* {@link cluster} as it does preprocessing on the markers such as filtering
|
|
||||||
* based upon the viewport as in {@link AbstractViewportAlgorithm}. Caching
|
|
||||||
* and other optimizations can also be done here.
|
|
||||||
*/
|
|
||||||
abstract calculate({ markers, map }: AlgorithmInput): AlgorithmOutput;
|
|
||||||
/**
|
|
||||||
* Clusters the markers and called from {@link calculate}.
|
|
||||||
*/
|
|
||||||
protected abstract cluster({ markers, map }: AlgorithmInput): Cluster[];
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
export interface ViewportAlgorithmOptions extends AlgorithmOptions {
|
|
||||||
/**
|
|
||||||
* The number of pixels to extend beyond the viewport bounds when filtering
|
|
||||||
* markers prior to clustering.
|
|
||||||
*/
|
|
||||||
viewportPadding?: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Abstract viewport algorithm proves a class to filter markers by a padded
|
|
||||||
* viewport. This is a common optimization.
|
|
||||||
*
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
export declare abstract class AbstractViewportAlgorithm extends AbstractAlgorithm {
|
|
||||||
protected viewportPadding: number;
|
|
||||||
constructor({ viewportPadding, ...options }: ViewportAlgorithmOptions);
|
|
||||||
calculate({ markers, map, mapCanvasProjection, }: AlgorithmInput): AlgorithmOutput;
|
|
||||||
protected abstract cluster({ markers, map }: AlgorithmInput): Cluster[];
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
export declare const noop: (markers: Marker[]) => Cluster[];
|
|
16
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/core.test.d.ts
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export {};
|
|
46
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/grid.d.ts
generated
vendored
|
@ -1,46 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/// <reference types="google.maps" />
|
|
||||||
import { AbstractViewportAlgorithm, AlgorithmInput, AlgorithmOutput, ViewportAlgorithmOptions } from "./core";
|
|
||||||
import { Cluster } from "../cluster";
|
|
||||||
import { Marker } from "../marker-utils";
|
|
||||||
export interface GridOptions extends ViewportAlgorithmOptions {
|
|
||||||
gridSize?: number;
|
|
||||||
/**
|
|
||||||
* Max distance between cluster center and point in meters.
|
|
||||||
* @default 10000
|
|
||||||
*/
|
|
||||||
maxDistance?: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The default Grid algorithm historically used in Google Maps marker
|
|
||||||
* clustering.
|
|
||||||
*
|
|
||||||
* The Grid algorithm does not implement caching and markers may flash as the
|
|
||||||
* viewport changes. Instead use {@link SuperClusterAlgorithm}.
|
|
||||||
*/
|
|
||||||
export declare class GridAlgorithm extends AbstractViewportAlgorithm {
|
|
||||||
protected gridSize: number;
|
|
||||||
protected maxDistance: number;
|
|
||||||
protected clusters: Cluster[];
|
|
||||||
protected state: {
|
|
||||||
zoom: number;
|
|
||||||
};
|
|
||||||
constructor({ maxDistance, gridSize, ...options }: GridOptions);
|
|
||||||
calculate({ markers, map, mapCanvasProjection, }: AlgorithmInput): AlgorithmOutput;
|
|
||||||
protected cluster({ markers, map, mapCanvasProjection, }: AlgorithmInput): Cluster[];
|
|
||||||
protected addToClosestCluster(marker: Marker, map: google.maps.Map, projection: google.maps.MapCanvasProjection): void;
|
|
||||||
}
|
|
16
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/grid.test.d.ts
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export {};
|
|
21
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/index.d.ts
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export * from "./core";
|
|
||||||
export * from "./grid";
|
|
||||||
export * from "./noop";
|
|
||||||
export * from "./supercluster";
|
|
||||||
export * from "./superviewport";
|
|
||||||
export * from "./utils";
|
|
25
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/noop.d.ts
generated
vendored
|
@ -1,25 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
import { AbstractAlgorithm, AlgorithmInput, AlgorithmOptions, AlgorithmOutput } from "./core";
|
|
||||||
import { Cluster } from "../cluster";
|
|
||||||
/**
|
|
||||||
* Noop algorithm does not generate any clusters or filter markers by the an extended viewport.
|
|
||||||
*/
|
|
||||||
export declare class NoopAlgorithm extends AbstractAlgorithm {
|
|
||||||
constructor({ ...options }: AlgorithmOptions);
|
|
||||||
calculate({ markers, map, mapCanvasProjection, }: AlgorithmInput): AlgorithmOutput;
|
|
||||||
protected cluster(input: AlgorithmInput): Cluster[];
|
|
||||||
}
|
|
43
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/supercluster.d.ts
generated
vendored
|
@ -1,43 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
import { AbstractAlgorithm, AlgorithmInput, AlgorithmOutput } from "./core";
|
|
||||||
import SuperCluster, { ClusterFeature } from "supercluster";
|
|
||||||
import { Marker } from "../marker-utils";
|
|
||||||
import { Cluster } from "../cluster";
|
|
||||||
export type SuperClusterOptions = SuperCluster.Options<{
|
|
||||||
[name: string]: any;
|
|
||||||
}, {
|
|
||||||
[name: string]: any;
|
|
||||||
}>;
|
|
||||||
/**
|
|
||||||
* A very fast JavaScript algorithm for geospatial point clustering using KD trees.
|
|
||||||
*
|
|
||||||
* @see https://www.npmjs.com/package/supercluster for more information on options.
|
|
||||||
*/
|
|
||||||
export declare class SuperClusterAlgorithm extends AbstractAlgorithm {
|
|
||||||
protected superCluster: SuperCluster;
|
|
||||||
protected markers: Marker[];
|
|
||||||
protected clusters: Cluster[];
|
|
||||||
protected state: {
|
|
||||||
zoom: number;
|
|
||||||
};
|
|
||||||
constructor({ maxZoom, radius, ...options }: SuperClusterOptions);
|
|
||||||
calculate(input: AlgorithmInput): AlgorithmOutput;
|
|
||||||
cluster({ map }: AlgorithmInput): Cluster[];
|
|
||||||
protected transformCluster({ geometry: { coordinates: [lng, lat], }, properties, }: ClusterFeature<{
|
|
||||||
marker: Marker;
|
|
||||||
}>): Cluster;
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export {};
|
|
43
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/superviewport.d.ts
generated
vendored
|
@ -1,43 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
import { AbstractViewportAlgorithm, AlgorithmInput, AlgorithmOutput, ViewportAlgorithmOptions } from "./core";
|
|
||||||
import { SuperClusterOptions } from "./supercluster";
|
|
||||||
import SuperCluster, { ClusterFeature } from "supercluster";
|
|
||||||
import { Marker } from "../marker-utils";
|
|
||||||
import { Cluster } from "../cluster";
|
|
||||||
export interface SuperClusterViewportOptions extends SuperClusterOptions, ViewportAlgorithmOptions {
|
|
||||||
}
|
|
||||||
export interface SuperClusterViewportState {
|
|
||||||
zoom: number;
|
|
||||||
view: [number, number, number, number];
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* A very fast JavaScript algorithm for geospatial point clustering using KD trees.
|
|
||||||
*
|
|
||||||
* @see https://www.npmjs.com/package/supercluster for more information on options.
|
|
||||||
*/
|
|
||||||
export declare class SuperClusterViewportAlgorithm extends AbstractViewportAlgorithm {
|
|
||||||
protected superCluster: SuperCluster;
|
|
||||||
protected markers: Marker[];
|
|
||||||
protected clusters: Cluster[];
|
|
||||||
protected state: SuperClusterViewportState;
|
|
||||||
constructor({ maxZoom, radius, viewportPadding, ...options }: SuperClusterViewportOptions);
|
|
||||||
calculate(input: AlgorithmInput): AlgorithmOutput;
|
|
||||||
cluster({ map, mapCanvasProjection }: AlgorithmInput): Cluster[];
|
|
||||||
protected transformCluster({ geometry: { coordinates: [lng, lat], }, properties, }: ClusterFeature<{
|
|
||||||
marker: Marker;
|
|
||||||
}>): Cluster;
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export {};
|
|
56
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/utils.d.ts
generated
vendored
|
@ -1,56 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/// <reference types="google.maps" />
|
|
||||||
import { Marker } from "../marker-utils";
|
|
||||||
/**
|
|
||||||
* Returns the markers visible in a padded map viewport
|
|
||||||
*
|
|
||||||
* @param map
|
|
||||||
* @param mapCanvasProjection
|
|
||||||
* @param markers The list of marker to filter
|
|
||||||
* @param viewportPaddingPixels The padding in pixel
|
|
||||||
* @returns The list of markers in the padded viewport
|
|
||||||
*/
|
|
||||||
export declare const filterMarkersToPaddedViewport: (map: google.maps.Map, mapCanvasProjection: google.maps.MapCanvasProjection, markers: Marker[], viewportPaddingPixels: number) => Marker[];
|
|
||||||
/**
|
|
||||||
* Extends a bounds by a number of pixels in each direction
|
|
||||||
*/
|
|
||||||
export declare const extendBoundsToPaddedViewport: (bounds: google.maps.LatLngBounds, projection: google.maps.MapCanvasProjection, numPixels: number) => google.maps.LatLngBounds;
|
|
||||||
/**
|
|
||||||
* Gets the extended bounds as a bbox [westLng, southLat, eastLng, northLat]
|
|
||||||
*/
|
|
||||||
export declare const getPaddedViewport: (bounds: google.maps.LatLngBounds, projection: google.maps.MapCanvasProjection, pixels: number) => [number, number, number, number];
|
|
||||||
/**
|
|
||||||
* Returns the distance between 2 positions.
|
|
||||||
*
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
export declare const distanceBetweenPoints: (p1: google.maps.LatLngLiteral, p2: google.maps.LatLngLiteral) => number;
|
|
||||||
type PixelBounds = {
|
|
||||||
northEast: google.maps.Point;
|
|
||||||
southWest: google.maps.Point;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Extends a pixel bounds by numPixels in all directions.
|
|
||||||
*
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
export declare const extendPixelBounds: ({ northEast, southWest }: PixelBounds, numPixels: number) => PixelBounds;
|
|
||||||
/**
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
export declare const pixelBoundsToLatLngBounds: ({ northEast, southWest }: PixelBounds, projection: google.maps.MapCanvasProjection) => google.maps.LatLngBounds;
|
|
||||||
export {};
|
|
16
src/treehug/node_modules/@googlemaps/markerclusterer/dist/algorithms/utils.test.d.ts
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export {};
|
|
41
src/treehug/node_modules/@googlemaps/markerclusterer/dist/cluster.d.ts
generated
vendored
|
@ -1,41 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/// <reference types="google.maps" />
|
|
||||||
import { Marker } from "./marker-utils";
|
|
||||||
export interface ClusterOptions {
|
|
||||||
position?: google.maps.LatLng | google.maps.LatLngLiteral;
|
|
||||||
markers?: Marker[];
|
|
||||||
}
|
|
||||||
export declare class Cluster {
|
|
||||||
marker?: Marker;
|
|
||||||
readonly markers?: Marker[];
|
|
||||||
protected _position: google.maps.LatLng;
|
|
||||||
constructor({ markers, position }: ClusterOptions);
|
|
||||||
get bounds(): google.maps.LatLngBounds | undefined;
|
|
||||||
get position(): google.maps.LatLng;
|
|
||||||
/**
|
|
||||||
* Get the count of **visible** markers.
|
|
||||||
*/
|
|
||||||
get count(): number;
|
|
||||||
/**
|
|
||||||
* Add a marker to the cluster.
|
|
||||||
*/
|
|
||||||
push(marker: Marker): void;
|
|
||||||
/**
|
|
||||||
* Cleanup references and remove marker from map.
|
|
||||||
*/
|
|
||||||
delete(): void;
|
|
||||||
}
|
|
16
src/treehug/node_modules/@googlemaps/markerclusterer/dist/cluster.test.d.ts
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export {};
|
|
20
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.d.ts
generated
vendored
|
@ -1,20 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2019 Google LLC. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export * from "./algorithms";
|
|
||||||
export * from "./cluster";
|
|
||||||
export * from "./markerclusterer";
|
|
||||||
export * from "./renderer";
|
|
||||||
export * from "./marker-utils";
|
|
5279
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.dev.js
generated
vendored
956
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.esm.js
generated
vendored
|
@ -1,956 +0,0 @@
|
||||||
import equal from 'fast-deep-equal';
|
|
||||||
import SuperCluster from 'supercluster';
|
|
||||||
|
|
||||||
/*! *****************************************************************************
|
|
||||||
Copyright (c) Microsoft Corporation.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
||||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
||||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
||||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
||||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
***************************************************************************** */
|
|
||||||
|
|
||||||
function __rest(s, e) {
|
|
||||||
var t = {};
|
|
||||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
||||||
t[p] = s[p];
|
|
||||||
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
||||||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
||||||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
||||||
t[p[i]] = s[p[i]];
|
|
||||||
}
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2023 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* util class that creates a common set of convenience functions to wrap
|
|
||||||
* shared behavior of Advanced Markers and Markers.
|
|
||||||
*/
|
|
||||||
class MarkerUtils {
|
|
||||||
static isAdvancedMarkerAvailable(map) {
|
|
||||||
return (google.maps.marker &&
|
|
||||||
map.getMapCapabilities().isAdvancedMarkersAvailable === true);
|
|
||||||
}
|
|
||||||
static isAdvancedMarker(marker) {
|
|
||||||
return (google.maps.marker &&
|
|
||||||
marker instanceof google.maps.marker.AdvancedMarkerElement);
|
|
||||||
}
|
|
||||||
static setMap(marker, map) {
|
|
||||||
if (this.isAdvancedMarker(marker)) {
|
|
||||||
marker.map = map;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
marker.setMap(map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static getPosition(marker) {
|
|
||||||
// SuperClusterAlgorithm.calculate expects a LatLng instance so we fake it for Adv Markers
|
|
||||||
if (this.isAdvancedMarker(marker)) {
|
|
||||||
if (marker.position) {
|
|
||||||
if (marker.position instanceof google.maps.LatLng) {
|
|
||||||
return marker.position;
|
|
||||||
}
|
|
||||||
// since we can't cast to LatLngLiteral for reasons =(
|
|
||||||
if (marker.position.lat && marker.position.lng) {
|
|
||||||
return new google.maps.LatLng(marker.position.lat, marker.position.lng);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new google.maps.LatLng(null);
|
|
||||||
}
|
|
||||||
return marker.getPosition();
|
|
||||||
}
|
|
||||||
static getVisible(marker) {
|
|
||||||
if (this.isAdvancedMarker(marker)) {
|
|
||||||
/**
|
|
||||||
* Always return true for Advanced Markers because the clusterer
|
|
||||||
* uses getVisible as a way to count legacy markers not as an actual
|
|
||||||
* indicator of visibility for some reason. Even when markers are hidden
|
|
||||||
* Marker.getVisible returns `true` and this is used to set the marker count
|
|
||||||
* on the cluster. See the behavior of Cluster.count
|
|
||||||
*/
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return marker.getVisible();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
class Cluster {
|
|
||||||
constructor({ markers, position }) {
|
|
||||||
this.markers = markers;
|
|
||||||
if (position) {
|
|
||||||
if (position instanceof google.maps.LatLng) {
|
|
||||||
this._position = position;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this._position = new google.maps.LatLng(position);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
get bounds() {
|
|
||||||
if (this.markers.length === 0 && !this._position) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const bounds = new google.maps.LatLngBounds(this._position, this._position);
|
|
||||||
for (const marker of this.markers) {
|
|
||||||
bounds.extend(MarkerUtils.getPosition(marker));
|
|
||||||
}
|
|
||||||
return bounds;
|
|
||||||
}
|
|
||||||
get position() {
|
|
||||||
return this._position || this.bounds.getCenter();
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get the count of **visible** markers.
|
|
||||||
*/
|
|
||||||
get count() {
|
|
||||||
return this.markers.filter((m) => MarkerUtils.getVisible(m)).length;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Add a marker to the cluster.
|
|
||||||
*/
|
|
||||||
push(marker) {
|
|
||||||
this.markers.push(marker);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Cleanup references and remove marker from map.
|
|
||||||
*/
|
|
||||||
delete() {
|
|
||||||
if (this.marker) {
|
|
||||||
MarkerUtils.setMap(this.marker, null);
|
|
||||||
this.marker = undefined;
|
|
||||||
}
|
|
||||||
this.markers.length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Returns the markers visible in a padded map viewport
|
|
||||||
*
|
|
||||||
* @param map
|
|
||||||
* @param mapCanvasProjection
|
|
||||||
* @param markers The list of marker to filter
|
|
||||||
* @param viewportPaddingPixels The padding in pixel
|
|
||||||
* @returns The list of markers in the padded viewport
|
|
||||||
*/
|
|
||||||
const filterMarkersToPaddedViewport = (map, mapCanvasProjection, markers, viewportPaddingPixels) => {
|
|
||||||
const extendedMapBounds = extendBoundsToPaddedViewport(map.getBounds(), mapCanvasProjection, viewportPaddingPixels);
|
|
||||||
return markers.filter((marker) => extendedMapBounds.contains(MarkerUtils.getPosition(marker)));
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Extends a bounds by a number of pixels in each direction
|
|
||||||
*/
|
|
||||||
const extendBoundsToPaddedViewport = (bounds, projection, numPixels) => {
|
|
||||||
const { northEast, southWest } = latLngBoundsToPixelBounds(bounds, projection);
|
|
||||||
const extendedPixelBounds = extendPixelBounds({ northEast, southWest }, numPixels);
|
|
||||||
return pixelBoundsToLatLngBounds(extendedPixelBounds, projection);
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Gets the extended bounds as a bbox [westLng, southLat, eastLng, northLat]
|
|
||||||
*/
|
|
||||||
const getPaddedViewport = (bounds, projection, pixels) => {
|
|
||||||
const extended = extendBoundsToPaddedViewport(bounds, projection, pixels);
|
|
||||||
const ne = extended.getNorthEast();
|
|
||||||
const sw = extended.getSouthWest();
|
|
||||||
return [sw.lng(), sw.lat(), ne.lng(), ne.lat()];
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Returns the distance between 2 positions.
|
|
||||||
*
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
const distanceBetweenPoints = (p1, p2) => {
|
|
||||||
const R = 6371; // Radius of the Earth in km
|
|
||||||
const dLat = ((p2.lat - p1.lat) * Math.PI) / 180;
|
|
||||||
const dLon = ((p2.lng - p1.lng) * Math.PI) / 180;
|
|
||||||
const sinDLat = Math.sin(dLat / 2);
|
|
||||||
const sinDLon = Math.sin(dLon / 2);
|
|
||||||
const a = sinDLat * sinDLat +
|
|
||||||
Math.cos((p1.lat * Math.PI) / 180) *
|
|
||||||
Math.cos((p2.lat * Math.PI) / 180) *
|
|
||||||
sinDLon *
|
|
||||||
sinDLon;
|
|
||||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
||||||
return R * c;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Converts a LatLng bound to pixels.
|
|
||||||
*
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
const latLngBoundsToPixelBounds = (bounds, projection) => {
|
|
||||||
return {
|
|
||||||
northEast: projection.fromLatLngToDivPixel(bounds.getNorthEast()),
|
|
||||||
southWest: projection.fromLatLngToDivPixel(bounds.getSouthWest()),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Extends a pixel bounds by numPixels in all directions.
|
|
||||||
*
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
const extendPixelBounds = ({ northEast, southWest }, numPixels) => {
|
|
||||||
northEast.x += numPixels;
|
|
||||||
northEast.y -= numPixels;
|
|
||||||
southWest.x -= numPixels;
|
|
||||||
southWest.y += numPixels;
|
|
||||||
return { northEast, southWest };
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
const pixelBoundsToLatLngBounds = ({ northEast, southWest }, projection) => {
|
|
||||||
const sw = projection.fromDivPixelToLatLng(southWest);
|
|
||||||
const ne = projection.fromDivPixelToLatLng(northEast);
|
|
||||||
return new google.maps.LatLngBounds(sw, ne);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
class AbstractAlgorithm {
|
|
||||||
constructor({ maxZoom = 16 }) {
|
|
||||||
this.maxZoom = maxZoom;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Helper function to bypass clustering based upon some map state such as
|
|
||||||
* zoom, number of markers, etc.
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* cluster({markers, map}: AlgorithmInput): Cluster[] {
|
|
||||||
* if (shouldBypassClustering(map)) {
|
|
||||||
* return this.noop({markers})
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
noop({ markers, }) {
|
|
||||||
return noop(markers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Abstract viewport algorithm proves a class to filter markers by a padded
|
|
||||||
* viewport. This is a common optimization.
|
|
||||||
*
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
class AbstractViewportAlgorithm extends AbstractAlgorithm {
|
|
||||||
constructor(_a) {
|
|
||||||
var { viewportPadding = 60 } = _a, options = __rest(_a, ["viewportPadding"]);
|
|
||||||
super(options);
|
|
||||||
this.viewportPadding = 60;
|
|
||||||
this.viewportPadding = viewportPadding;
|
|
||||||
}
|
|
||||||
calculate({ markers, map, mapCanvasProjection, }) {
|
|
||||||
if (map.getZoom() >= this.maxZoom) {
|
|
||||||
return {
|
|
||||||
clusters: this.noop({
|
|
||||||
markers,
|
|
||||||
}),
|
|
||||||
changed: false,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
clusters: this.cluster({
|
|
||||||
markers: filterMarkersToPaddedViewport(map, mapCanvasProjection, markers, this.viewportPadding),
|
|
||||||
map,
|
|
||||||
mapCanvasProjection,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @hidden
|
|
||||||
*/
|
|
||||||
const noop = (markers) => {
|
|
||||||
const clusters = markers.map((marker) => new Cluster({
|
|
||||||
position: MarkerUtils.getPosition(marker),
|
|
||||||
markers: [marker],
|
|
||||||
}));
|
|
||||||
return clusters;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* The default Grid algorithm historically used in Google Maps marker
|
|
||||||
* clustering.
|
|
||||||
*
|
|
||||||
* The Grid algorithm does not implement caching and markers may flash as the
|
|
||||||
* viewport changes. Instead use {@link SuperClusterAlgorithm}.
|
|
||||||
*/
|
|
||||||
class GridAlgorithm extends AbstractViewportAlgorithm {
|
|
||||||
constructor(_a) {
|
|
||||||
var { maxDistance = 40000, gridSize = 40 } = _a, options = __rest(_a, ["maxDistance", "gridSize"]);
|
|
||||||
super(options);
|
|
||||||
this.clusters = [];
|
|
||||||
this.state = { zoom: -1 };
|
|
||||||
this.maxDistance = maxDistance;
|
|
||||||
this.gridSize = gridSize;
|
|
||||||
}
|
|
||||||
calculate({ markers, map, mapCanvasProjection, }) {
|
|
||||||
const state = { zoom: map.getZoom() };
|
|
||||||
let changed = false;
|
|
||||||
if (this.state.zoom >= this.maxZoom && state.zoom >= this.maxZoom) ;
|
|
||||||
else {
|
|
||||||
changed = !equal(this.state, state);
|
|
||||||
}
|
|
||||||
this.state = state;
|
|
||||||
if (map.getZoom() >= this.maxZoom) {
|
|
||||||
return {
|
|
||||||
clusters: this.noop({
|
|
||||||
markers,
|
|
||||||
}),
|
|
||||||
changed,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
clusters: this.cluster({
|
|
||||||
markers: filterMarkersToPaddedViewport(map, mapCanvasProjection, markers, this.viewportPadding),
|
|
||||||
map,
|
|
||||||
mapCanvasProjection,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
cluster({ markers, map, mapCanvasProjection, }) {
|
|
||||||
this.clusters = [];
|
|
||||||
markers.forEach((marker) => {
|
|
||||||
this.addToClosestCluster(marker, map, mapCanvasProjection);
|
|
||||||
});
|
|
||||||
return this.clusters;
|
|
||||||
}
|
|
||||||
addToClosestCluster(marker, map, projection) {
|
|
||||||
let maxDistance = this.maxDistance; // Some large number
|
|
||||||
let cluster = null;
|
|
||||||
for (let i = 0; i < this.clusters.length; i++) {
|
|
||||||
const candidate = this.clusters[i];
|
|
||||||
const distance = distanceBetweenPoints(candidate.bounds.getCenter().toJSON(), MarkerUtils.getPosition(marker).toJSON());
|
|
||||||
if (distance < maxDistance) {
|
|
||||||
maxDistance = distance;
|
|
||||||
cluster = candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cluster &&
|
|
||||||
extendBoundsToPaddedViewport(cluster.bounds, projection, this.gridSize).contains(MarkerUtils.getPosition(marker))) {
|
|
||||||
cluster.push(marker);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const cluster = new Cluster({ markers: [marker] });
|
|
||||||
this.clusters.push(cluster);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Noop algorithm does not generate any clusters or filter markers by the an extended viewport.
|
|
||||||
*/
|
|
||||||
class NoopAlgorithm extends AbstractAlgorithm {
|
|
||||||
constructor(_a) {
|
|
||||||
var options = __rest(_a, []);
|
|
||||||
super(options);
|
|
||||||
}
|
|
||||||
calculate({ markers, map, mapCanvasProjection, }) {
|
|
||||||
return {
|
|
||||||
clusters: this.cluster({ markers, map, mapCanvasProjection }),
|
|
||||||
changed: false,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
cluster(input) {
|
|
||||||
return this.noop(input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* A very fast JavaScript algorithm for geospatial point clustering using KD trees.
|
|
||||||
*
|
|
||||||
* @see https://www.npmjs.com/package/supercluster for more information on options.
|
|
||||||
*/
|
|
||||||
class SuperClusterAlgorithm extends AbstractAlgorithm {
|
|
||||||
constructor(_a) {
|
|
||||||
var { maxZoom, radius = 60 } = _a, options = __rest(_a, ["maxZoom", "radius"]);
|
|
||||||
super({ maxZoom });
|
|
||||||
this.state = { zoom: -1 };
|
|
||||||
this.superCluster = new SuperCluster(Object.assign({ maxZoom: this.maxZoom, radius }, options));
|
|
||||||
}
|
|
||||||
calculate(input) {
|
|
||||||
let changed = false;
|
|
||||||
const state = { zoom: input.map.getZoom() };
|
|
||||||
if (!equal(input.markers, this.markers)) {
|
|
||||||
changed = true;
|
|
||||||
// TODO use proxy to avoid copy?
|
|
||||||
this.markers = [...input.markers];
|
|
||||||
const points = this.markers.map((marker) => {
|
|
||||||
const position = MarkerUtils.getPosition(marker);
|
|
||||||
const coordinates = [position.lng(), position.lat()];
|
|
||||||
return {
|
|
||||||
type: "Feature",
|
|
||||||
geometry: {
|
|
||||||
type: "Point",
|
|
||||||
coordinates,
|
|
||||||
},
|
|
||||||
properties: { marker },
|
|
||||||
};
|
|
||||||
});
|
|
||||||
this.superCluster.load(points);
|
|
||||||
}
|
|
||||||
if (!changed) {
|
|
||||||
if (this.state.zoom <= this.maxZoom || state.zoom <= this.maxZoom) {
|
|
||||||
changed = !equal(this.state, state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.state = state;
|
|
||||||
if (changed) {
|
|
||||||
this.clusters = this.cluster(input);
|
|
||||||
}
|
|
||||||
return { clusters: this.clusters, changed };
|
|
||||||
}
|
|
||||||
cluster({ map }) {
|
|
||||||
return this.superCluster
|
|
||||||
.getClusters([-180, -90, 180, 90], Math.round(map.getZoom()))
|
|
||||||
.map((feature) => this.transformCluster(feature));
|
|
||||||
}
|
|
||||||
transformCluster({ geometry: { coordinates: [lng, lat], }, properties, }) {
|
|
||||||
if (properties.cluster) {
|
|
||||||
return new Cluster({
|
|
||||||
markers: this.superCluster
|
|
||||||
.getLeaves(properties.cluster_id, Infinity)
|
|
||||||
.map((leaf) => leaf.properties.marker),
|
|
||||||
position: { lat, lng },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const marker = properties.marker;
|
|
||||||
return new Cluster({
|
|
||||||
markers: [marker],
|
|
||||||
position: MarkerUtils.getPosition(marker),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* A very fast JavaScript algorithm for geospatial point clustering using KD trees.
|
|
||||||
*
|
|
||||||
* @see https://www.npmjs.com/package/supercluster for more information on options.
|
|
||||||
*/
|
|
||||||
class SuperClusterViewportAlgorithm extends AbstractViewportAlgorithm {
|
|
||||||
constructor(_a) {
|
|
||||||
var { maxZoom, radius = 60, viewportPadding = 60 } = _a, options = __rest(_a, ["maxZoom", "radius", "viewportPadding"]);
|
|
||||||
super({ maxZoom, viewportPadding });
|
|
||||||
this.superCluster = new SuperCluster(Object.assign({ maxZoom: this.maxZoom, radius }, options));
|
|
||||||
this.state = { zoom: -1, view: [0, 0, 0, 0] };
|
|
||||||
}
|
|
||||||
calculate(input) {
|
|
||||||
const state = {
|
|
||||||
zoom: Math.round(input.map.getZoom()),
|
|
||||||
view: getPaddedViewport(input.map.getBounds(), input.mapCanvasProjection, this.viewportPadding),
|
|
||||||
};
|
|
||||||
let changed = !equal(this.state, state);
|
|
||||||
if (!equal(input.markers, this.markers)) {
|
|
||||||
changed = true;
|
|
||||||
// TODO use proxy to avoid copy?
|
|
||||||
this.markers = [...input.markers];
|
|
||||||
const points = this.markers.map((marker) => {
|
|
||||||
const position = MarkerUtils.getPosition(marker);
|
|
||||||
const coordinates = [position.lng(), position.lat()];
|
|
||||||
return {
|
|
||||||
type: "Feature",
|
|
||||||
geometry: {
|
|
||||||
type: "Point",
|
|
||||||
coordinates,
|
|
||||||
},
|
|
||||||
properties: { marker },
|
|
||||||
};
|
|
||||||
});
|
|
||||||
this.superCluster.load(points);
|
|
||||||
}
|
|
||||||
if (changed) {
|
|
||||||
this.clusters = this.cluster(input);
|
|
||||||
this.state = state;
|
|
||||||
}
|
|
||||||
return { clusters: this.clusters, changed };
|
|
||||||
}
|
|
||||||
cluster({ map, mapCanvasProjection }) {
|
|
||||||
/* recalculate new state because we can't use the cached version. */
|
|
||||||
const state = {
|
|
||||||
zoom: Math.round(map.getZoom()),
|
|
||||||
view: getPaddedViewport(map.getBounds(), mapCanvasProjection, this.viewportPadding),
|
|
||||||
};
|
|
||||||
return this.superCluster
|
|
||||||
.getClusters(state.view, state.zoom)
|
|
||||||
.map((feature) => this.transformCluster(feature));
|
|
||||||
}
|
|
||||||
transformCluster({ geometry: { coordinates: [lng, lat], }, properties, }) {
|
|
||||||
if (properties.cluster) {
|
|
||||||
return new Cluster({
|
|
||||||
markers: this.superCluster
|
|
||||||
.getLeaves(properties.cluster_id, Infinity)
|
|
||||||
.map((leaf) => leaf.properties.marker),
|
|
||||||
position: { lat, lng },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const marker = properties.marker;
|
|
||||||
return new Cluster({
|
|
||||||
markers: [marker],
|
|
||||||
position: MarkerUtils.getPosition(marker),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Provides statistics on all clusters in the current render cycle for use in {@link Renderer.render}.
|
|
||||||
*/
|
|
||||||
class ClusterStats {
|
|
||||||
constructor(markers, clusters) {
|
|
||||||
this.markers = { sum: markers.length };
|
|
||||||
const clusterMarkerCounts = clusters.map((a) => a.count);
|
|
||||||
const clusterMarkerSum = clusterMarkerCounts.reduce((a, b) => a + b, 0);
|
|
||||||
this.clusters = {
|
|
||||||
count: clusters.length,
|
|
||||||
markers: {
|
|
||||||
mean: clusterMarkerSum / clusters.length,
|
|
||||||
sum: clusterMarkerSum,
|
|
||||||
min: Math.min(...clusterMarkerCounts),
|
|
||||||
max: Math.max(...clusterMarkerCounts),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class DefaultRenderer {
|
|
||||||
/**
|
|
||||||
* The default render function for the library used by {@link MarkerClusterer}.
|
|
||||||
*
|
|
||||||
* Currently set to use the following:
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* // change color if this cluster has more markers than the mean cluster
|
|
||||||
* const color =
|
|
||||||
* count > Math.max(10, stats.clusters.markers.mean)
|
|
||||||
* ? "#ff0000"
|
|
||||||
* : "#0000ff";
|
|
||||||
*
|
|
||||||
* // create svg url with fill color
|
|
||||||
* const svg = window.btoa(`
|
|
||||||
* <svg fill="${color}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240">
|
|
||||||
* <circle cx="120" cy="120" opacity=".6" r="70" />
|
|
||||||
* <circle cx="120" cy="120" opacity=".3" r="90" />
|
|
||||||
* <circle cx="120" cy="120" opacity=".2" r="110" />
|
|
||||||
* <circle cx="120" cy="120" opacity=".1" r="130" />
|
|
||||||
* </svg>`);
|
|
||||||
*
|
|
||||||
* // create marker using svg icon
|
|
||||||
* return new google.maps.Marker({
|
|
||||||
* position,
|
|
||||||
* icon: {
|
|
||||||
* url: `data:image/svg+xml;base64,${svg}`,
|
|
||||||
* scaledSize: new google.maps.Size(45, 45),
|
|
||||||
* },
|
|
||||||
* label: {
|
|
||||||
* text: String(count),
|
|
||||||
* color: "rgba(255,255,255,0.9)",
|
|
||||||
* fontSize: "12px",
|
|
||||||
* },
|
|
||||||
* // adjust zIndex to be above other markers
|
|
||||||
* zIndex: 1000 + count,
|
|
||||||
* });
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
render({ count, position }, stats, map) {
|
|
||||||
// change color if this cluster has more markers than the mean cluster
|
|
||||||
const color = count > Math.max(10, stats.clusters.markers.mean) ? "#ff0000" : "#0000ff";
|
|
||||||
// create svg literal with fill color
|
|
||||||
const svg = `<svg fill="${color}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240" width="50" height="50">
|
|
||||||
<circle cx="120" cy="120" opacity=".6" r="70" />
|
|
||||||
<circle cx="120" cy="120" opacity=".3" r="90" />
|
|
||||||
<circle cx="120" cy="120" opacity=".2" r="110" />
|
|
||||||
<text x="50%" y="50%" style="fill:#fff" text-anchor="middle" font-size="50" dominant-baseline="middle" font-family="roboto,arial,sans-serif">${count}</text>
|
|
||||||
</svg>`;
|
|
||||||
const title = `Cluster of ${count} markers`,
|
|
||||||
// adjust zIndex to be above other markers
|
|
||||||
zIndex = Number(google.maps.Marker.MAX_ZINDEX) + count;
|
|
||||||
if (MarkerUtils.isAdvancedMarkerAvailable(map)) {
|
|
||||||
// create cluster SVG element
|
|
||||||
const parser = new DOMParser();
|
|
||||||
const svgEl = parser.parseFromString(svg, "image/svg+xml").documentElement;
|
|
||||||
svgEl.setAttribute("transform", "translate(0 25)");
|
|
||||||
const clusterOptions = {
|
|
||||||
map,
|
|
||||||
position,
|
|
||||||
zIndex,
|
|
||||||
title,
|
|
||||||
content: svgEl,
|
|
||||||
};
|
|
||||||
return new google.maps.marker.AdvancedMarkerElement(clusterOptions);
|
|
||||||
}
|
|
||||||
const clusterOptions = {
|
|
||||||
position,
|
|
||||||
zIndex,
|
|
||||||
title,
|
|
||||||
icon: {
|
|
||||||
url: `data:image/svg+xml;base64,${btoa(svg)}`,
|
|
||||||
anchor: new google.maps.Point(25, 25),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
return new google.maps.Marker(clusterOptions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2019 Google LLC. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Extends an object's prototype by another's.
|
|
||||||
*
|
|
||||||
* @param type1 The Type to be extended.
|
|
||||||
* @param type2 The Type to extend with.
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
function extend(type1, type2) {
|
|
||||||
/* istanbul ignore next */
|
|
||||||
// eslint-disable-next-line prefer-const
|
|
||||||
for (let property in type2.prototype) {
|
|
||||||
type1.prototype[property] = type2.prototype[property];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
class OverlayViewSafe {
|
|
||||||
constructor() {
|
|
||||||
// MarkerClusterer implements google.maps.OverlayView interface. We use the
|
|
||||||
// extend function to extend MarkerClusterer with google.maps.OverlayView
|
|
||||||
// because it might not always be available when the code is defined so we
|
|
||||||
// look for it at the last possible moment. If it doesn't exist now then
|
|
||||||
// there is no point going ahead :)
|
|
||||||
extend(OverlayViewSafe, google.maps.OverlayView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright 2021 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
var MarkerClustererEvents;
|
|
||||||
(function (MarkerClustererEvents) {
|
|
||||||
MarkerClustererEvents["CLUSTERING_BEGIN"] = "clusteringbegin";
|
|
||||||
MarkerClustererEvents["CLUSTERING_END"] = "clusteringend";
|
|
||||||
MarkerClustererEvents["CLUSTER_CLICK"] = "click";
|
|
||||||
})(MarkerClustererEvents || (MarkerClustererEvents = {}));
|
|
||||||
const defaultOnClusterClickHandler = (_, cluster, map) => {
|
|
||||||
map.fitBounds(cluster.bounds);
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* MarkerClusterer creates and manages per-zoom-level clusters for large amounts
|
|
||||||
* of markers. See {@link MarkerClustererOptions} for more details.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class MarkerClusterer extends OverlayViewSafe {
|
|
||||||
constructor({ map, markers = [], algorithmOptions = {}, algorithm = new SuperClusterAlgorithm(algorithmOptions), renderer = new DefaultRenderer(), onClusterClick = defaultOnClusterClickHandler, }) {
|
|
||||||
super();
|
|
||||||
this.markers = [...markers];
|
|
||||||
this.clusters = [];
|
|
||||||
this.algorithm = algorithm;
|
|
||||||
this.renderer = renderer;
|
|
||||||
this.onClusterClick = onClusterClick;
|
|
||||||
if (map) {
|
|
||||||
this.setMap(map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addMarker(marker, noDraw) {
|
|
||||||
if (this.markers.includes(marker)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.markers.push(marker);
|
|
||||||
if (!noDraw) {
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addMarkers(markers, noDraw) {
|
|
||||||
markers.forEach((marker) => {
|
|
||||||
this.addMarker(marker, true);
|
|
||||||
});
|
|
||||||
if (!noDraw) {
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
removeMarker(marker, noDraw) {
|
|
||||||
const index = this.markers.indexOf(marker);
|
|
||||||
if (index === -1) {
|
|
||||||
// Marker is not in our list of markers, so do nothing:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
MarkerUtils.setMap(marker, null);
|
|
||||||
this.markers.splice(index, 1); // Remove the marker from the list of managed markers
|
|
||||||
if (!noDraw) {
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
removeMarkers(markers, noDraw) {
|
|
||||||
let removed = false;
|
|
||||||
markers.forEach((marker) => {
|
|
||||||
removed = this.removeMarker(marker, true) || removed;
|
|
||||||
});
|
|
||||||
if (removed && !noDraw) {
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
return removed;
|
|
||||||
}
|
|
||||||
clearMarkers(noDraw) {
|
|
||||||
this.markers.length = 0;
|
|
||||||
if (!noDraw) {
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Recalculates and draws all the marker clusters.
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
const map = this.getMap();
|
|
||||||
if (map instanceof google.maps.Map && map.getProjection()) {
|
|
||||||
google.maps.event.trigger(this, MarkerClustererEvents.CLUSTERING_BEGIN, this);
|
|
||||||
const { clusters, changed } = this.algorithm.calculate({
|
|
||||||
markers: this.markers,
|
|
||||||
map,
|
|
||||||
mapCanvasProjection: this.getProjection(),
|
|
||||||
});
|
|
||||||
// Allow algorithms to return flag on whether the clusters/markers have changed.
|
|
||||||
if (changed || changed == undefined) {
|
|
||||||
// Accumulate the markers of the clusters composed of a single marker.
|
|
||||||
// Those clusters directly use the marker.
|
|
||||||
// Clusters with more than one markers use a group marker generated by a renderer.
|
|
||||||
const singleMarker = new Set();
|
|
||||||
for (const cluster of clusters) {
|
|
||||||
if (cluster.markers.length == 1) {
|
|
||||||
singleMarker.add(cluster.markers[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const groupMarkers = [];
|
|
||||||
// Iterate the clusters that are currently rendered.
|
|
||||||
for (const cluster of this.clusters) {
|
|
||||||
if (cluster.marker == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (cluster.markers.length == 1) {
|
|
||||||
if (!singleMarker.has(cluster.marker)) {
|
|
||||||
// The marker:
|
|
||||||
// - was previously rendered because it is from a cluster with 1 marker,
|
|
||||||
// - should no more be rendered as it is not in singleMarker.
|
|
||||||
MarkerUtils.setMap(cluster.marker, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Delay the removal of old group markers to avoid flickering.
|
|
||||||
groupMarkers.push(cluster.marker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.clusters = clusters;
|
|
||||||
this.renderClusters();
|
|
||||||
// Delayed removal of the markers of the former groups.
|
|
||||||
requestAnimationFrame(() => groupMarkers.forEach((marker) => MarkerUtils.setMap(marker, null)));
|
|
||||||
}
|
|
||||||
google.maps.event.trigger(this, MarkerClustererEvents.CLUSTERING_END, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onAdd() {
|
|
||||||
this.idleListener = this.getMap().addListener("idle", this.render.bind(this));
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
onRemove() {
|
|
||||||
google.maps.event.removeListener(this.idleListener);
|
|
||||||
this.reset();
|
|
||||||
}
|
|
||||||
reset() {
|
|
||||||
this.markers.forEach((marker) => MarkerUtils.setMap(marker, null));
|
|
||||||
this.clusters.forEach((cluster) => cluster.delete());
|
|
||||||
this.clusters = [];
|
|
||||||
}
|
|
||||||
renderClusters() {
|
|
||||||
// Generate stats to pass to renderers.
|
|
||||||
const stats = new ClusterStats(this.markers, this.clusters);
|
|
||||||
const map = this.getMap();
|
|
||||||
this.clusters.forEach((cluster) => {
|
|
||||||
if (cluster.markers.length === 1) {
|
|
||||||
cluster.marker = cluster.markers[0];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Generate the marker to represent the group.
|
|
||||||
cluster.marker = this.renderer.render(cluster, stats, map);
|
|
||||||
// Make sure all individual markers are removed from the map.
|
|
||||||
cluster.markers.forEach((marker) => MarkerUtils.setMap(marker, null));
|
|
||||||
if (this.onClusterClick) {
|
|
||||||
cluster.marker.addListener("click",
|
|
||||||
/* istanbul ignore next */
|
|
||||||
(event) => {
|
|
||||||
google.maps.event.trigger(this, MarkerClustererEvents.CLUSTER_CLICK, cluster);
|
|
||||||
this.onClusterClick(event, cluster, map);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MarkerUtils.setMap(cluster.marker, map);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { AbstractAlgorithm, AbstractViewportAlgorithm, Cluster, ClusterStats, DefaultRenderer, GridAlgorithm, MarkerClusterer, MarkerClustererEvents, MarkerUtils, NoopAlgorithm, SuperClusterAlgorithm, SuperClusterViewportAlgorithm, defaultOnClusterClickHandler, distanceBetweenPoints, extendBoundsToPaddedViewport, extendPixelBounds, filterMarkersToPaddedViewport, getPaddedViewport, noop, pixelBoundsToLatLngBounds };
|
|
||||||
//# sourceMappingURL=index.esm.js.map
|
|
1
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.esm.js.map
generated
vendored
2
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.min.js
generated
vendored
1
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.min.js.map
generated
vendored
2
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.umd.js
generated
vendored
1
src/treehug/node_modules/@googlemaps/markerclusterer/dist/index.umd.js.map
generated
vendored
31
src/treehug/node_modules/@googlemaps/markerclusterer/dist/marker-utils.d.ts
generated
vendored
|
@ -1,31 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2023 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/// <reference types="google.maps" />
|
|
||||||
/**
|
|
||||||
* Supports markers of either either "legacy" or "advanced" types.
|
|
||||||
*/
|
|
||||||
export type Marker = google.maps.Marker | google.maps.marker.AdvancedMarkerElement;
|
|
||||||
/**
|
|
||||||
* util class that creates a common set of convenience functions to wrap
|
|
||||||
* shared behavior of Advanced Markers and Markers.
|
|
||||||
*/
|
|
||||||
export declare class MarkerUtils {
|
|
||||||
static isAdvancedMarkerAvailable(map: google.maps.Map): boolean;
|
|
||||||
static isAdvancedMarker(marker: Marker): marker is google.maps.marker.AdvancedMarkerElement;
|
|
||||||
static setMap(marker: Marker, map: google.maps.Map | null): void;
|
|
||||||
static getPosition(marker: Marker): google.maps.LatLng;
|
|
||||||
static getVisible(marker: Marker): boolean;
|
|
||||||
}
|
|
16
src/treehug/node_modules/@googlemaps/markerclusterer/dist/marker-utils.test.d.ts
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright 2023 Google LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
export {};
|
|