From 03cb1a463bf01634b216e6eaaf522271aa35449f Mon Sep 17 00:00:00 2001 From: Trinity Pointard Date: Sat, 20 Apr 2019 21:03:19 +0200 Subject: [PATCH] improve script and add front end delete dockers for old commit same pr before running new one add a front end heavily copied from Plume to see which pr are running should in theory fetch pr name from github, but have CORS issues :'( --- .gitignore | 3 +- Caddyfile.base | 4 + bash.sh | 11 +- static/feather.css | 251 ++++++++++++++++++++++++++++++++ static/index.html | 39 +++++ static/main.css | 1 + static/plume-ci.js | 44 ++++++ static/plumeFeather256.png | Bin 0 -> 12262 bytes static/plumeFeatherFilled64.png | Bin 0 -> 2696 bytes static/up.json | 1 + 10 files changed, 351 insertions(+), 3 deletions(-) create mode 100644 Caddyfile.base create mode 100644 static/feather.css create mode 100644 static/index.html create mode 100644 static/main.css create mode 100644 static/plume-ci.js create mode 100644 static/plumeFeather256.png create mode 100644 static/plumeFeatherFilled64.png create mode 100644 static/up.json diff --git a/.gitignore b/.gitignore index 998ca1c..ebea82b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.tar.gz Caddyfile Caddyfile.* -!Caddyfile.template \ No newline at end of file +!Caddyfile.template +!Caddyfile.base diff --git a/Caddyfile.base b/Caddyfile.base new file mode 100644 index 0000000..ff75e18 --- /dev/null +++ b/Caddyfile.base @@ -0,0 +1,4 @@ +localhost { + root ./static + tls off +} diff --git a/bash.sh b/bash.sh index 524bffa..b2b5c39 100755 --- a/bash.sh +++ b/bash.sh @@ -40,6 +40,7 @@ inotifywait -m ./ -e create -e moved_to | fi; cont=plume-pr-$id + docker container rm $cont || true docker run -td --name $cont --rm -p 127.0.0.1:$port:7878 --mount type=bind,src=$(pwd),dst=/app plumeorg/plume-buildenv:v0.0.5 docker exec -w /app $cont ls -al docker exec -w /app $cont /app/bin/diesel migration run @@ -50,8 +51,14 @@ inotifywait -m ./ -e create -e moved_to | popd - sed -e "s;%BASE_URL%;$domain;g" -e "s;%PORT%;$port;g" Caddyfile.template | tee Caddyfile.$id - cat Caddyfile.$id Caddyfile | tee Caddyfile + #get comma separated list of running containers + currently_running=$(docker container ls | grep -Eo 'plume-pr-[0-9]+' | cut -c10- | tr '\n' ',') + + #remove trailing ',' and convert to json + echo '['"${currently_running::-1}"']' > static/up.json + + sed -e "s;%BASE_URL%;$domain;g" -e "s;%PORT%;$port;g" Caddyfile.template > $id.caddy + cat Caddyfile.base *.caddy > Caddyfile kill $caddy_pid caddy & caddy_pid=$! diff --git a/static/feather.css b/static/feather.css new file mode 100644 index 0000000..e6339ce --- /dev/null +++ b/static/feather.css @@ -0,0 +1,251 @@ +.feather { + width: 24px; + height: 24px; + stroke: currentColor; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; + fill: none; +} + +.icon:before { + font-family: "Feather"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-alert-octagon:before { content: "\e81b"; } +.icon-alert-circle:before { content: "\e81c"; } +.icon-activity:before { content: "\e81d"; } +.icon-alert-triangle:before { content: "\e81e"; } +.icon-align-center:before { content: "\e81f"; } +.icon-airplay:before { content: "\e820"; } +.icon-align-justify:before { content: "\e821"; } +.icon-align-left:before { content: "\e822"; } +.icon-align-right:before { content: "\e823"; } +.icon-arrow-down-left:before { content: "\e824"; } +.icon-arrow-down-right:before { content: "\e825"; } +.icon-anchor:before { content: "\e826"; } +.icon-aperture:before { content: "\e827"; } +.icon-arrow-left:before { content: "\e828"; } +.icon-arrow-right:before { content: "\e829"; } +.icon-arrow-down:before { content: "\e82a"; } +.icon-arrow-up-left:before { content: "\e82b"; } +.icon-arrow-up-right:before { content: "\e82c"; } +.icon-arrow-up:before { content: "\e82d"; } +.icon-award:before { content: "\e82e"; } +.icon-bar-chart:before { content: "\e82f"; } +.icon-at-sign:before { content: "\e830"; } +.icon-bar-chart-:before { content: "\e831"; } +.icon-battery-charging:before { content: "\e832"; } +.icon-bell-off:before { content: "\e833"; } +.icon-battery:before { content: "\e834"; } +.icon-bluetooth:before { content: "\e835"; } +.icon-bell:before { content: "\e836"; } +.icon-book:before { content: "\e837"; } +.icon-briefcase:before { content: "\e838"; } +.icon-camera-off:before { content: "\e839"; } +.icon-calendar:before { content: "\e83a"; } +.icon-bookmark:before { content: "\e83b"; } +.icon-box:before { content: "\e83c"; } +.icon-camera:before { content: "\e83d"; } +.icon-check-circle:before { content: "\e83e"; } +.icon-check:before { content: "\e83f"; } +.icon-check-square:before { content: "\e840"; } +.icon-cast:before { content: "\e841"; } +.icon-chevron-down:before { content: "\e842"; } +.icon-chevron-left:before { content: "\e843"; } +.icon-chevron-right:before { content: "\e844"; } +.icon-chevron-up:before { content: "\e845"; } +.icon-chevrons-down:before { content: "\e846"; } +.icon-chevrons-right:before { content: "\e847"; } +.icon-chevrons-up:before { content: "\e848"; } +.icon-chevrons-left:before { content: "\e849"; } +.icon-circle:before { content: "\e84a"; } +.icon-clipboard:before { content: "\e84b"; } +.icon-chrome:before { content: "\e84c"; } +.icon-clock:before { content: "\e84d"; } +.icon-cloud-lightning:before { content: "\e84e"; } +.icon-cloud-drizzle:before { content: "\e84f"; } +.icon-cloud-rain:before { content: "\e850"; } +.icon-cloud-off:before { content: "\e851"; } +.icon-codepen:before { content: "\e852"; } +.icon-cloud-snow:before { content: "\e853"; } +.icon-compass:before { content: "\e854"; } +.icon-copy:before { content: "\e855"; } +.icon-corner-down-right:before { content: "\e856"; } +.icon-corner-down-left:before { content: "\e857"; } +.icon-corner-left-down:before { content: "\e858"; } +.icon-corner-left-up:before { content: "\e859"; } +.icon-corner-up-left:before { content: "\e85a"; } +.icon-corner-up-right:before { content: "\e85b"; } +.icon-corner-right-down:before { content: "\e85c"; } +.icon-corner-right-up:before { content: "\e85d"; } +.icon-cpu:before { content: "\e85e"; } +.icon-credit-card:before { content: "\e85f"; } +.icon-crosshair:before { content: "\e860"; } +.icon-disc:before { content: "\e861"; } +.icon-delete:before { content: "\e862"; } +.icon-download-cloud:before { content: "\e863"; } +.icon-download:before { content: "\e864"; } +.icon-droplet:before { content: "\e865"; } +.icon-edit-:before { content: "\e866"; } +.icon-edit:before { content: "\e867"; } +.icon-edit-1:before { content: "\e868"; } +.icon-external-link:before { content: "\e869"; } +.icon-eye:before { content: "\e86a"; } +.icon-feather:before { content: "\e86b"; } +.icon-facebook:before { content: "\e86c"; } +.icon-file-minus:before { content: "\e86d"; } +.icon-eye-off:before { content: "\e86e"; } +.icon-fast-forward:before { content: "\e86f"; } +.icon-file-text:before { content: "\e870"; } +.icon-film:before { content: "\e871"; } +.icon-file:before { content: "\e872"; } +.icon-file-plus:before { content: "\e873"; } +.icon-folder:before { content: "\e874"; } +.icon-filter:before { content: "\e875"; } +.icon-flag:before { content: "\e876"; } +.icon-globe:before { content: "\e877"; } +.icon-grid:before { content: "\e878"; } +.icon-heart:before { content: "\e879"; } +.icon-home:before { content: "\e87a"; } +.icon-github:before { content: "\e87b"; } +.icon-image:before { content: "\e87c"; } +.icon-inbox:before { content: "\e87d"; } +.icon-layers:before { content: "\e87e"; } +.icon-info:before { content: "\e87f"; } +.icon-instagram:before { content: "\e880"; } +.icon-layout:before { content: "\e881"; } +.icon-link-:before { content: "\e882"; } +.icon-life-buoy:before { content: "\e883"; } +.icon-link:before { content: "\e884"; } +.icon-log-in:before { content: "\e885"; } +.icon-list:before { content: "\e886"; } +.icon-lock:before { content: "\e887"; } +.icon-log-out:before { content: "\e888"; } +.icon-loader:before { content: "\e889"; } +.icon-mail:before { content: "\e88a"; } +.icon-maximize-:before { content: "\e88b"; } +.icon-map:before { content: "\e88c"; } +.icon-maximize:before { content: "\e88d"; } +.icon-map-pin:before { content: "\e88e"; } +.icon-menu:before { content: "\e88f"; } +.icon-message-circle:before { content: "\e890"; } +.icon-message-square:before { content: "\e891"; } +.icon-minimize-:before { content: "\e892"; } +.icon-mic-off:before { content: "\e893"; } +.icon-minus-circle:before { content: "\e894"; } +.icon-mic:before { content: "\e895"; } +.icon-minus-square:before { content: "\e896"; } +.icon-minus:before { content: "\e897"; } +.icon-moon:before { content: "\e898"; } +.icon-monitor:before { content: "\e899"; } +.icon-more-vertical:before { content: "\e89a"; } +.icon-more-horizontal:before { content: "\e89b"; } +.icon-move:before { content: "\e89c"; } +.icon-music:before { content: "\e89d"; } +.icon-navigation-:before { content: "\e89e"; } +.icon-navigation:before { content: "\e89f"; } +.icon-octagon:before { content: "\e8a0"; } +.icon-package:before { content: "\e8a1"; } +.icon-pause-circle:before { content: "\e8a2"; } +.icon-pause:before { content: "\e8a3"; } +.icon-percent:before { content: "\e8a4"; } +.icon-phone-call:before { content: "\e8a5"; } +.icon-phone-forwarded:before { content: "\e8a6"; } +.icon-phone-missed:before { content: "\e8a7"; } +.icon-phone-off:before { content: "\e8a8"; } +.icon-phone-incoming:before { content: "\e8a9"; } +.icon-phone:before { content: "\e8aa"; } +.icon-phone-outgoing:before { content: "\e8ab"; } +.icon-pie-chart:before { content: "\e8ac"; } +.icon-play-circle:before { content: "\e8ad"; } +.icon-play:before { content: "\e8ae"; } +.icon-plus-square:before { content: "\e8af"; } +.icon-plus-circle:before { content: "\e8b0"; } +.icon-plus:before { content: "\e8b1"; } +.icon-pocket:before { content: "\e8b2"; } +.icon-printer:before { content: "\e8b3"; } +.icon-power:before { content: "\e8b4"; } +.icon-radio:before { content: "\e8b5"; } +.icon-repeat:before { content: "\e8b6"; } +.icon-refresh-ccw:before { content: "\e8b7"; } +.icon-rewind:before { content: "\e8b8"; } +.icon-rotate-ccw:before { content: "\e8b9"; } +.icon-refresh-cw:before { content: "\e8ba"; } +.icon-rotate-cw:before { content: "\e8bb"; } +.icon-save:before { content: "\e8bc"; } +.icon-search:before { content: "\e8bd"; } +.icon-server:before { content: "\e8be"; } +.icon-scissors:before { content: "\e8bf"; } +.icon-share-:before { content: "\e8c0"; } +.icon-share:before { content: "\e8c1"; } +.icon-shield:before { content: "\e8c2"; } +.icon-settings:before { content: "\e8c3"; } +.icon-skip-back:before { content: "\e8c4"; } +.icon-shuffle:before { content: "\e8c5"; } +.icon-sidebar:before { content: "\e8c6"; } +.icon-skip-forward:before { content: "\e8c7"; } +.icon-slack:before { content: "\e8c8"; } +.icon-slash:before { content: "\e8c9"; } +.icon-smartphone:before { content: "\e8ca"; } +.icon-square:before { content: "\e8cb"; } +.icon-speaker:before { content: "\e8cc"; } +.icon-star:before { content: "\e8cd"; } +.icon-stop-circle:before { content: "\e8ce"; } +.icon-sun:before { content: "\e8cf"; } +.icon-sunrise:before { content: "\e8d0"; } +.icon-tablet:before { content: "\e8d1"; } +.icon-tag:before { content: "\e8d2"; } +.icon-sunset:before { content: "\e8d3"; } +.icon-target:before { content: "\e8d4"; } +.icon-thermometer:before { content: "\e8d5"; } +.icon-thumbs-up:before { content: "\e8d6"; } +.icon-thumbs-down:before { content: "\e8d7"; } +.icon-toggle-left:before { content: "\e8d8"; } +.icon-toggle-right:before { content: "\e8d9"; } +.icon-trash-:before { content: "\e8da"; } +.icon-trash:before { content: "\e8db"; } +.icon-trending-up:before { content: "\e8dc"; } +.icon-trending-down:before { content: "\e8dd"; } +.icon-triangle:before { content: "\e8de"; } +.icon-type:before { content: "\e8df"; } +.icon-twitter:before { content: "\e8e0"; } +.icon-upload:before { content: "\e8e1"; } +.icon-umbrella:before { content: "\e8e2"; } +.icon-upload-cloud:before { content: "\e8e3"; } +.icon-unlock:before { content: "\e8e4"; } +.icon-user-check:before { content: "\e8e5"; } +.icon-user-minus:before { content: "\e8e6"; } +.icon-user-plus:before { content: "\e8e7"; } +.icon-user-x:before { content: "\e8e8"; } +.icon-user:before { content: "\e8e9"; } +.icon-users:before { content: "\e8ea"; } +.icon-video-off:before { content: "\e8eb"; } +.icon-video:before { content: "\e8ec"; } +.icon-voicemail:before { content: "\e8ed"; } +.icon-volume-x:before { content: "\e8ee"; } +.icon-volume-:before { content: "\e8ef"; } +.icon-volume-1:before { content: "\e8f0"; } +.icon-volume:before { content: "\e8f1"; } +.icon-watch:before { content: "\e8f2"; } +.icon-wifi:before { content: "\e8f3"; } +.icon-x-square:before { content: "\e8f4"; } +.icon-wind:before { content: "\e8f5"; } +.icon-x:before { content: "\e8f6"; } +.icon-x-circle:before { content: "\e8f7"; } +.icon-zap:before { content: "\e8f8"; } +.icon-zoom-in:before { content: "\e8f9"; } +.icon-zoom-out:before { content: "\e8fa"; } +.icon-command:before { content: "\e8fb"; } +.icon-cloud:before { content: "\e8fc"; } +.icon-hash:before { content: "\e8fd"; } +.icon-headphones:before { content: "\e8fe"; } diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..a6abb70 --- /dev/null +++ b/static/index.html @@ -0,0 +1,39 @@ + + + + + Plume-ci ⋅ list of running pull requests + + + + + + + +
+ +
+ +
+
+
+

