WIP
1
cpanfile
|
@ -19,6 +19,7 @@ requires 'Filesys::DfPortable';
|
|||
requires 'Data::Entropy';
|
||||
requires 'Crypt::SaltedHash';
|
||||
requires 'Data::Validate::URI';
|
||||
requires 'Data::Entropy';
|
||||
requires 'Term::ProgressBar';
|
||||
requires 'URI::Find';
|
||||
|
||||
|
|
|
@ -175,6 +175,11 @@ sub startup {
|
|||
->to('Misc#about')
|
||||
->name('about');
|
||||
|
||||
# About page
|
||||
$r->get('/background')
|
||||
->to('Misc#background')
|
||||
->name('background');
|
||||
|
||||
# About config API endpoint
|
||||
$r->get('/about/config')
|
||||
->to('Misc#config_infos')
|
||||
|
|
|
@ -40,6 +40,13 @@ sub about {
|
|||
);
|
||||
}
|
||||
|
||||
sub background {
|
||||
my $c = shift;
|
||||
|
||||
$c->res->headers->cache_control('no-store');
|
||||
$c->reply->file($c->random_background_image);
|
||||
}
|
||||
|
||||
sub config_infos {
|
||||
my $c = shift;
|
||||
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
||||
package Lufi::Plugin::Helpers;
|
||||
use Mojo::Base 'Mojolicious::Plugin';
|
||||
use Mojo::Collection 'c';
|
||||
use File::Spec;
|
||||
use Lufi::DB::File;
|
||||
use Lufi::DB::Invitation;
|
||||
use Date::Language;
|
||||
use Data::Entropy qw(entropy_source);
|
||||
|
||||
sub register {
|
||||
my ($self, $app) = @_;
|
||||
|
@ -70,6 +73,8 @@ sub register {
|
|||
$app->helper(is_guest => \&_is_guest);
|
||||
$app->helper(get_date_lang => \&_get_date_lang);
|
||||
$app->helper(git_version => \&_git_version);
|
||||
$app->helper(backgrounds => \&_backgrounds);
|
||||
$app->helper(random_background_image => \&_random_background_image);
|
||||
}
|
||||
|
||||
sub _pg {
|
||||
|
@ -246,4 +251,25 @@ sub _git_version {
|
|||
}
|
||||
}
|
||||
|
||||
sub _backgrounds {
|
||||
my $c = shift;
|
||||
|
||||
state @backgrounds;
|
||||
if (!scalar @backgrounds) {
|
||||
for my $i (@{$c->app->static->paths}) {
|
||||
push @backgrounds, glob(File::Spec->catdir($i, 'img', 'backgrounds', '*'));
|
||||
}
|
||||
}
|
||||
|
||||
return @backgrounds;
|
||||
}
|
||||
|
||||
sub _random_background_image {
|
||||
my $c = shift;
|
||||
|
||||
my @backgrounds = $c->backgrounds;
|
||||
|
||||
return File::Spec->abs2rel($backgrounds[entropy_source->get_int(scalar(@backgrounds))]);
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
After Width: | Height: | Size: 249 KiB |
After Width: | Height: | Size: 248 KiB |
After Width: | Height: | Size: 249 KiB |
After Width: | Height: | Size: 255 KiB |
|
@ -14,8 +14,8 @@ function escapeHtml(string) {
|
|||
return entityMap[s];
|
||||
});
|
||||
}
|
||||
function changeLang() {
|
||||
window.location = langUrl+$(this).val();
|
||||
function changeLang(locale) {
|
||||
window.location = langUrl+locale;
|
||||
}
|
||||
$(document).ready(function(){
|
||||
$('select').material_select();
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
node_modules/*
|
|
@ -0,0 +1,27 @@
|
|||
all: minify
|
||||
|
||||
cat-css:
|
||||
@echo -n 'Concatenating css files to styles.css…'
|
||||
@cat styles/*.css > styles.css
|
||||
@echo ' Done.'
|
||||
|
||||
build: cat-css
|
||||
@echo 'TailwindCSS processing…'
|
||||
@NODE_ENV=production npx tailwindcss build styles.css -c tailwind.config.js -o ../public/css/lufi.css
|
||||
@echo ' Done.'
|
||||
|
||||
minify: build
|
||||
@echo -n 'Minifying lufi.css file…'
|
||||
@npx csso ../public/css/lufi.css -o ../public/css/lufi.min.css
|
||||
@echo ' Done.'
|
||||
@ls -lh ../public/css/lufi*.css
|
||||
|
||||
watch: all
|
||||
@inotify-hookable -f tailwind.config.js -w styles -w ../templates -c "make" 2>/dev/null
|
||||
|
||||
first-install:
|
||||
yarn add csso-cli tailwindcss
|
||||
npx tailwindcss init
|
||||
|
||||
install:
|
||||
yarn install --production --pure-lockfile
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"csso-cli": "^3.0.0",
|
||||
"tailwindcss": "^1.4.5"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,311 @@
|
|||
@tailwind base;
|
||||
|
||||
/* Recreate some normal behavior */
|
||||
h1 {
|
||||
@apply text-2xl;
|
||||
}
|
||||
h2 {
|
||||
@apply text-xl;
|
||||
}
|
||||
h3 {
|
||||
@apply text-lg;
|
||||
}
|
||||
|
||||
@tailwind components;
|
||||
|
||||
a {
|
||||
@apply underline;
|
||||
text-decoration-style: dotted;
|
||||
}
|
||||
/* Default */
|
||||
body {
|
||||
@apply bg-cover;
|
||||
background-image: repeating-linear-gradient(135deg, #00000033, #00000033 63%, transparent 63%, transparent),
|
||||
url('../background');
|
||||
@apply text-white;
|
||||
@apply min-h-screen;
|
||||
}
|
||||
body > * {
|
||||
@apply px-4;
|
||||
}
|
||||
body.rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
/* Navbar */
|
||||
.navbar {
|
||||
@apply bg-gray-800 bg-opacity-75;
|
||||
@apply w-full;
|
||||
@apply text-base uppercase;
|
||||
}
|
||||
.navbar .navbrand {
|
||||
@apply font-bold;
|
||||
}
|
||||
.navbar ul li {
|
||||
@apply px-2 py-1;
|
||||
@apply hidden;
|
||||
}
|
||||
.navbar ul li.navbrand {
|
||||
display: list-item;
|
||||
}
|
||||
.navbar ul li > *,
|
||||
.dropdown.user ul li * {
|
||||
@apply align-middle;
|
||||
@apply no-underline;
|
||||
@apply border-solid border-gray-400 border-b-4;
|
||||
}
|
||||
.navbar ul.show-menu li {
|
||||
display: list-item;
|
||||
}
|
||||
.navbar ul li.navbrand * {
|
||||
@apply border-none;
|
||||
@apply inline-block;
|
||||
}
|
||||
.navbar .hamburger {
|
||||
@apply float-right;
|
||||
}
|
||||
@screen xl {
|
||||
.navbar .navbrand .hamburger {
|
||||
@apply hidden;
|
||||
}
|
||||
.navbar ul {
|
||||
@apply flex;
|
||||
}
|
||||
.navbar ul li {
|
||||
display: list-item;
|
||||
}
|
||||
}
|
||||
.navbar ul li.active,
|
||||
.dropdown.user ul li.active {
|
||||
@apply font-bold;
|
||||
}
|
||||
.navbar ul li.active *,
|
||||
.dropdown.active ul li.active * {
|
||||
@apply border-solid border-teal-400 border-b-4;
|
||||
@apply no-underline;
|
||||
}
|
||||
.navbar ul li.dropdown {
|
||||
@apply relative;
|
||||
}
|
||||
.navbar ul li.dropdown.lang *,
|
||||
.navbar ul li.dropdown.user > a {
|
||||
@apply border-opacity-0;
|
||||
}
|
||||
.dropdown span,
|
||||
.dropdown li {
|
||||
@apply cursor-pointer;
|
||||
}
|
||||
.dropdown a {
|
||||
display: ruby;
|
||||
}
|
||||
.navbar ul li.dropdown ul {
|
||||
@apply bg-gray-800 bg-opacity-100;
|
||||
@apply absolute;
|
||||
@apply mt-1;
|
||||
@apply block;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.dropdown.lang ul li {
|
||||
@apply underline;
|
||||
text-decoration-style: dotted;
|
||||
}
|
||||
.dropdown.user ul,
|
||||
.dropdown.user ul li form {
|
||||
@apply border-none;
|
||||
}
|
||||
.dropdown.user button {
|
||||
@apply text-base uppercase;
|
||||
}
|
||||
main {
|
||||
@apply mt-4 w-auto mx-auto;
|
||||
@apply grid grid-cols-1;
|
||||
@apply max-w-6xl;
|
||||
}
|
||||
main > * {
|
||||
@apply bg-gray-900 bg-opacity-75;
|
||||
@apply p-4;
|
||||
}
|
||||
main a {
|
||||
@apply text-teal-200;
|
||||
}
|
||||
main a:visited {
|
||||
@apply text-purple-400;
|
||||
}
|
||||
/* Icons */
|
||||
svg {
|
||||
@apply h-4 w-4;
|
||||
@apply text-white;
|
||||
}
|
||||
svg.icon-hamburger {
|
||||
@apply h-8 w-8;
|
||||
}
|
||||
svg.icon-infos {
|
||||
@apply h-5 w-5;
|
||||
@apply text-blue-500 inline-block;
|
||||
@apply bg-white rounded-full;
|
||||
}
|
||||
svg.icon-upload {
|
||||
@apply mx-auto;
|
||||
@apply rounded-full border border-gray-200 border-8;
|
||||
@apply h-32 w-32;
|
||||
@apply text-gray-200;
|
||||
}
|
||||
/* Cards */
|
||||
.card {
|
||||
@apply p-4 mt-4;
|
||||
}
|
||||
.card.mini {
|
||||
@apply pl-1 pr-0 py-0 my-1;
|
||||
}
|
||||
.card.error {
|
||||
@apply bg-orange-100;
|
||||
@apply text-orange-700;
|
||||
@apply border-l-4 border-orange-500;
|
||||
}
|
||||
.card.info {
|
||||
@apply bg-blue-100;
|
||||
@apply text-blue-700;
|
||||
@apply border-l-4 border-blue-500;
|
||||
}
|
||||
/* Buttons */
|
||||
.btn,
|
||||
.btn a {
|
||||
@apply text-white text-center no-underline !important;
|
||||
}
|
||||
.btn {
|
||||
@apply bg-teal-700;
|
||||
@apply font-bold;
|
||||
@apply py-1 px-2;
|
||||
@apply border-2 border-teal-700 rounded;
|
||||
@apply text-white text-center no-underline !important;
|
||||
}
|
||||
.btn:hover {
|
||||
@apply bg-teal-900;
|
||||
@apply border-teal-900;
|
||||
}
|
||||
.btn.disabled {
|
||||
@apply opacity-50 cursor-not-allowed;
|
||||
}
|
||||
.form {
|
||||
@apply mx-auto;
|
||||
}
|
||||
.form .input-field {
|
||||
@apply mb-4;
|
||||
}
|
||||
.form label {
|
||||
@apply text-sm font-bold;
|
||||
@apply mb-2;
|
||||
@apply block;
|
||||
}
|
||||
.form input {
|
||||
@apply pl-2 w-full;
|
||||
}
|
||||
.form .btn {
|
||||
@apply w-full;
|
||||
}
|
||||
select {
|
||||
@apply appearance-none;
|
||||
@apply block appearance-none w-full;
|
||||
@apply border border-gray-200 rounded;
|
||||
}
|
||||
.modale {
|
||||
@apply bg-gray-900 bg-opacity-100;
|
||||
@apply p-4 pt-8;
|
||||
@apply w-full h-full;
|
||||
@apply fixed inset-0;
|
||||
@apply overflow-y-scroll;
|
||||
@apply z-50;
|
||||
}
|
||||
.modale div {
|
||||
@apply mx-auto max-w-4xl;
|
||||
}
|
||||
.modale ul {
|
||||
@apply list-disc list-inside;
|
||||
}
|
||||
/* My files page */
|
||||
.block-div.myfiles hr {
|
||||
@apply mb-2;
|
||||
}
|
||||
.block-div.myfiles {
|
||||
@apply leading-tight;
|
||||
}
|
||||
.files-buttons {
|
||||
@apply my-4 grid grid-cols-1 gap-2;
|
||||
@apply text-center;
|
||||
}
|
||||
@screen lg {
|
||||
.files-buttons {
|
||||
@apply mt-4 grid grid-cols-2;
|
||||
}
|
||||
}
|
||||
.files-buttons .btn {
|
||||
@apply w-full;
|
||||
}
|
||||
/* Index page */
|
||||
.upload {
|
||||
@apply my-4 grid grid-cols-1 gap-2;
|
||||
}
|
||||
@screen lg {
|
||||
.upload {
|
||||
@apply mt-4 grid grid-cols-2;
|
||||
}
|
||||
}
|
||||
@screen xl {
|
||||
.upload {
|
||||
@apply mt-4 grid grid-cols-3;
|
||||
}
|
||||
.upload #results {
|
||||
@apply col-span-2;
|
||||
}
|
||||
}
|
||||
.upload .upload-form {
|
||||
@apply bg-gray-900 bg-opacity-75;
|
||||
@apply rounded-md;
|
||||
@apply p-4;
|
||||
}
|
||||
@screen md {
|
||||
.upload .upload-form {
|
||||
@apply leading-relaxed;
|
||||
}
|
||||
}
|
||||
@screen lg {
|
||||
.upload .upload-form {
|
||||
@apply leading-loose;
|
||||
}
|
||||
}
|
||||
.upload .upload-form select {
|
||||
@apply leading-normal;
|
||||
}
|
||||
.upload .upload-form input {
|
||||
@apply pl-2;
|
||||
@apply leading-relaxed;
|
||||
}
|
||||
.upload .upload-form select,
|
||||
.upload .upload-form input,
|
||||
.upload .upload-form {
|
||||
@apply bg-gray-700 bg-opacity-75;
|
||||
}
|
||||
.upload #results h1 {
|
||||
@apply text-xl text-center;
|
||||
}
|
||||
.upload .upload-form .input-field {
|
||||
@apply relative;
|
||||
}
|
||||
.upload .upload-form [type="checkbox"] {
|
||||
@apply w-4 h-4;
|
||||
}
|
||||
|
||||
.upload #files {
|
||||
@apply text-center;
|
||||
@apply mt-4 p-4;
|
||||
@apply border-2 border-gray-200 border-dashed;
|
||||
}
|
||||
|
||||
.upload #results {
|
||||
@apply bg-gray-700 bg-opacity-75;
|
||||
@apply rounded-md;
|
||||
@apply p-4 mx-10;
|
||||
}
|
||||
.form.invite {
|
||||
@apply max-w-2xl;
|
||||
}
|
||||
@tailwind utilities;
|
|
@ -0,0 +1,19 @@
|
|||
@tailwind base;
|
||||
|
||||
/* Recreate some normal behavior */
|
||||
h1 {
|
||||
@apply text-2xl;
|
||||
}
|
||||
h2 {
|
||||
@apply text-xl;
|
||||
}
|
||||
h3 {
|
||||
@apply text-lg;
|
||||
}
|
||||
|
||||
@tailwind components;
|
||||
|
||||
a {
|
||||
@apply underline;
|
||||
text-decoration-style: dotted;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/* Default */
|
||||
body {
|
||||
@apply bg-cover;
|
||||
background-image: repeating-linear-gradient(135deg, #00000033, #00000033 63%, transparent 63%, transparent),
|
||||
url('../background');
|
||||
@apply text-white;
|
||||
@apply min-h-screen;
|
||||
}
|
||||
body > * {
|
||||
@apply px-4;
|
||||
}
|
||||
body.rtl {
|
||||
direction: rtl;
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
/* Navbar */
|
||||
.navbar {
|
||||
@apply bg-gray-800 bg-opacity-75;
|
||||
@apply w-full;
|
||||
@apply text-base uppercase;
|
||||
}
|
||||
.navbar .navbrand {
|
||||
@apply font-bold;
|
||||
}
|
||||
.navbar ul li {
|
||||
@apply px-2 py-1;
|
||||
@apply hidden;
|
||||
}
|
||||
.navbar ul li.navbrand {
|
||||
display: list-item;
|
||||
}
|
||||
.navbar ul li > *,
|
||||
.dropdown.user ul li * {
|
||||
@apply align-middle;
|
||||
@apply no-underline;
|
||||
@apply border-solid border-gray-400 border-b-4;
|
||||
}
|
||||
.navbar ul.show-menu li {
|
||||
display: list-item;
|
||||
}
|
||||
.navbar ul li.navbrand * {
|
||||
@apply border-none;
|
||||
@apply inline-block;
|
||||
}
|
||||
.navbar .hamburger {
|
||||
@apply float-right;
|
||||
}
|
||||
@screen xl {
|
||||
.navbar .navbrand .hamburger {
|
||||
@apply hidden;
|
||||
}
|
||||
.navbar ul {
|
||||
@apply flex;
|
||||
}
|
||||
.navbar ul li {
|
||||
display: list-item;
|
||||
}
|
||||
}
|
||||
.navbar ul li.active,
|
||||
.dropdown.user ul li.active {
|
||||
@apply font-bold;
|
||||
}
|
||||
.navbar ul li.active *,
|
||||
.dropdown.active ul li.active * {
|
||||
@apply border-solid border-teal-400 border-b-4;
|
||||
@apply no-underline;
|
||||
}
|
||||
.navbar ul li.dropdown {
|
||||
@apply relative;
|
||||
}
|
||||
.navbar ul li.dropdown.lang *,
|
||||
.navbar ul li.dropdown.user > a {
|
||||
@apply border-opacity-0;
|
||||
}
|
||||
.dropdown span,
|
||||
.dropdown li {
|
||||
@apply cursor-pointer;
|
||||
}
|
||||
.dropdown a {
|
||||
display: ruby;
|
||||
}
|
||||
.navbar ul li.dropdown ul {
|
||||
@apply bg-gray-800 bg-opacity-100;
|
||||
@apply absolute;
|
||||
@apply mt-1;
|
||||
@apply block;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.dropdown.lang ul li {
|
||||
@apply underline;
|
||||
text-decoration-style: dotted;
|
||||
}
|
||||
.dropdown.user ul,
|
||||
.dropdown.user ul li form {
|
||||
@apply border-none;
|
||||
}
|
||||
.dropdown.user button {
|
||||
@apply text-base uppercase;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
main {
|
||||
@apply mt-4 w-auto mx-auto;
|
||||
@apply grid grid-cols-1;
|
||||
@apply max-w-6xl;
|
||||
}
|
||||
main > * {
|
||||
@apply bg-gray-900 bg-opacity-75;
|
||||
@apply p-4;
|
||||
}
|
||||
main a {
|
||||
@apply text-teal-200;
|
||||
}
|
||||
main a:visited {
|
||||
@apply text-purple-400;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
/* Icons */
|
||||
svg {
|
||||
@apply h-4 w-4;
|
||||
@apply text-white;
|
||||
}
|
||||
svg.icon-hamburger {
|
||||
@apply h-8 w-8;
|
||||
}
|
||||
svg.icon-infos {
|
||||
@apply h-5 w-5;
|
||||
@apply text-blue-500 inline-block;
|
||||
@apply bg-white rounded-full;
|
||||
}
|
||||
svg.icon-upload {
|
||||
@apply mx-auto;
|
||||
@apply rounded-full border border-gray-200 border-8;
|
||||
@apply h-32 w-32;
|
||||
@apply text-gray-200;
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
/* Cards */
|
||||
.card {
|
||||
@apply p-4 mt-4;
|
||||
}
|
||||
.card.mini {
|
||||
@apply pl-1 pr-0 py-0 my-1;
|
||||
}
|
||||
.card.error {
|
||||
@apply bg-orange-100;
|
||||
@apply text-orange-700;
|
||||
@apply border-l-4 border-orange-500;
|
||||
}
|
||||
.card.info {
|
||||
@apply bg-blue-100;
|
||||
@apply text-blue-700;
|
||||
@apply border-l-4 border-blue-500;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
/* Buttons */
|
||||
.btn,
|
||||
.btn a {
|
||||
@apply text-white text-center no-underline !important;
|
||||
}
|
||||
.btn {
|
||||
@apply bg-teal-700;
|
||||
@apply font-bold;
|
||||
@apply py-1 px-2;
|
||||
@apply border-2 border-teal-700 rounded;
|
||||
@apply text-white text-center no-underline !important;
|
||||
}
|
||||
.btn:hover {
|
||||
@apply bg-teal-900;
|
||||
@apply border-teal-900;
|
||||
}
|
||||
.btn.disabled {
|
||||
@apply opacity-50 cursor-not-allowed;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
.form {
|
||||
@apply mx-auto;
|
||||
}
|
||||
.form .input-field {
|
||||
@apply mb-4;
|
||||
}
|
||||
.form label {
|
||||
@apply text-sm font-bold;
|
||||
@apply mb-2;
|
||||
@apply block;
|
||||
}
|
||||
.form input {
|
||||
@apply pl-2 w-full;
|
||||
}
|
||||
.form .btn {
|
||||
@apply w-full;
|
||||
}
|
||||
select {
|
||||
@apply appearance-none;
|
||||
@apply block appearance-none w-full;
|
||||
@apply border border-gray-200 rounded;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
.modale {
|
||||
@apply bg-gray-900 bg-opacity-100;
|
||||
@apply p-4 pt-8;
|
||||
@apply w-full h-full;
|
||||
@apply fixed inset-0;
|
||||
@apply overflow-y-scroll;
|
||||
@apply z-50;
|
||||
}
|
||||
.modale div {
|
||||
@apply mx-auto max-w-4xl;
|
||||
}
|
||||
.modale ul {
|
||||
@apply list-disc list-inside;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
/* My files page */
|
||||
.block-div.myfiles hr {
|
||||
@apply mb-2;
|
||||
}
|
||||
.block-div.myfiles {
|
||||
@apply leading-tight;
|
||||
}
|
||||
.files-buttons {
|
||||
@apply my-4 grid grid-cols-1 gap-2;
|
||||
@apply text-center;
|
||||
}
|
||||
@screen lg {
|
||||
.files-buttons {
|
||||
@apply mt-4 grid grid-cols-2;
|
||||
}
|
||||
}
|
||||
.files-buttons .btn {
|
||||
@apply w-full;
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/* Index page */
|
||||
.upload {
|
||||
@apply my-4 grid grid-cols-1 gap-2;
|
||||
}
|
||||
@screen lg {
|
||||
.upload {
|
||||
@apply mt-4 grid grid-cols-2;
|
||||
}
|
||||
}
|
||||
@screen xl {
|
||||
.upload {
|
||||
@apply mt-4 grid grid-cols-3;
|
||||
}
|
||||
.upload #results {
|
||||
@apply col-span-2;
|
||||
}
|
||||
}
|
||||
.upload .upload-form {
|
||||
@apply bg-gray-900 bg-opacity-75;
|
||||
@apply rounded-md;
|
||||
@apply p-4;
|
||||
}
|
||||
@screen md {
|
||||
.upload .upload-form {
|
||||
@apply leading-relaxed;
|
||||
}
|
||||
}
|
||||
@screen lg {
|
||||
.upload .upload-form {
|
||||
@apply leading-loose;
|
||||
}
|
||||
}
|
||||
.upload .upload-form select {
|
||||
@apply leading-normal;
|
||||
}
|
||||
.upload .upload-form input {
|
||||
@apply pl-2;
|
||||
@apply leading-relaxed;
|
||||
}
|
||||
.upload .upload-form select,
|
||||
.upload .upload-form input,
|
||||
.upload .upload-form {
|
||||
@apply bg-gray-700 bg-opacity-75;
|
||||
}
|
||||
.upload #results h1 {
|
||||
@apply text-xl text-center;
|
||||
}
|
||||
.upload .upload-form .input-field {
|
||||
@apply relative;
|
||||
}
|
||||
.upload .upload-form [type="checkbox"] {
|
||||
@apply w-4 h-4;
|
||||
}
|
||||
|
||||
.upload #files {
|
||||
@apply text-center;
|
||||
@apply mt-4 p-4;
|
||||
@apply border-2 border-gray-200 border-dashed;
|
||||
}
|
||||
|
||||
.upload #results {
|
||||
@apply bg-gray-700 bg-opacity-75;
|
||||
@apply rounded-md;
|
||||
@apply p-4 mx-10;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
.form.invite {
|
||||
@apply max-w-2xl;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
@tailwind utilities;
|
|
@ -0,0 +1,15 @@
|
|||
module.exports = {
|
||||
purge: [
|
||||
'../templates/*.ep',
|
||||
'../templates/*/*.ep',
|
||||
'../templates/*/*/*ep',
|
||||
],
|
||||
target: 'relaxed',
|
||||
prefix: '',
|
||||
important: false,
|
||||
separator: ':',
|
||||
theme: {},
|
||||
variants: {},
|
||||
corePlugins: {},
|
||||
plugins: [],
|
||||
}
|
|
@ -0,0 +1,749 @@
|
|||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@fullhuman/postcss-purgecss@^2.1.2":
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.2.0.tgz#2b3699287163ff515f25ccdae5b96a244eebb41a"
|
||||
integrity sha512-q4zYAn8L9olA5uneaLhxkHRBoug9dnAqytbdX9R5dbzSORobhYr1yGR2JN3Q1UMd5RB0apm1NvJekHaymal/BQ==
|
||||
dependencies:
|
||||
postcss "7.0.28"
|
||||
purgecss "^2.2.0"
|
||||
|
||||
"@types/color-name@^1.1.1":
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
|
||||
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
|
||||
|
||||
acorn-node@^1.6.1:
|
||||
version "1.8.2"
|
||||
resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
|
||||
integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
|
||||
dependencies:
|
||||
acorn "^7.0.0"
|
||||
acorn-walk "^7.0.0"
|
||||
xtend "^4.0.2"
|
||||
|
||||
acorn-walk@^7.0.0:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e"
|
||||
integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==
|
||||
|
||||
acorn@^7.0.0:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
|
||||
integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
|
||||
|
||||
ansi-regex@^2.0.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
|
||||
integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
|
||||
|
||||
ansi-styles@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
|
||||
integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
|
||||
|
||||
ansi-styles@^3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
|
||||
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
|
||||
dependencies:
|
||||
color-convert "^1.9.0"
|
||||
|
||||
ansi-styles@^4.1.0:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
|
||||
integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
|
||||
dependencies:
|
||||
"@types/color-name" "^1.1.1"
|
||||
color-convert "^2.0.1"
|
||||
|
||||
anymatch@~3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
|
||||
integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
|
||||
dependencies:
|
||||
normalize-path "^3.0.0"
|
||||
picomatch "^2.0.4"
|
||||
|
||||
autoprefixer@^9.4.5:
|
||||
version "9.7.6"
|
||||
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4"
|
||||
integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==
|
||||
dependencies:
|
||||
browserslist "^4.11.1"
|
||||
caniuse-lite "^1.0.30001039"
|
||||
chalk "^2.4.2"
|
||||
normalize-range "^0.1.2"
|
||||
num2fraction "^1.2.2"
|
||||
postcss "^7.0.27"
|
||||
postcss-value-parser "^4.0.3"
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||
|
||||
binary-extensions@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
|
||||
integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
braces@~3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
||||
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
|
||||
browserslist@^4.11.1, browserslist@^4.12.0:
|
||||
version "4.12.0"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d"
|
||||
integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==
|
||||
dependencies:
|
||||
caniuse-lite "^1.0.30001043"
|
||||
electron-to-chromium "^1.3.413"
|
||||
node-releases "^1.1.53"
|
||||
pkg-up "^2.0.0"
|
||||
|
||||
bytes@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
|
||||
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
|
||||
|
||||
camelcase-css@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
|
||||
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
|
||||
|
||||
caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001043:
|
||||
version "1.0.30001053"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001053.tgz#b7ae027567ce2665b965b0437e4512b296ccd20d"
|
||||
integrity sha512-HtV4wwIZl6GA4Oznse8aR274XUOYGZnQLcf/P8vHgmlfqSNelwD+id8CyHOceqLqt9yfKmo7DUZTh1EuS9pukg==
|
||||
|
||||
chalk@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||
integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
|
||||
dependencies:
|
||||
ansi-styles "^2.2.1"
|
||||
escape-string-regexp "^1.0.2"
|
||||
has-ansi "^2.0.0"
|
||||
strip-ansi "^3.0.0"
|
||||
supports-color "^2.0.0"
|
||||
|
||||
chalk@^2.4.1, chalk@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||
dependencies:
|
||||
ansi-styles "^3.2.1"
|
||||
escape-string-regexp "^1.0.5"
|
||||
supports-color "^5.3.0"
|
||||
|
||||
chalk@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72"
|
||||
integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==
|
||||
dependencies:
|
||||
ansi-styles "^4.1.0"
|
||||
supports-color "^7.1.0"
|
||||
|
||||
chokidar@^3.0.0:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8"
|
||||
integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==
|
||||
dependencies:
|
||||
anymatch "~3.1.1"
|
||||
braces "~3.0.2"
|
||||
glob-parent "~5.1.0"
|
||||
is-binary-path "~2.1.0"
|
||||
is-glob "~4.0.1"
|
||||
normalize-path "~3.0.0"
|
||||
readdirp "~3.4.0"
|
||||
optionalDependencies:
|
||||
fsevents "~2.1.2"
|
||||
|
||||
clap@^1.0.9:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
|
||||
integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==
|
||||
dependencies:
|
||||
chalk "^1.1.3"
|
||||
|
||||
color-convert@^1.9.0, color-convert@^1.9.1:
|
||||
version "1.9.3"
|
||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
||||
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
|
||||
dependencies:
|
||||
color-name "1.1.3"
|
||||
|
||||
color-convert@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
|
||||
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
|
||||
dependencies:
|
||||
color-name "~1.1.4"
|
||||
|
||||
color-name@1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
|
||||
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
|
||||
|
||||
color-name@^1.0.0, color-name@~1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||
|
||||
color-string@^1.5.2:
|
||||
version "1.5.3"
|
||||
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
|
||||
integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
|
||||
dependencies:
|
||||
color-name "^1.0.0"
|
||||
simple-swizzle "^0.2.2"
|
||||
|
||||
color@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
|
||||
integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
|
||||
dependencies:
|
||||
color-convert "^1.9.1"
|
||||
color-string "^1.5.2"
|
||||
|
||||
commander@^5.0.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
|
||||
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||
|
||||
css-tree@1.0.0-alpha.39:
|
||||
version "1.0.0-alpha.39"
|
||||
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
|
||||
integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
|
||||
dependencies:
|
||||
mdn-data "2.0.6"
|
||||
source-map "^0.6.1"
|
||||
|
||||
css-unit-converter@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
|
||||
integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
|
||||
|
||||
cssesc@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
|
||||
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
|
||||
|
||||
csso-cli@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/csso-cli/-/csso-cli-3.0.0.tgz#a9bf3de54067c5ee471cbdb002da2b89ece9b06c"
|
||||
integrity sha512-j0ytVZ8qHXcFnR3HOvfH8RWOeHtlqwt97mYe32AnJ2yG6noqV0Jsn8OwOQq8wpdavkHr8JOx6drRtY2HoKLjqw==
|
||||
dependencies:
|
||||
chokidar "^3.0.0"
|
||||
clap "^1.0.9"
|
||||
csso "^4.0.1"
|
||||
source-map "^0.6.1"
|
||||
|
||||
csso@^4.0.1:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
|
||||
integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==
|
||||
dependencies:
|
||||
css-tree "1.0.0-alpha.39"
|
||||
|
||||
defined@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
|
||||
integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
|
||||
|
||||
detective@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b"
|
||||
integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==
|
||||
dependencies:
|
||||
acorn-node "^1.6.1"
|
||||
defined "^1.0.0"
|
||||
minimist "^1.1.1"
|
||||
|
||||
electron-to-chromium@^1.3.413:
|
||||
version "1.3.430"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.430.tgz#33914f7c2db771bdcf30977bd4fd6258ee8a2f37"
|
||||
integrity sha512-HMDYkANGhx6vfbqpOf/hc6hWEmiOipOHGDeRDeUb3HLD3XIWpvKQxFgWf0tgHcr3aNv6I/8VPecplqmQsXoZSw==
|
||||
|
||||
escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
|
||||
|
||||
fill-range@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
||||
dependencies:
|
||||
to-regex-range "^5.0.1"
|
||||
|
||||
find-up@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
|
||||
integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
|
||||
dependencies:
|
||||
locate-path "^2.0.0"
|
||||
|
||||
fs-extra@^8.0.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
|
||||
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^4.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
||||
|
||||
fsevents@~2.1.2:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
|
||||
integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
|
||||
|
||||
glob-parent@~5.1.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
|
||||
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
|
||||
dependencies:
|
||||
is-glob "^4.0.1"
|
||||
|
||||
glob@^7.0.0, glob@^7.1.2:
|
||||
version "7.1.6"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
||||
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.4"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
|
||||
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
|
||||
|
||||
has-ansi@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
|
||||
integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
|
||||
dependencies:
|
||||
ansi-regex "^2.0.0"
|
||||
|
||||
has-flag@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
||||
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
|
||||
|
||||
has-flag@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
||||
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
|
||||
|
||||
indexes-of@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
|
||||
integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
|
||||
|
||||
inflight@^1.0.4:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
|
||||
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
|
||||
dependencies:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
is-arrayish@^0.3.1:
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
|
||||
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
|
||||
|
||||
is-binary-path@~2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
|
||||
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
|
||||
dependencies:
|
||||
binary-extensions "^2.0.0"
|
||||
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
|
||||
|
||||
is-glob@^4.0.1, is-glob@~4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
|
||||
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-number@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||
|
||||
jsonfile@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
|
||||
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
locate-path@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
|
||||
integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
|
||||
dependencies:
|
||||
p-locate "^2.0.0"
|
||||
path-exists "^3.0.0"
|
||||
|
||||
lodash.toarray@^4.4.0:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
|
||||
integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE=
|
||||
|
||||
lodash@^4.17.15:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||
|
||||
mdn-data@2.0.6:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
|
||||
integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
|
||||
|
||||
minimatch@^3.0.4:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimist@^1.1.1:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
||||
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
|
||||
|
||||
node-emoji@^1.8.1:
|
||||
version "1.10.0"
|
||||
resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da"
|
||||
integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==
|
||||
dependencies:
|
||||
lodash.toarray "^4.4.0"
|
||||
|
||||
node-releases@^1.1.53:
|
||||
version "1.1.55"
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee"
|
||||
integrity sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==
|
||||
|
||||
normalize-path@^3.0.0, normalize-path@~3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
||||
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
||||
|
||||
normalize-range@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
|
||||
integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
|
||||
|
||||
normalize.css@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
|
||||
integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
|
||||
|
||||
num2fraction@^1.2.2:
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
|
||||
integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
|
||||
|
||||
object-assign@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
||||
|
||||
once@^1.3.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
p-limit@^1.1.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
|
||||
integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
|
||||
dependencies:
|
||||
p-try "^1.0.0"
|
||||
|
||||
p-locate@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
|
||||
integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
|
||||
dependencies:
|
||||
p-limit "^1.1.0"
|
||||
|
||||
p-try@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
|
||||
integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
|
||||
|
||||
path-exists@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
|
||||
integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
|
||||
|
||||
path-is-absolute@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
path-parse@^1.0.6:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
|
||||
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
|
||||
|
||||
picomatch@^2.0.4, picomatch@^2.2.1:
|
||||
version "2.2.2"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
|
||||
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
|
||||
|
||||
pkg-up@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
|
||||
integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
|
||||
dependencies:
|
||||
find-up "^2.1.0"
|
||||
|
||||
postcss-functions@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e"
|
||||
integrity sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=
|
||||
dependencies:
|
||||
glob "^7.1.2"
|
||||
object-assign "^4.1.1"
|
||||
postcss "^6.0.9"
|
||||
postcss-value-parser "^3.3.0"
|
||||
|
||||
postcss-js@^2.0.0:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-2.0.3.tgz#a96f0f23ff3d08cec7dc5b11bf11c5f8077cdab9"
|
||||
integrity sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==
|
||||
dependencies:
|
||||
camelcase-css "^2.0.1"
|
||||
postcss "^7.0.18"
|
||||
|
||||
postcss-nested@^4.1.1:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.2.1.tgz#4bc2e5b35e3b1e481ff81e23b700da7f82a8b248"
|
||||
integrity sha512-AMayXX8tS0HCp4O4lolp4ygj9wBn32DJWXvG6gCv+ZvJrEa00GUxJcJEEzMh87BIe6FrWdYkpR2cuyqHKrxmXw==
|
||||
dependencies:
|
||||
postcss "^7.0.21"
|
||||
postcss-selector-parser "^6.0.2"
|
||||
|
||||
postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
|
||||
integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
|
||||
dependencies:
|
||||
cssesc "^3.0.0"
|
||||
indexes-of "^1.0.1"
|
||||
uniq "^1.0.1"
|
||||
|
||||
postcss-value-parser@^3.3.0:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
|
||||
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
|
||||
|
||||
postcss-value-parser@^4.0.3:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
|
||||
integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
|
||||
|
||||
postcss@7.0.28:
|
||||
version "7.0.28"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.28.tgz#d349ced7743475717ba91f6810efb58c51fb5dbb"
|
||||
integrity sha512-YU6nVhyWIsVtlNlnAj1fHTsUKW5qxm3KEgzq2Jj6KTEFOTK8QWR12eIDvrlWhiSTK8WIBFTBhOJV4DY6dUuEbw==
|
||||
dependencies:
|
||||
chalk "^2.4.2"
|
||||
source-map "^0.6.1"
|
||||
supports-color "^6.1.0"
|
||||
|
||||
postcss@^6.0.9:
|
||||
version "6.0.23"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
|
||||
integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
|
||||
dependencies:
|
||||
chalk "^2.4.1"
|
||||
source-map "^0.6.1"
|
||||
supports-color "^5.4.0"
|
||||
|
||||
postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.21, postcss@^7.0.27:
|
||||
version "7.0.29"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.29.tgz#d3a903872bd52280b83bce38cdc83ce55c06129e"
|
||||
integrity sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==
|
||||
dependencies:
|
||||
chalk "^2.4.2"
|
||||
source-map "^0.6.1"
|
||||
supports-color "^6.1.0"
|
||||
|
||||
pretty-hrtime@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
|
||||
integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
|
||||
|
||||
purgecss@^2.2.0:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-2.2.1.tgz#aa3bdf23370f7539df6154f5e25df2da311cd018"
|
||||
integrity sha512-wngRSLW1dpNr8kr3TL9nTJMyTFI5BiRiaUUEys5M1CA4zEHLF25fRHoshEeDqmhstaNTOddmpYM34zRrUtEGbQ==
|
||||
dependencies:
|
||||
commander "^5.0.0"
|
||||
glob "^7.0.0"
|
||||
postcss "7.0.28"
|
||||
postcss-selector-parser "^6.0.2"
|
||||
|
||||
readdirp@~3.4.0:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
|
||||
integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
|
||||
dependencies:
|
||||
picomatch "^2.2.1"
|
||||
|
||||
reduce-css-calc@^2.1.6:
|
||||
version "2.1.7"
|
||||
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz#1ace2e02c286d78abcd01fd92bfe8097ab0602c2"
|
||||
integrity sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==
|
||||
dependencies:
|
||||
css-unit-converter "^1.1.1"
|
||||
postcss-value-parser "^3.3.0"
|
||||
|
||||
resolve@^1.14.2:
|
||||
version "1.17.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
|
||||
integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
|
||||
dependencies:
|
||||
path-parse "^1.0.6"
|
||||
|
||||
simple-swizzle@^0.2.2:
|
||||
version "0.2.2"
|
||||
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
|
||||
integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
|
||||
dependencies:
|
||||
is-arrayish "^0.3.1"
|
||||
|
||||
source-map@^0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
strip-ansi@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
|
||||
integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
|
||||
dependencies:
|
||||
ansi-regex "^2.0.0"
|
||||
|
||||
supports-color@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
|
||||
integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
|
||||
|
||||
supports-color@^5.3.0, supports-color@^5.4.0:
|
||||
version "5.5.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
|
||||
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
supports-color@^6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
|
||||
integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
supports-color@^7.1.0:
|
||||
version "7.1.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
|
||||
integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
|
||||
dependencies:
|
||||
has-flag "^4.0.0"
|
||||
|
||||
tailwindcss@^1.4.5:
|
||||
version "1.4.5"
|
||||
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.4.5.tgz#893ccddd226dc264f2bd53acd11e58077149e11d"
|
||||
integrity sha512-MJW96Rz3G3RrFDbDuQCU893y4bf5hMWeVbMgcCqUfLNPbO9wRogDibCEvdKitD6aX9Y90SDT2FOKD17+WmIFLQ==
|
||||
dependencies:
|
||||
"@fullhuman/postcss-purgecss" "^2.1.2"
|
||||
autoprefixer "^9.4.5"
|
||||
browserslist "^4.12.0"
|
||||
bytes "^3.0.0"
|
||||
chalk "^4.0.0"
|
||||
color "^3.1.2"
|
||||
detective "^5.2.0"
|
||||
fs-extra "^8.0.0"
|
||||
lodash "^4.17.15"
|
||||
node-emoji "^1.8.1"
|
||||
normalize.css "^8.0.1"
|
||||
postcss "^7.0.11"
|
||||
postcss-functions "^3.0.0"
|
||||
postcss-js "^2.0.0"
|
||||
postcss-nested "^4.1.1"
|
||||
postcss-selector-parser "^6.0.0"
|
||||
pretty-hrtime "^1.0.3"
|
||||
reduce-css-calc "^2.1.6"
|
||||
resolve "^1.14.2"
|
||||
|
||||
to-regex-range@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
|
||||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
uniq@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
|
||||
integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
|
||||
|
||||
universalify@^0.1.0:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
||||
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||
|
||||
xtend@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
|
||||
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
|
|
@ -1,24 +1,63 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div class="text-left">
|
||||
<h3><%= l('What is Lufi?') %></h3>
|
||||
<p><%= l('Lufi is a free (as in free speech) file hosting software.') %></p>
|
||||
<h3><%= l('Privacy') %></h3>
|
||||
<p><%= l('The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file\'s content.') %><br>
|
||||
<%= l('The administrator can only see the file\'s name, its size and its mimetype (what kind of file it is: video, text, etc.).') %></p>
|
||||
<p><%= l('You don\'t need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don\'t panic, this is normally the case for all sites on which you send files.') %></p>
|
||||
<h3><%= l('How does it work?') %></h3>
|
||||
<p><%= l('Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.') %></p>
|
||||
<p><%= l('You can see the list of your files by clicking on the "My files" link at the top right of this page.') %></p>
|
||||
<h3><%= l('How to report an illegal file?') %></h3>
|
||||
<p><%== l('Please contact the administrator: %1', config('contact')) %></p>
|
||||
<h3><%= l('Who wrote this software?') %></h3>
|
||||
<p><%== l('The original (and only for now) author is <a href="https://fiat-tux.fr" class="classic">Luc Didry</a>.') %></p>
|
||||
<h3><%= l('How to install the software on my server?') %></h3>
|
||||
<p><%== l('As Lufi is a free software licensed under of the terms of the <a href="https://gnu.org/licenses/agpl.html" class="classic">AGPLv3</a>, you can install it on you own server. Have a look on the <a href="https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home" class="classic">Wiki</a> for the procedure.') %><br>
|
||||
<%== l('Get the source code on <a href="https://framagit.org/fiat-tux/hat-softwares/lufi" class="classic">the official repository</a> or on its <a href="https://github.com/ldidry/lufi" class="classic">Github mirror</a>') %>
|
||||
<div class="about-page">
|
||||
<h1>
|
||||
<%= l('What is Lufi?') %>
|
||||
</h1>
|
||||
<p>
|
||||
<%= l('Lufi is a free (as in free speech) file hosting software.') %>
|
||||
</p>
|
||||
<h1>
|
||||
<%= l('Privacy') %>
|
||||
</h1>
|
||||
<p>
|
||||
<%= l('The files uploaded on a Lufi instance are encrypted before the upload to the server: the administrator of the server can not see the file\'s content.') %>
|
||||
<br>
|
||||
<%= l('The administrator can only see the file\'s name, its size and its mimetype (what kind of file it is: video, text, etc.).') %>
|
||||
</p>
|
||||
<p>
|
||||
<%= l('You don\'t need to register yourself to upload files but be aware that, for legal reasons, your IP address will be stored when you send a file. Don\'t panic, this is normally the case for all sites on which you send files.') %>
|
||||
</p>
|
||||
<h1>
|
||||
<%= l('How does it work?') %>
|
||||
</h1>
|
||||
<p>
|
||||
<%= l('Drag and drop files in the appropriate area or use the traditional way to send files and the files will be chunked, encrypted and sent to the server. You will get two links per file: a download link, that you give to the people you want to share the file with and a deletion link, allowing you to delete the file whenever you want.') %>
|
||||
</p>
|
||||
<p>
|
||||
<%= l('You can see the list of your files by clicking on the "My files" link at the top right of this page.') %>
|
||||
</p>
|
||||
<h1>
|
||||
<%= l('How to report an illegal file?') %>
|
||||
</h1>
|
||||
<p>
|
||||
<%== l('Please contact the administrator: %1', config('contact')) %>
|
||||
</p>
|
||||
<h1>
|
||||
<%= l('Who wrote this software?') %>
|
||||
</h1>
|
||||
<p>
|
||||
<%== l('The original (and only for now) author is <a href="https://fiat-tux.fr">Luc Didry</a>.') %>
|
||||
</p>
|
||||
<h1>
|
||||
<%= l('How to install the software on my server?') %>
|
||||
</h1>
|
||||
<p>
|
||||
<%== l('As Lufi is a free software licensed under of the terms of the <a href="https://gnu.org/licenses/agpl.html">AGPLv3</a>, you can install it on you own server. Have a look on the <a href="https://framagit.org/fiat-tux/hat-softwares/lufi/wikis/home">Wiki</a> for the procedure.') %>
|
||||
<br>
|
||||
<%== l('Get the source code on <a href="https://framagit.org/fiat-tux/hat-softwares/lufi">the official repository</a> or on its <a href="https://github.com/ldidry/lufi">Github mirror</a>') %>
|
||||
</p>
|
||||
<h1>
|
||||
<%= l('Version') %>
|
||||
</h1>
|
||||
<p>
|
||||
<%== l('Latest tag of this instance: %1', sprintf('<a href="https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s">%s</a>', stash('version')->{tag}, stash('version')->{tag})) %>
|
||||
</p>
|
||||
<p>
|
||||
<%== l('Latest commit of this instance: %1', sprintf('<a href="https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s">%s</a>', stash('version')->{commit}, stash('version')->{commit})) %>
|
||||
</p>
|
||||
<p class="mt-2">
|
||||
<a href="<%= url_for('/') %>" class="btn">
|
||||
<%= l('Back to homepage') %>
|
||||
</a>
|
||||
</p>
|
||||
<h3><%= l('Version') %></h3>
|
||||
<p><%== l('Latest tag of this instance: %1', sprintf('<a href="https://framagit.org/fiat-tux/hat-softwares/lufi/-/releases/%s" class="classic">%s</a>', stash('version')->{tag}, stash('version')->{tag})) %></p>
|
||||
<p><%== l('Latest commit of this instance: %1', sprintf('<a href="https://framagit.org/fiat-tux/hat-softwares/lufi/-/commit/%s" class="classic">%s</a>', stash('version')->{commit}, stash('version')->{commit})) %></p>
|
||||
<p><%= link_to url_for('/') => ( class => "btn waves-effect waves-light cyan" ) => begin %><%= l('Back to homepage') %><% end%></p>
|
||||
</div>
|
||||
|
|
|
@ -1,13 +1,22 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% use Number::Bytes::Human qw(format_bytes);
|
||||
<div id="delays-info" class="modal">
|
||||
<div class="modal-content">
|
||||
<h1><%= l('Information about delays') %></h1>
|
||||
<div class="text-left">
|
||||
<p><%= l('If you choose a delay, the file will be deleted after that delay.') %><br>
|
||||
<%= l('Don\'t worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.') %>
|
||||
<div
|
||||
:class="{ 'hidden': !showDelayModale, 'modale': true }"
|
||||
class="hidden">
|
||||
<div>
|
||||
<h1>
|
||||
<%= l('Information about delays') %>
|
||||
</h1>
|
||||
<div>
|
||||
<p>
|
||||
<%= l('If you choose a delay, the file will be deleted after that delay.') %>
|
||||
<br>
|
||||
<%= l('Don\'t worry: if a user begins to download the file before the expiration and the download ends after the expiration, he will be able to get the file.') %>
|
||||
</p>
|
||||
% if (defined(config('delay_for_size'))) {
|
||||
<p><%= l('This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:') %></p>
|
||||
<p>
|
||||
<%= l('This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:') %>
|
||||
</p>
|
||||
<ul>
|
||||
% my $delays = config('delay_for_size');
|
||||
% $delays->{0} = max_delay;
|
||||
|
@ -17,15 +26,23 @@
|
|||
% my $delay = $delays->{$keys[$i]};
|
||||
% if ($i + 1 < scalar(@keys)) {
|
||||
% if ($delay) {
|
||||
<li><%= l('between %1 and %2, the file will be kept %3 day(s).', format_bytes($keys[$i]), format_bytes($keys[$i + 1]), $delay) %></li>
|
||||
<li>
|
||||
<%= l('between %1 and %2, the file will be kept %3 day(s).', format_bytes($keys[$i]), format_bytes($keys[$i + 1]), $delay) %>
|
||||
</li>
|
||||
% } else {
|
||||
<li><%= l('between %1 and %2, the file will be kept forever.', format_bytes($keys[$i]), format_bytes($keys[$i + 1]), $delay) %></li>
|
||||
<li>
|
||||
<%= l('between %1 and %2, the file will be kept forever.', format_bytes($keys[$i]), format_bytes($keys[$i + 1]), $delay) %>
|
||||
</li>
|
||||
% }
|
||||
% } else {
|
||||
% if ($delay) {
|
||||
<li><%= l('for %1 and more, the file will be kept %2 day(s)', format_bytes($keys[$i]), $delay) %></li>
|
||||
<li>
|
||||
<%= l('for %1 and more, the file will be kept %2 day(s)', format_bytes($keys[$i]), $delay) %>
|
||||
</li>
|
||||
% } else {
|
||||
<li><%= l('for %1 and more, the file will be kept forever.', format_bytes($keys[$i]), $delay) %></li>
|
||||
<li>
|
||||
<%= l('for %1 and more, the file will be kept forever.', format_bytes($keys[$i]), $delay) %>
|
||||
</li>
|
||||
% }
|
||||
% }
|
||||
% $i++;
|
||||
|
@ -33,8 +50,13 @@
|
|||
</ul>
|
||||
</div>
|
||||
% }
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat"><%= l('Close') %></a>
|
||||
<div class="my-4">
|
||||
<a
|
||||
href="#"
|
||||
class="btn"
|
||||
@click.prevent="showDelayModale = false">
|
||||
<%= l('Close') %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,37 +1,64 @@
|
|||
% # vim:set sts=4 sw=4 ts=4 ft=html.epl expandtab:
|
||||
|
||||
<h2><%= l('My files') %></h2>
|
||||
<h2>
|
||||
<%= l('My files') %>
|
||||
</h2>
|
||||
<hr>
|
||||
|
||||
|
||||
<p>
|
||||
<%= l('Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you\'ll lose this list.') %><br>
|
||||
<%= l('Only the files sent with this browser will be listed here. This list is stored in localStorage: if you delete your localStorage data, you\'ll lose this list.') %>
|
||||
<br>
|
||||
<%= l('Rows in red mean that the files have expired and are no longer available.') %>
|
||||
</p>
|
||||
<div class="files-buttons">
|
||||
<a href="#" id="exportStorage" class="btn left-mg cyan"><%= l('Export localStorage data') %></a>
|
||||
<a href="#" id="purgeExpired" class="btn left-mg cyan"><%= l('Purge expired files from localStorage') %></a>
|
||||
<a href="#" id="clickImport" class="btn left-mg cyan"><%= l('Import localStorage data') %></a>
|
||||
<span class="file-field input-field">
|
||||
<div>
|
||||
<a href="#" id="exportStorage">
|
||||
<%= l('Export localStorage data') %>
|
||||
</a>
|
||||
<a href="#" id="purgeExpired">
|
||||
<%= l('Purge expired files from localStorage') %>
|
||||
</a>
|
||||
<a href="#" id="clickImport">
|
||||
<%= l('Import localStorage data') %>
|
||||
</a>
|
||||
<span>
|
||||
<input type="file" id="import" onchange="importStorage(this.files)">
|
||||
</span>
|
||||
<a href="#" id="invertSelection" class="btn left-mg cyan"><%= l('Invert selection') %></a>
|
||||
<a href="#" class="btn left-mg cyan disabled" id="mass-delete" disabled><%= l('Delete selected files') %></a>
|
||||
<a href="#" id="invertSelection">
|
||||
<%= l('Invert selection') %>
|
||||
</a>
|
||||
<a href="#" id="mass-delete" disabled>
|
||||
<%= l('Delete selected files') %>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<table class="responsive-table highlight striped">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center-align"></th>
|
||||
<th class="center-align"><%= l('File name') %></th>
|
||||
<th class="center-align"><%= l('Download link') %></th>
|
||||
<th class="center-align"><%= l('Counter') %></th>
|
||||
<th class="center-align"><%= l('Delete at first download?') %></th>
|
||||
<th class="center-align"><%= l('Uploaded at') %></th>
|
||||
<th class="center-align"><%= l('Expires at') %></th>
|
||||
<th class="center-align"><%= l('Deletion link') %></th>
|
||||
<th class="center-align"><%= l('Mail') %></th>
|
||||
<th></th>
|
||||
<th>
|
||||
<%= l('File name') %>
|
||||
</th>
|
||||
<th>
|
||||
<%= l('Download link') %>
|
||||
</th>
|
||||
<th>
|
||||
<%= l('Counter') %>
|
||||
</th>
|
||||
<th>
|
||||
<%= l('Delete at first download?') %>
|
||||
</th>
|
||||
<th>
|
||||
<%= l('Uploaded at') %>
|
||||
</th>
|
||||
<th>
|
||||
<%= l('Expires at') %>
|
||||
</th>
|
||||
<th>
|
||||
<%= l('Deletion link') %>
|
||||
</th>
|
||||
<th>
|
||||
<%= l('Mail') %>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="myfiles">
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-check" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
|
||||
</svg>
|
After Width: | Height: | Size: 183 B |
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-checkbox" viewBox="0 0 20 20">
|
||||
<path d="M0 11l2-2 5 5L18 3l2 2L7 18z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 97 B |
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-cross" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
|
||||
</svg>
|
After Width: | Height: | Size: 189 B |
|
@ -0,0 +1,3 @@
|
|||
<svg aria-hidden="true" class="icon-down" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
|
||||
</svg>
|
After Width: | Height: | Size: 202 B |
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-download" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16a5 5 0 01-.916-9.916 5.002 5.002 0 019.832 0A5.002 5.002 0 0116 16m-7 3l3 3m0 0l3-3m-3 3V10"/>
|
||||
</svg>
|
After Width: | Height: | Size: 268 B |
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-hamburger" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
|
||||
</svg>
|
After Width: | Height: | Size: 195 B |
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-infos" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 226 B |
|
@ -0,0 +1,3 @@
|
|||
<svg aria-hidden="true" class="icon-meridian" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"/>
|
||||
</svg>
|
After Width: | Height: | Size: 341 B |
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-trash" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path class="heroicon-ui" d="M8 6V4c0-1.1.9-2 2-2h4a2 2 0 0 1 2 2v2h5a1 1 0 0 1 0 2h-1v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V8H3a1 1 0 1 1 0-2h5zM6 8v12h12V8H6zm8-2V4h-4v2h4zm-4 4a1 1 0 0 1 1 1v6a1 1 0 0 1-2 0v-6a1 1 0 0 1 1-1zm4 0a1 1 0 0 1 1 1v6a1 1 0 0 1-2 0v-6a1 1 0 0 1 1-1z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 368 B |
|
@ -0,0 +1,3 @@
|
|||
<svg aria-hidden="true" class="icon-up" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7"/>
|
||||
</svg>
|
After Width: | Height: | Size: 199 B |
|
@ -0,0 +1,3 @@
|
|||
<svg class="icon-upload" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"/>
|
||||
</svg>
|
After Width: | Height: | Size: 233 B |
|
@ -0,0 +1,3 @@
|
|||
<svg aria-hidden="true" class="icon-user" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 255 B |
|
@ -1,161 +1,50 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% my %d = (
|
||||
% delay_0 => l('no time limit'),
|
||||
% delay_1 => l('24 hours'),
|
||||
% delay_365 => l('1 year')
|
||||
% );
|
||||
<form class="row">
|
||||
<div x-data="{
|
||||
'showDelayModale': false,
|
||||
'notEnoughEntropy': false,
|
||||
'firstView': <%= config('force_burn_after_reading') ? 'true' : 'false' %>,
|
||||
'forceBurn': <%= config('force_burn_after_reading') ? 'true' : 'false' %>,
|
||||
'forceBurnOrInvitation': <%= (config('force_burn_after_reading') || stash('invitation')) ? 'true' : 'false' %>,
|
||||
'delay': <%= defined($self->default_delay) ? $self->default_delay : $self->max_delay %>
|
||||
}">
|
||||
<form>
|
||||
<noscript>
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= l('Javascript is disabled. You won\'t be able to use Lufi.') %></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<strong>
|
||||
<%= l('Javascript is disabled. You won\'t be able to use Lufi.') %>
|
||||
</strong>
|
||||
</div>
|
||||
</noscript>
|
||||
% if (defined(config('broadcast_message'))) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= config('broadcast_message') %></strong>
|
||||
</div>
|
||||
%= include 'index/messages'
|
||||
% if (stop_upload) {
|
||||
<div>
|
||||
<strong>
|
||||
<%= l('Sorry, the uploading is currently disabled. Please try again later.') %>
|
||||
</strong>
|
||||
</div>
|
||||
</div>
|
||||
% }
|
||||
% if (stash('invitation')) {
|
||||
<div class="col s12">
|
||||
<div class="card blue">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= l('The link(s) of your file(s) will automatically be sent by mail to %1 (%2)', stash('invitation')->ldap_user, stash('invitation')->ldap_user_mail) %></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% }
|
||||
<div class="col s12 hiddendiv" id="not-enough-entropy">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= l('Your browser does not have enough entropy to generate a strong encryption key. Please wait (it\'s better if you do things on your computer while waiting).') %></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% if (stop_upload) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= l('Sorry, the uploading is currently disabled. Please try again later.') %></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% } else {
|
||||
<div class="col s12 m6">
|
||||
<div class="input-field">
|
||||
<a class="waves-effect waves-light modal-trigger prefix" href="#delays-info" title="<%= l('Important: more information on delays') %>"><i class="mdi-action-info small"></i></a>
|
||||
<select id="delete-day">
|
||||
% for my $delay (qw/0 1 7 30 365/) {
|
||||
% my $text = ($delay == 7 || $delay == 30) ? l('%1 days', $delay) : $d{'delay_'.$delay};
|
||||
% if (max_delay) {
|
||||
% if ($delay) {
|
||||
% if ($delay < max_delay) {
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% } elsif ($delay == max_delay) {
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% last;
|
||||
% } else {
|
||||
% my $text = ($delay == 1) ? l('24 hours') : l('%1 days', $delay);
|
||||
<option value="<%= max_delay %>" <%== is_selected(max_delay) %>><%= l('%1 days', max_delay) %></option>
|
||||
% last;
|
||||
% }
|
||||
% }
|
||||
% } else {
|
||||
<option value="<%= $delay %>" <%== is_selected($delay) %>><%= $text %></option>
|
||||
% }
|
||||
% }
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
% if ($self->config('force_burn_after_reading')) {
|
||||
<p class="col s12 m6 text-left like-label">
|
||||
<%= l('Files deleted at first download') %>
|
||||
</p>
|
||||
% } else {
|
||||
%= include 'index/delays'
|
||||
%= include 'index/burn_after_reading'
|
||||
%= include 'index/zip_files'
|
||||
% if (config('allow_pwd_on_files') && (!stash('invitation'))) {
|
||||
%= include 'index/pwd_on_files'
|
||||
% }
|
||||
%= include 'index/zipname'
|
||||
% }
|
||||
<p class="col s12 m6 text-left<%= ' hiddendiv' if (config('force_burn_after_reading') || stash('invitation')) %>">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="first-view"
|
||||
data-checked="<%= 'data-checked' if config('force_burn_after_reading') %>"
|
||||
<%= 'disabled="disabled"' if config('force_burn_after_reading') %>
|
||||
>
|
||||
<label for="first-view"><%= l('Delete at first download?') %></label>
|
||||
</p>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<p class="col s12 m6 text-left">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="zip-files"
|
||||
data-checked=""
|
||||
>
|
||||
<label for="zip-files"><%= l('Create a zip archive with the files before uploading?') %></label>
|
||||
</p>
|
||||
</div>
|
||||
% if (config('allow_pwd_on_files') && (!stash('invitation'))) {
|
||||
<div class="col s12 m6">
|
||||
<div class="input-field">
|
||||
<input type="password" id="file_pwd" placeholder="<%= l('Password') %>" class="validate" autocomplete="off">
|
||||
<label for="file_pwd"><%= l('Add a password to file(s)') %></label>
|
||||
</div>
|
||||
</div>
|
||||
% }
|
||||
<div class="col s12 m12 hide" id="zipname-input">
|
||||
<div class="col s12 m6">
|
||||
<div class="input-field">
|
||||
<input type="text" id="zipname" placeholder="documents.zip" value="documents.zip" class="validate">
|
||||
<label for="zipname"><%= l('Name of the zip file') %></label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="row">
|
||||
<div id="files" class="col s12 m12">
|
||||
<h2><%= l('Drop files here') %></h2>
|
||||
<p id="max-file-size"></p>
|
||||
<p><small><%= l('or') %></small></p>
|
||||
<label>
|
||||
<span id="file-browser-span" class="btn disabled waves-effect waves-light"><%= l('Click to open the file browser') %></span>
|
||||
<input type="file" id="file-browser-button" multiple disabled>
|
||||
</label>
|
||||
</div>
|
||||
<div id="zipping" class="col s12 m6 hide">
|
||||
<div class="card">
|
||||
<div>
|
||||
<a href="#" id="reset-zipping">
|
||||
<i class="right mdi-navigation-close small"></i>
|
||||
</a>
|
||||
<div class="card-content">
|
||||
<span class="card-title" id="zip-name">documents.zip</span> (<span id="zip-size"></span>)
|
||||
<p id="zip-compressing" class="hide">
|
||||
<button class="btn-floating pulse"><i class="mdi-content-archive"></i></button>
|
||||
<%= l('Compressing zip file…') %>
|
||||
</p>
|
||||
<ul id="zip-parts">
|
||||
</ul>
|
||||
<div class="right-align">
|
||||
<a href="#" id="uploadZip" class="btn waves-effect waves-light"><%= l('Upload generated zip file') %></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
%= include 'index/drag_n_drop'
|
||||
%= include 'index/zipped_files'
|
||||
</div>
|
||||
<div id="results">
|
||||
<h2><%= l('Uploaded files') %></h2>
|
||||
<h1>
|
||||
<%= l('Uploaded files') %>
|
||||
</h1>
|
||||
<div id="misc"></div>
|
||||
<ul class="list-group" id="ul-results">
|
||||
<ul id="ul-results">
|
||||
</ul>
|
||||
</div>
|
||||
%= include 'delays'
|
||||
</div>
|
||||
% if (defined stash('invitation')) {
|
||||
%= javascript '/partial/index.js?token=' . stash('invitation')->token
|
||||
% } else {
|
||||
|
@ -167,4 +56,3 @@
|
|||
%= javascript '/js/jszip.min.js'
|
||||
%= javascript '/js/lufi-notifications.js'
|
||||
%= javascript '/js/lufi-up.js'
|
||||
% }
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div>
|
||||
% if ($self->config('force_burn_after_reading')) {
|
||||
<p>
|
||||
<%= l('Files deleted at first download') %>
|
||||
</p>
|
||||
% }
|
||||
<div :class="{ 'hidden': forceBurnOrInvitation }">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="first-view"
|
||||
x-model="firstView"
|
||||
:disabled="forceBurn"
|
||||
>
|
||||
<label for="first-view">
|
||||
<%= l('Delete at first download?') %>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,54 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% my %d = (
|
||||
% delay_0 => l('no time limit'),
|
||||
% delay_1 => l('24 hours'),
|
||||
% delay_365 => l('1 year')
|
||||
% );
|
||||
<div>
|
||||
<div class="inline-block">
|
||||
<a
|
||||
href="#delays-info"
|
||||
class="no-underline"
|
||||
title="<%= l('Important: more information on delays') %>"
|
||||
@click.prevent="showDelayModale = true">
|
||||
<%= include 'icons/infos.svg' %></a>
|
||||
<label for="delete-day">
|
||||
<%= l('File availability') %>
|
||||
</label>
|
||||
<div class="relative inline-block">
|
||||
<select id="delete-day" x-model="delay">
|
||||
% for my $delay (qw/0 1 7 30 365/) {
|
||||
% my $text = ($delay == 7 || $delay == 30) ? l('%1 days', $delay) : $d{'delay_'.$delay};
|
||||
% if (max_delay) {
|
||||
% if ($delay) {
|
||||
% if ($delay < max_delay) {
|
||||
<option value="<%= $delay %>">
|
||||
%= $text
|
||||
</option>
|
||||
% } elsif ($delay == max_delay) {
|
||||
<option value="<%= $delay %>">
|
||||
%= $text
|
||||
</option>
|
||||
% last;
|
||||
% } else {
|
||||
% my $text = ($delay == 1) ? l('24 hours') : l('%1 days', $delay);
|
||||
<option value="<%= max_delay %>">
|
||||
%= l('%1 days', max_delay)
|
||||
</option>
|
||||
% last;
|
||||
% }
|
||||
% }
|
||||
% } else {
|
||||
<option value="<%= $delay %>">
|
||||
%= $text
|
||||
</option>
|
||||
% }
|
||||
% }
|
||||
</select>
|
||||
<div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
|
||||
%= include 'icons/down.svg'
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
%= include 'delays'
|
|
@ -0,0 +1,22 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div id="files">
|
||||
<h1>
|
||||
<%= l('Drop files here') %>
|
||||
</h1>
|
||||
<p id="max-file-size"></p>
|
||||
<p>
|
||||
<small>
|
||||
<%= l('or') %>
|
||||
</small>
|
||||
</p>
|
||||
<label>
|
||||
<span id="file-browser-span">
|
||||
<%= l('Click to open the file browser') %>
|
||||
</span>
|
||||
<input
|
||||
type="file"
|
||||
id="file-browser-button"
|
||||
multiple
|
||||
disabled>
|
||||
</label>
|
||||
</div>
|
|
@ -0,0 +1,13 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% if (stash('invitation')) {
|
||||
<div>
|
||||
<strong>
|
||||
<%= l('The link(s) of your file(s) will automatically be sent by mail to %1 (%2)', stash('invitation')->ldap_user, stash('invitation')->ldap_user_mail) %>
|
||||
</strong>
|
||||
</div>
|
||||
% }
|
||||
<div :class="{ 'hidden': !notEnoughEntropy }" class="hidden">
|
||||
<strong>
|
||||
<%= l('Your browser does not have enough entropy to generate a strong encryption key. Please wait (it\'s better if you do things on your computer while waiting).') %>
|
||||
</strong>
|
||||
</div>
|
|
@ -0,0 +1,11 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div>
|
||||
<input
|
||||
type="password"
|
||||
id="file_pwd"
|
||||
placeholder="<%= l('Password') %>"
|
||||
autocomplete="off">
|
||||
<label for="file_pwd">
|
||||
<%= l('Add a password to file(s)') %>
|
||||
</label>
|
||||
</div>
|
|
@ -0,0 +1,11 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="zip-files"
|
||||
data-checked=""
|
||||
>
|
||||
<label for="zip-files">
|
||||
<%= l('Create a zip archive with the files before uploading?') %>
|
||||
</label>
|
||||
</div>
|
|
@ -0,0 +1,11 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div id="zipname-input">
|
||||
<input
|
||||
type="text"
|
||||
id="zipname"
|
||||
placeholder="documents.zip"
|
||||
value="documents.zip">
|
||||
<label for="zipname">
|
||||
<%= l('Name of the zip file') %>
|
||||
</label>
|
||||
</div>
|
|
@ -0,0 +1,27 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div id="zipping">
|
||||
<div>
|
||||
<a href="#" id="reset-zipping">
|
||||
<i class="right mdi-navigation-close small"></i>
|
||||
</a>
|
||||
<div>
|
||||
<span class="card-title" id="zip-name">
|
||||
documents.zip
|
||||
</span>
|
||||
(<span id="zip-size"></span>)
|
||||
<p id="zip-compressing" class="hide">
|
||||
<button class="btn-floating pulse">
|
||||
<i class="mdi-content-archive"></i>
|
||||
</button>
|
||||
<%= l('Compressing zip file…') %>
|
||||
</p>
|
||||
<ul id="zip-parts">
|
||||
</ul>
|
||||
<div>
|
||||
<a href="#" id="uploadZip">
|
||||
<%= l('Upload generated zip file') %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,31 +1,25 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
|
||||
% if (scalar(@{$self->stash('fails')})) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
% for my $msg (@{$self->stash('fails')}) {
|
||||
<strong><%= $msg %></strong>
|
||||
% }
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
% for my $msg (@{$self->stash('fails')}) {
|
||||
<strong><%= $msg %></strong>
|
||||
% }
|
||||
</div>
|
||||
% }
|
||||
% if (scalar(@{$self->stash('success')})) {
|
||||
<div class="col s12">
|
||||
<div class="card blue">
|
||||
<div class="card-content white-text">
|
||||
% for my $msg (@{$self->stash('success')}) {
|
||||
<strong><%== $msg %></strong>
|
||||
% }
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
% for my $msg (@{$self->stash('success')}) {
|
||||
<strong><%== $msg %></strong>
|
||||
% }
|
||||
</div>
|
||||
% }
|
||||
|
||||
<form class="row" method="post">
|
||||
<h1><%= l('Invite a guest') %></h1>
|
||||
<div class="margin-bottom-35">
|
||||
<form method="post" class="form invite">
|
||||
<h1>
|
||||
<%= l('Invite a guest') %>
|
||||
</h1>
|
||||
<div class="mb-4">
|
||||
<p>
|
||||
<%= l('You can invite someone to send you files through this Lufi instance even if they don’t have an account on it.') %>
|
||||
</p>
|
||||
|
@ -39,13 +33,28 @@
|
|||
<label for="guest_mail">
|
||||
<%= l('Email address of your guest') %>
|
||||
</label>
|
||||
<input id="guest_mail" name="guest_mail" type="email" placeholder="name@example.org" required>
|
||||
<input
|
||||
id="guest_mail"
|
||||
name="guest_mail"
|
||||
type="email"
|
||||
placeholder="name@example.org"
|
||||
required>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label for="expire_at">
|
||||
<%= l('How many days would you like the invitation to be valid?') %>
|
||||
</label>
|
||||
<input id="expire_at" name="expire_at" type="number" min="1" max="<%= stash('max_expire_at') %>" step="1" value="<%= stash('max_expire_at') %>" required>
|
||||
<input
|
||||
id="expire_at"
|
||||
name="expire_at"
|
||||
type="number"
|
||||
min="1"
|
||||
max="<%= stash('max_expire_at') %>"
|
||||
step="1"
|
||||
value="<%= stash('max_expire_at') %>"
|
||||
required>
|
||||
</div>
|
||||
<button class="btn waves-effect waves-light" type="submit"><%= l('Send the invitation') %></button>
|
||||
<button class="btn" type="submit">
|
||||
<%= l('Send the invitation') %>
|
||||
</button>
|
||||
</form>
|
||||
|
|
|
@ -1,110 +1,53 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% my $lang = $self->languages;
|
||||
% $lang =~ s/-(.*)/_\U$1/;
|
||||
% my $body_class = ($lang eq 'ar') ? 'class="rtl"' : '';
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title><%= config('instance_name') %></title>
|
||||
<title>
|
||||
<%= config('instance_name') %>
|
||||
</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<link rel="icon" type="image/png" href="<%= url_for('/img/favicon.png') %>">
|
||||
<link rel="icon" sizes="128x128" href="<%= url_for('/img/lufi128.png') %>">
|
||||
<link rel="icon" sizes="196x196" href="<%= url_for('/img/lufi196.png') %>">
|
||||
<link rel="apple-touch-icon" href="<%= url_for('/img/lufi60.png') %>">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="<%= url_for('/img/lufi76.png') %>">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="<%= url_for('/img/lufi120.png') %>">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="<%= url_for('/img/lufi152.png') %>">
|
||||
<link rel="apple-touch-icon-precomposed" sizes="128x128" href="<%= url_for('/img/lufi128.png') %>">
|
||||
%= stylesheet '/css/materialize.min.css'
|
||||
%= stylesheet '/css/lufi.css'
|
||||
%= javascript '/js/ie-detection.js'
|
||||
<link rel="icon" href="<%= url_for('/img/favicon.png') %>" type="image/png">
|
||||
<link rel="icon" href="<%= url_for('/img/lufi128.png') %>" sizes="128x128" >
|
||||
<link rel="icon" href="<%= url_for('/img/lufi196.png') %>" sizes="196x196" >
|
||||
<link rel="apple-touch-icon" href="<%= url_for('/img/lufi60.png') %>">
|
||||
<link rel="apple-touch-icon" href="<%= url_for('/img/lufi76.png') %>" sizes="76x76">
|
||||
<link rel="apple-touch-icon" href="<%= url_for('/img/lufi120.png') %>" sizes="120x120">
|
||||
<link rel="apple-touch-icon" href="<%= url_for('/img/lufi152.png') %>" sizes="152x152">
|
||||
<link rel="apple-touch-icon-precomposed" href="<%= url_for('/img/lufi128.png') %>" sizes="128x128">
|
||||
|
||||
%= stylesheet '/css/lufi.min.css'
|
||||
|
||||
%= javascript '/js/ie-detection.js', defer => undef
|
||||
%= javascript '/partial/layout.js', defer => undef
|
||||
%= javascript '/js/lufi-common.js', defer => undef
|
||||
%= javascript '/js/alpine.min.js', defer => undef
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="cyan">
|
||||
<div class="nav-wrapper container">
|
||||
<a href="<%= url_for('/') %>" class="brand-logo"> <img src="<%= url_for('/img/lufi-min.png') %>" alt="logo"> <%= config('instance_name') %></a>
|
||||
<a href="#" data-activates="mobile" class="button-collapse"><i class="mdi-navigation-menu"></i></a>
|
||||
<ul id="nav-mobile" class="right hide-on-med-and-down">
|
||||
<li><a href="<%= $self->config('report') %>"><%= l('Report file') %></a></li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd'))) || is_user_authenticated()) {
|
||||
<li<%== ' class="active"' if (current_route eq 'index') %>><a href="<%= url_for('/') %>"><%= l('Upload files') %></a></li>
|
||||
<li<%== ' class="active"' if (current_route eq 'files') %>><a href="<%= url_for('/files') %>"><%= l('My files') %></a></li>
|
||||
% if (defined config('ldap') && defined config('invitations')) {
|
||||
<li<%== ' class="active"' if (current_route eq 'invite') %>><a href="<%= url_for('/invite') %>"><%= l('Invite a guest') %></a></li>
|
||||
<li<%== ' class="active"' if (current_route eq 'invite/list') %>><a href="<%= url_for('/invite/list') %>"><%= l('My invitations') %></a></li>
|
||||
% }
|
||||
% } else {
|
||||
<li><a href="<%= url_for('/login') %>"><%= l('Signin') %></a></li>
|
||||
% }
|
||||
<li>
|
||||
<div class="input-field select-lang">
|
||||
<label class="hiddendiv"><%= l('Language') %></label>
|
||||
<select>
|
||||
<option value="" disabled selected><%= l('Language') %></option>
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<option value="<%= $i %>"><%= iso639_native_name($i) %></option>
|
||||
% }
|
||||
</select>
|
||||
</div>
|
||||
</li>
|
||||
<li<%== ' class="active"' if (current_route eq 'about') %>><a href="<%= url_for('/about') %>"><%= l('About') %></a></li>
|
||||
% if ((defined(config('ldap')) || defined(config('htpasswd'))) && is_user_authenticated()) {
|
||||
<li>
|
||||
<form action="<%= url_for('/logout') %>" method="POST">
|
||||
%= csrf_field
|
||||
<button class="btn-flat" type="submit"><%= l('Logout') %></button>
|
||||
</form>
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
||||
<ul id="mobile" class="side-nav">
|
||||
<li><a href="<%= $self->config('report') %>"><%= l('Report file') %></a></li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd'))) || is_user_authenticated()) {
|
||||
<li<%== ' class="active"' if (current_route eq 'index') %>><a href="<%= url_for('/') %>"><%= l('Upload files') %></a></li>
|
||||
<li<%== ' class="active"' if (current_route eq 'files') %>><a href="<%= url_for('/files') %>"><%= l('My files') %></a></li>
|
||||
% if (defined config('ldap') && defined config('invitations')) {
|
||||
<li<%== ' class="active"' if (current_route eq 'invite') %>><a href="<%= url_for('/invite') %>"><%= l('Invite a guest') %></a></li>
|
||||
<li<%== ' class="active"' if (current_route eq 'invite/list') %>><a href="<%= url_for('/invite/list') %>"><%= l('My invitations') %></a></li>
|
||||
% }
|
||||
% } else {
|
||||
<li><a href="<%= url_for('/login') %>"><%= l('Signin') %></a></li>
|
||||
% }
|
||||
<li>
|
||||
<div class="input-field select-lang-mobile">
|
||||
<label class="hiddendiv"><%= l('Language') %></label>
|
||||
<select>
|
||||
<option value="" disabled selected><%= l('Language') %></option>
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<option value="<%= $i %>"><%= iso639_native_name($i) %></option>
|
||||
% }
|
||||
</select>
|
||||
</div>
|
||||
</li>
|
||||
<li<%== ' class="active"' if (current_route eq 'about') %>><a href="<%= url_for('/about') %>"><%= l('About') %></a></li>
|
||||
% if ((defined(config('ldap')) || defined(config('htpasswd'))) && is_user_authenticated()) {
|
||||
<li>
|
||||
<form action="<%= url_for('/logout') %>" method="POST">
|
||||
%= csrf_field
|
||||
<button class="btn-flat" type="submit"><%= l('Logout') %></button>
|
||||
</form>
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="container">
|
||||
%= javascript '/js/jquery-2.2.4.min.js'
|
||||
%= javascript '/partial/layout.js'
|
||||
%= javascript '/js/lufi-common.js'
|
||||
<body <%== $body_class %>>
|
||||
%= include 'layouts/nav/navbar'
|
||||
<header>
|
||||
% if (defined(config('broadcast_message'))) {
|
||||
<div>
|
||||
<strong>
|
||||
<%= config('broadcast_message') %>
|
||||
</strong>
|
||||
</div>
|
||||
% }
|
||||
</header>
|
||||
<main>
|
||||
<%= content %>
|
||||
</div>
|
||||
% if (defined(config('piwik_img'))) {
|
||||
<img src="<%== config('piwik_img') %>" class="no_border" alt="" />
|
||||
% }
|
||||
%= javascript '/js/materialize.js'
|
||||
%= javascript '/js/sidenav.js'
|
||||
</main>
|
||||
% if (defined(config('piwik_img'))) {
|
||||
<footer>
|
||||
<img src="<%== config('piwik_img') %>" class="no_border" alt="" />
|
||||
</footer>
|
||||
% }
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<ul id="mobile">
|
||||
<li>
|
||||
<a href="<%= $self->config('report') %>">
|
||||
<%= l('Report file') %>
|
||||
</a>
|
||||
</li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd'))) || is_user_authenticated()) {
|
||||
<li :class="{ 'active': route === 'index' }">
|
||||
<a href="<%= url_for('/') %>">
|
||||
<%= l('Upload files') %>
|
||||
</a>
|
||||
</li>
|
||||
<li :class="{ 'active': route === 'files' }">
|
||||
<a href="<%= url_for('/files') %>">
|
||||
<%= l('My files') %>
|
||||
</a>
|
||||
</li>
|
||||
% if (defined config('ldap') && defined config('invitations')) {
|
||||
<li :class="{ 'active': route === 'invite' }">
|
||||
<a href="<%= url_for('/invite') %>">
|
||||
<%= l('Invite a guest') %>
|
||||
</a>
|
||||
</li>
|
||||
<li :class="{ 'active': route === 'invite/list' }">
|
||||
<a href="<%= url_for('/invite/list') %>">
|
||||
<%= l('My invitations') %>
|
||||
</a>
|
||||
</li>
|
||||
% }
|
||||
% } else {
|
||||
<li>
|
||||
<a href="<%= url_for('/login') %>">
|
||||
<%= l('Signin') %>
|
||||
</a>
|
||||
</li>
|
||||
% }
|
||||
<li>
|
||||
<div>
|
||||
<label class="hiddendiv">
|
||||
<%= l('Language') %>
|
||||
</label>
|
||||
<select>
|
||||
<option value="" disabled selected>
|
||||
<%= l('Language') %>
|
||||
</option>
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<option value="<%= $i %>">
|
||||
<%= iso639_native_name($i) %>
|
||||
</option>
|
||||
% }
|
||||
</select>
|
||||
</div>
|
||||
</li>
|
||||
<li :class="{ 'active': route === 'about' }">
|
||||
<a href="<%= url_for('/about') %>">
|
||||
<%= l('About') %>
|
||||
</a>
|
||||
</li>
|
||||
% if ((defined(config('ldap')) || defined(config('htpasswd'))) && is_user_authenticated()) {
|
||||
<li>
|
||||
<form action="<%= url_for('/logout') %>" method="POST">
|
||||
%= csrf_field
|
||||
<button class="btn-flat" type="submit">
|
||||
<%= l('Logout') %>
|
||||
</button>
|
||||
</form>
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
|
@ -0,0 +1,118 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<nav class="navbar" x-data="{ route: '<%= current_route %>', langDpdwn: false, showMenu: false, userDpdwn: false }">
|
||||
<ul :class="{ 'show-menu': showMenu }">
|
||||
<li class="navbrand">
|
||||
<a href="<%= url_for('/') %>">
|
||||
|
||||
<img src="<%= url_for('/img/lufi-min.png') %>" alt="logo">
|
||||
<%= config('instance_name') %>
|
||||
</a>
|
||||
<a
|
||||
href="#"
|
||||
class="hamburger"
|
||||
@click.prevent="showMenu = !showMenu">
|
||||
%= include 'icons/hamburger.svg'
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="<%= $self->config('report') %>">
|
||||
<%= l('Report file') %>
|
||||
</a>
|
||||
</li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd'))) || is_user_authenticated()) {
|
||||
<li :class="{ 'active': route === 'index' }">
|
||||
<a href="<%= url_for('/') %>">
|
||||
<%= l('Upload files') %>
|
||||
</a>
|
||||
</li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd')))) {
|
||||
<li :class="{ 'active': route === 'files' }">
|
||||
<a href="<%= url_for('/files') %>">
|
||||
<%= l('My files') %>
|
||||
</a>
|
||||
</li>
|
||||
% }
|
||||
% } else {
|
||||
<li :class="{ 'active': route === 'login' }">
|
||||
<a href="<%= url_for('/login') %>">
|
||||
<%= l('Signin') %>
|
||||
</a>
|
||||
</li>
|
||||
% }
|
||||
<li class="dropdown lang">
|
||||
<a
|
||||
href="#"
|
||||
title="<%= l('Change language.') %>"
|
||||
@click.prevent="langDpdwn = !langDpdwn"
|
||||
@click.away="langDpdwn = false">
|
||||
%= include 'icons/meridian.svg'
|
||||
%= l('Language')
|
||||
<span x-show="!langDpdwn">
|
||||
%= include 'icons/down.svg'
|
||||
</span>
|
||||
<span x-show="langDpdwn">
|
||||
%= include 'icons/up.svg'
|
||||
</span>
|
||||
</a>
|
||||
<ul x-show="langDpdwn">
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<li @click="changeLang('<%= $i %>')">
|
||||
<%= iso639_native_name($i) %>
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
||||
</li>
|
||||
% if ((defined(config('ldap')) || defined(config('htpasswd'))) && is_user_authenticated()) {
|
||||
<li class="dropdown user">
|
||||
<a
|
||||
href="#"
|
||||
title="<%= l('Menu related to your files, invitations and logout.') %>"
|
||||
@click.prevent="userDpdwn = !userDpdwn"
|
||||
@click.away="userDpdwn = false">
|
||||
%= include 'icons/user.svg'
|
||||
%= $self->current_user->{username}
|
||||
<span x-show="!userDpdwn">
|
||||
%= include 'icons/down.svg'
|
||||
</span>
|
||||
<span x-show="userDpdwn">
|
||||
%= include 'icons/up.svg'
|
||||
</span>
|
||||
</a>
|
||||
<ul x-show="userDpdwn">
|
||||
<li :class="{ 'active': route === 'files' }">
|
||||
<a href="<%= url_for('/files') %>">
|
||||
<%= l('My files') %>
|
||||
</a>
|
||||
</li>
|
||||
% if (defined config('ldap') && defined config('invitations')) {
|
||||
<li :class="{ 'active': route === 'invite' }">
|
||||
<a href="<%= url_for('/invite') %>">
|
||||
<%= l('Invite a guest') %>
|
||||
</a>
|
||||
</li>
|
||||
<li :class="{ 'active': route === 'invite_list' }">
|
||||
<a href="<%= url_for('/invite/list') %>">
|
||||
<%= l('My invitations') %>
|
||||
</a>
|
||||
</li>
|
||||
% }
|
||||
<li>
|
||||
<form action="<%= url_for('/logout') %>" method="POST">
|
||||
%= csrf_field
|
||||
<button type="submit">
|
||||
<%= l('Logout') %>
|
||||
</button>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
% }
|
||||
<li :class="{ 'active': route === 'about' }">
|
||||
<a href="<%= url_for('/about') %>">
|
||||
<%= l('About') %>
|
||||
</a>
|
||||
</li>
|
||||
% #= include 'layouts/nav/normal_nav'
|
||||
% #= include 'layouts/nav/mobile_nav'
|
||||
</ul>
|
||||
</nav>
|
|
@ -0,0 +1,70 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<ul id="nav-mobile">
|
||||
<li>
|
||||
<a href="<%= $self->config('report') %>">
|
||||
<%= l('Report file') %>
|
||||
</a>
|
||||
</li>
|
||||
% if ((!defined(config('ldap')) && !defined(config('htpasswd'))) || is_user_authenticated()) {
|
||||
<li :class="{ 'active': route === 'index' }">
|
||||
<a href="<%= url_for('/') %>">
|
||||
<%= l('Upload files') %>
|
||||
</a>
|
||||
</li>
|
||||
<li :class="{ 'active': route === 'files' }">
|
||||
<a href="<%= url_for('/files') %>">
|
||||
<%= l('My files') %>
|
||||
</a>
|
||||
</li>
|
||||
% if (defined config('ldap') && defined config('invitations')) {
|
||||
<li :class="{ 'active': route === 'invite' }">
|
||||
<a href="<%= url_for('/invite') %>">
|
||||
<%= l('Invite a guest') %>
|
||||
</a>
|
||||
</li>
|
||||
<li :class="{ 'active': route === 'invite/list' }">
|
||||
<a href="<%= url_for('/invite/list') %>">
|
||||
<%= l('My invitations') %>
|
||||
</a>
|
||||
</li>
|
||||
% }
|
||||
% } else {
|
||||
<li>
|
||||
<a href="<%= url_for('/login') %>">
|
||||
<%= l('Signin') %>
|
||||
</a>
|
||||
</li>
|
||||
% }
|
||||
<li>
|
||||
<div>
|
||||
<label class="hiddendiv">
|
||||
<%= l('Language') %>
|
||||
</label>
|
||||
<select>
|
||||
<option value="" disabled selected>
|
||||
<%= l('Language') %>
|
||||
</option>
|
||||
% for my $i (@{$self->available_langs}) {
|
||||
<option value="<%= $i %>">
|
||||
<%= iso639_native_name($i) %>
|
||||
</option>
|
||||
% }
|
||||
</select>
|
||||
</div>
|
||||
</li>
|
||||
<li :class="{ 'active': route === 'about' }">
|
||||
<a href="<%= url_for('/about') %>">
|
||||
<%= l('About') %>
|
||||
</a>
|
||||
</li>
|
||||
% if ((defined(config('ldap')) || defined(config('htpasswd'))) && is_user_authenticated()) {
|
||||
<li>
|
||||
<form action="<%= url_for('/logout') %>" method="POST">
|
||||
%= csrf_field
|
||||
<button class="btn-flat" type="submit">
|
||||
<%= l('Logout') %>
|
||||
</button>
|
||||
</form>
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
|
@ -1,31 +1,41 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% if (defined stash('msg')) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= stash('msg') %></strong>
|
||||
</div>
|
||||
<div>
|
||||
<strong>
|
||||
<%= stash('msg') %>
|
||||
</strong>
|
||||
</div>
|
||||
</div>
|
||||
% }
|
||||
<form class="row" method="post" action="<%= url_for('login') %>">
|
||||
<div class="col s8 m8 offset-s2 offset-m2">
|
||||
<div class="input-field">
|
||||
<input id="login" type="text" class="validate" name="login">
|
||||
<label for="login"><%= l('Login') %></label>
|
||||
</div>
|
||||
<form method="post" action="<%= url_for('login') %>" class="form">
|
||||
<div class="input-field">
|
||||
<label for="login">
|
||||
<%= l('Login') %>
|
||||
</label>
|
||||
<input
|
||||
id="login"
|
||||
type="text"
|
||||
name="login"
|
||||
required>
|
||||
</div>
|
||||
<div class="col s8 m8 offset-s2 offset-m2">
|
||||
<div class="input-field">
|
||||
<input id="password" type="password" class="validate" name="password">
|
||||
<label for="password"><%= l('Password') %></label>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label for="password">
|
||||
<%= l('Password') %>
|
||||
</label>
|
||||
<input
|
||||
id="password"
|
||||
type="password"
|
||||
name="password"
|
||||
required>
|
||||
</div>
|
||||
%= csrf_field
|
||||
<input name="redirect" value="<%= stash('redirect') %>" type="hidden">
|
||||
<div class="col s8 m8 offset-s2 offset-m2">
|
||||
<button class="btn waves-effect waves-light" type="submit" name="action">
|
||||
<%= l('Signin') %>
|
||||
</button>
|
||||
</div>
|
||||
<input
|
||||
name="redirect"
|
||||
value="<%= stash('redirect') %>"
|
||||
type="hidden">
|
||||
<button
|
||||
class="btn"
|
||||
type="submit"
|
||||
name="action">
|
||||
<%= l('Signin') %>
|
||||
</button>
|
||||
</form>
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
% if (defined stash('msg')) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= stash('msg') %></strong>
|
||||
</div>
|
||||
<div>
|
||||
<strong>
|
||||
<%= stash('msg') %>
|
||||
</strong>
|
||||
</div>
|
||||
</div>
|
||||
% } else {
|
||||
<div class="col s12">
|
||||
<div class="card blue-grey darken-1">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= l('You have been successfully logged out.') %></strong>
|
||||
</div>
|
||||
<div class="card-action">
|
||||
<a href="<%= url_for('login') %>"><%= l('Signin') %></a>
|
||||
<div>
|
||||
<p>
|
||||
<strong>
|
||||
<%= l('You have been successfully logged out.') %>
|
||||
</strong>
|
||||
</p>
|
||||
<div>
|
||||
<a href="<%= url_for('login') %>">
|
||||
<%= l('Signin') %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% }
|
||||
|
|
|
@ -1,50 +1,77 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div class="row">
|
||||
<div>
|
||||
% if (defined(stash('msg'))) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%== stash('msg')%></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<strong>
|
||||
<%== stash('msg')%>
|
||||
</strong>
|
||||
</div>
|
||||
% }
|
||||
<div class="col s12">
|
||||
<div class="card cyan">
|
||||
<div class="card-content white-text">
|
||||
<p><%= l('If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.') %></p>
|
||||
<p><%= l('Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.') %></p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="card-content white-text">
|
||||
<p>
|
||||
<%= l('If you send the mail from this server, the links will be sent to the server, which may lower your privacy protection.') %>
|
||||
</p>
|
||||
<p>
|
||||
<%= l('Adding URLs not related to this Lufi instance to the mail body or subject is prohibited.') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<form action="<%= url_for('m') %>" method="post" class="col s12">
|
||||
<form action="<%= url_for('m') %>" method="post">
|
||||
%= csrf_field
|
||||
<div class="input-field">
|
||||
<label for="emails"><%= l('Comma-separated email addresses') %></label>
|
||||
% if (defined(stash('values'))) {
|
||||
<input type="text" class="validate" id="emails" name="emails" placeholder="<%= l('Emails') %>" value="<%= stash('values')->{emails} %>">
|
||||
% } else {
|
||||
<input type="text" class="validate" id="emails" name="emails" placeholder="<%= l('Emails') %>">
|
||||
% }
|
||||
<label for="emails">
|
||||
<%= l('Comma-separated email addresses') %>
|
||||
</label>
|
||||
% if (defined(stash('values'))) {
|
||||
<input
|
||||
type="text"
|
||||
id="emails"
|
||||
name="emails"
|
||||
placeholder="<%= l('Emails') %>"
|
||||
value="<%= stash('values')->{emails} %>">
|
||||
% } else {
|
||||
<input
|
||||
type="text"
|
||||
id="emails"
|
||||
name="emails"
|
||||
placeholder="<%= l('Emails') %>">
|
||||
% }
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label for="subject"><%= l('Email subject') %></label>
|
||||
% if (defined(stash('values'))) {
|
||||
<input type="text" class="validate" id="subject" name="subject" value="<%= stash('values')->{subject} %>">
|
||||
% } else {
|
||||
<input type="text" class="validate" id="subject" name="subject" value="<%= l('Here\'s some files') %>">
|
||||
% }
|
||||
<div>
|
||||
<label for="subject">
|
||||
<%= l('Email subject') %>
|
||||
</label>
|
||||
% if (defined(stash('values'))) {
|
||||
<input
|
||||
type="text"
|
||||
id="subject"
|
||||
name="subject"
|
||||
value="<%= stash('values')->{subject} %>">
|
||||
% } else {
|
||||
<input
|
||||
type="text"
|
||||
id="subject"
|
||||
name="subject"
|
||||
value="<%= l('Here\'s some files') %>">
|
||||
% }
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label for="body"><%= l('Email body') %></label>
|
||||
<textarea class="materialize-textarea" id="body" name="body" rows="10">
|
||||
<div>
|
||||
<label for="body">
|
||||
<%= l('Email body') %>
|
||||
</label>
|
||||
<textarea id="body" name="body" rows="10">
|
||||
% if (defined(stash('values'))) {
|
||||
<%= stash('values')->{body} %>
|
||||
% }
|
||||
</textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-info"><%= l('Send with this server') %></button>
|
||||
<a href="#" class="btn btn-primary" id="mailto"><%= l('Send with your own mail software') %></a>
|
||||
<button type="submit">
|
||||
<%= l('Send with this server') %>
|
||||
</button>
|
||||
<a href="#" id="mailto">
|
||||
<%= l('Send with your own mail software') %>
|
||||
</a>
|
||||
</form>
|
||||
<div>
|
||||
%= javascript url_for('/partial/mail.js')->query(populate => (!defined(stash('msg')) && !defined(stash('values'))), links => $links)
|
||||
|
|
|
@ -1,22 +1,26 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
% if (!defined(stash('f')) && defined(stash('msg'))) {
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<p><%= stash('msg') %></p>
|
||||
% } elsif (defined(stash('msg_success'))) {
|
||||
<div class="card cyan">
|
||||
<div class="card-content white-text">
|
||||
<p><%= stash('msg_success') %></p>
|
||||
% } else {
|
||||
<div class="card cyan">
|
||||
<div class="card-content white-text">
|
||||
<span class="card-title"><%= stash('f')->filename %></span>
|
||||
<p><%= stash('msg') %></p>
|
||||
% }
|
||||
</div>
|
||||
<div>
|
||||
% if (!defined(stash('f')) && defined(stash('msg'))) {
|
||||
<div>
|
||||
<p>
|
||||
<%= stash('msg') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
% } elsif (defined(stash('msg_success'))) {
|
||||
<div>
|
||||
<p>
|
||||
<%= stash('msg_success') %>
|
||||
</p>
|
||||
</div>
|
||||
% } else {
|
||||
<div>
|
||||
<span>
|
||||
<%= stash('f')->filename %>
|
||||
</span>
|
||||
<p>
|
||||
<%= stash('msg') %>
|
||||
</p>
|
||||
</div>
|
||||
% }
|
||||
</div>
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
% # vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:
|
||||
// vim:set sts=4 sw=4 ts=4 ft=javascript expandtab:
|
||||
var langUrl = '<%= url_for('lang') %>';
|
||||
var prefix = '<%= substr(config('prefix'), 1) %>';
|
||||
|
|
|
@ -1,45 +1,63 @@
|
|||
% # vim:set sw=4 ts=4 sts=4 ft=html.epl expandtab:
|
||||
<div class="row valign-wrapper">
|
||||
<div class="valign center col s12">
|
||||
<div>
|
||||
% if (!defined(stash('f')) && defined(stash('msg'))) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= stash('msg')%></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<strong>
|
||||
<%= stash('msg')%>
|
||||
</strong>
|
||||
</div>
|
||||
% } else {
|
||||
<h2 class="col s12 center-align title-filename"><%= stash('f')->filename %></h2>
|
||||
<h1>
|
||||
<%= stash('f')->filename %>
|
||||
</h1>
|
||||
% if (defined(stash('msg'))) {
|
||||
<div class="col s12">
|
||||
<div class="card pink">
|
||||
<div class="card-content white-text">
|
||||
<strong><%= stash('msg')%></strong>
|
||||
</div>
|
||||
<div>
|
||||
<strong>
|
||||
<%= stash('msg')%>
|
||||
</strong>
|
||||
</div>
|
||||
</div>
|
||||
% } else {
|
||||
% if (stash('file_pwd')) {
|
||||
<div class="col s12">
|
||||
<div class="input-field">
|
||||
<input type="password" id="file_pwd" placeholder="<%= l('Password') %>" class="validate">
|
||||
<div>
|
||||
<input
|
||||
type="password"
|
||||
id="file_pwd"
|
||||
placeholder="<%= l('Password') %>">
|
||||
<a href="#" id="go">
|
||||
<%= l('Download') %>
|
||||
</a>
|
||||
</div>
|
||||
<a id="go" class="waves-effect waves-light btn"><%= l('Download') %></a>
|
||||
</div>
|
||||
% }
|
||||
<div class="file-progress col s12<%= (stash('file_pwd')) ? ' hide' : '' %>">
|
||||
<p id="filesize" data-filesize="<%= stash('f')->filesize %>" data-zipped="<%= (stash('f')->zipped) ? 'true' : 'false' %>"></p>
|
||||
<p id="please-wait"><%= l('Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.') %></p>
|
||||
<p id="loading"></p>
|
||||
<div class="progress" id="pbd">
|
||||
<div id="pb" class="determinate width-0" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
|
||||
<span id="pbt" class="sr-only">0%</span>
|
||||
<div
|
||||
class="<%= (stash('file_pwd')) ? 'hide' : '' %>">
|
||||
<p
|
||||
id="filesize"
|
||||
data-filesize="<%= stash('f')->filesize %>"
|
||||
data-zipped="<%= (stash('f')->zipped) ? 'true' : 'false' %>">
|
||||
</p>
|
||||
<p id="please-wait">
|
||||
<%= l('Please wait while we are getting your file. We first need to download and decrypt all parts before you can get it.') %>
|
||||
</p>
|
||||
<p id="loading">
|
||||
</p>
|
||||
<div id="pbd">
|
||||
<div
|
||||
id="pb"
|
||||
role="progressbar"
|
||||
aria-valuenow="0"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100">
|
||||
<span id="pbt" class="sr-only">
|
||||
0%
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="file-abort col s12<%= (stash('file_pwd')) ? ' hide' : '' %>">
|
||||
<a id="abort" class="waves-effect waves-light btn"><%= l('Abort') %></a>
|
||||
<div
|
||||
class="<%= (stash('file_pwd')) ? 'hide' : '' %>">
|
||||
<a href="#" id="abort">
|
||||
<%= l('Abort') %>
|
||||
</a>
|
||||
</div>
|
||||
%= javascript '/partial/render.js?nbslices='.stash('f')->nbslices.'&file='.stash('f')->short
|
||||
%= javascript '/js/filesize.min.js'
|
||||
|
|