diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 69362e23..7238441c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3.2.0 + uses: actions/checkout@v3.3.0 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/retrospring.yml b/.github/workflows/retrospring.yml index 35938753..3542d3b5 100644 --- a/.github/workflows/retrospring.yml +++ b/.github/workflows/retrospring.yml @@ -41,7 +41,7 @@ jobs: BUNDLE_WITHOUT: 'production' steps: - - uses: actions/checkout@v3.2.0 + - uses: actions/checkout@v3.3.0 - name: Install dependencies run: sudo apt update && sudo apt-get install -y libpq-dev libxml2-dev libxslt1-dev libmagickwand-dev imagemagick libidn11-dev - name: Set up Ruby @@ -81,7 +81,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.2.0 + - uses: actions/checkout@v3.3.0 - name: Install dependencies run: sudo apt update && sudo apt-get install -y libpq-dev libxml2-dev libxslt1-dev libmagickwand-dev imagemagick libidn11-dev - name: Set up Ruby diff --git a/Gemfile.lock b/Gemfile.lock index 9d922eeb..d0bf5b6f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,7 +92,7 @@ GEM activemodel (>= 5.2) buftok (0.2.0) builder (3.2.4) - bullet (7.0.5) + bullet (7.0.7) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) carrierwave (2.1.0) @@ -314,7 +314,7 @@ GEM parser (3.1.3.0) ast (~> 2.4.1) pg (1.4.5) - pghero (3.0.1) + pghero (3.1.0) activerecord (>= 6) public_suffix (4.0.7) puma (6.0.2) @@ -402,7 +402,7 @@ GEM rspec-its (1.3.0) rspec-core (>= 3.0.0) rspec-expectations (>= 3.0.0) - rspec-mocks (3.12.1) + rspec-mocks (3.12.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-rails (6.0.1) diff --git a/app/assets/stylesheets/_utilities.scss b/app/assets/stylesheets/_utilities.scss index fc3477d8..5fe1bbae 100644 --- a/app/assets/stylesheets/_utilities.scss +++ b/app/assets/stylesheets/_utilities.scss @@ -6,6 +6,10 @@ font-size: 10em; } +.fs-7 { + font-size: .8rem; +} + .pe-none { pointer-events: none; } diff --git a/app/assets/stylesheets/application.sass.scss b/app/assets/stylesheets/application.sass.scss index 588ed388..38f3d2eb 100644 --- a/app/assets/stylesheets/application.sass.scss +++ b/app/assets/stylesheets/application.sass.scss @@ -80,6 +80,7 @@ $unicodeRangeValues in Lexend.$unicodeMap { "overrides/minicolors", "overrides/modal", "overrides/navbar", +"overrides/popover", "overrides/turbolinks", "overrides/toasts", "overrides/sweet-alert"; @@ -109,6 +110,7 @@ $unicodeRangeValues in Lexend.$unicodeMap { "components/inbox-actions", "components/inbox-entry", "components/mobile-nav", +"components/navbar", "components/notifications", "components/profile", "components/push-settings", diff --git a/app/assets/stylesheets/components/_inbox-entry.scss b/app/assets/stylesheets/components/_inbox-entry.scss index 38cdf4ba..2b4d7076 100644 --- a/app/assets/stylesheets/components/_inbox-entry.scss +++ b/app/assets/stylesheets/components/_inbox-entry.scss @@ -1,4 +1,6 @@ .inbox-entry { + $this: &; + &--new { box-shadow: 0 0.125rem 0.25rem var(--primary); @@ -19,4 +21,13 @@ } } } + + .format-help { + opacity: .3; + } + + &:focus-within .format-help, + &:hover .format-help { + opacity: 1; + } } diff --git a/app/assets/stylesheets/components/_navbar.scss b/app/assets/stylesheets/components/_navbar.scss new file mode 100644 index 00000000..584fe5e5 --- /dev/null +++ b/app/assets/stylesheets/components/_navbar.scss @@ -0,0 +1,22 @@ +.navbar-dev { + &.fixed-top:before { + top: 0; + } + + &:before { + @extend .progress-bar-striped; + @extend .bg-warning; + + content: ""; + position: absolute; + bottom: 0; + height: 4px; + width: 100%; + background-size: 40px 40px; + + @include media-breakpoint-up('md') { + bottom: unset; + top: 0; + } + } +} diff --git a/app/assets/stylesheets/overrides/_popover.scss b/app/assets/stylesheets/overrides/_popover.scss new file mode 100644 index 00000000..7ba4f826 --- /dev/null +++ b/app/assets/stylesheets/overrides/_popover.scss @@ -0,0 +1,13 @@ +.popover { + box-shadow: $box-shadow; + background-color: var(--raised-bg); +} + +.rs-popover { + --popover-arrow-border: transparent; + --popover-border-color: transparent; +} + +.popover-body p:last-child { + margin-bottom: 0; +} diff --git a/app/javascript/retrospring/controllers/format_popup_controller.ts b/app/javascript/retrospring/controllers/format_popup_controller.ts new file mode 100644 index 00000000..e22723ef --- /dev/null +++ b/app/javascript/retrospring/controllers/format_popup_controller.ts @@ -0,0 +1,18 @@ +import { Controller } from '@hotwired/stimulus'; +import { Popover } from 'bootstrap'; + +export default class extends Controller { + connect(): void { + const formatOptionsElement = document.getElementById('formatting-options'); + + this.element.addEventListener('click', e => e.preventDefault()); + + new Popover(this.element, { + html: true, + content: formatOptionsElement.innerHTML, + placement: 'bottom', + trigger: 'focus', + customClass: 'rs-popover' + }) + } +} diff --git a/app/javascript/retrospring/initializers/stimulus.ts b/app/javascript/retrospring/initializers/stimulus.ts index 09ead0bf..90b3a96d 100644 --- a/app/javascript/retrospring/initializers/stimulus.ts +++ b/app/javascript/retrospring/initializers/stimulus.ts @@ -3,6 +3,7 @@ import AnnouncementController from "retrospring/controllers/announcement_control import AutofocusController from "retrospring/controllers/autofocus_controller"; import CharacterCountController from "retrospring/controllers/character_count_controller"; import CharacterCountWarningController from "retrospring/controllers/character_count_warning_controller"; +import FormatPopupController from "retrospring/controllers/format_popup_controller"; /** * This module sets up Stimulus and our controllers @@ -17,4 +18,5 @@ export default function (): void { window['Stimulus'].register('autofocus', AutofocusController); window['Stimulus'].register('character-count', CharacterCountController); window['Stimulus'].register('character-count-warning', CharacterCountWarningController); + window['Stimulus'].register('format-popup', FormatPopupController); } diff --git a/app/views/inbox/_entry.html.haml b/app/views/inbox/_entry.html.haml index 12409502..bab43c53 100644 --- a/app/views/inbox/_entry.html.haml +++ b/app/views/inbox/_entry.html.haml @@ -23,15 +23,17 @@ = render "actions/question", question: i.question - if current_user == i.user .card-body - %textarea.form-control{ name: "ib-answer", placeholder: t(".placeholder"), data: { id: i.id } } - %br/ - %button.btn.btn-success{ name: "ib-answer", data: { ib_id: i.id } } - = t("voc.answer") - %button.btn.btn-danger{ name: "ib-destroy", data: { ib_id: i.id } } - = t("voc.delete") - %button.btn.btn-default{ name: "ib-options", data: { ib_id: i.id, state: :hidden } } - %i.fa.fa-chevron-down - %span.pe-none= t(".options") + %textarea.form-control.mb-3{ name: "ib-answer", placeholder: t(".placeholder"), data: { id: i.id } } + .d-sm-flex + %button.btn.btn-success.me-sm-1{ name: "ib-answer", data: { ib_id: i.id } } + = t("voc.answer") + %button.btn.btn-danger.me-sm-1{ name: "ib-destroy", data: { ib_id: i.id } } + = t("voc.delete") + %button.btn.btn-default.px-1{ name: "ib-options", data: { ib_id: i.id, state: :hidden } } + %i.fa.fa-chevron-down + %span.pe-none= t(".options") + %p.format-help.ms-auto.align-self-center.mt-2.mt-sm-0.text-center + = render "shared/format_link" .card-footer.d-none{ id: "ib-options-#{i.id}" } %h4= t(".sharing.heading") - if current_user.services.count.positive? diff --git a/app/views/layouts/base.html.haml b/app/views/layouts/base.html.haml index 6791f897..8b05a3b8 100644 --- a/app/views/layouts/base.html.haml +++ b/app/views/layouts/base.html.haml @@ -30,6 +30,7 @@ = render 'navigation/guest' = render 'shared/announcements' = yield + = render "shared/formatting" - if Rails.env.development? #debug %hr diff --git a/app/views/navigation/_desktop.html.haml b/app/views/navigation/_desktop.html.haml index 1cf872f3..eb8aba63 100644 --- a/app/views/navigation/_desktop.html.haml +++ b/app/views/navigation/_desktop.html.haml @@ -1,10 +1,13 @@ -%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top.d-lg-block.d-none.d-print-none{ role: :navigation } +%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top.d-lg-block.d-none.d-print-none{ class: Rails.env.development? ? "navbar-dev" : "", role: :navigation } .container %a.navbar-brand{ href: '/', title: APP_CONFIG["site_name"] } - if APP_CONFIG["use_svg_logo"] = render inline: Rails.application.config.justask_svg_logo - else = APP_CONFIG["site_name"] + - if Rails.env.development? + %span.badge.rounded-pill.bg-warning.text-bg-warning.fs-7 + DEV %ul.nav.navbar-nav.me-auto = nav_entry t("navigation.timeline"), root_path, icon: 'home' = nav_entry t("navigation.inbox"), '/inbox', icon: 'inbox', badge: inbox_count diff --git a/app/views/navigation/_guest.html.haml b/app/views/navigation/_guest.html.haml index e0df2d01..4d9c330d 100644 --- a/app/views/navigation/_guest.html.haml +++ b/app/views/navigation/_guest.html.haml @@ -1,10 +1,13 @@ -%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top{ role: :navigation } +%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top{ class: Rails.env.development? ? "navbar-dev" : "", role: :navigation } .container %a.navbar-brand{ href: '/', title: APP_CONFIG["site_name"] } - if APP_CONFIG["use_svg_logo"] = render inline: Rails.application.config.justask_svg_logo - else = APP_CONFIG["site_name"] + - if Rails.env.development? + %span.badge.rounded-pill.bg-warning.text-bg-warning.fs-7 + DEV %button.navbar-toggler{ data: { bs_target: '#j2-main-navbar-collapse', bs_toggle: :collapse }, type: :button } %span.visually-hidden= t("navigation.toggle") %span.navbar-toggler-icon diff --git a/app/views/navigation/_mobile.html.haml b/app/views/navigation/_mobile.html.haml index 13d749ea..2bc5cc78 100644 --- a/app/views/navigation/_mobile.html.haml +++ b/app/views/navigation/_mobile.html.haml @@ -1,5 +1,5 @@ - notifications_icon = notification_count.nil? ? 'bell-o' : 'bell' -%nav.navbar.navbar-themed.bg-primary.fixed-bottom.d-lg-none.d-block.d-print-none#rs-mobile-nav{ role: :navigation } +%nav.navbar.navbar-themed.bg-primary.fixed-bottom.d-lg-none.d-block.d-print-none#rs-mobile-nav{ class: Rails.env.development? ? "navbar-dev" : "", role: :navigation } .container %ul.nav.navbar-nav.navbar-icon-row = nav_entry t("navigation.timeline"), root_path, icon: 'home', icon_only: true diff --git a/app/views/shared/_format_link.html.haml b/app/views/shared/_format_link.html.haml new file mode 100644 index 00000000..023cbfe5 --- /dev/null +++ b/app/views/shared/_format_link.html.haml @@ -0,0 +1,3 @@ +%a.text-muted.text-decoration-none.fs-7{ href: "#", data: { controller: "format-popup" }, tabindex: "0" } + %i.fab.fa-markdown + = t("voc.format_markdown") diff --git a/app/views/shared/_formatting.html.haml b/app/views/shared/_formatting.html.haml new file mode 100644 index 00000000..30a19851 --- /dev/null +++ b/app/views/shared/_formatting.html.haml @@ -0,0 +1,2 @@ +#formatting-options.d-none{ aria: { hidden: true } } + = t(".body_html", app_name: APP_CONFIG["site_name"]) diff --git a/config/locales/views.en.yml b/config/locales/views.en.yml index 06ebaca6..e1696485 100644 --- a/config/locales/views.en.yml +++ b/config/locales/views.en.yml @@ -551,6 +551,13 @@ en: unsubscribe_all: "Disable on all devices" description: "Here you can set up or disable push notifications for new questions in your inbox." shared: + formatting: + body_html: | +