List of running pull requests

+ +
+ + + + + diff --git a/static/main.css b/static/main.css new file mode 100644 index 0000000..dd55abf --- /dev/null +++ b/static/main.css @@ -0,0 +1 @@ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}html,body{margin:0;padding:0;background:#F4F4F4;color:#242424;font-family:"Route159",serif}html ::selection,body ::selection{background:#c2bbee}html ::-moz-selection,body ::-moz-selection{background:#c2bbee}a,a:visited{color:#7765E3;text-decoration:none}a::selection{color:#F4F4F4}a::-moz-selection{color:#F4F4F4}small{margin-left:1em;color:rgba(36,36,36,0.4);font-size:.75em;word-wrap:break-word;word-break:break-all}.center{text-align:center;font-weight:bold;opacity:.6;padding:5em}.spaced{margin:4rem 0}.cards.spaced{margin:1rem 0 5rem}.banner{background:#E3E3E3;padding-top:2em;padding-bottom:1em;margin:3em 0px}.hidden{display:none}body>main>*,.h-feed>*{margin:0 20%}body>main>.h-entry,.h-feed{margin:0}main h1,main h2,main h3,main h4,main h5,main h6{font-family:"Route159",serif;line-height:1.15;font-weight:300}main h1.article,main h2.article,main h3.article,main h4.article,main h5.article,main h6.article{max-width:40rem}main h1{font-size:2.5em;font-weight:300;margin-top:1em}main h1.article{margin:1em auto .5em;font-family:"Playfair Display",serif;font-size:2.5em;font-weight:normal}main h2{font-size:1.75em;font-weight:300}main h2.article{margin:auto;font-size:1.25em;margin-bottom:.5em}main h3,main h4,main h5,main h6{font-size:1.5em;font-weight:300}main h3.article,main h4.article,main h5.article,main h6.article{margin:auto;font-size:1.1em;margin-bottom:.5em}main .cover{padding:0px;margin:0px;width:auto;min-height:50vh;background-position:center;background-size:cover;overflow:hidden}p.error{color:#E92F2F;font-weight:bold;max-width:40rem;margin:1em auto}.user h1{display:flex;flex-direction:row;align-items:center;margin:0px}.user .avatar.medium{margin-left:0px}.badge{margin-right:1em;padding:.35em 1em;background:#F4F4F4;color:#7765E3;border:1px solid #7765E3;border-radius:1em;font-size:1rem}.user-summary{margin:2em 0px}.cards{display:flex;flex-direction:row;flex-wrap:wrap;padding:0 5%}.card{flex:1;display:flex;flex-direction:column;min-width:20em;min-height:20em;margin:1em;box-sizing:border-box;background:#E3E3E3;text-overflow:ellipsis}.card>*{margin:20px}.card .cover{min-height:10em;background-position:center;background-size:cover;margin:0px}.card h3{margin:.75em 20px;font-family:"Playfair Display",serif;font-size:1.75em;font-weight:normal}.card h3 a{transition:color .1s ease-in;color:#242424}.card h3 a:hover{color:#7765E3}.card main{flex:1;font-family:"Lora",serif;font-size:1em;line-height:1.25;text-align:left;overflow:hidden}.list .card{background:0;margin:2em 0;padding:0;min-height:0}.presentation>h2,.presentation>a{text-align:center}.presentation>a{font-size:1.2em;margin:1em}.stats{display:flex;justify-content:space-around;margin:2em}.stats>div{display:flex;flex-direction:column;justify-content:center;align-items:center}.stats p{text-align:center}.stats em{font-weight:bold;display:block;margin:1em 0}.pagination{display:flex;justify-content:space-evenly}.pagination>*{padding:2em}.flex{display:flex;flex-direction:row;align-items:center}.flex.vertical{flex-direction:column;justify-content:space-around;align-items:flex-start}.flex.vertical small{margin:initial}.flex .grow{flex:1}.left-icon{align-self:center;padding:1em;background:#ECECEC;border-radius:50px;margin:1em;margin-right:2em}body>footer{display:flex;align-content:center;justify-content:space-between;background:#ECECEC;padding:0 20%;margin-top:5em}body>footer *{margin:5em 0}figure{text-align:center;margin:2em;max-width:100%;width:auto;height:auto}figure>*{max-width:100%}figure figcaption{padding:1em}figure audio,figure video{width:100%}.preview{display:block;max-width:100px;max-height:100px;width:auto;height:auto;margin-right:20px}.media-preview{min-height:8em}.media-preview:not(.image){background-color:#7765E3;background-repeat:no-repeat;background-position:center;background-size:4em}.media-preview.unknown{background-image:url('/static/images/unknown-file.svg');display:block}.media-preview.audio{background-image:url('/static/images/audio-file.svg')}.media-preview.video{background-image:url('/static/images/video-file.svg')}.avatar{background-position:center;background-size:cover;border-radius:100%}.avatar.small{width:50px;height:50px}.avatar.medium{width:100px;height:100px;margin:20px}.avatar.padded{margin-right:2rem}.tabs{border-bottom:1px solid #ECECEC;padding:0px;margin:auto 20% 2em;overflow:auto;display:flex}.tabs a{display:inline-block;color:#242424;padding:1em}.tabs a.selected{color:#7765E3;border-bottom:1px solid #7765E3}header{background:#ECECEC}header #content{display:flex;align-content:center;justify-content:space-between}header nav#menu{position:relative;display:none;transform:skewX(-15deg);left:-1em;padding:1em 1em 1em 2em;background:#7765E3;align-self:flex-start}header nav#menu a{transform:skewX(15deg);display:flex;flex-direction:column;align-items:center;justify-content:center;width:1.4em;height:1.4em;margin:0;padding:0;color:#ECECEC;font-size:1.33em}header nav{display:flex;flex-direction:row;align-items:center}header nav hr{height:100%;width:.2em;background:#7765E3;border:none;transform:skewX(-15deg)}header nav a{display:flex;align-items:center;position:relative;align-self:stretch;margin:0;padding:0 2em;font-size:1em}header nav a i{font-size:1.2em}header nav a.title{margin:0;text-align:center;padding:.5em 1em;font-size:1.75em}header nav a.title img{height:1.75em;width:1.75em}header nav a.title p{margin:0;padding-left:.5em}.messages>*{padding:1em 20%}.messages p.error{color:#E92F2F;background:#fde7e7;margin:0;max-width:initial}@media screen and (min-width: 600px){header nav a i{transition:all .2s ease;margin:0}header nav a .mobile-label{transition:all .2s ease;display:block;position:absolute;left:50%;transform:translate(-50%, 0);opacity:0;font-size:.9em;white-space:nowrap}header nav a img+.mobile-label{display:none}header nav a:hover i{margin-bottom:.75em}header nav a:hover .mobile-label{opacity:1;transform:translate(-50%, 80%)}}main .article-info{max-width:40rem;margin:0 auto 3em;font-size:.95em;font-weight:400}main .article-info .author,main .article-info .author a{font-weight:600}main article{max-width:40rem;margin:2.5em auto;font-family:"Lora",serif;font-size:1.2em;line-height:1.7}main article a:hover{text-decoration:underline}main article img{display:block;margin:3em auto;max-width:100%}main article pre{padding:1em;background:#ECECEC;overflow:auto;border-radius:5px}main .article-meta,main .article-meta button{padding:0;font-size:1.1em;margin-top:10%}main .article-meta>*{margin:0 20%}main .article-meta>p{margin:2em 20%;font-size:.9em}main .article-meta .tags{list-style:none;display:inline-block;padding:0px;margin-bottom:2em}main .article-meta .tags li{display:inline-block;background:#ECECEC;padding:0px;margin:0px 10px 10px 0px;border-radius:3px;transition:all .2s ease-in}main .article-meta .tags li a{display:inline-block;padding:10px 20px;color:#242424}main .article-meta .tags li:hover{background:#d8d8d8}main .article-meta .actions{display:flex;flex-direction:row;justify-content:space-around}main .article-meta .likes,main .article-meta .reshares{display:flex;flex-direction:column;align-items:center;padding:.5em 0}main .article-meta .likes p,main .article-meta .reshares p{font-size:1.5em;display:inline-block;margin:0}main .article-meta .likes .action,main .article-meta .reshares .action{display:flex;flex-direction:column;align-items:center;justify-content:center;margin:0;padding:0;background:none;color:#242424;border:none;font-size:1.1em}main .article-meta .likes .action svg.feather,main .article-meta .reshares .action svg.feather{transition:background .1s ease-in;display:flex;align-items:center;justify-content:center;margin:.5em 0;width:2.5em;height:2.5em;border-radius:50%}main .article-meta .likes .action.reshared svg.feather,main .article-meta .likes .action.liked svg.feather,main .article-meta .reshares .action.reshared svg.feather,main .article-meta .reshares .action.liked svg.feather{color:#F4F4F4;font-weight:900}main .article-meta .likes p,main .article-meta .likes .action:hover{color:#E92F2F}main .article-meta .likes .action svg.feather{padding:.7em;box-sizing:border-box;color:#E92F2F;fill:none;border:solid #E92F2F thin}main .article-meta .likes .action:hover svg.feather{background:rgba(233,47,47,0.15)}main .article-meta .likes .action.liked svg.feather{background:#E92F2F;fill:currentColor}main .article-meta .likes .action.liked:hover svg.feather{background:rgba(233,47,47,0.25) color: #E92F2F}main .article-meta .reshares p,main .article-meta .reshares .action:hover{color:#7765E3}main .article-meta .reshares .action svg.feather{padding:.7em;box-sizing:border-box;color:#7765E3;border:solid #7765E3 thin;font-weight:600}main .article-meta .reshares .action:hover svg.feather{background:rgba(119,101,227,0.15)}main .article-meta .reshares .action.reshared svg.feather{background:#7765E3}main .article-meta .reshares .action.reshared:hover svg.feather{background:rgba(119,101,227,0.25) color: #7765E3}main .article-meta .comments{margin:0}main .article-meta .comments>*{margin-left:20%;margin-right:20%}main .article-meta .comments h2{color:#7765E3;font-size:1.5em;font-weight:600}main .article-meta .comments summary{cursor:pointer}main .article-meta .comments>form input[type="submit"]{font-size:1em}main .article-meta .comments a.button,main .article-meta .comments form.inline,main .article-meta .comments form.inline input{display:inline-block;padding:0;background:none;color:#242424;border:none;margin-right:2em;font-family:"Route159",serif}main .article-meta .comments a.button::before,main .article-meta .comments form.inline::before,main .article-meta .comments form.inline input::before{color:#7765E3;padding-right:.5em}main .article-meta .comments a.button:hover,main .article-meta .comments form.inline:hover,main .article-meta .comments form.inline input:hover{color:#7765E3}main .article-meta .comments .list{display:grid;margin:0 0 -5em;padding:0 20%;background:#ECECEC}main .article-meta .comments .comment{padding:2em;font-size:1em;border:none}main .article-meta .comments .comment .author{display:flex;flex-direction:row;align-items:center;align-content:center}main .article-meta .comments .comment .author *{transition:all .1s ease-in}main .article-meta .comments .comment .author .display-name{color:#242424}main .article-meta .comments .comment .author:hover .display-name{color:#7765E3}main .article-meta .comments .comment .author:hover small{opacity:1}main .article-meta .comments .comment .text{padding:1.25em 0;font-family:"Lora",serif;font-size:1.1em;line-height:1.4;text-align:left}#plume-editor header{display:flex;flex-direction:row-reverse;background:transparent;align-items:center;justify-content:space-between}#plume-editor header button{flex:0 0 10em;font-size:1.25em;margin:.5em 0em .5em 1em}#plume-editor>*{min-height:1em;outline:none;margin-bottom:.5em}#plume-editor .placeholder{color:rgba(36,36,36,0.4)}#plume-editor article{max-width:none;min-height:80vh}.popup{position:fixed;top:15vh;bottom:20vh;left:20vw;right:20vw;background:#ECECEC;border:1px solid #7765E3;z-index:2;padding:2em;overflow-y:auto}.popup:not(.show),.popup-bg:not(.show){display:none}.popup-bg{background:rgba(0,0,0,0.1);position:fixed;top:0px;left:0px;right:0px;bottom:0px}.cw-container{position:relative;display:inline-block}.cw-text{display:none}input[type="checkbox"].cw-checkbox{display:none}input:checked ~ .cw-container:before{content:" ";position:absolute;height:100%;width:100%;background:#000}input:checked ~ .cw-container>.cw-text{display:inline;position:absolute;color:white;width:100%;text-align:center;top:50%;transform:translateY(-50%)}label{display:block;margin:2em auto .5em;font-size:1.2em}input,textarea,select{transition:all .1s ease-in;display:block;width:100%;margin:auto;padding:1em;box-sizing:border-box;background:#FFFFFF;color:#242424;border:none;border:solid #ECECEC thin;font-size:1.2em;font-weight:400}input:focus,textarea:focus,select:focus{border-color:#7765E3}form input[type="submit"]{margin:2em auto}textarea{resize:vertical;font-family:"Lora",serif;font-size:1.1em;line-height:1.5}input[type="checkbox"]{display:inline;margin:initial;min-width:initial;width:initial}form.inline{display:inline;margin:0px;padding:0px;width:auto}form.inline input[type="submit"]{display:inline-block;color:#7765E3;cursor:pointer;font-size:1em;width:auto;-webkit-appearance:none}form.inline input[type="submit"]:not(.button){margin:0;padding:0;border:none;background:transparent;color:#7765E3}.button,input[type="submit"],button{transition:all .1s ease-in;display:inline-block;-webkit-appearance:none;border-radius:.5em;margin:.5em auto;padding:.75em 1em;background:transparent;color:#7765E3;border:1px solid #7765E3;cursor:pointer}.button:hover,input[type="submit"]:hover,button:hover{background:rgba(119,101,227,0.4);color:white}.button.destructive,input[type="submit"].destructive,button.destructive{color:#E92F2F;border-color:#E92F2F}.button.destructive:hover,input[type="submit"].destructive:hover,button.destructive:hover{background:rgba(233,47,47,0.4);color:#F4F4F4}input[type="submit"]{display:block}form.new-post{max-width:60em;-webkit-appearance:none}form.new-post .title{margin:0 auto;padding:.75em 0;background:none;border:none;font-family:"Playfair Display",serif;font-size:2em;text-align:left}form.new-post textarea{min-height:20em;overflow-y:hidden;resize:none}form.new-post input[type="submit"]{background:#ECECEC;color:#242424;border:none;-webkit-appearance:none;font-family:"Playfair Display",serif;font-size:1.5em}form.new-post input[type="submit"]:hover{background:#ECECEC}.button+.button{margin-left:1em}.split{display:flex;justify-content:space-between}.split>*{flex-grow:1;max-width:40%}header.center{display:flex;flex-direction:column;align-items:center;background:transparent;opacity:1;font-weight:normal;text-align:left}header.center>*{margin-left:0;margin-right:0}@media screen and (max-width: 600px){@keyframes menuOpening{from{transform:scaleX(0);transform-origin:left;opacity:0}to{transform:scaleX(1);transform-origin:left;opacity:1}}header{flex-direction:column}header nav#menu{display:inline-flex}header #content{display:none;text-align:center}header:focus-within #content,#content.show{position:fixed;display:flex;flex-direction:column;justify-content:flex-start;top:0;left:0;width:100%;height:100%;box-sizing:border-box;animation:.2s menuOpening}header:focus-within #content::before,#content.show::before{content:"";position:absolute;transform:skewX(-10deg);top:0;left:-20%;width:100%;height:100%;z-index:-10;background:#7765E3}header:focus-within #content>nav,#content.show>nav{flex-direction:column;align-items:flex-start}header:focus-within #content>nav a,#content.show>nav a{display:flex;flex-direction:row;align-items:center;margin:0;padding:1rem 1.5rem;color:#F4F4F4;font-size:1.4em;font-weight:300}header:focus-within #content>nav a.title,#content.show>nav a.title{font-size:1.8em}header:focus-within #content>nav a>*:first-child,#content.show>nav a>*:first-child{width:3rem}header:focus-within #content>nav a>img:first-child,#content.show>nav a>img:first-child{height:3rem}header:focus-within #content>nav a>*:last-child,#content.show>nav a>*:last-child{margin-left:1rem}header:focus-within #content>nav a>nav hr,#content.show>nav a>nav hr{display:block;margin:0;width:100%;border:solid #F4F4F4 .1rem}header:focus-within #content>nav a .mobile-label,#content.show>nav a .mobile-label{display:initial}body>main>*{padding:0 5%}main .article-meta>*{margin:0 5%}main .article-meta>p{margin:2em 5%;font-size:.9em}main .article-meta .comments>*{margin:auto 5%}main .article-meta .comments .comment{padding:2em 0px}main .article-info,main article,main h1.article,main h2.article{max-width:90vw}.card{min-width:80%;min-height:80%}.tabs{margin:auto 0px 2em}.stats{flex-direction:column}body>footer{flex-direction:column;align-items:center}body>footer *{margin:1em auto}.flex.wrap{flex-direction:column}.cards{margin:1rem 0 5rem}} diff --git a/static/plume-ci.js b/static/plume-ci.js new file mode 100644 index 0000000..134c25d --- /dev/null +++ b/static/plume-ci.js @@ -0,0 +1,44 @@ +fetch("/up.json").then(function(response) { + return response.json().then(function(json) { + for(i = 0; i < json.length; i++) { + id = json[i]; + fetch("https://api.github.com/repos/Plume-org/Plume/pulls/"+id, {mode: 'cors'}).then( + +function(response) { + return response.json().then(function(json) { + link_test = document.createElement("a"); + link_test.href = "https://pr-" + id + ".joinplu.me/"; + link_github = document.createElement("a"); + link_github.href = "https://github.com/Plume-org/Plume/pull/" + id; + link_github.innerText = "(view on Github)"; + if(json.title === undefined) { + link_test.innerText = "#" + id; + } else { + link_test.innerText = "#" + id + " " + json.title; + } + li = document.createElement("li"); + li.appendChild(link_test); + li.append(" ⋅ "); + li.appendChild(link_github); + document.getElementById("list").appendChild(li); + }) +} + + ).catch( +function() { + link_test = document.createElement("a"); + link_test.href = "https://pr-" + id + ".joinplu.me/"; + link_github = document.createElement("a"); + link_github.href = "https://github.com/Plume-org/Plume/pull/" + id; + link_github.innerText = "(view on Github)"; + link_test.innerText = "#" + id; + li = document.createElement("li"); + li.appendChild(link_test); + li.append(" ⋅ "); + li.appendChild(link_github); + document.getElementById("list").appendChild(li); +} + ) + } + }) +}); diff --git a/static/plumeFeather256.png b/static/plumeFeather256.png new file mode 100644 index 0000000000000000000000000000000000000000..748fbb75c85669904a1bdd38127822b0ea2cbb0f GIT binary patch literal 12262 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 SibQDg0a>XJk`)rr!2bbRq*A^B literal 0 HcmV?d00001 diff --git a/static/plumeFeatherFilled64.png b/static/plumeFeatherFilled64.png new file mode 100644 index 0000000000000000000000000000000000000000..917c4189f2cd4f3c396d7490144a603534b37e49 GIT binary patch literal 2696 zcmV;33U~F1P)ni4Lz$3@s(}cqCt1-^iio6%}T>_Vl zw-F4EslqW?g5)(&1>p~xxHp}5BcSctXWe6Ueb)>27Ex|Ss0WbYo)s}T&N4h_Ij*U} zajJ1l77&U-FT|$-UN*wbJNIq*_jx10j)so6I$~OS<-~RabpQy6c;&{rD{##+Ja<_+ zV;rnT6vCs!#mvWdb~T*_IOhduZQSz?Fkeu(S-}7plf!o}z;jnm+2HXgg|C2G1pWE0 z?xvrPq@S|_v^4Ln!}5T_c0dpz>(!F+>hPQub0brw6rL#m6!W#wS?8nxt&RB`G_g-1 z)Cxk@Uq?1mkC9A8d_jB~)d=A4?fK^4jLtjf1h~7g^V5p`CW7&t71ZP|!ID_Hd z7uY#IZ^;E{ZOm`7syoC>9+lYKs_-yC&cBE%{~~7deNTtP7KoBJ0E$r%bd1kmQUUJX z(zQde-xQ&S*j%M>9YA&VQnHz~srVTA_JRCU-@oh3`1~ai;LZ;}xzhDBkApUjN`4<8 zIe$ZHjklT*M126L$Rm^4EV=-#jrmQA{Rwc%xGeFU6;$~fQ}Y!@eW)g=@Vnjl=D$v6 zV^Z@r3$!+MU9Dn&4_qQLQTyuLCCvAmKMPfgVeiQAho>@IGyz%~J8x6fU!tt>+*SDQ zg=6wF?gcoeIyHZ#=oPFD01j^GTlc-G>=s3U*2c~zkRBlCdv9WS?s6hKFvce5UzD0Z zt09Hp7yu&jg|^>Z7f)ro;B!E0Q`fDk+5tE@e*;zin?aQ%89Hm@IV*9U^m>1&co@|f z;Agw?%~SS1Ebs_u+0uEVs^$SV=hv4T4=4$v&*grmHZ`B6@Hk=l#5d@Q+&h!~f(g*l z(0LWYJ|L6LtfR_*%h@~;7ZGpxw;|)MNyTRvzs^wUrIEkwkLR2JHB*@d5#XLXI@Tic zeUK{OtEDTb48S#VW6;obkgTq8al6Maj#LF`Y3jNi)mB8PsoIP&UYhh{5GVZ%7GET>g~<&> zduGFvngDli?c7MBI{~Wwx8OQ8X;F`XwIvGSF@msfOu8dJer7F&;9meG*Gs-N8@^No zXlrXTy$7TNSe0>Clg+G8gLVv(WQao8OBkJE^b#uKkn`)wdg~b|{G*(Pv_IbQ(UY^` zO+|p-1DAaqc#jc}n%sn_bj7eXB8*QFM191`;FvteRFTcB#rNtEaR{PU%jbUOr0d!* z&DO`f1-Q4NXMIBabp@)kmmn2}t;Qn=PcT$EjE?JV&s{?3parpvu3PY-S@yoN26-!P24ObA|k~=p?Ok^;7Xq zuX8hrPHN_|&^VtAZF`NXFRpV-~K?dkdO%{c(~$%dYqP~yV~wacn5 zC*!W3kN-KL5FDjgj`S!ZpJ~rGKQ>>^IgfzAN$wS;)^(OGV&j#;;)^38?ikT~+w)s@ zr@=fY0q(iyJDz<*KMM@s+AKV*jTkH*BudTzS`f5xSN@J4rNuud0h0dZ4T5fPOb*Xo zl~x_5_LmGXP}onRB~VTpV{YD=Z~kMNKISBVsNM$*A9fb@bxjbRVz6|myu(BPV${2J zXMW4EwEfIlfYye+*C@PQ#7#AbIRR=J3XYT?G?Wv%O=0tKHUQtNZ0S>!Fg!^y>>VA#J_!27_U>)ZR79F0rWL^E25teCxlRp^ zshSh9wGlzoM=3gvwc$we%ZPrZ{?&Ego$ktdF)^(GYNX%68}z-}SqAx)C_Y0ee3fwI zQF0jv6dtPTU)k}F?ds#-swYZrS@0h3iDz3CG?jevN^`0Y=@<3?ckUEkChpfAr+OJNA#~JC`v*fcqMH za{UrNC_t6J@$5qefGB>0{=z}ZjhAnW(Z|lj?!kTgwj_&J<#aJYfB`4EUsT@gnB15L zi-{d#ptv8f2->l$yZKWfI==k*hB4vXmTi0LQTaSD{Hmk8@kwlv{-NhljZx(X>-*O2 z_+Mx|j1P+^<^iBOI%Bf=>IyD2Tt#mHA&5?)8UhTca?|ea=HD)L