%{app_name} uses Markdown for formatting

+

A blank line starts a new paragraph

+

*italic text* for italic text

+

**bold text** for bold text

+

[link](https://example.com) for link

links: about: "About" source: "Source code" diff --git a/config/locales/voc.en.yml b/config/locales/voc.en.yml index 232d5500..7f674a7e 100644 --- a/config/locales/voc.en.yml +++ b/config/locales/voc.en.yml @@ -10,6 +10,7 @@ en: delete: "Delete" edit: "Edit" follow: "Follow" + format_markdown: "Styling with Markdown is supported" load: "Load more" login: "Sign in" logout: "Sign out" diff --git a/lib/retrospring/version.rb b/lib/retrospring/version.rb index 14d0c287..ede915a6 100644 --- a/lib/retrospring/version.rb +++ b/lib/retrospring/version.rb @@ -17,9 +17,9 @@ module Retrospring def month = 1 - def day = 5 + def day = 11 - def patch = 2 + def patch = 0 def suffix = "" diff --git a/lib/tasks/.keep b/lib/tasks/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/use_case/question/create.rb b/lib/use_case/question/create.rb index 51a4f3de..5cc8f174 100644 --- a/lib/use_case/question/create.rb +++ b/lib/use_case/question/create.rb @@ -95,7 +95,7 @@ module UseCase def filtered?(question) target_user.mute_rules.any? { |rule| rule.applies_to? question } || (anonymous && AnonymousBlock.where(identifier: question.author_identifier, user_id: [target_user.id, nil]).any?) || - (source_user_id && anonymous && AnonymousBlock.where(target_user_id: [source_user.id, nil], user_id: [target_user.id, nil]).any?) || + (source_user_id && anonymous && AnonymousBlock.where(target_user_id: source_user.id, user_id: [target_user.id, nil]).any?) || (source_user_id && target_user.muting?(source_user)) end diff --git a/package.json b/package.json index 05156176..33382f8e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "build:css": "sass ./app/assets/stylesheets/application.sass.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules" }, "dependencies": { - "@fontsource/lexend": "^4.5.13", + "@fontsource/lexend": "^4.5.14", "@fortawesome/fontawesome-free": "^6.2.1", "@hotwired/stimulus": "^3.2.1", "@hotwired/turbo-rails": "^7.2.4", @@ -26,7 +26,7 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.11.0", "@typescript-eslint/parser": "^4.11.0", - "esbuild": "^0.16.14", + "esbuild": "^0.16.16", "eslint": "^7.16.0", "eslint-plugin-import": "^2.26.0" } diff --git a/spec/integration/generated_locale_spec.rb b/spec/integration/generated_locale_spec.rb new file mode 100644 index 00000000..64246680 --- /dev/null +++ b/spec/integration/generated_locale_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "rails_helper" +require "support/load_rake_tasks" + +describe "test locale generation" do + it "succeeds" do + allow($stdout).to receive(:puts) + + Rake::Task["locale:generate"].execute + + %w[activerecord controllers errors frontend views voc].each do |locale_type| + expect($stdout).to have_received(:puts).with a_string_including("generating #{locale_type}.en-xx.yml") + end + end +end diff --git a/spec/integration/version_bump_spec.rb b/spec/integration/version_bump_spec.rb new file mode 100644 index 00000000..656c69e6 --- /dev/null +++ b/spec/integration/version_bump_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require "rails_helper" +require "support/load_rake_tasks" + +describe "version bumping tasks" do + include ActiveSupport::Testing::TimeHelpers + + describe "version:bump" do + around do |example| + # make a backup of our version file + version_path = Rails.root.join("lib/retrospring/version.rb") + version_contents = File.read(version_path) + example.run + ensure + # restore our version file + File.write(version_path, version_contents) + end + + it "updates the version if the version date differs" do + travel_to(Time.utc(2069, 6, 21, 13, 37, 0)) + allow($stdout).to receive(:puts) + + Rake::Task["version:bump"].execute + + expect($stdout).to have_received(:puts).with "New version: 2069.0621.0" + travel_back + end + + context "when version is already from today" do + before do + allow(Retrospring::Version).to receive(:year).and_return 2069 + allow(Retrospring::Version).to receive(:month).and_return 6 + allow(Retrospring::Version).to receive(:day).and_return 21 + allow(Retrospring::Version).to receive(:patch).and_return 0 + + # just stubbing the constant is not enough, we need to stub away the + # reading of the version file too; otherwise only the patch value is + # updated + version_path = Rails.root.join("lib/retrospring/version.rb") + version_contents = File.read(version_path) + .sub!(/def year = .+/, "def year = 2069") + .sub!(/def month = .+/, "def month = 6") + .sub!(/def day = .+/, "def day = 21") + .sub!(/def patch = .+/, "def patch = 0") + allow(File).to receive(:read).with(version_path).and_return(version_contents) + end + + it "updates the version if the version date differs" do + travel_to(Time.utc(2069, 6, 21, 13, 37, 0)) + allow($stdout).to receive(:puts) + + Rake::Task["version:bump"].execute + + expect($stdout).to have_received(:puts).with "Current version: 2069.0621.0" + expect($stdout).to have_received(:puts).with "New version: 2069.0621.1" + travel_back + end + end + end + + describe "version:commit" do + before do + allow(Retrospring::Version).to receive(:year).and_return 2069 + allow(Retrospring::Version).to receive(:month).and_return 6 + allow(Retrospring::Version).to receive(:day).and_return 21 + allow(Retrospring::Version).to receive(:patch).and_return 3 + end + + it "runs the correct git commands" do + allow($stdout).to receive(:puts) + version_path = Rails.root.join("lib/retrospring/version.rb") + + expect_any_instance_of(Rake::FileUtilsExt) + .to receive(:sh) + .with(%(git commit -m 'Bump version to 2069.0621.3' -- #{version_path.to_s.inspect})) + expect_any_instance_of(Rake::FileUtilsExt) + .to receive(:sh) + .with(%(git tag -a -m 'Bump version to 2069.0621.3' 2069.0621.3)) + + Rake::Task["version:commit"].execute + end + end +end diff --git a/spec/support/load_rake_tasks.rb b/spec/support/load_rake_tasks.rb new file mode 100644 index 00000000..bc079705 --- /dev/null +++ b/spec/support/load_rake_tasks.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +# ensure Rake tasks are only loaded once during the entire RSpec run. +# +# when using it from a `before(:context) { ... }` block this will load the +# tasks more than once and therefore run tasks more often than they should ... +Rails.application.load_tasks diff --git a/yarn.lock b/yarn.lock index 4a23f062..51d986d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,115 +23,115 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@esbuild/android-arm64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.14.tgz#f02c9f0d43086ddf6ed2795b881ddf7990f74456" - integrity sha512-hTqB6Iq13pW4xaydeqQrs8vPntUnMjbkq+PgGiBMi69eYk74naG2ftHWqKnxn874kNrt5Or3rQ0PJutx2doJuQ== +"@esbuild/android-arm64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.16.tgz#833184b8a0a96f9c85105c53d0a67e6d3c5c3f07" + integrity sha512-hFHVAzUKp9Tf8psGq+bDVv+6hTy1bAOoV/jJMUWwhUnIHsh6WbFMhw0ZTkqDuh7TdpffFoHOiIOIxmHc7oYRBQ== -"@esbuild/android-arm@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.14.tgz#24e4faf569d0d6bbf9ed46f6ed395d68eb7f04fc" - integrity sha512-u0rITLxFIeYAvtJXBQNhNuV4YZe+MD1YvIWT7Nicj8hZAtRVZk2PgNH6KclcKDVHz1ChLKXRfX7d7tkbQBUfrg== +"@esbuild/android-arm@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.16.tgz#23761b2fd1dfa4806161dbfc9e0824f04061cb95" + integrity sha512-BUuWMlt4WSXod1HSl7aGK8fJOsi+Tab/M0IDK1V1/GstzoOpqc/v3DqmN8MkuapPKQ9Br1WtLAN4uEgWR8x64A== -"@esbuild/android-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.14.tgz#1173e706cf57c0d4dbf069d18e5d50ae6a5b0871" - integrity sha512-jir51K4J0K5Rt0KOcippjSNdOl7akKDVz5I6yrqdk4/m9y+rldGptQUF7qU4YpX8U61LtR+w2Tu2Ph+K/UaJOw== +"@esbuild/android-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.16.tgz#ffa09f04c0ffea5b594ab7655fc9ca1220365e9b" + integrity sha512-9WhxJpeb6XumlfivldxqmkJepEcELekmSw3NkGrs+Edq6sS5KRxtUBQuKYDD7KqP59dDkxVbaoPIQFKWQG0KLg== -"@esbuild/darwin-arm64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.14.tgz#67f05693c5b097bcb4ff656ba5839459f30f79c2" - integrity sha512-vrlaP81IuwPaw1fyX8fHCmivP3Gr73ojVEZy+oWJLAiZVcG8o8Phwun/XDnYIFUHxIoUnMFEpg9o38MIvlw8zw== +"@esbuild/darwin-arm64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.16.tgz#62ed2b4bfab594b9e5e708580361f1d059b53b26" + integrity sha512-8Z+wld+vr/prHPi2O0X7o1zQOfMbXWGAw9hT0jEyU/l/Yrg+0Z3FO9pjPho72dVkZs4ewZk0bDOFLdZHm8jEfw== -"@esbuild/darwin-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.14.tgz#519c9d127c5363d4a1e73b9d954460f798b41d2a" - integrity sha512-KV1E01eC2hGYA2qzFDRCK4wdZCRUvMwCNcobgpiiOzp5QXpJBqFPdxI69j8vvzuU7oxFXDgANwEkXvpeQqyOyg== +"@esbuild/darwin-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.16.tgz#e9756d34cd9b3737a5354e89ca0fdca32d8df64c" + integrity sha512-CYkxVvkZzGCqFrt7EgjFxQKhlUPyDkuR9P0Y5wEcmJqVI8ncerOIY5Kej52MhZyzOBXkYrJgZeVZC9xXXoEg9A== -"@esbuild/freebsd-arm64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.14.tgz#2e3f5de2951a8ec732a3e4ec4f5d47a7c9626001" - integrity sha512-xRM1RQsazSvL42BNa5XC7ytD4ZDp0ZyJcH7aB0SlYUcHexJUKiDNKR7dlRVlpt6W0DvoRPU2nWK/9/QWS4u2fw== +"@esbuild/freebsd-arm64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.16.tgz#db7bce444d372e5a213a3f359c42aee3acc0dd45" + integrity sha512-fxrw4BYqQ39z/3Ja9xj/a1gMsVq0xEjhSyI4a9MjfvDDD8fUV8IYliac96i7tzZc3+VytyXX+XNsnpEk5sw5Wg== -"@esbuild/freebsd-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.14.tgz#d3cf84ff28357ac8d0123309bac37fcfcdd98f53" - integrity sha512-7ALTAn6YRRf1O6fw9jmn0rWmOx3XfwDo7njGtjy1LXhDGUjTY/vohEPM3ii5MQ411vJv1r498EEx2aBQTJcrEw== +"@esbuild/freebsd-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.16.tgz#02e8a81b7e56040b5eb883896de445a6cd3501f0" + integrity sha512-8p3v1D+du2jiDvSoNVimHhj7leSfST9YlKsAEO7etBfuqjaBMndo0fmjNLp0JCMld+XIx9L80tooOkyUv1a1PQ== -"@esbuild/linux-arm64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.14.tgz#f44b0e3d5d470cd763a9bc4855a12b8cb73d6c12" - integrity sha512-TLh2OcbBUQcMYRH4GbiDkDZfZ4t1A3GgmeXY27dHSI6xrU7IkO00MGBiJySmEV6sH3Wa6pAN6UtaVL0DwkGW4Q== +"@esbuild/linux-arm64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.16.tgz#ea8c3df172644fa6437f0083c2a38b50f89e5b98" + integrity sha512-N3u6BBbCVY3xeP2D8Db7QY8I+nZ+2AgOopUIqk+5yCoLnsWkcVxD2ay5E9iIdvApFi1Vg1lZiiwaVp8bOpAc4A== -"@esbuild/linux-arm@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.14.tgz#b239eb7e6cb7df9c34c6b08f4adf113da47e0e09" - integrity sha512-X6xULug66ulrr4IzrW7qq+eq9n4MtEyagdWvj4o4cmWr+JXOT47atjpDF9j5M2zHY0UQBmqnHhwl+tXpkpIb2w== +"@esbuild/linux-arm@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.16.tgz#c1c2e97e67bb7247e6f60e2644de057bfedb8cbb" + integrity sha512-bYaocE1/PTMRmkgSckZ0D0Xn2nox8v2qlk+MVVqm+VECNKDdZvghVZtH41dNtBbwADSvA6qkCHGYeWm9LrNCBw== -"@esbuild/linux-ia32@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.14.tgz#f5f7886027cd61bed59178e981a0ef47ca5b72ef" - integrity sha512-oBZkcZ56UZDFCAfE3Fd/Jgy10EoS7Td77NzNGenM+HSY8BkdQAcI9VF9qgwdOLZ+tuftWD7UqZ26SAhtvA3XhA== +"@esbuild/linux-ia32@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.16.tgz#9a0b0e926926f891a3e7f7c50bb38e3db49c2c9a" + integrity sha512-dxjqLKUW8GqGemoRT9v8IgHk+T4tRm1rn1gUcArsp26W9EkK/27VSjBVUXhEG5NInHZ92JaQ3SSMdTwv/r9a2A== -"@esbuild/linux-loong64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.14.tgz#d2329371726f9778156c89ea0bed26fc1bc3cd7e" - integrity sha512-udz/aEHTcuHP+xdWOJmZ5C9RQXHfZd/EhCnTi1Hfay37zH3lBxn/fNs85LA9HlsniFw2zccgcbrrTMKk7Cn1Qg== +"@esbuild/linux-loong64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.16.tgz#c5a50ff5981d457ed45f42c3f06a60086759c79b" + integrity sha512-MdUFggHjRiCCwNE9+1AibewoNq6wf94GLB9Q9aXwl+a75UlRmbRK3h6WJyrSGA6ZstDJgaD2wiTSP7tQNUYxwA== -"@esbuild/linux-mips64el@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.14.tgz#8af86bdc6ee937c8a2803b3c197b28824f48df8e" - integrity sha512-kJ2iEnikUOdC1SiTGbH0fJUgpZwa0ITDTvj9EHf9lm3I0hZ4Yugsb3M6XSl696jVxrEocLe519/8CbSpQWFSrg== +"@esbuild/linux-mips64el@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.16.tgz#e85b7e3c25000be2ae373e5208e55e282a9763e0" + integrity sha512-CO3YmO7jYMlGqGoeFeKzdwx/bx8Vtq/SZaMAi+ZLDUnDUdfC7GmGwXzIwDJ70Sg+P9pAemjJyJ1icKJ9R3q/Fg== -"@esbuild/linux-ppc64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.14.tgz#3fa3f8c6c9db3127f2ec5b2eba1cec67ff9a9b8e" - integrity sha512-kclKxvZvX5YhykwlJ/K9ljiY4THe5vXubXpWmr7q3Zu3WxKnUe1VOZmhkEZlqtnJx31GHPEV4SIG95IqTdfgfg== +"@esbuild/linux-ppc64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.16.tgz#24a0013bf727830df44fece571172ebe31b5c5e6" + integrity sha512-DSl5Czh5hCy/7azX0Wl9IdzPHX2H8clC6G87tBnZnzUpNgRxPFhfmArbaHoAysu4JfqCqbB/33u/GL9dUgCBAw== -"@esbuild/linux-riscv64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.14.tgz#1bd1b631de2533106a08876295bad3a19b20f629" - integrity sha512-fdwP9Dc+Kx/cZwp9T9kNqjAE/PQjfrxbio4rZ3XnC3cVvZBjuxpkiyu/tuCwt6SbAK5th6AYNjFdEV9kGC020A== +"@esbuild/linux-riscv64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.16.tgz#b080998d8d0480e8235f1384c585ae505e98a19d" + integrity sha512-sSVVMEXsqf1fQu0j7kkhXMViroixU5XoaJXl1u/u+jbXvvhhCt9YvA/B6VM3aM/77HuRQ94neS5bcisijGnKFQ== -"@esbuild/linux-s390x@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.14.tgz#c87440b6522b9a36a9cafd05b0f1ca3c5bad4cca" - integrity sha512-++fw3P4fQk9nqvdzbANRqimKspL8pDCnSpXomyhV7V/ISha/BZIYvZwLBWVKp9CVWKwWPJ4ktsezuLIvlJRHqA== +"@esbuild/linux-s390x@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.16.tgz#5042de05b9b653dfd134f05e1b37b61704c14c42" + integrity sha512-jRqBCre9gZGoCdCN/UWCCMwCMsOg65IpY9Pyj56mKCF5zXy9d60kkNRdDN6YXGjr3rzcC4DXnS/kQVCGcC4yPQ== -"@esbuild/linux-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.14.tgz#49cd974dad6042ac0141ba332df6307c44e77fed" - integrity sha512-TomtswAuzBf2NnddlrS4W01Tv85RM9YtATB3OugY6On0PLM4Ksz5qvQKVAjtzPKoLgL1FiZtfc8mkZc4IgoMEA== +"@esbuild/linux-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.16.tgz#b7c0750f2276c9dcf41f0f2229adca46ef22f698" + integrity sha512-G1+09TopOzo59/55lk5Q0UokghYLyHTKKzD5lXsAOOlGDbieGEFJpJBr3BLDbf7cz89KX04sBeExAR/pL/26sA== -"@esbuild/netbsd-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.14.tgz#53dcfb5131376feff0911adff7f01b4821706cf6" - integrity sha512-U06pfx8P5CqyoPNfqIJmnf+5/r4mJ1S62G4zE6eOjS59naQcxi6GnscUCPH3b+hRG0qdKoGX49RAyiqW+M9aSw== +"@esbuild/netbsd-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.16.tgz#e2a0ee181fbbe834174d26e24ce1b258232bb3eb" + integrity sha512-xwjGJB5wwDEujLaJIrSMRqWkbigALpBNcsF9SqszoNKc+wY4kPTdKrSxiY5ik3IatojePP+WV108MvF6q6np4w== -"@esbuild/openbsd-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.14.tgz#f36888f73087bcd12c5bf9a4b18e348da9c80ad0" - integrity sha512-/Jl8XVaWEZNu9rZw+n792GIBupQwHo6GDoapHSb/2xp/Ku28eK6QpR2O9cPBkzHH4OOoMH0LB6zg/qczJ5TTGg== +"@esbuild/openbsd-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.16.tgz#87a84c1932e00f52ab3380c31facf0e48086ffb9" + integrity sha512-yeERkoxG2nR2oxO5n+Ms7MsCeNk23zrby2GXCqnfCpPp7KNc0vxaaacIxb21wPMfXXRhGBrNP4YLIupUBrWdlg== -"@esbuild/sunos-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.14.tgz#41e046bb0849ae59702a5cfa8be300431a61ee3a" - integrity sha512-2iI7D34uTbDn/TaSiUbEHz+fUa8KbN90vX5yYqo12QGpu6T8Jl+kxODsWuMCwoTVlqUpwfPV22nBbFPME9OPtw== +"@esbuild/sunos-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.16.tgz#996bcd2603cd345733c3aa5f52bfd5b8fa7d1d36" + integrity sha512-nHfbEym0IObXPhtX6Va3H5GaKBty2kdhlAhKmyCj9u255ktAj0b1YACUs9j5H88NRn9cJCthD1Ik/k9wn8YKVg== -"@esbuild/win32-arm64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.14.tgz#d6ed78742a6edd413e75796882ddaef8c1e23b93" - integrity sha512-SjlM7AHmQVTiGBJE/nqauY1aDh80UBsXZ94g4g60CDkrDMseatiqALVcIuElg4ZSYzJs8hsg5W6zS2zLpZTVgg== +"@esbuild/win32-arm64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.16.tgz#404a9411d12533d0f2ce0a85df6ddb32e851ef04" + integrity sha512-pdD+M1ZOFy4hE15ZyPX09fd5g4DqbbL1wXGY90YmleVS6Y5YlraW4BvHjim/X/4yuCpTsAFvsT4Nca2lbyDH/A== -"@esbuild/win32-ia32@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.14.tgz#558bd53859a83fe887d7d2dcdc6cb3fc9aa9a9bc" - integrity sha512-z06t5zqk8ak0Xom5HG81z2iOQ1hNWYsFQp3sczVLVx+dctWdgl80tNRyTbwjaFfui2vFO12dfE3trCTvA+HO4g== +"@esbuild/win32-ia32@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.16.tgz#bb5655a48f5f87fee870061883411f5149bc5e44" + integrity sha512-IPEMfU9p0c3Vb8PqxaPX6BM9rYwlTZGYOf9u+kMdhoILZkVKEjq6PKZO0lB+isojWwAnAqh4ZxshD96njTXajg== -"@esbuild/win32-x64@0.16.14": - version "0.16.14" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.14.tgz#90558dcb279989d92a42e5be4dfb884b2399361f" - integrity sha512-ED1UpWcM6lAbalbbQ9TrGqJh4Y9TaASUvu8bI/0mgJcxhSByJ6rbpgqRhxYMaQ682WfA71nxUreaTO7L275zrw== +"@esbuild/win32-x64@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.16.tgz#ee22fed0b2e0c00ce895cdfae9d32ef069a12e04" + integrity sha512-1YYpoJ39WV/2bnShPwgdzJklc+XS0bysN6Tpnt1cWPdeoKOG4RMEY1g7i534QxXX/rPvNx/NLJQTTCeORYzipg== "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -148,10 +148,10 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@fontsource/lexend@^4.5.13": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@fontsource/lexend/-/lexend-4.5.13.tgz#a22076e1393af0f075e945fcffc9ffa514805304" - integrity sha512-lJjBMU9Jmi2a/QqLRBhwe862385UyS2RckS3ATr8jHAq1JFLxox2p2gODNzhaWo0ZwTjDxIJ0YfMiEzSdyqZ0w== +"@fontsource/lexend@^4.5.14": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@fontsource/lexend/-/lexend-4.5.14.tgz#04c7a12650aff6e6d030c6e84c9e1ee94f219764" + integrity sha512-6ctm23JzSITVKi6Kjnw5chfE5rZLUa50DpFbXHQlgjrwNtdvEg1mH6JYLQAZM4VtMmg2JfiSQyoCvePGvvhTVg== "@fortawesome/fontawesome-free@^6.2.1": version "6.2.1" @@ -639,33 +639,33 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.16.14: - version "0.16.14" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.14.tgz#366249a0a0fd431d3ab706195721ef1014198919" - integrity sha512-6xAn3O6ZZyoxZAEkwfI9hw4cEqSr/o1ViJtnkvImVkblmUN65Md04o0S/7H1WNu1XGf1Cjij/on7VO4psIYjkw== +esbuild@^0.16.16: + version "0.16.16" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.16.tgz#e8a27820a30cc1449066f9bbe8916b145dbc9046" + integrity sha512-24JyKq10KXM5EBIgPotYIJ2fInNWVVqflv3gicIyQqfmUqi4HvDW1VR790cBgLJHCl96Syy7lhoz7tLFcmuRmg== optionalDependencies: - "@esbuild/android-arm" "0.16.14" - "@esbuild/android-arm64" "0.16.14" - "@esbuild/android-x64" "0.16.14" - "@esbuild/darwin-arm64" "0.16.14" - "@esbuild/darwin-x64" "0.16.14" - "@esbuild/freebsd-arm64" "0.16.14" - "@esbuild/freebsd-x64" "0.16.14" - "@esbuild/linux-arm" "0.16.14" - "@esbuild/linux-arm64" "0.16.14" - "@esbuild/linux-ia32" "0.16.14" - "@esbuild/linux-loong64" "0.16.14" - "@esbuild/linux-mips64el" "0.16.14" - "@esbuild/linux-ppc64" "0.16.14" - "@esbuild/linux-riscv64" "0.16.14" - "@esbuild/linux-s390x" "0.16.14" - "@esbuild/linux-x64" "0.16.14" - "@esbuild/netbsd-x64" "0.16.14" - "@esbuild/openbsd-x64" "0.16.14" - "@esbuild/sunos-x64" "0.16.14" - "@esbuild/win32-arm64" "0.16.14" - "@esbuild/win32-ia32" "0.16.14" - "@esbuild/win32-x64" "0.16.14" + "@esbuild/android-arm" "0.16.16" + "@esbuild/android-arm64" "0.16.16" + "@esbuild/android-x64" "0.16.16" + "@esbuild/darwin-arm64" "0.16.16" + "@esbuild/darwin-x64" "0.16.16" + "@esbuild/freebsd-arm64" "0.16.16" + "@esbuild/freebsd-x64" "0.16.16" + "@esbuild/linux-arm" "0.16.16" + "@esbuild/linux-arm64" "0.16.16" + "@esbuild/linux-ia32" "0.16.16" + "@esbuild/linux-loong64" "0.16.16" + "@esbuild/linux-mips64el" "0.16.16" + "@esbuild/linux-ppc64" "0.16.16" + "@esbuild/linux-riscv64" "0.16.16" + "@esbuild/linux-s390x" "0.16.16" + "@esbuild/linux-x64" "0.16.16" + "@esbuild/netbsd-x64" "0.16.16" + "@esbuild/openbsd-x64" "0.16.16" + "@esbuild/sunos-x64" "0.16.16" + "@esbuild/win32-arm64" "0.16.16" + "@esbuild/win32-ia32" "0.16.16" + "@esbuild/win32-x64" "0.16.16" escape-string-regexp@^1.0.5: version "1.0.5"