diff --git a/README.md b/README.md
index 7a799a2e..535f3dff 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@ Then start the dev server:
npm run dev
```
-This will serve up the site at [localhost:3002](http://localhost:3002).
+This will serve up the site at [127.0.0.1:3002](http://127.0.0.1:3002). **If you use localhost instead of 127.0.0.1 you may find page load extremely slow.**
It will watch for changes and do hot module reloading. Occasionally you'll need to restart Vite when it doesn't
pick up a change.
diff --git a/api/ConfigAPI.js b/api/ConfigAPI.js
new file mode 100644
index 00000000..4d122781
--- /dev/null
+++ b/api/ConfigAPI.js
@@ -0,0 +1,7 @@
+import BaseAPI from '@/api/BaseAPI'
+
+export default class ConfigAPI extends BaseAPI {
+ fetchv2(key) {
+ return this.$getv2('/config/' + key)
+ }
+}
diff --git a/api/index.d.ts b/api/index.d.ts
index 4a107a12..9081fd45 100644
--- a/api/index.d.ts
+++ b/api/index.d.ts
@@ -19,6 +19,7 @@ import BanditAPI from './BanditAPI.js'
import ChatAPI from './ChatAPI.js'
import CommentAPI from './CommentAPI.js'
import CommunityEventAPI from './CommunityEventAPI.js'
+import ConfigAPI from './ConfigAPI.js'
import DashboardAPI from './DashboardAPI.js'
import DomainAPI from './DomainAPI.js'
import DonationsAPI from './DonationsAPI.js'
@@ -62,6 +63,7 @@ interface API {
chat: ChatAPI;
comment: CommentAPI;
communityevent: CommunityEventAPI;
+ config: ConfigAPI;
dashboard: DashboardAPI;
domain: DomainAPI;
donations: DonationsAPI;
diff --git a/api/index.js b/api/index.js
index d1cfca38..01442944 100644
--- a/api/index.js
+++ b/api/index.js
@@ -17,6 +17,7 @@ import BanditAPI from './BanditAPI.js'
import ChatAPI from './ChatAPI.js'
import CommentAPI from './CommentAPI.js'
import CommunityEventAPI from './CommunityEventAPI.js'
+import ConfigAPI from './ConfigAPI.js'
import DashboardAPI from './DashboardAPI.js'
import DomainAPI from './DomainAPI.js'
import DonationsAPI from './DonationsAPI.js'
@@ -62,6 +63,7 @@ export default (config) => {
chat: new ChatAPI(options),
comment: new CommentAPI(options),
communityevent: new CommunityEventAPI(options),
+ config: new ConfigAPI(options),
dashboard: new DashboardAPI(options),
domain: new DomainAPI(options),
donations: new DonationsAPI(options),
diff --git a/app.vue b/app.vue
index 0c09860c..4b57ee9a 100644
--- a/app.vue
+++ b/app.vue
@@ -123,6 +123,7 @@ import { useMiscStore } from './stores/misc'
import { computed, watch, reloadNuxtApp } from '#imports'
// polyfills
import 'core-js/actual/array/to-sorted'
+import { useConfigStore } from '~/stores/config'
const route = useRoute()
const loadingIndicatorThrottle = ref(5000)
@@ -139,7 +140,12 @@ let ready = false
// Starting with around Nuxt 3.4.1, when we first access the config (here) it has public as we'd expect, but
// if we store that and access it later, we are just looking at the contents of public. I don't understand why
// this is, but we don't expect the config to change, so we take a copy here.
-const runtimeConfig = JSON.parse(JSON.stringify(useRuntimeConfig()))
+const runtimeConfig = JSON.parse(
+ JSON.stringify({
+ public: useRuntimeConfig().public,
+ app: useRuntimeConfig().app,
+ })
+)
const miscStore = useMiscStore()
const groupStore = useGroupStore()
@@ -148,6 +154,7 @@ const authStore = useAuthStore()
const userStore = useUserStore()
const isochroneStore = useIsochroneStore()
const composeStore = useComposeStore()
+const configStore = useConfigStore()
const chatStore = useChatStore()
const addressStore = useAddressStore()
const trystStore = useTrystStore()
@@ -189,6 +196,7 @@ searchStore.init(runtimeConfig)
storyStore.init(runtimeConfig)
volunteeringStore.init(runtimeConfig)
communityEventStore.init(runtimeConfig)
+configStore.init(runtimeConfig)
jobStore.init(runtimeConfig)
teamStore.init(runtimeConfig)
donationStore.init(runtimeConfig)
@@ -263,6 +271,21 @@ if (process.client) {
window.location.reload()
}
}
+
+ window.onerror = function (message, url, line, col, error) {
+ // We can get this, for example if the CookieYes script is blocked.
+ console.log('Uncaught error', message, url, line, col, error)
+
+ if (url.includes('cookieyes')) {
+ // If CookieYes fails with an error, then we proceed as though it wasn't configured.
+ //
+ // This catches the error on Firefox, but not on Chrome, so it's of limited use.
+ console.log('CookieYes error')
+ if (window.postCookieYes) {
+ window.postCookieYes()
+ }
+ }
+ }
}
const chatCount = computed(() => {
diff --git a/assets/css/buttons.scss b/assets/css/buttons.scss
index 747a8560..3ba70c6d 100644
--- a/assets/css/buttons.scss
+++ b/assets/css/buttons.scss
@@ -83,3 +83,9 @@ button {
color: $color-gray--normal !important;
}
}
+
+.badge {
+ &.text-bg-info {
+ color: white !important;
+ }
+}
\ No newline at end of file
diff --git a/assets/css/global.scss b/assets/css/global.scss
index 933eb8e5..91d0cf9f 100644
--- a/assets/css/global.scss
+++ b/assets/css/global.scss
@@ -246,7 +246,8 @@ legend {
}
.sidebar__wrapper {
- height: calc(100vh - var(--header-navbar-height) - var(--ads-label-height) - $sticky-banner-height-desktop);
+ height: calc(100vh - var(--header-navbar-height) - $sticky-banner-height-desktop - $ads-cta);
+ overflow-y: scroll;
.card-body .card {
border-radius: unset;
diff --git a/assets/css/message-images.scss b/assets/css/message-images.scss
new file mode 100644
index 00000000..62e8f15e
--- /dev/null
+++ b/assets/css/message-images.scss
@@ -0,0 +1,9 @@
+@import 'bootstrap/scss/functions';
+@import 'bootstrap/scss/variables';
+@import 'bootstrap/scss/mixins/_breakpoints';
+
+$thumbnail-size: 150px;
+$thumbnail-size-md: 200px;
+
+$notthumbnail-size: 320px;
+$notthumbnail-size-md: 200px;
\ No newline at end of file
diff --git a/assets/css/navbar.scss b/assets/css/navbar.scss
index 386a292b..db2400de 100644
--- a/assets/css/navbar.scss
+++ b/assets/css/navbar.scss
@@ -2,6 +2,12 @@
@import 'bootstrap/scss/variables';
@import 'bootstrap/scss/mixins/_breakpoints';
+$navbar-height: calc(8px + 8px + 64px);
+
+@include media-breakpoint-up(md) {
+ $navbar-height: calc(8px + 8px + 58px);
+}
+
#navbar_large .nav-item {
text-align: center;
}
@@ -148,6 +154,24 @@ svg.fa-icon {
color: white !important;
}
+.communityeventsbadge {
+ position: absolute;
+ top: 2px;
+ right: -2px;
+ font-size: 11px;
+ background-color: $colour-secondary !important;
+ color: white !important;
+}
+
+.volunteeropportunitiesbadge {
+ position: absolute;
+ top: 2px;
+ right: 9px;
+ font-size: 11px;
+ background-color: $colour-secondary !important;
+ color: white !important;
+}
+
.browsebadge {
position: absolute;
top: 2px;
diff --git a/assets/css/sidebar-ads.scss b/assets/css/sidebar-ads.scss
index d0a9db50..412d7a1a 100644
--- a/assets/css/sidebar-ads.scss
+++ b/assets/css/sidebar-ads.scss
@@ -1,3 +1,2 @@
$sidebar-ads-height-small: 258px;
$sidebar-ads-height-large: 608px;
-$sidebar-ads-label-height: 42px;
diff --git a/assets/css/sticky-banner.scss b/assets/css/sticky-banner.scss
index 3622d22f..7f07644a 100644
--- a/assets/css/sticky-banner.scss
+++ b/assets/css/sticky-banner.scss
@@ -1,2 +1,3 @@
-$sticky-banner-height-mobile: 50px;
-$sticky-banner-height-desktop: 90px;
+$sticky-banner-height-mobile: 73px;
+$sticky-banner-height-desktop: 113px;
+$ads-cta: 23px;
diff --git a/assets/css/uploader.scss b/assets/css/uploader.scss
index a43858a5..8f34b239 100644
--- a/assets/css/uploader.scss
+++ b/assets/css/uploader.scss
@@ -2,200 +2,3743 @@
@import 'bootstrap/scss/_functions';
@import 'bootstrap/scss/_variables';
@import 'bootstrap/scss/mixins/_breakpoints';
+@import 'assets/css/sticky-banner.scss';
-.my-config {
- --darkmode: 0;
- --h-accent: 98;
- --s-accent: 70%;
- --l-accent: 46%;
- --h-background: 0;
- --s-background: 0%;
- --l-background: 100%;
- --border-radius-element: 0;
- --border-radius-frame: 0;
- --border-radius-thumb: 0;
- --clr-confirm: #338808;
- --icon-edit-file: 'm17.002 0.905 -2.269 2.269 6.094 6.094 2.269 -2.269c1.172 -1.172 1.172 -3.07 0 -4.242l-1.847 -1.852c-1.172 -1.172 -3.07 -1.172 -4.242 0zm-3.328 3.328L2.747 15.164c-0.488 0.488 -0.844 1.092 -1.041 1.753L0.047 22.556c-0.117 0.398 -0.009 0.825 0.281 1.116s0.717 0.398 1.111 0.286L7.078 22.298c0.661 -0.197 1.266 -0.553 1.753 -1.041l10.936 -10.931z';
- --icon-remove-file: 'M6.337 0.83C6.591 0.319 7.111 0 7.678 0h5.644c0.567 0 1.087 0.319 1.341 0.83L15 1.5h4.5c0.83 0 1.5 0.67 1.5 1.5s-0.67 1.5 -1.5 1.5H1.5C0.67 4.5 0 3.83 0 3s0.67 -1.5 1.5 -1.5h4.5zM1.5 6h18v15c0 1.655 -1.345 3 -3 3H4.5c-1.655 0 -3 -1.345 -3 -3zm4.5 3c-0.413 0 -0.75 0.338 -0.75 0.75v10.5c0 0.413 0.338 0.75 0.75 0.75s0.75 -0.338 0.75 -0.75V9.75c0 -0.413 -0.338 -0.75 -0.75 -0.75m4.5 0c-0.413 0 -0.75 0.338 -0.75 0.75v10.5c0 0.413 0.338 0.75 0.75 0.75s0.75 -0.338 0.75 -0.75V9.75c0 -0.413 -0.338 -0.75 -0.75 -0.75m4.5 0c-0.413 0 -0.75 0.338 -0.75 0.75v10.5c0 0.413 0.338 0.75 0.75 0.75s0.75 -0.338 0.75 -0.75V9.75c0 -0.413 -0.338 -0.75 -0.75 -0.75';
- --icon-default: 'm11 3c-.9428 0-1.4141313.0000788-1.7070312.2929688-.2714001.2714099-.2915088.6968024-.2929688 1.5078124-3.45256.0000701-5.18871.0076507-6.34375.9941407-.16547.14133-.3196175.2954675-.4609375.4609375-.99524 1.16527-.9960937 2.9216069-.9960937 6.4355466 0 3.5139.0008537 5.2722.9960937 6.4375.14132.1654.2954675.319538.4609375.460938 1.16527.9952 2.9216169.99414 6.4355469.99414h5.8164061c3.5139 0 5.270247.00106 6.435547-.99414.1654-.1414.319637-.295538.460938-.460938.9952-1.1653.996093-2.9236.996093-6.4375 0-3.5139397-.000893-5.2702766-.996093-6.4355466-.1413-.16547-.295538-.3196075-.460938-.4609375-1.1551-.98649-2.89125-.9940706-6.34375-.9941407-.0015-.8110099-.021569-1.2364025-.292969-1.5078124-.2929-.29289-.764231-.2929688-1.707031-.2929688zm1 5.1230469c2.5235 0 4.568359 2.0448591 4.568359 4.5683591s-2.044859 4.570313-4.568359 4.570313-4.5683594-2.046813-4.5683594-4.570313 2.0448594-4.5683591 4.5683594-4.5683591zm6.646484 0c.4588 0 .830078.3712581.830078.8300781 0 .45883-.371278.8320312-.830078.8320312-.4589 0-.832031-.3732012-.832031-.8320312 0-.45882.373131-.8300781.832031-.8300781z';
-}
-
-.my-config2 {
- --darkmode: 0;
- --h-accent: 98;
- --s-accent: 70%;
- --l-accent: 46%;
- --border-radius-element: 0;
- --border-radius-frame: 0;
- --border-radius-thumb: 0;
- --clr-confirm: #338808;
- --ui-size: 50px;
- --icon-edit-file: 'm17.002 0.905 -2.269 2.269 6.094 6.094 2.269 -2.269c1.172 -1.172 1.172 -3.07 0 -4.242l-1.847 -1.852c-1.172 -1.172 -3.07 -1.172 -4.242 0zm-3.328 3.328L2.747 15.164c-0.488 0.488 -0.844 1.092 -1.041 1.753L0.047 22.556c-0.117 0.398 -0.009 0.825 0.281 1.116s0.717 0.398 1.111 0.286L7.078 22.298c0.661 -0.197 1.266 -0.553 1.753 -1.041l10.936 -10.931z';
- --icon-remove-file: 'M6.337 0.83C6.591 0.319 7.111 0 7.678 0h5.644c0.567 0 1.087 0.319 1.341 0.83L15 1.5h4.5c0.83 0 1.5 0.67 1.5 1.5s-0.67 1.5 -1.5 1.5H1.5C0.67 4.5 0 3.83 0 3s0.67 -1.5 1.5 -1.5h4.5zM1.5 6h18v15c0 1.655 -1.345 3 -3 3H4.5c-1.655 0 -3 -1.345 -3 -3zm4.5 3c-0.413 0 -0.75 0.338 -0.75 0.75v10.5c0 0.413 0.338 0.75 0.75 0.75s0.75 -0.338 0.75 -0.75V9.75c0 -0.413 -0.338 -0.75 -0.75 -0.75m4.5 0c-0.413 0 -0.75 0.338 -0.75 0.75v10.5c0 0.413 0.338 0.75 0.75 0.75s0.75 -0.338 0.75 -0.75V9.75c0 -0.413 -0.338 -0.75 -0.75 -0.75m4.5 0c-0.413 0 -0.75 0.338 -0.75 0.75v10.5c0 0.413 0.338 0.75 0.75 0.75s0.75 -0.338 0.75 -0.75V9.75c0 -0.413 -0.338 -0.75 -0.75 -0.75';
- --icon-default: 'm11 3c-.9428 0-1.4141313.0000788-1.7070312.2929688-.2714001.2714099-.2915088.6968024-.2929688 1.5078124-3.45256.0000701-5.18871.0076507-6.34375.9941407-.16547.14133-.3196175.2954675-.4609375.4609375-.99524 1.16527-.9960937 2.9216069-.9960937 6.4355466 0 3.5139.0008537 5.2722.9960937 6.4375.14132.1654.2954675.319538.4609375.460938 1.16527.9952 2.9216169.99414 6.4355469.99414h5.8164061c3.5139 0 5.270247.00106 6.435547-.99414.1654-.1414.319637-.295538.460938-.460938.9952-1.1653.996093-2.9236.996093-6.4375 0-3.5139397-.000893-5.2702766-.996093-6.4355466-.1413-.16547-.295538-.3196075-.460938-.4609375-1.1551-.98649-2.89125-.9940706-6.34375-.9941407-.0015-.8110099-.021569-1.2364025-.292969-1.5078124-.2929-.29289-.764231-.2929688-1.707031-.2929688zm1 5.1230469c2.5235 0 4.568359 2.0448591 4.568359 4.5683591s-2.044859 4.570313-4.568359 4.570313-4.5683594-2.046813-4.5683594-4.570313 2.0448594-4.5683591 4.5683594-4.5683591zm6.646484 0c.4588 0 .830078.3712581.830078.8300781 0 .45883-.371278.8320312-.830078.8320312-.4589 0-.832031-.3732012-.832031-.8320312 0-.45882.373131-.8300781.832031-.8300781z';
-}
-
-lr-simple-btn button {
- background-color: $colour-success;
+.uppy-Dashboard-poweredBy {
+ display: none !important;
+}
+
+@charset "UTF-8";
+.uppy-Informer {
+ position: absolute;
+ right: 0;
+ bottom: 60px;
+ left: 0;
+ z-index: 1005;
+ text-align: center;
+}
+
+.uppy-Informer span > div {
+ margin-bottom: 6px;
+}
+
+.uppy-Informer-animated {
+ z-index: -1000;
+ transform: translateY(350%);
+ opacity: 0;
+ transition: all 300ms ease-in;
+}
+
+.uppy-Informer p {
+ display: inline-block;
+ max-width: 90%;
+ margin: 0;
+ padding: 0;
+ padding: 6px 15px;
+ color: #fff;
+ font-weight: 400;
+ font-size: 12px;
+ line-height: 1.4;
+ background-color: #757575;
+ border-radius: 18px;
+}
+
+.uppy-Informer p {
+ max-width: 500px;
+ padding: 10px 20px;
+ font-size: 14px;
+ line-height: 1.3;
+}
+
+[data-uppy-theme=dark] .uppy-Informer p {
+ background-color: #333;
+}
+
+[dir="ltr"] .uppy-Informer p span {
+ left: 3px;
+}
+
+[dir="rtl"] .uppy-Informer p span {
+ right: 3px;
+}
+
+[dir="ltr"] .uppy-Informer p span {
+ margin-left: -1px;
+}
+
+[dir="rtl"] .uppy-Informer p span {
+ margin-right: -1px;
+}
+
+.uppy-Informer p span {
+ position: relative;
+ top: -1px;
+ display: inline-block;
+ width: 13px;
+ height: 13px;
+ color: #525252;
+ font-size: 10px;
+ line-height: 12px;
+ vertical-align: middle;
+ background-color: #fff;
+ border-radius: 50%;
+}
+
+.uppy-Informer p span:hover {
+ cursor: help;
+}
+
+.uppy-Informer p span::after {
+ line-height: 1.3;
+ word-wrap: break-word;
+}
+
+/* -------------------------------------------------------------------
+ Microtip
+
+ Modern, lightweight css-only tooltips
+ Just 1kb minified and gzipped
+
+ @author Ghosh
+ @package Microtip
+
+----------------------------------------------------------------------
+ 1. Base Styles
+ 2. Direction Modifiers
+ 3. Position Modifiers
+-------------------------------------------------------------------- */
+/* ------------------------------------------------
+ [1] Base Styles
+------------------------------------------------- */
+.uppy-Root [aria-label][role~=tooltip] {
+ position: relative;
+}
+
+.uppy-Root [aria-label][role~=tooltip]::before,
+.uppy-Root [aria-label][role~=tooltip]::after {
+ position: absolute;
+ z-index: 10;
+ box-sizing: border-box;
+ transform: translate3d(0, 0, 0);
+ transform-origin: top;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ opacity: 0;
+ transition: all var(--microtip-transition-duration, 0.18s) var(--microtip-transition-easing, ease-in-out) var(--microtip-transition-delay, 0s);
+ pointer-events: none;
+ will-change: transform;
+}
+
+.uppy-Root [aria-label][role~=tooltip]::before {
+ background-size: 100% auto !important;
+ content: "";
+}
+
+.uppy-Root [aria-label][role~=tooltip]::after {
+ box-sizing: content-box;
+ padding: 0.5em 1em;
+ color: #fff;
+ font-weight: var(--microtip-font-weight, normal);
+ font-size: var(--microtip-font-size, 13px);
+ white-space: nowrap;
+ text-transform: var(--microtip-text-transform, none);
+ background: rgba(17, 17, 17, 0.9);
+ border-radius: 4px;
+ content: attr(aria-label);
+}
+
+.uppy-Root [aria-label][role~=tooltip]:hover::before,
+.uppy-Root [aria-label][role~=tooltip]:hover::after,
+.uppy-Root [aria-label][role~=tooltip]:focus::before,
+.uppy-Root [aria-label][role~=tooltip]:focus::after {
+ opacity: 1;
+ pointer-events: auto;
+}
+
+/* ------------------------------------------------
+ [2] Position Modifiers
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position|=top]::before {
+ bottom: 100%;
+ left: 50%;
+ width: 18px;
+ height: 6px;
+ margin-bottom: 5px;
+ background: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%280%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E") no-repeat;
+ transform: translate3d(-50%, 0, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position|=top]::after {
+ bottom: 100%;
+ left: 50%;
+ margin-bottom: 11px;
+ transform: translate3d(-50%, 0, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position|=top]:hover::before {
+ transform: translate3d(-50%, -5px, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=top]:hover::after {
+ transform: translate3d(-50%, -5px, 0);
+}
+
+/* ------------------------------------------------
+ [2.1] Top Left
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position=top-left]::after {
+ bottom: 100%;
+ transform: translate3d(calc(-100% + 16px), 0, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=top-left]:hover::after {
+ transform: translate3d(calc(-100% + 16px), -5px, 0);
+}
+
+/* ------------------------------------------------
+ [2.2] Top Right
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position=top-right]::after {
+ bottom: 100%;
+ transform: translate3d(calc(0% - 16px), 0, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=top-right]:hover::after {
+ transform: translate3d(calc(0% - 16px), -5px, 0);
+}
+
+/* ------------------------------------------------
+ [2.3] Bottom
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position|=bottom]::before {
+ top: 100%;
+ bottom: auto;
+ left: 50%;
+ width: 18px;
+ height: 6px;
+ margin-top: 5px;
+ margin-bottom: 0;
+ background: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28180%2018%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E") no-repeat;
+ transform: translate3d(-50%, -10px, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position|=bottom]::after {
+ top: 100%;
+ left: 50%;
+ margin-top: 11px;
+ transform: translate3d(-50%, -10px, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position|=bottom]:hover::before {
+ transform: translate3d(-50%, 0, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=bottom]:hover::after {
+ transform: translate3d(-50%, 0, 0);
+}
+
+/* ------------------------------------------------
+ [2.4] Bottom Left
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position=bottom-left]::after {
+ top: 100%;
+ transform: translate3d(calc(-100% + 16px), -10px, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=bottom-left]:hover::after {
+ transform: translate3d(calc(-100% + 16px), 0, 0);
+}
+
+/* ------------------------------------------------
+ [2.5] Bottom Right
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position=bottom-right]::after {
+ top: 100%;
+ transform: translate3d(calc(0% - 16px), -10px, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=bottom-right]:hover::after {
+ transform: translate3d(calc(0% - 16px), 0, 0);
+}
+
+/* ------------------------------------------------
+ [2.6] Left
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position=left]::before,
+.uppy-Root [role~=tooltip][data-microtip-position=left]::after {
+ top: 50%;
+ right: 100%;
+ bottom: auto;
+ left: auto;
+ transform: translate3d(10px, -50%, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=left]::before {
+ width: 6px;
+ height: 18px;
+ margin-right: 5px;
+ margin-bottom: 0;
+ background: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28-90%2018%2018%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E") no-repeat;
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=left]::after {
+ margin-right: 11px;
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=left]:hover::before,
+.uppy-Root [role~=tooltip][data-microtip-position=left]:hover::after {
+ transform: translate3d(0, -50%, 0);
+}
+
+/* ------------------------------------------------
+ [2.7] Right
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-position=right]::before,
+.uppy-Root [role~=tooltip][data-microtip-position=right]::after {
+ top: 50%;
+ bottom: auto;
+ left: 100%;
+ transform: translate3d(-10px, -50%, 0);
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=right]::before {
+ width: 6px;
+ height: 18px;
+ margin-bottom: 0;
+ margin-left: 5px;
+ background: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%2890%206%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E") no-repeat;
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=right]::after {
+ margin-left: 11px;
+}
+
+.uppy-Root [role~=tooltip][data-microtip-position=right]:hover::before,
+.uppy-Root [role~=tooltip][data-microtip-position=right]:hover::after {
+ transform: translate3d(0, -50%, 0);
+}
+
+/* ------------------------------------------------
+ [3] Size
+------------------------------------------------- */
+.uppy-Root [role~=tooltip][data-microtip-size=small]::after {
+ width: 80px;
+ white-space: initial;
+}
+
+.uppy-Root [role~=tooltip][data-microtip-size=medium]::after {
+ width: 150px;
+ white-space: initial;
+}
+
+.uppy-Root [role~=tooltip][data-microtip-size=large]::after {
+ width: 260px;
+ white-space: initial;
+}
+
+.uppy-StatusBar {
+ position: relative;
+ z-index: 1001;
+ display: flex;
+ height: 46px;
+ color: #fff;
+ font-weight: 400;
+ font-size: 12px;
+ line-height: 40px;
+ background-color: #fff;
+ transition: height 0.2s;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar {
+ background-color: #1f1f1f;
+}
+
+.uppy-StatusBar::before {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 2px;
+ background-color: #eaeaea;
+ content: "";
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar::before {
+ background-color: #757575;
+}
+
+.uppy-StatusBar[aria-hidden=true] {
+ height: 0;
+ overflow-y: hidden;
+}
+
+.uppy-StatusBar.is-complete .uppy-StatusBar-progress {
+ background-color: #1bb240;
+}
+
+.uppy-StatusBar.is-error .uppy-StatusBar-progress {
+ background-color: #e32437;
+}
+
+.uppy-StatusBar.is-complete .uppy-StatusBar-statusIndicator {
+ color: #1bb240;
+}
+
+.uppy-StatusBar.is-error .uppy-StatusBar-statusIndicator {
+ color: #e32437;
+}
+
+.uppy-StatusBar:not([aria-hidden=true]).is-waiting {
+ height: 65px;
+ background-color: #fff;
+ border-top: 1px solid #eaeaea;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar:not([aria-hidden=true]).is-waiting {
+ background-color: #1f1f1f;
+ border-top: 1px solid #333;
+}
+
+.uppy-StatusBar-progress {
+ position: absolute;
+ z-index: 1001;
+ height: 2px;
+ background-color: #1269cf;
+ transition: background-color, width 0.3s ease-out;
+}
+
+.uppy-StatusBar-progress.is-indeterminate {
+ background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.3) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.3) 50%, rgba(0, 0, 0, 0.3) 75%, transparent 75%, transparent);
+ background-size: 64px 64px;
+ animation: uppy-StatusBar-ProgressStripes 1s linear infinite;
+}
+
+@keyframes uppy-StatusBar-ProgressStripes {
+ from {
+ background-position: 0 0;
+ }
+ to {
+ background-position: 64px 0;
+ }
+}
+
+.uppy-StatusBar.is-preprocessing .uppy-StatusBar-progress,
+.uppy-StatusBar.is-postprocessing .uppy-StatusBar-progress {
+ background-color: #f6a623;
+}
+
+.uppy-StatusBar.is-waiting .uppy-StatusBar-progress {
+ display: none;
+}
+
+[dir="ltr"] .uppy-StatusBar-content {
+ padding-left: 10px;
+}
+
+[dir="rtl"] .uppy-StatusBar-content {
+ padding-right: 10px;
+}
+
+.uppy-StatusBar-content {
+ position: relative;
+ z-index: 1002;
+ display: flex;
+ align-items: center;
+ height: 100%;
+ color: #333;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+[dir="ltr"] .uppy-StatusBar-content {
+ padding-left: 15px;
+}
+
+[dir="rtl"] .uppy-StatusBar-content {
+ padding-right: 15px;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-content {
+ color: #eaeaea;
+}
+
+[dir="ltr"] .uppy-StatusBar-status {
+ padding-right: 0.3em;
+}
+
+[dir="rtl"] .uppy-StatusBar-status {
+ padding-left: 0.3em;
+}
+
+.uppy-StatusBar-status {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ font-weight: normal;
+ line-height: 1.4;
+}
+
+.uppy-StatusBar-statusPrimary {
+ font-weight: 500;
+ line-height: 1;
+ display: flex;
+}
+
+.uppy-StatusBar-statusPrimary button.uppy-StatusBar-details {
+ margin-left: 5px;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-statusPrimary {
+ color: #eaeaea;
+}
+
+.uppy-StatusBar-statusSecondary {
+ display: inline-block;
+ margin-top: 1px;
+ color: #757575;
+ font-size: 11px;
+ line-height: 1.2;
+ white-space: nowrap;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-statusSecondary {
+ color: #bbb;
+}
+
+[dir="ltr"] .uppy-StatusBar-statusSecondaryHint {
+ margin-right: 5px;
+}
+
+[dir="rtl"] .uppy-StatusBar-statusSecondaryHint {
+ margin-left: 5px;
+}
+
+.uppy-StatusBar-statusSecondaryHint {
+ display: inline-block;
+ line-height: 1;
+ vertical-align: middle;
+}
+
+[dir="ltr"] .uppy-StatusBar-statusSecondaryHint {
+ margin-right: 8px;
+}
+
+[dir="rtl"] .uppy-StatusBar-statusSecondaryHint {
+ margin-left: 8px;
+}
+
+[dir="ltr"] .uppy-StatusBar-statusIndicator {
+ margin-right: 7px;
+}
+
+[dir="rtl"] .uppy-StatusBar-statusIndicator {
+ margin-left: 7px;
+}
+
+.uppy-StatusBar-statusIndicator {
+ position: relative;
+ top: 1px;
+ color: #525252;
+}
+
+.uppy-StatusBar-statusIndicator svg {
+ vertical-align: text-bottom;
+}
+
+[dir="ltr"] .uppy-StatusBar-actions {
+ right: 10px;
+}
+
+[dir="rtl"] .uppy-StatusBar-actions {
+ left: 10px;
+}
+
+.uppy-StatusBar-actions {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1004;
+ display: flex;
+ align-items: center;
+}
+
+.uppy-StatusBar.is-waiting .uppy-StatusBar-actions {
+ position: static;
+ width: 100%;
+ height: 100%;
+ padding: 0 15px;
+ background-color: #fafafa;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar.is-waiting .uppy-StatusBar-actions {
+ background-color: #1f1f1f;
+}
+
+.uppy-StatusBar:not([aria-hidden=true]).is-waiting.has-ghosts {
+ flex-direction: column;
+ height: 90px;
+}
+
+.uppy-StatusBar:not([aria-hidden=true]).is-waiting.has-ghosts {
+ flex-direction: row;
+ height: 65px;
+}
+
+.uppy-StatusBar:not([aria-hidden=true]).is-waiting.has-ghosts .uppy-StatusBar-actions {
+ flex-direction: column;
+ justify-content: center;
+}
+
+.uppy-StatusBar:not([aria-hidden=true]).is-waiting.has-ghosts .uppy-StatusBar-actions {
+ flex-direction: row;
+ justify-content: initial;
+}
+
+.uppy-StatusBar-actionCircleBtn {
+ margin: 3px;
+ line-height: 1;
+ cursor: pointer;
+ opacity: 0.9;
+}
+
+.uppy-StatusBar-actionCircleBtn:focus {
+ outline: none;
+}
+
+.uppy-StatusBar-actionCircleBtn::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-StatusBar-actionCircleBtn:focus {
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.5);
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionCircleBtn:focus {
+ outline: none;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionCircleBtn::-moz-focus-inner {
+ border: 0;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionCircleBtn:focus {
+ box-shadow: 0 0 0 2px rgba(170, 225, 255, 0.85);
+}
+
+.uppy-StatusBar-actionCircleBtn:hover {
+ opacity: 1;
+}
+
+.uppy-StatusBar-actionCircleBtn:focus {
+ border-radius: 50%;
+}
+
+.uppy-StatusBar-actionCircleBtn svg {
+ vertical-align: bottom;
+}
+
+.uppy-StatusBar-actionBtn {
+ display: inline-block;
+ color: #1269cf;
+ font-size: 10px;
+ line-height: inherit;
+ vertical-align: middle;
+}
+
+.uppy-StatusBar-actionBtn {
+ font-size: 11px;
+}
+
+.uppy-StatusBar-actionBtn--disabled {
+ opacity: 0.4;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--disabled {
+ opacity: 0.7;
+}
+
+[dir="ltr"] .uppy-StatusBar-actionBtn--retry {
+ margin-right: 6px;
+}
+
+[dir="rtl"] .uppy-StatusBar-actionBtn--retry {
+ margin-left: 6px;
+}
+
+.uppy-StatusBar-actionBtn--retry {
+ position: relative;
+ height: 16px;
+ padding: 1px 6px 3px 18px;
+ color: #fff;
+ line-height: 1;
+ background-color: #ff4b23;
+ border-radius: 8px;
+}
+
+.uppy-StatusBar-actionBtn--retry:focus {
+ outline: none;
+}
+
+.uppy-StatusBar-actionBtn--retry::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-StatusBar-actionBtn--retry:focus {
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.5);
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--retry:focus {
+ outline: none;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--retry::-moz-focus-inner {
+ border: 0;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--retry:focus {
+ box-shadow: 0 0 0 2px rgba(170, 225, 255, 0.85);
+}
+
+.uppy-StatusBar-actionBtn--retry:hover {
+ background-color: #f92d00;
+}
+
+[dir="ltr"] .uppy-StatusBar-actionBtn--retry svg {
+ left: 6px;
+}
+
+[dir="rtl"] .uppy-StatusBar-actionBtn--retry svg {
+ right: 6px;
+}
+
+.uppy-StatusBar-actionBtn--retry svg {
+ position: absolute;
+ top: 3px;
+}
+
+.uppy-StatusBar.is-waiting .uppy-StatusBar-actionBtn--upload {
+ width: 100%;
+ padding: 15px 10px;
+ color: #fff;
+ font-size: 14px;
+ line-height: 1;
+ background-color: #1bb240;
+}
+
+.uppy-StatusBar.is-waiting .uppy-StatusBar-actionBtn--upload:hover {
+ background-color: #189c38;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar.is-waiting .uppy-StatusBar-actionBtn--upload {
+ background-color: #1c8b37;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar.is-waiting .uppy-StatusBar-actionBtn--upload:hover {
+ background-color: #18762f;
+}
+
+.uppy-StatusBar.is-waiting .uppy-StatusBar-actionBtn--upload {
+ width: auto;
+ padding: 13px 22px;
+}
+
+.uppy-StatusBar.is-waiting .uppy-StatusBar-actionBtn--upload.uppy-StatusBar-actionBtn--disabled:hover {
+ background-color: #1bb240;
+ cursor: not-allowed;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar.is-waiting .uppy-StatusBar-actionBtn--upload.uppy-StatusBar-actionBtn--disabled:hover {
+ background-color: #1c8b37;
+}
+
+.uppy-StatusBar:not(.is-waiting) .uppy-StatusBar-actionBtn--upload {
+ color: #1269cf;
+ background-color: transparent;
+}
+
+[dir="ltr"] .uppy-StatusBar-actionBtn--uploadNewlyAdded {
+ padding-right: 3px;
+}
+
+[dir="rtl"] .uppy-StatusBar-actionBtn--uploadNewlyAdded {
+ padding-left: 3px;
+}
+
+[dir="ltr"] .uppy-StatusBar-actionBtn--uploadNewlyAdded {
+ padding-left: 3px;
+}
+
+[dir="rtl"] .uppy-StatusBar-actionBtn--uploadNewlyAdded {
+ padding-right: 3px;
+}
+
+.uppy-StatusBar-actionBtn--uploadNewlyAdded {
+ padding-bottom: 1px;
+ border-radius: 3px;
+}
+
+.uppy-StatusBar-actionBtn--uploadNewlyAdded:focus {
+ outline: none;
+}
+
+.uppy-StatusBar-actionBtn--uploadNewlyAdded::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-StatusBar-actionBtn--uploadNewlyAdded:focus {
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.5);
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--uploadNewlyAdded:focus {
+ outline: none;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--uploadNewlyAdded::-moz-focus-inner {
+ border: 0;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--uploadNewlyAdded:focus {
+ box-shadow: 0 0 0 2px rgba(170, 225, 255, 0.85);
+}
+
+.uppy-StatusBar.is-preprocessing .uppy-StatusBar-actionBtn--uploadNewlyAdded, .uppy-StatusBar.is-postprocessing .uppy-StatusBar-actionBtn--uploadNewlyAdded {
+ display: none;
+}
+
+.uppy-StatusBar-actionBtn--done {
+ padding: 7px 8px;
+ line-height: 1;
+ border-radius: 3px;
+}
+
+.uppy-StatusBar-actionBtn--done:focus {
+ outline: none;
+}
+
+.uppy-StatusBar-actionBtn--done::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-StatusBar-actionBtn--done:hover {
+ color: #0e51a0;
+}
+
+.uppy-StatusBar-actionBtn--done:focus {
+ background-color: #dfe6f1;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--done:focus {
+ background-color: #333;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-actionBtn--done {
+ color: #02baf2;
+}
+
+.uppy-StatusBar-actionBtn--done {
+ font-size: 14px;
+}
+
+.uppy-StatusBar-serviceMsg {
+ padding-left: 10px;
+ color: #000;
+ font-size: 11px;
+ line-height: 1.1;
+}
+
+.uppy-StatusBar-serviceMsg {
+ padding-left: 15px;
+ font-size: 14px;
+}
+
+[data-uppy-theme=dark] .uppy-StatusBar-serviceMsg {
+ color: #eaeaea;
+}
+
+.uppy-StatusBar-serviceMsg-ghostsIcon {
+ position: relative;
+ top: 2px;
+ left: 6px;
+ width: 10px;
+ vertical-align: text-bottom;
+ opacity: 0.5;
+}
+
+.uppy-StatusBar-serviceMsg-ghostsIcon {
+ top: 1px;
+ left: 10px;
+ width: 15px;
+}
+
+[dir="ltr"] .uppy-StatusBar-details {
+ left: 2px;
+}
+
+[dir="rtl"] .uppy-StatusBar-details {
+ right: 2px;
+}
+
+.uppy-StatusBar-details {
+ position: relative;
+ top: 0;
+ display: inline-block;
+ width: 13px;
+ height: 13px;
+ color: #fff;
+ font-weight: 600;
+ font-size: 10px;
+ line-height: 12px;
+ text-align: center;
+ vertical-align: middle;
+ background-color: #939393;
+ border-radius: 50%;
+ cursor: help;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+.uppy-StatusBar-details::after {
+ line-height: 1.3;
+ word-wrap: break-word;
+}
+
+[dir="ltr"] .uppy-StatusBar-spinner {
+ margin-right: 10px;
+}
+
+[dir="rtl"] .uppy-StatusBar-spinner {
+ margin-left: 10px;
+}
+
+.uppy-StatusBar-spinner {
+ animation-name: uppy-StatusBar-spinnerAnimation;
+ animation-duration: 1s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ fill: #1269cf;
+}
+
+.uppy-StatusBar.is-preprocessing .uppy-StatusBar-spinner,
+.uppy-StatusBar.is-postprocessing .uppy-StatusBar-spinner {
+ fill: #f6a623;
+}
+
+@keyframes uppy-StatusBar-spinnerAnimation {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+.uppy-ProviderBrowser-viewType--grid ul.uppy-ProviderBrowser-list,
+.uppy-ProviderBrowser-viewType--unsplash ul.uppy-ProviderBrowser-list {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: flex-start;
+ justify-content: space-between;
+ padding: 6px;
+}
+
+.uppy-ProviderBrowser-viewType--grid ul.uppy-ProviderBrowser-list::after,
+.uppy-ProviderBrowser-viewType--unsplash ul.uppy-ProviderBrowser-list::after {
+ flex: auto;
+ content: "";
+}
+
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem {
+ position: relative;
+ width: 50%;
+ margin: 0;
+}
+
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem {
+ width: 33.3333%;
+}
+
+.uppy-size--lg .uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem,
+.uppy-size--lg .uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem {
+ width: 25%;
+}
+
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem::before,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem::before {
+ display: block;
+ padding-top: 100%;
+ content: "";
+}
+
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem--selected img,
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem--selected svg,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem--selected img,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem--selected svg {
+ opacity: 0.85;
+}
+
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem--disabled,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem--disabled {
+ opacity: 0.5;
+}
+
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem--noPreview .uppy-ProviderBrowserItem-inner,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem--noPreview .uppy-ProviderBrowserItem-inner {
+ background-color: rgba(147, 147, 147, 0.2);
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem--noPreview .uppy-ProviderBrowserItem-inner,
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem--noPreview .uppy-ProviderBrowserItem-inner {
+ background-color: rgba(234, 234, 234, 0.2);
+}
+
+.uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem--noPreview svg,
+.uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem--noPreview svg {
+ width: 30%;
+ height: 30%;
+ fill: rgba(0, 0, 0, 0.7);
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--grid li.uppy-ProviderBrowserItem--noPreview svg,
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--unsplash li.uppy-ProviderBrowserItem--noPreview svg {
+ fill: rgba(255, 255, 255, 0.8);
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-inner,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-inner {
+ position: absolute;
+ top: 7px;
+ right: 7px;
+ bottom: 7px;
+ left: 7px;
+ width: calc(100% - 14px);
+ height: calc(100% - 14px);
+ overflow: hidden;
+ text-align: center;
+ border-radius: 4px;
+}
+
+@media (hover: none) {
+ .uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-inner .uppy-ProviderBrowserItem-author,
+ .uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-inner .uppy-ProviderBrowserItem-author {
+ display: block;
+ }
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-inner,
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-inner {
+ box-shadow: 0 0 0 3px rgba(170, 225, 255, 0.7);
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-inner img,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-inner img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 4px;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-author,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-author {
+ position: absolute;
+ display: none;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ background: rgba(0, 0, 0, 0.3);
color: white;
- /*font-size: v-bind('fontSize');*/
+ font-weight: 500;
+ font-size: 12px;
+ margin: 0;
+ padding: 5px;
+ text-decoration: none;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-author:hover,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-author:hover {
+ background: rgba(0, 0, 0, 0.4);
+ text-decoration: underline;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ z-index: 1002;
+ width: 26px;
+ height: 26px;
+ background-color: #1269cf;
+ border-radius: 50%;
+ opacity: 0;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox::after, [dir="ltr"]
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox::after {
+ left: 7px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox::after, [dir="rtl"]
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox::after {
+ right: 7px;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox::after,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox::after {
+ top: 8px;
+ width: 12px;
+ height: 7px;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem--is-checked .uppy-ProviderBrowserItem-checkbox,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem--is-checked .uppy-ProviderBrowserItem-checkbox {
+ opacity: 1;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox--grid:hover + label .uppy-ProviderBrowserItem-author,
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox--grid:focus + label .uppy-ProviderBrowserItem-author,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox--grid:hover + label .uppy-ProviderBrowserItem-author,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox--grid:focus + label .uppy-ProviderBrowserItem-author {
+ display: block;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox--grid:focus + label,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox--grid:focus + label {
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.5);
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox--grid:focus + label:focus,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox--grid:focus + label:focus {
+ outline: none;
+}
+
+.uppy-ProviderBrowser-viewType--grid .uppy-ProviderBrowserItem-checkbox--grid:focus + label::-moz-focus-inner,
+.uppy-ProviderBrowser-viewType--unsplash .uppy-ProviderBrowserItem-checkbox--grid:focus + label::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-ProviderBrowser-viewType--list {
+ background-color: #fff;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--list {
+ background-color: #1f1f1f;
+}
+
+.uppy-ProviderBrowser-viewType--list li.uppy-ProviderBrowserItem {
+ display: flex;
+ align-items: center;
+ margin: 0;
+ padding: 7px 15px;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--list li.uppy-ProviderBrowserItem {
+ color: #eaeaea;
+}
+
+.uppy-ProviderBrowser-viewType--list li.uppy-ProviderBrowserItem--disabled {
+ opacity: 0.6;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox {
+ margin-right: 15px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox {
+ margin-left: 15px;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox {
+ width: 17px;
+ height: 17px;
+ background-color: #fff;
+ border: 1px solid #cfcfcf;
+ border-radius: 3px;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox:focus {
+ border: 1px solid #1269cf;
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.25);
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox::after {
+ left: 3px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox::after {
+ right: 3px;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox::after {
+ top: 4px;
+ width: 9px;
+ height: 5px;
+ opacity: 0;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-checkbox:focus {
+ border-color: rgba(2, 186, 242, 0.7);
+ box-shadow: 0 0 0 3px rgba(2, 186, 242, 0.2);
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem--is-checked .uppy-ProviderBrowserItem-checkbox,
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem--is-partial .uppy-ProviderBrowserItem-checkbox {
+ background-color: #1269cf;
+ border-color: #1269cf;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem--is-checked .uppy-ProviderBrowserItem-checkbox::after,
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem--is-partial .uppy-ProviderBrowserItem-checkbox::after {
+ opacity: 1;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-inner {
+ display: flex;
+ align-items: center;
+ color: inherit;
+ font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Segoe UI Symbol", "Segoe UI Emoji", "Apple Color Emoji", Roboto, Helvetica, Arial, sans-serif;
+ padding: 2px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-inner:focus {
+ text-decoration: underline;
+ outline: none;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-inner img, [dir="ltr"]
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-inner svg {
+ margin-right: 8px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-inner img, [dir="rtl"]
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-inner svg {
+ margin-left: 8px;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-inner span {
+ overflow: hidden;
+ line-height: 1.2;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem--disabled .uppy-ProviderBrowserItem-inner {
+ cursor: default;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-iconWrap {
+ margin-right: 7px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-iconWrap {
+ margin-left: 7px;
+}
+
+.uppy-ProviderBrowser-viewType--list .uppy-ProviderBrowserItem-iconWrap {
+ width: 20px;
+}
+
+.uppy-ProviderBrowserItem-checkbox {
+ position: relative;
+ flex-shrink: 0;
+ cursor: pointer;
+}
+
+.uppy-ProviderBrowserItem-checkbox:disabled {
+ cursor: default;
+}
+
+.uppy-ProviderBrowserItem-checkbox:disabled::after {
+ cursor: default;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowserItem-checkbox {
+ background-color: #1f1f1f;
+ border-color: #939393;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowserItem--is-checked .uppy-ProviderBrowserItem-checkbox {
+ background-color: #333;
+}
+
+.uppy-ProviderBrowserItem--is-checked .uppy-ProviderBrowserItem-checkbox::after {
+ position: absolute;
+ border-bottom: 2px solid #eaeaea;
+ border-left: 2px solid #eaeaea;
+ transform: rotate(-45deg);
+ cursor: pointer;
+ content: "";
+}
+
+.uppy-ProviderBrowserItem--is-partial .uppy-ProviderBrowserItem-checkbox::after {
+ content: "" !important;
+ position: absolute !important;
+ top: 50% !important;
+ left: 20% !important;
+ right: 20% !important;
+ height: 2px !important;
+ background-color: #eaeaea !important;
+ transform: translateY(-50%) !important;
+}
+
+.uppy-SearchProvider {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+}
+
+[data-uppy-theme=dark] .uppy-SearchProvider {
+ background-color: #1f1f1f;
+}
+
+.uppy-SearchProvider-input {
+ width: 90%;
+ max-width: 650px;
+ margin-bottom: 15px;
+}
+
+.uppy-SearchProvider-input {
+ margin-bottom: 20px;
+}
+
+.uppy-SearchProvider-input::-webkit-search-cancel-button {
+ display: none;
+}
+
+.uppy-SearchProvider-searchButton {
+ padding: 13px 25px;
+}
+
+.uppy-SearchProvider-searchButton {
+ padding: 13px 30px;
+}
+
+.uppy-DashboardContent-panelBody {
+ display: flex;
+ flex: 1;
+ align-items: center;
+ justify-content: center;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardContent-panelBody {
+ background-color: #1f1f1f;
+}
+
+.uppy-Provider-auth,
+.uppy-Provider-error,
+.uppy-Provider-loading,
+.uppy-Provider-empty {
+ display: flex;
+ flex: 1;
+ flex-flow: column wrap;
+ align-items: center;
+ justify-content: center;
+ color: #939393;
+}
+
+.uppy-Provider-empty {
+ color: #939393;
+}
+
+.uppy-Provider-authIcon svg {
+ width: 100px;
+ height: 75px;
+}
+
+.uppy-Provider-authTitle {
+ max-width: 500px;
+ margin-bottom: 30px;
+ padding: 0 15px;
+ color: #757575;
+ font-weight: 400;
+ font-size: 17px;
+ line-height: 1.4;
+ text-align: center;
+}
+
+.uppy-Provider-authTitle {
+ font-size: 20px;
+}
+
+[data-uppy-theme=dark] .uppy-Provider-authTitle {
+ color: #cfcfcf;
+}
+
+.uppy-Provider-btn-google {
+ display: flex;
+ align-items: center;
+ padding: 8px 12px !important;
+ background: #4285f4;
+}
+
+.uppy-Provider-btn-google:hover {
+ background-color: #1266f1;
+}
+
+.uppy-Provider-btn-google:focus {
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(66, 133, 244, 0.4);
+}
+
+.uppy-Provider-btn-google svg {
+ margin-right: 8px;
+}
+
+[dir="ltr"] .uppy-Provider-breadcrumbs {
+ text-align: left;
+}
+
+[dir="rtl"] .uppy-Provider-breadcrumbs {
+ text-align: right;
+}
+
+.uppy-Provider-breadcrumbs {
+ flex: 1;
+ margin-bottom: 10px;
+ color: #525252;
+ font-size: 12px;
+}
+
+.uppy-Provider-breadcrumbs {
+ margin-bottom: 0;
+}
+
+[data-uppy-theme=dark] .uppy-Provider-breadcrumbs {
+ color: #eaeaea;
+}
+
+[dir="ltr"] .uppy-Provider-breadcrumbsIcon {
+ margin-right: 4px;
+}
+
+[dir="rtl"] .uppy-Provider-breadcrumbsIcon {
+ margin-left: 4px;
+}
+
+.uppy-Provider-breadcrumbsIcon {
+ display: inline-block;
+ color: #525252;
+ line-height: 1;
+ vertical-align: middle;
+}
+
+.uppy-Provider-breadcrumbsIcon svg {
+ width: 13px;
+ height: 13px;
+ fill: #525252;
+}
+
+.uppy-Provider-breadcrumbs button {
+ display: inline-block;
+ padding: 4px;
+ line-height: inherit;
+ border-radius: 3px;
+}
+
+.uppy-Provider-breadcrumbs button:focus {
+ outline: none;
+}
+
+.uppy-Provider-breadcrumbs button::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-Provider-breadcrumbs button:hover {
+ color: #0e51a0;
+}
+
+.uppy-Provider-breadcrumbs button:focus {
+ background-color: #dfe6f1;
+}
+
+[data-uppy-theme=dark] .uppy-Provider-breadcrumbs button:focus {
+ background-color: #333;
+}
+
+.uppy-Provider-breadcrumbs button:not(:last-of-type) {
+ text-decoration: underline;
+}
+
+.uppy-Provider-breadcrumbs button:last-of-type {
+ color: #333;
+ font-weight: 500;
+ cursor: normal;
+ pointer-events: none;
+}
+
+.uppy-Provider-breadcrumbs button:hover {
+ cursor: pointer;
+}
+
+[data-uppy-theme=dark] .uppy-Provider-breadcrumbs button {
+ color: #eaeaea;
+}
+
+.uppy-ProviderBrowser {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ height: 100%;
+ font-weight: 400;
+ font-size: 14px;
+}
+
+.uppy-ProviderBrowser-user {
+ margin: 0 8px 0 0;
+ color: #333;
+ font-weight: 500;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-user {
+ color: #eaeaea;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-user::after {
+ left: 4px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-user::after {
+ right: 4px;
+}
+
+.uppy-ProviderBrowser-user::after {
+ position: relative;
+ color: #939393;
+ font-weight: normal;
+ content: "·";
+}
+
+.uppy-ProviderBrowser-header {
+ position: relative;
+ z-index: 1001;
+ border-bottom: 1px solid #eaeaea;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-header {
+ border-bottom: 1px solid #333;
+}
+
+.uppy-ProviderBrowser-headerBar {
+ z-index: 1001;
+ padding: 7px 15px;
+ color: #757575;
+ font-size: 12px;
+ line-height: 1.4;
+ background-color: #fafafa;
+}
+
+.uppy-ProviderBrowser-headerBar {
+ display: flex;
+ align-items: center;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-headerBar {
+ background-color: #1f1f1f;
+}
+
+.uppy-ProviderBrowser-headerBar--simple {
+ display: block;
+ justify-content: center;
+ text-align: center;
+}
+
+.uppy-ProviderBrowser-headerBar--simple .uppy-Provider-breadcrumbsWrap {
+ display: inline-block;
+ flex: none;
+ vertical-align: middle;
+}
+
+.uppy-ProviderBrowser-searchFilter {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: 30px;
+ padding-left: 8px;
+ padding-right: 8px;
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-searchFilterInput {
+ padding-left: 30px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-searchFilterInput {
+ padding-right: 30px;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-searchFilterInput {
+ padding-right: 30px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-searchFilterInput {
+ padding-left: 30px;
+}
+
+.uppy-ProviderBrowser-searchFilterInput {
+ z-index: 1001;
+ width: 100%;
+ height: 30px;
+ font-size: 13px;
+ font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Segoe UI Symbol", "Segoe UI Emoji", "Apple Color Emoji", Roboto, Helvetica, Arial, sans-serif;
+ line-height: 1.4;
+ background-color: #eaeaea;
+ border: 0;
+ border-radius: 4px;
+ outline: 0;
+ color: #333;
+}
+
+.uppy-ProviderBrowser-searchFilterInput::-webkit-search-cancel-button {
+ display: none;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-searchFilterInput {
+ color: #eaeaea;
+ background-color: #1f1f1f;
+}
+
+.uppy-ProviderBrowser-searchFilterInput:focus {
+ background-color: #cfcfcf;
+ border: 0;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-searchFilterInput:focus {
+ background-color: #333;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-searchFilterIcon {
+ left: 16px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-searchFilterIcon {
+ right: 16px;
+}
+
+.uppy-ProviderBrowser-searchFilterIcon {
+ position: absolute;
+ z-index: 1002;
+ width: 12px;
+ height: 12px;
+ color: #757575;
+}
+
+.uppy-ProviderBrowser-searchFilterInput::placeholder {
+ color: #939393;
+ opacity: 1;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-searchFilterReset {
+ right: 16px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-searchFilterReset {
+ left: 16px;
+}
+
+.uppy-ProviderBrowser-searchFilterReset {
+ border-radius: 3px;
+ position: absolute;
+ z-index: 1002;
+ width: 22px;
+ height: 22px;
+ padding: 6px;
+ color: #939393;
+ cursor: pointer;
+}
+
+.uppy-ProviderBrowser-searchFilterReset:focus {
+ outline: none;
+}
+
+.uppy-ProviderBrowser-searchFilterReset::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-ProviderBrowser-searchFilterReset:focus {
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.5);
+}
+
+.uppy-ProviderBrowser-searchFilterReset:hover {
+ color: #757575;
+}
+
+.uppy-ProviderBrowser-searchFilterReset svg {
+ vertical-align: text-top;
+}
+
+.uppy-ProviderBrowser-userLogout {
+ padding: 4px;
+ color: #1269cf;
+ line-height: inherit;
+ border-radius: 3px;
+ cursor: pointer;
+}
+
+.uppy-ProviderBrowser-userLogout:focus {
+ outline: none;
+}
+
+.uppy-ProviderBrowser-userLogout::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-ProviderBrowser-userLogout:hover {
+ color: #0e51a0;
+}
+
+.uppy-ProviderBrowser-userLogout:focus {
+ background-color: #dfe6f1;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-userLogout:focus {
+ background-color: #333;
+}
+
+.uppy-ProviderBrowser-userLogout:hover {
+ text-decoration: underline;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-userLogout {
+ color: #eaeaea;
+}
+
+.uppy-ProviderBrowser-body {
+ position: relative;
+ flex: 1;
+}
+
+.uppy-ProviderBrowser-list {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: block;
+ flex: 1;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ list-style: none;
+ background-color: #fff;
+ border-spacing: 0;
+ -webkit-overflow-scrolling: touch;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-list {
+ background-color: #1f1f1f;
+}
+
+.uppy-ProviderBrowser-list:focus {
+ outline: none;
+}
+
+.uppy-ProviderBrowserItem-inner {
+ font-weight: 500;
+ font-size: 13px;
+ cursor: pointer;
+}
+
+.uppy-ProviderBrowser-footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 15px;
+ background-color: #fff;
+ border-top: 1px solid #eaeaea;
+}
+
+[dir="ltr"] .uppy-ProviderBrowser-footer button {
+ margin-right: 8px;
+}
+
+[dir="rtl"] .uppy-ProviderBrowser-footer button {
+ margin-left: 8px;
+}
+
+[data-uppy-theme=dark] .uppy-ProviderBrowser-footer {
+ background-color: #1f1f1f;
+ border-top: 1px solid #333;
+}
+
+.uppy-ProviderBrowser-footer-buttons {
+ flex-shrink: 0;
+}
+
+.uppy-ProviderBrowser-footer-error {
+ color: #e32437;
+ line-height: 18px;
+}
+
+@media (max-width: 426px) {
+ .uppy-ProviderBrowser-footer {
+ flex-direction: column-reverse;
+ align-items: stretch;
+ }
+ .uppy-ProviderBrowser-footer-error {
+ padding-bottom: 10px;
+ }
+}
+
+.uppy-Dashboard-Item-previewInnerWrap {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ border-radius: 3px;
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.4);
+}
+
+.uppy-Dashboard-Item-previewInnerWrap {
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-previewInnerWrap {
+ box-shadow: none;
+}
+
+.uppy-Dashboard-Item-previewInnerWrap::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1001;
+ display: none;
+ background-color: rgba(0, 0, 0, 0.65);
+ content: "";
+}
+
+.uppy-Dashboard-Item-previewLink {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1002;
+}
+
+.uppy-Dashboard-Item-previewLink:focus {
+ box-shadow: inset 0 0 0 3px #579df0;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-previewLink:focus {
+ box-shadow: inset 0 0 0 3px #016c8d;
+}
+
+.uppy-Dashboard-Item-preview img.uppy-Dashboard-Item-previewImg {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 3px;
+ transform: translateZ(0);
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-preview img.uppy-Dashboard-Item-previewImg {
+ object-fit: contain;
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ max-height: 100%;
+ padding: 10px;
+}
+
+.uppy-Dashboard-Item-progress {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 1002;
+ width: 120px;
+ color: #fff;
+ text-align: center;
+ transform: translate(-50%, -50%);
+ transition: all 0.35 ease;
+}
+
+.uppy-Dashboard-Item-progressIndicator {
+ display: inline-block;
+ width: 38px;
+ height: 38px;
+ opacity: 0.9;
+ color: #fff;
+}
+
+.uppy-Dashboard-Item-progressIndicator {
+ width: 55px;
+ height: 55px;
+}
+
+button.uppy-Dashboard-Item-progressIndicator {
+ cursor: pointer;
+}
+
+button.uppy-Dashboard-Item-progressIndicator:focus {
+ outline: none;
+}
+
+button.uppy-Dashboard-Item-progressIndicator::-moz-focus-inner {
+ border: 0;
+}
+
+button.uppy-Dashboard-Item-progressIndicator:focus .uppy-Dashboard-Item-progressIcon--bg,
+button.uppy-Dashboard-Item-progressIndicator:focus .uppy-Dashboard-Item-progressIcon--retry {
+ fill: #579df0;
+}
+
+.uppy-Dashboard-Item-progressIcon--circle {
+ width: 100%;
+ height: 100%;
+}
+
+.uppy-Dashboard-Item-progressIcon--bg {
+ stroke: rgba(255, 255, 255, 0.4);
+}
+
+.uppy-Dashboard-Item-progressIcon--progress {
+ transition: stroke-dashoffset 0.5s ease-out;
+ stroke: #fff;
+}
+
+.uppy-Dashboard-Item-progressIcon--play {
+ transition: all 0.2s;
+ fill: #fff;
+ stroke: #fff;
+}
+
+.uppy-Dashboard-Item-progressIcon--cancel {
+ transition: all 0.2s;
+ fill: #fff;
+}
+
+.uppy-Dashboard-Item-progressIcon--pause {
+ transition: all 0.2s;
+ fill: #fff;
+ stroke: #fff;
+}
+
+.uppy-Dashboard-Item-progressIcon--check {
+ transition: all 0.2s;
+ fill: #fff;
+}
+
+.uppy-Dashboard-Item-progressIcon--retry {
+ fill: #fff;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item.is-complete .uppy-Dashboard-Item-progress {
+ right: -8px;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item.is-complete .uppy-Dashboard-Item-progress {
+ left: -8px;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item.is-complete .uppy-Dashboard-Item-progress {
+ left: initial;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item.is-complete .uppy-Dashboard-Item-progress {
+ right: initial;
+}
+
+.uppy-Dashboard-Item.is-complete .uppy-Dashboard-Item-progress {
+ top: -9px;
+ width: auto;
+ transform: initial;
+}
+
+.uppy-Dashboard-Item.is-error .uppy-Dashboard-Item-progressIndicator {
+ width: 18px;
+ height: 18px;
+}
+
+.uppy-Dashboard-Item.is-error .uppy-Dashboard-Item-progressIndicator {
+ width: 28px;
+ height: 28px;
+}
+
+.uppy-Dashboard-Item.is-complete .uppy-Dashboard-Item-progressIndicator {
+ width: 18px;
+ height: 18px;
+ opacity: 1;
+}
+
+.uppy-Dashboard-Item.is-complete .uppy-Dashboard-Item-progressIndicator {
+ width: 22px;
+ height: 22px;
+}
+
+.uppy-Dashboard-Item.is-processing .uppy-Dashboard-Item-progress {
+ opacity: 0;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item-fileInfo {
+ padding-right: 5px;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item-fileInfo {
+ padding-left: 5px;
+}
+
+[dir="ltr"] .uppy-Dashboard--singleFile .uppy-Dashboard-Item-fileInfo {
+ padding-right: 10px;
+}
+
+[dir="rtl"] .uppy-Dashboard--singleFile .uppy-Dashboard-Item-fileInfo {
+ padding-left: 10px;
+}
+
+[dir="ltr"] .uppy-Dashboard--singleFile .uppy-Dashboard-Item-fileInfo {
+ padding-right: 15px;
+}
+
+[dir="rtl"] .uppy-Dashboard--singleFile .uppy-Dashboard-Item-fileInfo {
+ padding-left: 15px;
+}
+
+.uppy-Dashboard-Item-name {
+ margin-bottom: 5px;
+ font-weight: 500;
+ font-size: 12px;
+ line-height: 1.3;
+ word-wrap: anywhere;
+ word-break: break-all;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-name {
+ color: #eaeaea;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-name {
+ font-size: 14px;
+ line-height: 1.4;
+}
+
+.uppy-Dashboard-Item-fileName {
+ display: flex;
+ align-items: baseline;
+}
+
+.uppy-Dashboard-Item-fileName button {
+ margin-left: 5px;
+}
+
+.uppy-Dashboard-Item-author {
+ color: #757575;
+ vertical-align: bottom;
+ font-size: 11px;
+ font-weight: normal;
+ display: inline-block;
+ line-height: 1;
+ margin-bottom: 5px;
+}
+
+.uppy-Dashboard-Item-author a {
+ color: #757575;
+}
+
+.uppy-Dashboard-Item-status {
+ color: #757575;
+ font-weight: normal;
+ font-size: 11px;
+ line-height: 1;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-status {
+ color: #bbb;
+}
+
+.uppy-Dashboard-Item-statusSize {
+ display: inline-block;
+ text-transform: uppercase;
+ vertical-align: bottom;
+ margin-bottom: 5px;
+}
+
+.uppy-Dashboard-Item-reSelect {
+ color: #1269cf;
+ font-weight: 600;
+ font-size: inherit;
+ font-family: inherit;
+}
+
+.uppy-Dashboard-Item-errorMessage {
+ font-size: 11px;
+ font-weight: 500;
+ line-height: 1.3;
+ color: #a51523;
+ background-color: #fdeff1;
+ padding: 5px 6px;
+}
+
+.uppy-Dashboard-Item-errorMessageBtn {
+ font-size: 11px;
+ text-decoration: underline;
+ color: #a51523;
+ cursor: pointer;
+ font-weight: 500;
+}
+
+.uppy-Dashboard-Item-preview .uppy-Dashboard-Item-errorMessage {
+ display: none;
+}
+
+.uppy-Dashboard-Item-preview .uppy-Dashboard-Item-errorMessage {
+ display: block;
+ border-top: 1px solid #f7c2c8;
+ padding: 6px 8px;
+ line-height: 1.4;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+.uppy-Dashboard-Item-fileInfo .uppy-Dashboard-Item-errorMessage {
+ display: inline-block;
+ position: static;
+ border: 1px solid #f7c2c8;
+ border-radius: 3px;
+}
+
+.uppy-Dashboard-Item-fileInfo .uppy-Dashboard-Item-errorMessage {
+ display: none;
+}
+
+.uppy-Dashboard-Item-action {
+ color: #939393;
+ cursor: pointer;
+}
+
+.uppy-Dashboard-Item-action:focus {
+ outline: none;
+}
+
+.uppy-Dashboard-Item-action::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-Dashboard-Item-action:focus {
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.5);
+}
+
+.uppy-Dashboard-Item-action:hover {
+ color: #1f1f1f;
+ opacity: 1;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-action {
+ color: #cfcfcf;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-action:focus {
+ outline: none;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-action::-moz-focus-inner {
+ border: 0;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-action:focus {
+ box-shadow: 0 0 0 2px rgba(170, 225, 255, 0.85);
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-action:hover {
+ color: #eaeaea;
+}
+
+.uppy-Dashboard-Item-action--remove {
+ color: #1f1f1f;
+ opacity: 0.95;
+}
+
+.uppy-Dashboard-Item-action--remove:hover {
+ color: #000;
+ opacity: 1;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item-action--remove {
+ right: -8px;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item-action--remove {
+ left: -8px;
+}
+
+.uppy-Dashboard-Item-action--remove {
+ position: absolute;
+ top: -8px;
+ z-index: 1002;
+ width: 18px;
+ height: 18px;
+ padding: 0;
+}
+
+.uppy-Dashboard-Item-action--remove:focus {
+ border-radius: 50%;
+}
+
+[dir="ltr"] .uppy-Dashboard--singleFile.uppy-size--height-md .uppy-Dashboard-Item-action--remove {
+ right: 8px;
+}
+
+[dir="rtl"] .uppy-Dashboard--singleFile.uppy-size--height-md .uppy-Dashboard-Item-action--remove {
+ left: 8px;
+}
+
+.uppy-Dashboard--singleFile.uppy-size--height-md .uppy-Dashboard-Item-action--remove {
+ position: absolute;
+ top: 8px;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-action--remove {
+ color: #525252;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item-action--remove:hover {
+ color: #333;
+}
+
+.uppy-Dashboard-Item-action--copyLink,
+.uppy-Dashboard-Item-action--edit {
+ width: 16px;
+ height: 16px;
+ padding: 0;
+}
+
+.uppy-Dashboard-Item-action--copyLink:focus,
+.uppy-Dashboard-Item-action--edit:focus {
+ border-radius: 3px;
+}
+
+.uppy-Dashboard-Item {
+ display: flex;
+ align-items: center;
+ padding: 10px;
+ border-bottom: 1px solid #eaeaea;
+}
+
+[dir="ltr"] .uppy-Dashboard:not(.uppy-Dashboard--singleFile) .uppy-Dashboard-Item {
+ padding-right: 0;
+}
+
+[dir="rtl"] .uppy-Dashboard:not(.uppy-Dashboard--singleFile) .uppy-Dashboard-Item {
+ padding-left: 0;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-Item {
+ border-bottom: 1px solid #333;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item {
+ float: left;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item {
+ float: right;
+}
+
+.uppy-Dashboard-Item {
+ position: relative;
+ display: block;
+ /* When changing width: also update `itemsPerRow` values in `src/components/Dashboard.js`. */
+ width: calc(33.333% - 15px - 15px);
+ height: 215px;
+ margin: 5px 15px;
+ padding: 0;
+ border-bottom: 0;
+}
+
+.uppy-size--lg .uppy-Dashboard-Item {
+ /* When changing width: also update `itemsPerRow` values in `src/components/Dashboard.js`. */
+ width: calc(25% - 15px - 15px);
+ height: 190px;
+ margin: 5px 15px;
+ padding: 0;
+}
+
+.uppy-size--xl .uppy-Dashboard-Item {
+ /* When changing width: also update `itemsPerRow` values in `src/components/Dashboard.js`. */
+ width: calc(20% - 15px - 15px);
+ height: 210px;
+ padding: 0;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ max-width: 400px;
+ height: 100%;
+ border-bottom: 0;
+ position: relative;
+ padding: 15px;
+}
+
+.uppy-Dashboard-Item.is-ghost .uppy-Dashboard-Item-previewInnerWrap {
+ opacity: 0.2;
+}
+
+.uppy-Dashboard-Item.is-ghost .uppy-Dashboard-Item-name {
+ opacity: 0.7;
+}
+
+.uppy-Dashboard-Item.is-ghost .uppy-Dashboard-Item-preview::before {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1005;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='35' height='39' viewBox='0 0 35 39'%3E%3Cpath d='M1.708 38.66c1.709 0 3.417-3.417 6.834-3.417 3.416 0 5.125 3.417 8.61 3.417 3.348 0 5.056-3.417 8.473-3.417 4.305 0 5.125 3.417 6.833 3.417.889 0 1.709-.889 1.709-1.709v-19.68C34.167-5.757 0-5.757 0 17.271v19.68c0 .82.888 1.709 1.708 1.709zm8.542-17.084a3.383 3.383 0 01-3.417-3.416 3.383 3.383 0 013.417-3.417 3.383 3.383 0 013.417 3.417 3.383 3.383 0 01-3.417 3.416zm13.667 0A3.383 3.383 0 0120.5 18.16a3.383 3.383 0 013.417-3.417 3.383 3.383 0 013.416 3.417 3.383 3.383 0 01-3.416 3.416z' fill='%2523000' fill-rule='nonzero'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: 50% 10px;
+ background-size: 25px;
+ opacity: 0.5;
+ content: "";
+}
+
+.uppy-Dashboard-Item.is-ghost .uppy-Dashboard-Item-preview::before {
+ background-position: 50% 50%;
+ background-size: 40px;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item.is-ghost .uppy-Dashboard-Item-preview::before {
+ background-position: 50% 50%;
+ background-size: 30%;
+}
+
+.uppy-Dashboard-Item-preview {
+ position: relative;
+ flex-grow: 0;
+ flex-shrink: 0;
+ width: 50px;
+ height: 50px;
+}
+
+.uppy-Dashboard-Item-preview {
+ width: 100%;
+ height: 140px;
+}
+
+.uppy-size--lg .uppy-Dashboard-Item-preview {
+ height: 120px;
+}
+
+.uppy-size--xl .uppy-Dashboard-Item-preview {
+ height: 140px;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-preview {
+ width: 100%;
+ max-height: 75%;
+ flex-grow: 1;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-preview {
+ max-height: 100%;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item-fileInfoAndButtons {
+ padding-right: 8px;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item-fileInfoAndButtons {
+ padding-left: 8px;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item-fileInfoAndButtons {
+ padding-left: 12px;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item-fileInfoAndButtons {
+ padding-right: 12px;
+}
+
+.uppy-Dashboard-Item-fileInfoAndButtons {
+ display: flex;
+ flex-grow: 1;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.uppy-Dashboard-Item-fileInfoAndButtons, .uppy-Dashboard--singleFile .uppy-Dashboard-Item-fileInfoAndButtons {
+ align-items: flex-start;
+ padding: 0;
+ padding-top: 9px;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-fileInfoAndButtons {
+ width: 100%;
+ flex-grow: 0;
+}
+
+.uppy-Dashboard-Item-fileInfo {
+ flex-grow: 1;
+ flex-shrink: 1;
+}
+
+.uppy-Dashboard-Item-actionWrapper {
+ flex-grow: 0;
+ flex-shrink: 0;
+}
+
+.uppy-Dashboard-Item.is-inprogress .uppy-Dashboard-Item-previewInnerWrap::after,
+.uppy-Dashboard-Item.is-error .uppy-Dashboard-Item-previewInnerWrap::after {
+ display: block;
+}
+
+[dir="ltr"] .uppy-Dashboard-Item-errorDetails {
+ left: 2px;
+}
+
+[dir="rtl"] .uppy-Dashboard-Item-errorDetails {
+ right: 2px;
+}
+
+.uppy-Dashboard-Item-errorDetails {
+ position: relative;
+ top: 0;
+ flex-shrink: 0;
+ width: 13px;
+ height: 13px;
+ color: #fff;
+ font-weight: 600;
+ font-size: 10px;
+ line-height: 12px;
+ text-align: center;
+ background-color: #939393;
+ border-radius: 50%;
+ border: none;
+ cursor: help;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+.uppy-Dashboard-Item-errorDetails::after {
+ line-height: 1.3;
+ word-wrap: break-word;
+}
+
+.uppy-Dashboard-FileCard {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1005;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+ background-color: #fff;
+ border-radius: 5px;
+ box-shadow: 0 0 10px 4px rgba(0, 0, 0, 0.1);
+}
+
+.uppy-Dashboard-FileCard .uppy-DashboardContent-bar {
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+}
+
+.uppy-Dashboard-FileCard .uppy-Dashboard-FileCard-actions {
+ border-bottom-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+}
+
+.uppy-Dashboard-FileCard-inner {
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ flex-shrink: 1;
+ height: 100%;
+ min-height: 0;
+}
+
+.uppy-Dashboard-FileCard-preview {
+ position: relative;
+ display: flex;
+ flex-grow: 0;
+ flex-shrink: 1;
+ align-items: center;
+ justify-content: center;
+ height: 60%;
+ min-height: 0;
+ border-bottom: 1px solid #eaeaea;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-FileCard-preview {
+ background-color: #333;
+ border-bottom: 0;
+}
+
+.uppy-Dashboard-FileCard-preview img.uppy-Dashboard-Item-previewImg {
+ flex: 0 0 auto;
+ max-width: 90%;
+ max-height: 90%;
+ object-fit: cover;
+ border-radius: 3px;
+ box-shadow: 0 3px 20px rgba(0, 0, 0, 0.15);
+}
+
+[dir="ltr"] .uppy-Dashboard-FileCard-edit {
+ right: 10px;
+}
+
+[dir="rtl"] .uppy-Dashboard-FileCard-edit {
+ left: 10px;
+}
+
+.uppy-Dashboard-FileCard-edit {
+ position: absolute;
+ top: 10px;
+ padding: 7px 15px;
+ color: #fff;
+ font-size: 13px;
+ background-color: rgba(0, 0, 0, 0.5);
+ border-radius: 50px;
+}
+
+.uppy-Dashboard-FileCard-edit:focus {
+ outline: none;
+}
+
+.uppy-Dashboard-FileCard-edit::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-Dashboard-FileCard-edit:focus {
+ box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.5);
+}
+
+.uppy-Dashboard-FileCard-edit:hover {
+ background-color: rgba(0, 0, 0, 0.8);
+}
+
+.uppy-Dashboard-FileCard-info {
+ flex-grow: 0;
+ flex-shrink: 0;
+ height: 40%;
+ padding: 30px 20px 20px 20px;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-FileCard-info {
+ background-color: #1f1f1f;
+}
+
+.uppy-Dashboard-FileCard-fieldset {
+ max-width: 640px;
+ margin: auto;
+ margin-bottom: 12px;
+ padding: 0;
+ font-size: 0;
+ border: 0;
+}
+
+.uppy-Dashboard-FileCard-label {
+ display: inline-block;
+ width: 22%;
+ color: #525252;
+ font-size: 12px;
+ vertical-align: middle;
+}
+
+.uppy-Dashboard-FileCard-label {
+ font-size: 14px;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-FileCard-label {
+ color: #eaeaea;
+}
+
+.uppy-Dashboard-FileCard-input {
+ display: inline-block;
+ width: 78%;
+ vertical-align: middle;
+}
+
+.uppy-Dashboard-FileCard-actions {
+ display: flex;
+ flex-grow: 0;
+ flex-shrink: 0;
+ align-items: center;
+ height: 55px;
+ padding: 0 15px;
+ background-color: #fafafa;
+ border-top: 1px solid #eaeaea;
+}
+
+.uppy-Dashboard-FileCard-actions {
+ height: 65px;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-FileCard-actions {
+ background-color: #1f1f1f;
+ border-top: 1px solid #333;
+}
+
+[dir="ltr"] .uppy-Dashboard-FileCard-actionsBtn {
+ margin-right: 10px;
+}
+
+[dir="rtl"] .uppy-Dashboard-FileCard-actionsBtn {
+ margin-left: 10px;
+}
+
+.uppy-transition-slideDownUp-enter {
+ transform: translate3d(0, -105%, 0);
+ opacity: 0.01;
+ transition: transform 0.25s ease-in-out, opacity 0.25s ease-in-out;
+}
+
+.uppy-transition-slideDownUp-enter.uppy-transition-slideDownUp-enter-active {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+}
+
+.uppy-transition-slideDownUp-leave {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ transition: transform 0.25s ease-in-out, opacity 0.25s ease-in-out;
+}
+
+.uppy-transition-slideDownUp-leave.uppy-transition-slideDownUp-leave-active {
+ transform: translate3d(0, -105%, 0);
+ opacity: 0.01;
+}
+
+@keyframes uppy-Dashboard-fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes uppy-Dashboard-fadeOut {
+ from {
+ opacity: 1;
+ }
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes uppy-Dashboard-slideDownAndFadeIn {
+ from {
+ transform: translate3d(-50%, -70%, 0);
+ opacity: 0;
+ }
+ to {
+ transform: translate3d(-50%, -50%, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes uppy-Dashboard-slideDownAndFadeIn--small {
+ from {
+ transform: translate3d(0, -20%, 0);
+ opacity: 0;
+ }
+ to {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes uppy-Dashboard-slideUpFadeOut {
+ from {
+ transform: translate3d(-50%, -50%, 0);
+ opacity: 1;
+ }
+ to {
+ transform: translate3d(-50%, -70%, 0);
+ opacity: 0;
+ }
+}
+
+@keyframes uppy-Dashboard-slideUpFadeOut--small {
+ from {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+ to {
+ transform: translate3d(0, -20%, 0);
+ opacity: 0;
+ }
+}
+
+.uppy-Dashboard--modal {
+ z-index: 1001;
+}
+
+.uppy-Dashboard--modal[aria-hidden=true] {
+ display: none;
+}
+
+.uppy-Dashboard--modal.uppy-Dashboard--animateOpenClose > .uppy-Dashboard-inner {
+ animation: uppy-Dashboard-slideDownAndFadeIn--small 0.3s cubic-bezier(0, 0, 0.2, 1);
+}
+
+@media only screen and (min-width: 820px) {
+ .uppy-Dashboard--modal.uppy-Dashboard--animateOpenClose > .uppy-Dashboard-inner {
+ animation: uppy-Dashboard-slideDownAndFadeIn 0.3s cubic-bezier(0, 0, 0.2, 1);
+ }
+}
+
+.uppy-Dashboard--modal.uppy-Dashboard--animateOpenClose > .uppy-Dashboard-overlay {
+ animation: uppy-Dashboard-fadeIn 0.3s cubic-bezier(0, 0, 0.2, 1);
+}
+
+.uppy-Dashboard--modal.uppy-Dashboard--animateOpenClose.uppy-Dashboard--isClosing > .uppy-Dashboard-inner {
+ animation: uppy-Dashboard-slideUpFadeOut--small 0.3s cubic-bezier(0, 0, 0.2, 1);
+}
+
+@media only screen and (min-width: 820px) {
+ .uppy-Dashboard--modal.uppy-Dashboard--animateOpenClose.uppy-Dashboard--isClosing > .uppy-Dashboard-inner {
+ animation: uppy-Dashboard-slideUpFadeOut 0.3s cubic-bezier(0, 0, 0.2, 1);
+ }
+}
+
+.uppy-Dashboard--modal.uppy-Dashboard--animateOpenClose.uppy-Dashboard--isClosing > .uppy-Dashboard-overlay {
+ animation: uppy-Dashboard-fadeOut 0.3s cubic-bezier(0, 0, 0.2, 1);
+}
+
+.uppy-Dashboard-isFixed {
+ height: 100vh;
+ overflow: hidden;
+}
+
+.uppy-Dashboard--modal .uppy-Dashboard-overlay {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1001;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+
+.uppy-Dashboard-inner {
+ position: relative;
+ max-width: 100%;
+ max-height: 100%;
+ background-color: #f4f4f4;
+ border: 1px solid #eaeaea;
+ border-radius: 5px;
+ outline: none;
+}
+
+.uppy-Dashboard-inner {
+ min-height: auto;
+}
+
+@media only screen and (min-width: 820px) {
+ .uppy-Dashboard-inner {
+ width: 650px;
+ height: 500px;
+ }
+}
+
+.uppy-Dashboard--modal .uppy-Dashboard-inner {
+ z-index: 1002;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-inner {
+ background-color: #1f1f1f;
+}
+
+.uppy-Dashboard--isDisabled .uppy-Dashboard-inner {
+ cursor: not-allowed;
+}
+
+.uppy-Dashboard-innerWrap {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ overflow: hidden;
+ border-radius: 5px;
+ opacity: 0;
+}
+
+.uppy-Dashboard--isInnerWrapVisible .uppy-Dashboard-innerWrap {
+ opacity: 1;
+}
+
+.uppy-Dashboard--isDisabled .uppy-Dashboard-innerWrap {
+ opacity: 0.6;
+ filter: grayscale(100%);
+ -webkit-user-select: none;
+ user-select: none;
+ cursor: not-allowed;
+}
+
+.uppy-Dashboard--isDisabled .uppy-ProviderIconBg {
+ fill: #9f9f9f;
+}
+
+.uppy-Dashboard--isDisabled [disabled],
+.uppy-Dashboard--isDisabled [aria-disabled] {
+ pointer-events: none;
+ cursor: not-allowed;
+}
+
+.uppy-Dashboard--modal .uppy-Dashboard-inner {
+ position: fixed;
+ top: 35px;
+ right: 15px;
+ bottom: 15px;
+ left: 15px;
+ border: none;
+}
+
+@media only screen and (min-width: 820px) {
+ .uppy-Dashboard--modal .uppy-Dashboard-inner {
+ top: 50%;
+ right: auto;
+ left: 50%;
+ box-shadow: 0 5px 15px 4px rgba(0, 0, 0, 0.15);
+ transform: translate(-50%, -50%);
+ }
+}
+
+[dir="ltr"] .uppy-Dashboard-close {
+ right: -2px;
+}
+
+[dir="rtl"] .uppy-Dashboard-close {
+ left: -2px;
+}
+
+.uppy-Dashboard-close {
+ position: absolute;
+ top: -33px;
+ z-index: 1005;
+ display: block;
+ color: rgba(255, 255, 255, 0.9);
+ font-size: 27px;
+ cursor: pointer;
+}
+
+.uppy-Dashboard-close:focus {
+ outline: none;
+}
+
+.uppy-Dashboard-close::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-Dashboard-close:focus {
+ color: #6eabf2;
+}
+
+@media only screen and (min-width: 820px) {
+ [dir="ltr"] .uppy-Dashboard-close {
+ right: -35px;
+ }
+ [dir="rtl"] .uppy-Dashboard-close {
+ left: -35px;
+ }
+ .uppy-Dashboard-close {
+ top: -10px;
+ font-size: 35px;
+ }
+}
+
+.uppy-Dashboard-serviceMsg {
+ position: relative;
+ top: -1px;
+ z-index: 1004;
+ padding: 12px 0;
+ font-weight: 500;
+ font-size: 12px;
+ line-height: 1.3;
+ background-color: #fffbf7;
+ border-top: 1px solid #edd4b9;
+ border-bottom: 1px solid #edd4b9;
+}
+
+.uppy-Dashboard-serviceMsg {
+ font-size: 14px;
+ line-height: 1.4;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-serviceMsg {
+ color: #eaeaea;
+ background-color: #1f1f1f;
+ border-top: 1px solid #333;
+ border-bottom: 1px solid #333;
+}
+
+.uppy-Dashboard-serviceMsg-title {
+ display: block;
+ margin-bottom: 4px;
+ padding-left: 42px;
+ line-height: 1;
+}
+
+.uppy-Dashboard-serviceMsg-text {
+ padding: 0 15px;
+}
+
+.uppy-Dashboard-serviceMsg-actionBtn {
+ color: #1269cf;
+ font-weight: inherit;
+ font-size: inherit;
+ vertical-align: initial;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-serviceMsg-actionBtn {
+ color: rgba(2, 186, 242, 0.9);
}
-lr-progress-bar {
- top: 0px !important;
- height: 100% !important;
- padding-top: 10px;
- padding-bottom: 10px;
+.uppy-Dashboard-serviceMsg-icon {
+ position: absolute;
+ top: 10px;
+ left: 15px;
+}
- .progress {
- background-color: #61AE24D0;
- }
+.uppy-Dashboard-AddFiles {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ text-align: center;
}
-lr-file-uploader-inline {
- min-width: 230px;
+[data-uppy-drag-drop-supported=true] .uppy-Dashboard-AddFiles {
+ height: calc(100% - 14px);
+ margin: 7px;
+ border: 1px dashed #dfdfdf;
+ border-radius: 3px;
}
-lr-drop-area[with-icon] {
- min-height: 100px !important;
+.uppy-Dashboard-AddFilesPanel .uppy-Dashboard-AddFiles {
+ height: calc(100% - 14px - 40px);
+ border: none;
}
-lr-activity-header {
- & > div {
- display: none;
- }
+.uppy-Dashboard--modal .uppy-Dashboard-AddFiles {
+ border-color: #cfcfcf;
+}
- lr-icon[name="back"] {
- svg {
- width: 32px;
- height: 32px;
- }
- }
+[data-uppy-theme=dark] .uppy-Dashboard-AddFiles {
+ border-color: #757575;
+}
- .header-text {
- display: none;
- }
+.uppy-Dashboard-AddFiles-info {
+ display: none;
+ margin-top: auto;
+ padding-top: 15px;
+ padding-bottom: 15px;
}
-lr-upload-list {
- .done-btn, .upload-btn, .cancel-btn {
- display: none;
- }
+.uppy-size--height-md .uppy-Dashboard-AddFiles-info {
+ display: block;
+}
- .toolbar-spacer {
- display: none;
- }
+.uppy-Dashboard-AddFiles-info {
+ position: absolute;
+ right: 0;
+ bottom: 25px;
+ left: 0;
+ padding-top: 30px;
+ padding-bottom: 0;
+}
+
+[data-uppy-num-acquirers="0"] .uppy-Dashboard-AddFiles-info {
+ margin-top: 0;
+}
- .toolbar {
- justify-content: space-between;
- padding-right: 0px;
+.uppy-Dashboard-browse {
+ color: #1269cf;
+ cursor: pointer;
+}
- width: 105px;
+.uppy-Dashboard-browse:focus {
+ outline: none;
+}
- @include media-breakpoint-up(md) {
- width: 210px;
- }
- }
+.uppy-Dashboard-browse::-moz-focus-inner {
+ border: 0;
+}
- .files {
- display: flex;
- flex-wrap: wrap;
- min-height: unset;
- }
+.uppy-Dashboard-browse:hover, .uppy-Dashboard-browse:focus {
+ border-bottom: 1px solid #1269cf;
}
-lr-file-item {
- .thumb {
- // We hide the thumbnails in the uploader because we add our own.
- width: 0px;
- height: 0px;
- }
+[data-uppy-theme=dark] .uppy-Dashboard-browse {
+ color: rgba(2, 186, 242, 0.9);
+}
- .inner[uploading] .thumb {
- // ...except when uploading.
- width: 200px;
- height: 200px;
- }
+[data-uppy-theme=dark] .uppy-Dashboard-browse:hover, [data-uppy-theme=dark] .uppy-Dashboard-browse:focus {
+ border-bottom: 1px solid #02baf2;
+}
- .inner[finished] {
- padding: 0px;
- }
+.uppy-Dashboard-browseBtn {
+ display: block;
+ width: 100%;
+ margin-top: 8px;
+ margin-bottom: 5px;
+ font-weight: 500;
+ font-size: 14px;
}
-lr-drop-area[with-icon] {
- width: 200px;
- height: 200px;
+.uppy-Dashboard-browseBtn {
+ width: auto;
+ margin: auto;
+ margin-top: 15px;
+ margin-bottom: 15px;
+ padding: 13px 44px;
+ font-size: 15px;
+}
- &:hover {
- color: $colour-success;
+.uppy-Dashboard-AddFiles-list {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ width: 100%;
+ margin-top: 2px;
+ padding: 2px 0;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
- lr-drop-area[with-icon]:hover .icon-container {
- color: $colour-success;
- }
+.uppy-Dashboard-AddFiles-list {
+ flex: none;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ max-width: 600px;
+ margin-top: 15px;
+ padding-top: 0;
+ overflow-y: visible;
+}
- .icon-container {
- background-color: $colour-success !important;
- color: $color-white !important;
- }
- }
+.uppy-DashboardTab {
+ width: 100%;
+ text-align: center;
+ border-bottom: 1px solid #eaeaea;
+}
- .icon-container {
- background-color: $colour-success;
+[data-uppy-theme=dark] .uppy-DashboardTab {
+ border-bottom: 1px solid #333;
+}
- lr-icon[name="default"] {
- svg {
- width: 32px;
- height: 32px;
- color: $color-white;
- }
- }
- }
+.uppy-DashboardTab {
+ display: inline-block;
+ width: initial;
+ margin-bottom: 10px;
+ border-bottom: none;
}
-lr-source-list {
- lr-icon {
- svg {
- width: 16px;
- height: 16px;
- }
- }
+.uppy-DashboardTab-btn {
+ flex-direction: row;
+ align-items: center;
+ justify-content: left;
+ width: 100%;
+ height: 100%;
+ padding: 12px 15px;
+ color: #525252;
+ background-color: transparent;
+ cursor: pointer;
+ -webkit-appearance: none;
+ appearance: none;
}
-lr-file-item {
- >.inner {
- padding-left: 0px;
- padding-right: 0px;
- grid-template-columns: 1fr;
- background-color: transparent;
- }
+.uppy-DashboardTab-btn:focus {
+ outline: none;
+}
- .file-name-wrapper, .file-actions {
- display: none;
- }
+.uppy-DashboardTab-btn::-moz-focus-inner {
+ border: 0;
+}
- .badge, .badge lr-icon, .badge lr-icon svg {
- width: 0px;
- height: 0px;
- }
+[dir="ltr"] .uppy-DashboardTab-btn {
+ margin-right: 1px;
+}
+
+[dir="rtl"] .uppy-DashboardTab-btn {
+ margin-left: 1px;
+}
+
+.uppy-DashboardTab-btn {
+ flex-direction: column;
+ width: 86px;
+ padding: 10px 3px;
+ border-radius: 5px;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-btn {
+ color: #eaeaea;
+}
+
+.uppy-DashboardTab-btn::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-DashboardTab-btn:hover {
+ background-color: #e9ecef;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-btn:hover {
+ background-color: #333;
+}
+
+.uppy-DashboardTab-btn:active,
+.uppy-DashboardTab-btn:focus {
+ background-color: #dfe6f1;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-btn:active,
+[data-uppy-theme=dark] .uppy-DashboardTab-btn:focus {
+ background-color: #525252;
+}
+
+.uppy-DashboardTab-btn svg {
+ display: inline-block;
+ max-width: 100%;
+ max-height: 100%;
+ overflow: hidden;
+ vertical-align: text-top;
+ transition: transform ease-in-out 0.15s;
+}
+
+[dir="ltr"] .uppy-DashboardTab-inner {
+ margin-right: 10px;
+}
+
+[dir="rtl"] .uppy-DashboardTab-inner {
+ margin-left: 10px;
}
-lr-source-list {
+.uppy-DashboardTab-inner {
display: flex;
- flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ width: 32px;
+ height: 32px;
+ border-radius: 8px;
+ background-color: #fff;
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.1), 0 2px 3px 0 rgba(0, 0, 0, 0.02);
+}
+
+[dir="ltr"] .uppy-DashboardTab-inner {
+ margin-right: 0;
+}
+
+[dir="rtl"] .uppy-DashboardTab-inner {
+ margin-left: 0;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-inner {
+ background-color: #323232;
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.2), 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 2px 3px 0 rgba(0, 0, 0, 0.08);
+}
+
+.uppy-DashboardTab-name {
+ font-weight: 400;
+ font-size: 14px;
+}
+
+.uppy-DashboardTab-name {
+ margin-top: 8px;
+ margin-bottom: 0;
+ font-size: 12px;
+ line-height: 15px;
+}
+
+.uppy-DashboardTab-iconMyDevice {
+ color: #1269cf;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-iconMyDevice {
+ color: #02baf2;
+}
+
+.uppy-DashboardTab-iconBox {
+ color: #0061d5;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-iconBox {
+ color: #eaeaea;
+}
+
+.uppy-DashboardTab-iconDropbox {
+ color: #0061fe;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-iconDropbox {
+ color: #eaeaea;
+}
+
+.uppy-DashboardTab-iconUnsplash {
+ color: #111;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-iconUnsplash {
+ color: #eaeaea;
+}
+
+.uppy-DashboardTab-iconScreenRec {
+ color: #2c3e50;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-iconScreenRec {
+ color: #eaeaea;
+}
+
+.uppy-DashboardTab-iconAudio {
+ color: #8030a3;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardTab-iconAudio {
+ color: #bf6ee3;
+}
+
+.uppy-Dashboard-input {
+ position: absolute;
+ z-index: -1;
+ width: 0.1px;
+ height: 0.1px;
+ overflow: hidden;
+ opacity: 0;
+}
+
+.uppy-DashboardContent-bar {
+ position: relative;
+ z-index: 1004;
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
justify-content: space-between;
+ width: 100%;
+ height: 40px;
+ padding: 0 10px;
+ background-color: #fafafa;
+ border-bottom: 1px solid #eaeaea;
+}
- lr-source-btn {
- padding-left: 0px;
+.uppy-DashboardContent-bar {
+ height: 50px;
+ padding: 0 15px;
+}
- lr-icon {
- margin-right: 0px;
- }
- }
+[data-uppy-theme=dark] .uppy-DashboardContent-bar {
+ background-color: #1f1f1f;
+ border-bottom: 1px solid #333;
+}
+
+.uppy-DashboardContent-title {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ width: 100%;
+ max-width: 170px;
+ margin: auto;
+ overflow-x: hidden;
+ font-weight: 500;
+ font-size: 12px;
+ line-height: 40px;
+ white-space: nowrap;
+ text-align: center;
+ text-overflow: ellipsis;
+}
+
+.uppy-DashboardContent-title {
+ max-width: 300px;
+ font-size: 14px;
+ line-height: 50px;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardContent-title {
+ color: #eaeaea;
+}
+
+[dir="ltr"] .uppy-DashboardContent-back, [dir="ltr"]
+.uppy-DashboardContent-save {
+ margin-left: -6px;
+}
+
+[dir="rtl"] .uppy-DashboardContent-back, [dir="rtl"]
+.uppy-DashboardContent-save {
+ margin-right: -6px;
+}
+
+.uppy-DashboardContent-back,
+.uppy-DashboardContent-save {
+ margin: 0;
+ padding: 0;
+ color: inherit;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: 1;
+ background: none;
+ border: 0;
+ -webkit-appearance: none;
+ padding: 7px 6px;
+ color: #1269cf;
+ font-weight: 400;
+ font-size: 12px;
+ border-radius: 3px;
+ cursor: pointer;
+}
+
+.uppy-DashboardContent-back:focus,
+.uppy-DashboardContent-save:focus {
+ outline: none;
+}
+
+.uppy-DashboardContent-back::-moz-focus-inner,
+.uppy-DashboardContent-save::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-DashboardContent-back:hover,
+.uppy-DashboardContent-save:hover {
+ color: #0e51a0;
+}
+
+.uppy-DashboardContent-back:focus,
+.uppy-DashboardContent-save:focus {
+ background-color: #dfe6f1;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardContent-back:focus,
+[data-uppy-theme=dark] .uppy-DashboardContent-save:focus {
+ background-color: #333;
}
-lr-start-from {
- .content {
- gap: unset;
- padding: 8px;
+.uppy-DashboardContent-back,
+.uppy-DashboardContent-save {
+ font-size: 14px;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardContent-back,
+[data-uppy-theme=dark] .uppy-DashboardContent-save {
+ color: #02baf2;
+}
+
+[dir="ltr"] .uppy-DashboardContent-addMore {
+ margin-right: -5px;
+}
+
+[dir="rtl"] .uppy-DashboardContent-addMore {
+ margin-left: -5px;
+}
+
+.uppy-DashboardContent-addMore {
+ margin: 0;
+ padding: 0;
+ color: inherit;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: 1;
+ background: none;
+ border: 0;
+ -webkit-appearance: none;
+ width: 29px;
+ height: 29px;
+ padding: 7px 8px;
+ color: #1269cf;
+ font-weight: 500;
+ border-radius: 3px;
+ cursor: pointer;
+}
+
+.uppy-DashboardContent-addMore:focus {
+ outline: none;
+}
+
+.uppy-DashboardContent-addMore::-moz-focus-inner {
+ border: 0;
+}
+
+.uppy-DashboardContent-addMore:hover {
+ color: #0e51a0;
+}
+
+.uppy-DashboardContent-addMore:focus {
+ background-color: #dfe6f1;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardContent-addMore:focus {
+ background-color: #333;
+}
+
+[dir="ltr"] .uppy-DashboardContent-addMore {
+ margin-right: -8px;
+}
+
+[dir="rtl"] .uppy-DashboardContent-addMore {
+ margin-left: -8px;
+}
+
+.uppy-DashboardContent-addMore {
+ width: auto;
+ height: auto;
+ font-size: 14px;
+}
+
+[data-uppy-theme=dark] .uppy-DashboardContent-addMore {
+ color: #02baf2;
+}
+
+[dir="ltr"] .uppy-DashboardContent-addMore svg {
+ margin-right: 4px;
+}
+
+[dir="rtl"] .uppy-DashboardContent-addMore svg {
+ margin-left: 4px;
+}
+
+.uppy-DashboardContent-addMore svg {
+ vertical-align: baseline;
+}
+
+.uppy-DashboardContent-addMore svg {
+ width: 11px;
+ height: 11px;
+}
+
+.uppy-DashboardContent-addMoreCaption {
+ display: none;
+}
+
+.uppy-DashboardContent-addMoreCaption {
+ display: inline;
+}
+
+.uppy-DashboardContent-panel {
+ position: absolute;
+ top: 20px;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1005;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ overflow: hidden;
+ background-color: whitesmoke;
+ border-radius: 5px;
+}
+
+.uppy-Dashboard-AddFilesPanel {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1005;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ background: #fafafa;
+ background: linear-gradient(0deg, #fafafa 35%, rgba(250, 250, 250, 0.85) 100%);
+ border-radius: 5px;
+ box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.15);
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-AddFilesPanel {
+ background-color: #333;
+ background-image: linear-gradient(0deg, #1f1f1f 35%, rgba(31, 31, 31, 0.85) 100%);
+}
+
+.uppy-Dashboard--isAddFilesPanelVisible .uppy-Dashboard-files {
+ filter: blur(2px);
+}
+
+.uppy-Dashboard-progress {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 12%;
+}
+
+.uppy-Dashboard-progressBarContainer.is-active {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1004;
+ width: 100%;
+ height: 100%;
+}
+
+.uppy-Dashboard-filesContainer {
+ position: relative;
+ flex: 1;
+ margin: 0;
+ overflow-y: hidden;
+}
+
+.uppy-Dashboard-filesContainer::after {
+ display: table;
+ clear: both;
+ content: "";
+}
+
+.uppy-Dashboard-files {
+ flex: 1;
+ margin: 0;
+ padding: 0 0 10px 0;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.uppy-Dashboard-files {
+ padding-top: 10px;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-filesInner {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+}
+
+.uppy-Dashboard-dropFilesHereHint {
+ position: absolute;
+ top: 7px;
+ right: 7px;
+ bottom: 7px;
+ left: 7px;
+ z-index: 2000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding-top: 90px;
+ color: #757575;
+ font-size: 16px;
+ text-align: center;
+ background-image: url("data:image/svg+xml,%3Csvg width='48' height='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24 1v1C11.85 2 2 11.85 2 24s9.85 22 22 22 22-9.85 22-22S36.15 2 24 2V1zm0 0V0c13.254 0 24 10.746 24 24S37.254 48 24 48 0 37.254 0 24 10.746 0 24 0v1zm7.707 19.293a.999.999 0 1 1-1.414 1.414L25 16.414V34a1 1 0 1 1-2 0V16.414l-5.293 5.293a.999.999 0 1 1-1.414-1.414l7-7a.999.999 0 0 1 1.414 0l7 7z' fill='%231269CF' fill-rule='nonzero'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: 50% 50%;
+ border: 1px dashed #1269cf;
+ border-radius: 3px;
+ visibility: hidden;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-dropFilesHereHint {
+ color: #bbb;
+ background-image: url("data:image/svg+xml,%3Csvg width='48' height='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24 1v1C11.85 2 2 11.85 2 24s9.85 22 22 22 22-9.85 22-22S36.15 2 24 2V1zm0 0V0c13.254 0 24 10.746 24 24S37.254 48 24 48 0 37.254 0 24 10.746 0 24 0v1zm7.707 19.293a.999.999 0 1 1-1.414 1.414L25 16.414V34a1 1 0 1 1-2 0V16.414l-5.293 5.293a.999.999 0 1 1-1.414-1.414l7-7a.999.999 0 0 1 1.414 0l7 7z' fill='%2302BAF2' fill-rule='nonzero'/%3E%3C/svg%3E");
+ border-color: #02baf2;
+}
+
+.uppy-Dashboard.uppy-Dashboard--isDraggingOver .uppy-Dashboard-dropFilesHereHint {
+ visibility: visible;
+ pointer-events: none;
+}
+
+.uppy-Dashboard.uppy-Dashboard--isDraggingOver .uppy-DashboardContent-bar,
+.uppy-Dashboard.uppy-Dashboard--isDraggingOver .uppy-Dashboard-files,
+.uppy-Dashboard.uppy-Dashboard--isDraggingOver .uppy-Dashboard-progressindicators,
+.uppy-Dashboard.uppy-Dashboard--isDraggingOver .uppy-Dashboard-serviceMsg {
+ opacity: 0.15;
+}
+
+.uppy-Dashboard.uppy-Dashboard--isDraggingOver .uppy-Dashboard-AddFiles {
+ opacity: 0.03;
+}
+
+.uppy-Dashboard-AddFiles-title {
+ width: 100%;
+ margin-top: 15px;
+ margin-bottom: 5px;
+ padding: 0 15px;
+ color: #000;
+ font-weight: 500;
+ font-size: 17px;
+ line-height: 1.35;
+ text-align: inline-start;
+}
+
+.uppy-Dashboard-AddFiles-title {
+ max-width: 480px;
+ padding: 0 35px;
+ margin-top: 5px;
+ font-weight: 400;
+ font-size: 21px;
+ text-align: center;
+}
+
+[data-uppy-num-acquirers="0"] .uppy-Dashboard-AddFiles-title {
+ text-align: center;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-AddFiles-title {
+ color: #eaeaea;
+}
+
+.uppy-Dashboard-AddFiles-title button {
+ font-weight: 500;
+}
+
+.uppy-Dashboard-AddFiles-title button {
+ font-weight: 400;
+}
+
+.uppy-Dashboard-note {
+ max-width: 350px;
+ margin: auto;
+ padding: 0 15px;
+ color: #757575;
+ font-size: 14px;
+ line-height: 1.25;
+ text-align: center;
+}
+
+.uppy-Dashboard-note {
+ max-width: 600px;
+ line-height: 1.35;
+}
+
+[data-uppy-theme=dark] .uppy-Dashboard-note {
+ color: #cfcfcf;
+}
+
+a.uppy-Dashboard-poweredBy {
+ display: inline-block;
+ margin-top: 8px;
+ color: #939393;
+ font-size: 11px;
+ text-align: center;
+ text-decoration: none;
+}
+
+.uppy-Dashboard-poweredByIcon {
+ position: relative;
+ top: 1px;
+ margin-right: 1px;
+ margin-left: 1px;
+ vertical-align: text-top;
+ opacity: 0.9;
+ fill: none;
+ stroke: #939393;
+}
+
+.uppy-Dashboard-Item-previewIcon {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 100;
+ width: 25px;
+ height: 25px;
+ transform: translate(-50%, -50%);
+}
+
+.uppy-Dashboard-Item-previewIcon {
+ width: 38px;
+ height: 38px;
+}
+
+.uppy-Dashboard-Item-previewIcon svg {
+ width: 100%;
+ height: 100%;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-previewIcon {
+ width: 100%;
+ height: 100%;
+ max-width: 60%;
+ max-height: 60%;
+}
+
+.uppy-Dashboard-Item-previewIconWrap {
+ position: relative;
+ height: 76px;
+ max-height: 75%;
+}
+
+.uppy-Dashboard--singleFile .uppy-Dashboard-Item-previewIconWrap {
+ width: 100%;
+ height: 100%;
+}
+
+.uppy-Dashboard-Item-previewIconBg {
+ width: 100%;
+ height: 100%;
+ filter: drop-shadow(rgba(0, 0, 0, 0.1) 0 1px 1px);
+}
+
+.uppy-Dashboard-upload {
+ position: relative;
+ width: 50px;
+ height: 50px;
+}
+
+.uppy-Dashboard-upload {
+ width: 60px;
+ height: 60px;
+}
+
+.uppy-Dashboard-upload .uppy-c-icon {
+ position: relative;
+ top: 1px;
+ width: 50%;
+}
+
+[dir="ltr"] .uppy-Dashboard-uploadCount {
+ right: -12px;
+}
+
+[dir="rtl"] .uppy-Dashboard-uploadCount {
+ left: -12px;
+}
+
+.uppy-Dashboard-uploadCount {
+ position: absolute;
+ top: -12px;
+ width: 16px;
+ height: 16px;
+ color: #fff;
+ font-size: 8px;
+ line-height: 16px;
+ background-color: #1bb240;
+ border-radius: 50%;
+}
+
+.uppy-Dashboard-uploadCount {
+ width: 18px;
+ height: 18px;
+ font-size: 9px;
+ line-height: 18px;
+}
+
+.uppy-Webcam-buttonContainer {
+ padding-bottom: $sticky-banner-height-mobile;
+
+ @include media-breakpoint-up(md) {
+ padding-bottom: 0;
}
}
\ No newline at end of file
diff --git a/components/AutoComplete.vue b/components/AutoComplete.vue
index 84755516..1ec6083c 100644
--- a/components/AutoComplete.vue
+++ b/components/AutoComplete.vue
@@ -578,8 +578,9 @@ export default {
}
},
- doAjax(val) {
+ async doAjax(val) {
this.invalid = false
+ let beforeAjaxResult = []
if (this.ajaxInProgress) {
// We're already doing a request. Don't send another one, partly out of politeness to the server, and
@@ -594,8 +595,10 @@ export default {
} else {
// Callback Event
if (this.onBeforeAjax) {
- this.onBeforeAjax(val)
+ // This might return some results - if so they should be shown first.
+ beforeAjaxResult = await this.onBeforeAjax(val)
}
+
// Compose Params
const params = this.composeParams(val.trim())
// Init Ajax
@@ -606,22 +609,26 @@ export default {
ajax.open('GET', `${this.url}?${params}`, true)
this.composeHeader(ajax)
+
// Callback Event
ajax.addEventListener('progress', data => {
if (data.lengthComputable && this.onAjaxProgress)
this.onAjaxProgress(data)
})
+
// On Done
ajax.addEventListener('loadend', e => {
const { status, responseText } = e.target
if (status === 200) {
const json = JSON.parse(responseText)
+
// Callback Event
if (this.onAjaxLoaded) {
this.onAjaxLoaded(json)
}
- this.json = this.process ? this.process(json) : json
+
+ this.json = beforeAjaxResult.concat(this.process ? this.process(json) : json)
if (this.restrict && (!this.json || this.json.length === 0)) {
// What we have doesn't match. Indicate that we have selected an invalid value.
@@ -641,7 +648,7 @@ export default {
// We no longer have a request in progress.
this.ajaxInProgress = null
})
- // Send Ajax
+
ajax.send()
}
},
diff --git a/components/AutoHeightTextarea.vue b/components/AutoHeightTextarea.vue
index b449b46d..f7c2d275 100644
--- a/components/AutoHeightTextarea.vue
+++ b/components/AutoHeightTextarea.vue
@@ -16,7 +16,9 @@
// If we're showing a scrollbar, then increase the number of rows.
//
// We don't shrink. If you're reading this, why not code it?
+import { mapWritableState } from 'pinia'
import { ref } from '#imports'
+import { useMiscStore } from '~/stores/misc'
export default {
props: {
@@ -65,11 +67,16 @@ export default {
timer: null,
}
},
+ computed: {
+ ...mapWritableState(useMiscStore, ['lastTyping']),
+ },
watch: {
modelValue(newVal) {
this.currentValue = newVal
},
currentValue(newVal) {
+ this.lastTyping = Date.now()
+
if (newVal && !this.timer) {
// Starting the timer here avoids having the timer run for empty textareas, which happen a lot in ChitChat.
this.checkRows()
diff --git a/components/ChatFooter.vue b/components/ChatFooter.vue
index b5da465c..6f05b5c3 100644
--- a/components/ChatFooter.vue
+++ b/components/ChatFooter.vue
@@ -70,18 +70,24 @@
-
+
Chat message
-
+
@@ -90,13 +96,14 @@
id="chatmessage"
ref="chatarea"
v-model="sendmessage"
+ :debounce="debounce"
+ class="h-100"
placeholder="Type here..."
- :style="height"
enterkeyhint="send"
autocapitalize="none"
@keydown="typing"
@keydown.enter.exact.prevent
- @keyup.enter.exact="send"
+ @keyup.enter.exact="sendOnEnter"
@keydown.enter.shift.exact.prevent="newline"
@keydown.alt.shift.enter.exact.prevent="newline"
@focus="markRead"
@@ -128,14 +135,13 @@
-
@@ -212,30 +218,42 @@
120
+ },
height() {
// Bootstrap Vue Next doesn't yet have autoresizing.
- return this.sendmessage ? 'height: 12em' : 'height: 6em'
+ const height = Math.min(6, Math.round(this.sendmessage?.length / 60))
+
+ return 'height: ' + (height + 6) + 'em'
},
noticesToShow() {
return (
@@ -556,9 +593,10 @@ export default {
},
watch: {
suggestedAddress: {
- handler(newVal) {
+ async handler(newVal) {
if (newVal?.address?.singleline?.length !== newVal?.matchedLength) {
this.hideSuggestedAddress = false
+ await this.$nextTick()
this.updateCaretPosition()
}
},
@@ -597,16 +635,18 @@ export default {
},
currentAtts: {
handler(newVal) {
- // We have uploaded a photo.
- this.uploading = false
+ if (newVal) {
+ // We have uploaded a photo.
+ this.uploading = false
- // Show the chat busy indicator.
- this.chatBusy = true
+ // Show the chat busy indicator.
+ this.chatBusy = true
- // We have uploaded a photo. Post a chatmessage referencing it.
- this.imageid = newVal[0].id
- this.imageuid = newVal[0].externaluid
- this.imagemods = newVal[0].externalmods
+ // We have uploaded a photo. Post a chatmessage referencing it.
+ this.imageid = newVal[0].id
+ this.imageuid = newVal[0].ouruid
+ this.imagemods = newVal[0].externalmods
+ }
},
deep: true,
},
@@ -626,7 +666,7 @@ export default {
left: caretPosition.left + textareaPosition.left,
}
},
- applySuggestedAddress() {
+ async applySuggestedAddress() {
const matchedLength = this.suggestedAddress.matchedLength
const suggestedAddress = this.suggestedAddress.address.singleline
// No need to apply suggestion if length of match and address are equal
@@ -635,8 +675,19 @@ export default {
}
this.sendmessage =
this.sendmessage.substring(0, this.sendmessage.length - matchedLength) +
- this.suggestedAddress.address.singleline
+ this.suggestedAddress.address.singleline +
+ ' '
this.hideSuggestedAddress = true
+ await this.$nextTick()
+ const el = this.$refs.chatarea?.$el
+
+ if (el) {
+ setTimeout(() => {
+ // Focus at end of text.
+ el.focus()
+ el.selectionStart = this.sendmessage.length
+ }, 100)
+ }
},
async markRead() {
await this.chatStore.markRead(this.id)
@@ -719,6 +770,12 @@ export default {
showInfo() {
this.showProfileModal = true
},
+ sendOnEnter() {
+ // Because of debounce, we might not have the full message yet. Start a timer.
+ setTimeout(() => {
+ this.send()
+ }, this.debounce + 100)
+ },
async send(callback) {
if (!this.sending) {
if (this.imageid) {
@@ -787,10 +844,10 @@ export default {
this.imagethumb = null
},
async typing() {
- // Let the server know that we are typing, no more frequently than every 10 seconds.
const now = new Date().getTime()
if (!this.lastTyping || now - this.lastTyping > TYPING_TIME_INVERVAL) {
+ // Let the server know that we are typing, no more frequently than every 10 seconds.
await this.chatStore.typing(this.id)
this.lastTyping = now
}
@@ -850,6 +907,8 @@ export default {
}
diff --git a/components/ChatMessage.vue b/components/ChatMessage.vue
index 7ce96adb..435e6ad6 100644
--- a/components/ChatMessage.vue
+++ b/components/ChatMessage.vue
@@ -71,6 +71,9 @@
+
+
+
Unknown chat message type {{ chatmessage?.type }}, {{ chat }}
{{ chatmessage }}
@@ -134,6 +137,7 @@ import ChatMessageAddress from './ChatMessageAddress'
import ChatMessageNudge from './ChatMessageNudge'
import ChatMessageDateRead from './ChatMessageDateRead'
import ChatMessageModMail from './ChatMessageModMail'
+import ChatMessageReminder from './ChatMessageReminder'
import SupportLink from '~/components/SupportLink.vue'
import ChatMessageWarning from '~/components/ChatMessageWarning'
import 'vue-simple-context-menu/dist/vue-simple-context-menu.css'
@@ -161,6 +165,7 @@ export default {
ChatMessageReport,
ChatMessageNudge,
ChatMessageModMail,
+ ChatMessageReminder,
SupportLink,
},
props: {
diff --git a/components/ChatMessageImage.vue b/components/ChatMessageImage.vue
index eb52007d..e83035d2 100644
--- a/components/ChatMessageImage.vue
+++ b/components/ChatMessageImage.vue
@@ -14,8 +14,17 @@
size="sm"
class="mr-1 mb-1 mt-1 inline"
/>
+
-
-
+
+
+
+
diff --git a/components/ChatMessageReminder.vue b/components/ChatMessageReminder.vue
new file mode 100644
index 00000000..2650ec76
--- /dev/null
+++ b/components/ChatMessageReminder.vue
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/components/ChatMessageSummary.vue b/components/ChatMessageSummary.vue
index 169211e6..2cc03948 100644
--- a/components/ChatMessageSummary.vue
+++ b/components/ChatMessageSummary.vue
@@ -26,11 +26,7 @@
-
+
+
diff --git a/components/DaDisabledOnServer.vue b/components/DaDisabledOnServer.vue
new file mode 100644
index 00000000..361d3c0e
--- /dev/null
+++ b/components/DaDisabledOnServer.vue
@@ -0,0 +1,27 @@
+
+
+
+ We've raised enough
+ in donations from kind freeglers to turn ads off today. Thanks!
+ Learn more
+
+
+
+
+
diff --git a/components/DaFallbackDonationRequest.vue b/components/DaFallbackDonationRequest.vue
new file mode 100644
index 00000000..f8b92dc0
--- /dev/null
+++ b/components/DaFallbackDonationRequest.vue
@@ -0,0 +1,30 @@
+
+
+
+
+ Thank you for donating to help keep Freegle running.
+
+ Help keep Freegle running. Click to donate.
+
+
+
+
+
diff --git a/components/DateFormatted.vue b/components/DateFormatted.vue
index 381ce2a4..8ff9f1da 100644
--- a/components/DateFormatted.vue
+++ b/components/DateFormatted.vue
@@ -10,6 +10,7 @@ import {
datetimeshort,
dateshort,
weekdayshort,
+ dateonlyNoYear,
} from '../composables/useTimeFormat'
export default {
@@ -32,6 +33,9 @@ export default {
case 'dateonly':
ret = dateonly(this.value)
break
+ case 'dateonlyNoYear':
+ ret = dateonlyNoYear(this.value)
+ break
case 'dateshort':
ret = dateshort(this.value)
break
diff --git a/components/DeadlineAskModal.vue b/components/DeadlineAskModal.vue
new file mode 100644
index 00000000..83eefea0
--- /dev/null
+++ b/components/DeadlineAskModal.vue
@@ -0,0 +1,136 @@
+
+
+
+ Is there a deadline?
+
+
+
+ We'll show your post to other freeglers for a while. But if your post
+ doesn't matter after a certain date, you can tell us.
+
+ That way you won't get replies you don't want.
+
+
+ Set a deadline:
+
+
+
+ Set a deadline?
+
+ Are you sure you want your post to stop showing after today?
+
+
+
+
+
+ Yes, set a deadline
+
+
+ No deadline
+
+
+
+ Cancel
+
+ Save deadline
+
+
+
+
+
+
diff --git a/components/DeliveryAskModal.vue b/components/DeliveryAskModal.vue
new file mode 100644
index 00000000..dfb49df5
--- /dev/null
+++ b/components/DeliveryAskModal.vue
@@ -0,0 +1,89 @@
+
+
+
+ Could you deliver?
+
+
+
+ Usually, the freegler who receives something will collect it. But
+ sometimes they don't have transport, and some people don't mind dropping
+ things off.
+
+
+ Could you deliver your items , if it works
+ for you?
+
+
+
+
+ Maybe
+ Collection only
+
+
+
+
+
diff --git a/components/DonationButton.vue b/components/DonationButton.vue
index 02668480..c664242f 100644
--- a/components/DonationButton.vue
+++ b/components/DonationButton.vue
@@ -8,7 +8,8 @@
>
-
Donate
+
{{ text }}
+
Donate
{{ show }}
@@ -31,6 +32,11 @@ export default {
required: false,
default: null,
},
+ text: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
async setup() {
await loadScript('https://www.paypalobjects.com/donate/sdk/donate-sdk.js')
@@ -69,7 +75,7 @@ export default {
}
},
show() {
- return this.value ? '£' + this.value : this.$props.show
+ return this.value ? '£' + this.value : null
},
},
mounted() {
@@ -105,6 +111,13 @@ export default {
e.stopPropagation()
},
clicked() {
+ if (this.$gtm?.enabled()) {
+ this.$gtm.trackEvent({
+ event: 'Donate',
+ label: 'Z1RRCIfbv7kZELy618UD',
+ })
+ }
+
this.$refs.paypalbutton?.firstChild?.click()
},
async donateMonthly() {
diff --git a/components/ExploreGroup.vue b/components/ExploreGroup.vue
index e0d15ca4..da6d2f39 100644
--- a/components/ExploreGroup.vue
+++ b/components/ExploreGroup.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/components/GooglePay.vue b/components/GooglePay.vue
new file mode 100644
index 00000000..778fb2a7
--- /dev/null
+++ b/components/GooglePay.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/components/ImageCarousel.vue b/components/ImageCarousel.vue
index fd3011a5..46071258 100644
--- a/components/ImageCarousel.vue
+++ b/components/ImageCarousel.vue
@@ -1,12 +1,40 @@
-
+
+
+
+
+ Zoom out
+
+
+
+
+
+ Zoom in
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/InterestedInOthersModal.vue b/components/InterestedInOthersModal.vue
new file mode 100644
index 00000000..c3a49b14
--- /dev/null
+++ b/components/InterestedInOthersModal.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+ Check out their other posts - let them know if you're interested in any
+ of these too.
+
+
+
+
+ Close
+
+
+
+
+
+
diff --git a/components/InviteSomeone.vue b/components/InviteSomeone.vue
index d7ab0bc1..c564c1b0 100644
--- a/components/InviteSomeone.vue
+++ b/components/InviteSomeone.vue
@@ -1,171 +1,124 @@
-
-
-
- Invite your friends!
-
-
-
-
- It'll ask for access to your contacts. Don't worry -
- this doesn't mean we can access all of them! You choose which ones to
- invite. We don't pass this information to our servers, we don't store
- it, and we can't access it in future. You're in control.
-
-
-
-
-
- Personalise your invitation message:
-
-
-
-
- Invite by WhatsApp
-
-
+
+
+
-
- {{ phone.name }}
- {{ phone.phone }}
+
+ Facebook
-
-
- Invite by text (SMS)
-
-
+
+
+
-
- {{ phone.name }}
- {{ phone.phone }}
+
-
-
-
- Invite by email
-
+
+
+
-
- {{ email.email }}
+
+ Whatsapp
-
-
-
+
+
+
+
+
+ Email
+
+
+
+
diff --git a/components/MessageDescription.vue b/components/MessageDescription.vue
index bff26584..d077dfae 100644
--- a/components/MessageDescription.vue
+++ b/components/MessageDescription.vue
@@ -1,23 +1,27 @@
-
-
{{ description }}
-
-
{{ textbody }}
+
+
+ {{ description }}
+
+ {{ textbody }}
+
+
diff --git a/components/MessageFreegled.vue b/components/MessageFreegled.vue
index f4feb49b..ea9f52d9 100644
--- a/components/MessageFreegled.vue
+++ b/components/MessageFreegled.vue
@@ -1,17 +1,24 @@
-
-
-
+
+
+
+
+
+
+
+ This item has already been successfully freegled.
+
+
diff --git a/components/MessageHistory.vue b/components/MessageHistory.vue
index 00511d98..7dd0760e 100644
--- a/components/MessageHistory.vue
+++ b/components/MessageHistory.vue
@@ -6,12 +6,13 @@
class="text--small"
>
- {{ timeago(group.arrival, true) }} on
+ {{ timeago(group.arrival, true) }}
+ on
-
+
Approved by {{ approvedby }}
-
+
diff --git a/components/MessageItemLocation.vue b/components/MessageItemLocation.vue
index 77eaf933..14a2e834 100644
--- a/components/MessageItemLocation.vue
+++ b/components/MessageItemLocation.vue
@@ -21,9 +21,12 @@
}"
itemprop="name"
>
-
{{
- item
- }}
+
{{ item }}
@@ -38,7 +41,8 @@
-
@@ -122,6 +126,11 @@ export default {
}
diff --git a/components/MessageList.vue b/components/MessageList.vue
index 2d10aaa9..c4525d95 100644
--- a/components/MessageList.vue
+++ b/components/MessageList.vue
@@ -16,50 +16,71 @@
>
-
+
+
+
+
+
+
diff --git a/components/MessageModal.vue b/components/MessageModal.vue
index 7fd8872a..34ddb7f4 100644
--- a/components/MessageModal.vue
+++ b/components/MessageModal.vue
@@ -3,6 +3,7 @@
ref="modal"
scrollable
size="lg"
+ no-trap
:fullscreen="showImagesProxy"
class="hide-footer"
body-class="p-0 p-md-3"
@@ -19,64 +20,48 @@
>
-
+
-
+
+
+
+ Back to description
+
+
-
-
-
- View description
-
-
- View description
-
-
-
-
- Close
-
+
+
Close
@@ -95,6 +80,7 @@
ad-unit-path="/22794232631/freegle_product"
ad-id="div-gpt-ad-1691925699378-0"
class="ml-md-2 mr-md-2 mt-md-2 ml-0 mr-0 mt-0"
+ in-modal
@close="hide"
@zoom="showImagesProxy = true"
/>
@@ -108,7 +94,6 @@
-
diff --git a/components/MessagePhotosModal.vue b/components/MessagePhotosModal.vue
index 45ab986a..dd0f131e 100644
--- a/components/MessagePhotosModal.vue
+++ b/components/MessagePhotosModal.vue
@@ -1,7 +1,6 @@
-
+
diff --git a/components/MessageReplySection.vue b/components/MessageReplySection.vue
index b921aac1..274b8b5d 100644
--- a/components/MessageReplySection.vue
+++ b/components/MessageReplySection.vue
@@ -28,6 +28,18 @@
: 'Can you help? If you have what they\'re looking for, let them know.'
"
>
+
+
+ Delivery may be possible
+
+
+
-
+
-
-
@@ -183,6 +186,9 @@ const MicroVolunteeringSimilarTerms = defineAsyncComponent(() =>
const MicroVolunteeringSurvey = defineAsyncComponent(() =>
import('./MicroVolunteeringSurvey')
)
+const MicroVolunteeringInvite = defineAsyncComponent(() =>
+ import('./MicroVolunteeringInvite')
+)
export default {
components: {
@@ -191,6 +197,7 @@ export default {
MicroVolunteeringSimilarTerms,
MicroVolunteeringFacebook,
MicroVolunteeringSurvey,
+ MicroVolunteeringInvite,
},
props: {
force: {
@@ -203,7 +210,7 @@ export default {
const microVolunteeringStore = useMicroVolunteeringStore()
const miscStore = useMiscStore()
const authStore = useAuthStore()
- const debug = true
+ const debug = false
if (debug) {
miscStore.set({
@@ -228,17 +235,26 @@ export default {
// already declined and b) we couldn't save a decline.
const lastAsk = miscStore.get('microvolunteeringlastask')
const askDue =
- !lastAsk || Date.now() - new Date(lastAsk).getTime() > 60 * 60 * 1000
+ !lastAsk ||
+ Date.now() - new Date(lastAsk).getTime() > 60 * 60 * 1000 ||
+ debug
// Check if we're on a group with microvolunteering enabled.
- let allowed = false
+ let allowed = debug
authStore.groups.forEach((g) => {
if (g.microvolunteeringallowed) {
allowed = true
}
})
- console.log('Ask due', askDue)
+ console.log(
+ 'Ask due',
+ askDue,
+ props.force,
+ allowed,
+ daysago,
+ me?.trustlevel
+ )
if (!allowed) {
// Not on a group with this function enabled.
@@ -249,12 +265,12 @@ export default {
} else if (props.force) {
// Forced. Get task in mounted().
fetchTask.value = true
- } else if (daysago > 7) {
+ } else if (daysago > 7 || debug) {
// They're not a new member. We might want to ask them.
- if (me?.trustlevel === 'Declined') {
+ if (me?.trustlevel === 'Declined' && !debug) {
// We're not forced to do this, and they've said they don't want to.
emit('verified')
- } else if (inviteAccepted.value) {
+ } else if (inviteAccepted.value || debug) {
// They're up for this. Get a task in mounted().
fetchTask.value = true
} else {
@@ -281,7 +297,7 @@ export default {
message: null,
todo: 5,
done: 0,
- types: ['CheckMessage', 'PhotoRotate', 'Survey2'],
+ types: ['CheckMessage', 'PhotoRotate', 'Survey2', 'Invite'],
bump: 1,
}
},
@@ -315,6 +331,8 @@ export default {
this.showTask = true
} else if (this.task.type === 'Survey2') {
this.showTask = true
+ } else if (this.task.type === 'Invite') {
+ this.showTask = true
} else {
this.doneForNow()
}
diff --git a/components/MicroVolunteeringInvite.vue b/components/MicroVolunteeringInvite.vue
new file mode 100644
index 00000000..7fa4432e
--- /dev/null
+++ b/components/MicroVolunteeringInvite.vue
@@ -0,0 +1,50 @@
+
+
+
+ Freegle spreads by word of mouth . Maybe you've got
+ friends, family or work colleagues who've never heard of us, and who could
+ help themseves or others by freegling?
+
+
+ A personal recommendation is worth a thousand online ads - and anyway, we
+ can't afford a thousand online ads!
+
+
+ Could you help spread the word? Personalise your message and send it using
+ the buttons below.
+
+
+
+ Skip
+
+
+
+
diff --git a/components/MyMessage.vue b/components/MyMessage.vue
index 4e5e0ee8..1381d09b 100644
--- a/components/MyMessage.vue
+++ b/components/MyMessage.vue
@@ -8,16 +8,16 @@
:border-variant="expanded ? 'success' : 'secondary'"
>
-
+
This post has
not been accepted and is not public yet.
-
+
@@ -604,10 +602,8 @@ export default {
this.visible = isVisible
}
},
- toggle() {
- this.expanded = !this.expanded
- },
showPhotos() {
+ console.log('Show photos')
this.showMessagePhotosModal = true
},
countUnseen(reply) {
diff --git a/components/MyMessageReply.vue b/components/MyMessageReply.vue
index 89d44eb9..3b05d580 100644
--- a/components/MyMessageReply.vue
+++ b/components/MyMessageReply.vue
@@ -4,27 +4,27 @@
-
-
-
- Nearby
-
-
-
-
- Good rating
-
-
-
-
- Quick reply
-
-
-
+
+
+
+
+ Nearby
+
+
+
+
+ Good rating
+
+
+
+ Quick reply
+
+
+
-
-
-
- {{ replyago }}
-
-
-
+
+
{{ chat?.snippet }}...
-
+
{{ chat?.snippet }}...
...
+
+
+ {{ replyago }}
+
+
-
+
@@ -71,6 +74,7 @@
v-else-if="message.type === 'Offer' && !taken && !withdrawn"
variant="primary"
class="align-middle mt-1 mb-1 mr-2"
+ :size="buttonSize"
@click="promise"
>
Promise
@@ -78,6 +82,7 @@
@@ -116,6 +121,7 @@ import { useChatStore } from '../stores/chat'
import { useRouter } from '#imports'
import SupporterInfo from '~/components/SupporterInfo'
import { timeago, datelocale } from '~/composables/useTimeFormat'
+import { useMiscStore } from '~/stores/misc'
const UserRatings = defineAsyncComponent(() =>
import('~/components/UserRatings')
@@ -178,6 +184,7 @@ export default {
const userStore = useUserStore()
const messageStore = useMessageStore()
const chatStore = useChatStore()
+ const miscStore = useMiscStore()
const promises = []
@@ -203,6 +210,7 @@ export default {
userStore,
messageStore,
chatStore,
+ miscStore,
}
},
data() {
@@ -247,6 +255,10 @@ export default {
return false
},
+ buttonSize() {
+ const breakpoint = this.miscStore.breakpoint
+ return breakpoint === 'xs' || breakpoint === 'sm' ? 'sm' : 'md'
+ },
},
methods: {
openChat() {
@@ -276,8 +288,11 @@ export default {
padding-right: 4px;
word-wrap: break-word;
line-height: 1.5;
- font-size: 125%;
font-weight: bold;
+
+ @include media-breakpoint-up(md) {
+ font-size: 125%;
+ }
}
.unpromise__slash {
@@ -293,21 +308,21 @@ export default {
.user {
grid-row: 1 / 2;
- grid-column: 1 / 3;
+ grid-column: 1 / 2;
align-self: start;
font-size: 150%;
}
.badges {
grid-row: 2 / 3;
- grid-column: 2 / 3;
- align-self: end;
+ grid-column: 1 / 3;
+ justify-self: end;
}
.ratings {
- grid-row: 2 / 3;
- grid-column: 1 / 2;
- justify-self: start;
+ grid-row: 1 / 2;
+ grid-column: 2 / 3;
+ align-self: end;
margin-top: 0.5rem;
margin-right: 0.5rem;
}
diff --git a/components/MyMessageReplyUser.vue b/components/MyMessageReplyUser.vue
index c638b169..83105bbc 100644
--- a/components/MyMessageReplyUser.vue
+++ b/components/MyMessageReplyUser.vue
@@ -76,7 +76,7 @@ const replyuser = computed(() => {
.truncatename {
white-space: nowrap;
- max-width: 32rem;
+ max-width: 11rem;
overflow: hidden;
text-overflow: ellipsis;
line-height: normal;
diff --git a/components/NationalReuseDayBox.vue b/components/NationalReuseDayBox.vue
new file mode 100644
index 00000000..a7deb4db
--- /dev/null
+++ b/components/NationalReuseDayBox.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+ {{ description }}
+
+
+
+
+
+
diff --git a/components/NavbarDesktop.vue b/components/NavbarDesktop.vue
index 7c0dc30e..90ec34fa 100644
--- a/components/NavbarDesktop.vue
+++ b/components/NavbarDesktop.vue
@@ -6,6 +6,13 @@
>
+
-
-
- Events
+
+
+
+
+ Events
+
@@ -147,10 +164,19 @@
class="nav-link text-center small p-0"
to="/volunteerings"
@mousedown="maybeReload('/volunteerings')"
- >
-
-
- Volunteer
+ >
+
+
+
+ {{ volunteerOpportunityCount }}
+
+ Volunteer
+
@@ -251,6 +277,10 @@ const {
activePostsCountPlural,
newsCount,
newsCountPlural,
+ communityEventCount,
+ communityEventCountPlural,
+ volunteerOpportunityCount,
+ volunteerOpportunityCountPlural,
browseCount,
browseCountPlural,
showAboutMeModal,
@@ -271,4 +301,9 @@ const NotificationOptions = defineAsyncComponent(() =>
diff --git a/components/NavbarMobile.vue b/components/NavbarMobile.vue
index 84b3b49f..a2c437db 100644
--- a/components/NavbarMobile.vue
+++ b/components/NavbarMobile.vue
@@ -220,7 +220,7 @@
+
diff --git a/components/NewsMessage.vue b/components/NewsMessage.vue
index 47472728..a8df77c4 100644
--- a/components/NewsMessage.vue
+++ b/components/NewsMessage.vue
@@ -10,8 +10,16 @@
class="font-weight-bold preline forcebreak nopara"
/>
+
import('~/components/NewsShareModal')
)
@@ -97,6 +108,19 @@ export default {
ReadMore,
},
extends: NewsBase,
+ computed: {
+ width() {
+ const miscStore = useMiscStore()
+
+ if (miscStore.breakpoint === 'xs' || miscStore.breakpoint === 'sm') {
+ // Full width image.
+ return process.server ? 400 : window.innerHeight
+ } else {
+ // 400px width image.
+ return 400
+ }
+ },
+ },
}
diff --git a/components/OutcomeBy.vue b/components/OutcomeBy.vue
index 1c24ad0d..b1742674 100644
--- a/components/OutcomeBy.vue
+++ b/components/OutcomeBy.vue
@@ -83,6 +83,7 @@ import { useMessageStore } from '../stores/message'
import UserRatings from './UserRatings'
import NumberIncrementDecrement from './NumberIncrementDecrement'
import { ref } from '#imports'
+import { useUserStore } from '~/stores/user'
export default {
components: { NumberIncrementDecrement, UserRatings },
@@ -121,6 +122,7 @@ export default {
},
async setup(props) {
const messageStore = useMessageStore()
+ const userStore = useUserStore()
if (props.msgid) {
await messageStore.fetch(props.msgid)
@@ -152,6 +154,7 @@ export default {
return {
messageStore,
+ userStore,
initiallySelectedUsers,
currentlySelectedUsers,
selectUser,
@@ -168,7 +171,7 @@ export default {
},
computed: {
repliers() {
- const ret = []
+ let ret = []
if (this.message?.replies) {
this.message.replies.forEach((u) => {
@@ -181,6 +184,26 @@ export default {
})
}
+ // Might be promised to someone who didn't reply - for example if they replied about something else and
+ // then this was added in.
+ if (this.message?.promises) {
+ this.message.promises.forEach((u) => {
+ if (u.userid > 0) {
+ const user = this.userStore.byId(u.userid)
+
+ ret.push({
+ userid: u.userid,
+ displayname: user?.displayname,
+ })
+ }
+ })
+ }
+
+ // Make ret unique by userid
+ ret = ret.filter(
+ (v, i, a) => a.findIndex((t) => t.userid === v.userid) === i
+ )
+
return ret
},
availableUsers() {
@@ -216,6 +239,16 @@ export default {
},
},
watch: {
+ repliers: {
+ handler(newVal) {
+ newVal.forEach((u) => {
+ if (!u.displayname) {
+ this.userStore.fetch(u.userid)
+ }
+ })
+ },
+ immediate: true,
+ },
currentlySelectedUsers: {
handler(newVal) {
this.$emit('tookUsers', newVal)
diff --git a/components/OutcomeModal.vue b/components/OutcomeModal.vue
index 91866194..b1fbc92f 100644
--- a/components/OutcomeModal.vue
+++ b/components/OutcomeModal.vue
@@ -323,7 +323,6 @@ export default {
},
methods: {
took(users) {
- console.log('Took', users)
this.tookUsers = users
},
async submit(callback) {
diff --git a/components/PinchMe.vue b/components/PinchMe.vue
new file mode 100644
index 00000000..f5f4f98f
--- /dev/null
+++ b/components/PinchMe.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/PlaceAutocomplete.vue b/components/PlaceAutocomplete.vue
index 88210d8d..b38215f2 100644
--- a/components/PlaceAutocomplete.vue
+++ b/components/PlaceAutocomplete.vue
@@ -32,12 +32,15 @@
:on-select="select"
:size="30"
variant="success"
+ :on-before-ajax="postcodeSearch"
/>
diff --git a/components/RenegeModal.vue b/components/RenegeModal.vue
index 112f17cf..ba2fa89c 100644
--- a/components/RenegeModal.vue
+++ b/components/RenegeModal.vue
@@ -46,7 +46,6 @@
-
@@ -62,64 +70,25 @@ export default {
@import 'bootstrap/scss/variables';
@import 'bootstrap/scss/mixins/_breakpoints';
@import 'assets/css/sticky-banner.scss';
+@import 'assets/css/navbar.scss';
.sidebar__wrapper {
+ height: calc(
+ 100vh - $sticky-banner-height-desktop - $navbar-height - 75px - 10px
+ );
display: grid;
- grid-template-rows: 1fr;
- grid-template-columns: 100%;
- height: 100vh;
-}
-
-.sidebar__info {
- grid-row: 1 / 2;
- grid-column: 1 / 2;
- display: grid;
- grid-template-rows: 1fr auto 1fr auto 70px;
- grid-template-columns: 1fr;
+ grid-auto-rows: minmax(0, 1fr);
grid-row-gap: 10px;
- height: calc(100vh - 100px);
-}
-
-.sidebar__botleft {
- grid-row: 1 / 2;
- grid-column: 1 / 2;
- display: grid;
- grid-template-rows: 1fr auto;
- height: calc(100vh - 68px);
+ grid-template-columns: minmax(0, 1fr);
+ overflow-y: hidden;
- padding-bottom: $sticky-banner-height-mobile;
-
- @include media-breakpoint-up(md) {
- padding-bottom: $sticky-banner-height-desktop;
- }
-
- .social-media__wrapper {
- grid-row: 2 / 3;
- padding-bottom: 10px;
+ div {
+ border-bottom: 1px lightgrey;
}
}
-.sidebar__community-event {
- grid-row: 1 / 2;
- overflow-y: auto;
- scrollbar-gutter: stable;
-}
-
-.hr1 {
- grid-row: 2 / 3;
-}
-
-.sidebar__volunteer-opportunity {
- grid-row: 3 / 4;
- overflow-y: auto;
- scrollbar-gutter: stable;
-}
-
-.hr2 {
- grid-row: 4 / 5;
-}
-
-.social-media__wrapper {
- grid-row: 5 / 6;
+.sidebar__botleft {
+ position: fixed;
+ bottom: $sticky-banner-height-desktop;
}
diff --git a/components/SidebarRight.vue b/components/SidebarRight.vue
index a3217be0..e9918c15 100644
--- a/components/SidebarRight.vue
+++ b/components/SidebarRight.vue
@@ -1,55 +1,65 @@
-
diff --git a/components/SomethingWentWrong.vue b/components/SomethingWentWrong.vue
index f8c70ae8..8fec0a32 100644
--- a/components/SomethingWentWrong.vue
+++ b/components/SomethingWentWrong.vue
@@ -48,6 +48,7 @@
diff --git a/components/UserRatings.vue b/components/UserRatings.vue
index ec4328e3..8e5cfb7f 100644
--- a/components/UserRatings.vue
+++ b/components/UserRatings.vue
@@ -8,7 +8,7 @@
v-b-tooltip.bottom="uptitle"
:size="size"
:variant="user.info.ratings.Up > 0 ? 'primary' : 'white'"
- :disabled="disabled || user.id === myid ? 'true' : undefined"
+ :disabled="disabled || user.id === myid"
:class="{
mine: user.info.ratings.Mine === 'Up',
'mr-1': true,
@@ -21,7 +21,7 @@
v-b-tooltip.bottom="downtitle"
:size="size"
:variant="user.info.ratings.Down > 0 ? 'warning' : 'white'"
- :disabled="disabled || user.id === myid ? 'true' : undefined"
+ :disabled="disabled || user.id === myid"
:class="{
mine: user.info.ratings.Mine === 'Down',
'ml-1': true,
@@ -31,92 +31,23 @@
{{ user.info.ratings.Down }}
-
-
- You've already given this freegler a
- thumbs up
- thumbs down
- rating. You can only rate each freegler once.
-
- You can remove your rating if you wish, or cancel.
-
-
-
- Please tell us why you're doing this. Your local volunteers may see what
- you put, but the other freegler won't.
-
-
-
- No Show
- Was late or early
- Stopped replying
- Unpleasant behaviour
- Something else
-
-
-
-
- Please give a bit of detail.
-
-
-
-
- Please select a reason and add some detail. Thanks.
-
-
+
+
diff --git a/components/UserRatingsDownModal.vue b/components/UserRatingsDownModal.vue
new file mode 100644
index 00000000..6ebb4235
--- /dev/null
+++ b/components/UserRatingsDownModal.vue
@@ -0,0 +1,103 @@
+
+
+
+ Please tell us why you're doing this. Your local volunteers may see what
+ you put, but the other freegler won't.
+
+
+
+ No Show
+ Was late or early
+ Stopped replying
+ Unpleasant behaviour
+ Something else
+
+
+
+
+ Please give a bit of detail.
+
+
+
+
+ Please select a reason and add some detail. Thanks.
+
+
+
+
diff --git a/components/UserRatingsRemoveModal.vue b/components/UserRatingsRemoveModal.vue
new file mode 100644
index 00000000..663d4739
--- /dev/null
+++ b/components/UserRatingsRemoveModal.vue
@@ -0,0 +1,55 @@
+
+
+
+ You've already given this freegler a
+ thumbs up
+ thumbs down
+ rating. You can only rate each freegler once.
+
+ You can remove your rating if you wish, or cancel.
+
+
+
diff --git a/components/UserSearch.vue b/components/UserSearch.vue
index 9ea96bf7..9bb314a1 100644
--- a/components/UserSearch.vue
+++ b/components/UserSearch.vue
@@ -1,6 +1,6 @@
-
+
{{ search.term }}
{{ searchAgo }}
diff --git a/components/VisualiseList.vue b/components/VisualiseList.vue
index b2b7aa4d..701e8420 100644
--- a/components/VisualiseList.vue
+++ b/components/VisualiseList.vue
@@ -9,6 +9,8 @@
:show-promised="false"
:show-location="false"
class="w-100 mb-2"
+ preload
+ wide
@click.prevent.self
/>
@@ -124,4 +126,22 @@ function doNext() {
.minheight {
min-height: 320px;
}
+
+// Hack MessageSummary to look better in this context.
+:deep {
+ img {
+ width: 100% !important;
+ }
+
+ .header-title {
+ width: 100% !important;
+ }
+
+ .item {
+ a {
+ width: 100% !important;
+ text-align: center;
+ }
+ }
+}
diff --git a/components/VolunteerOpportunity.vue b/components/VolunteerOpportunity.vue
index 0a6500b0..0870772a 100644
--- a/components/VolunteerOpportunity.vue
+++ b/components/VolunteerOpportunity.vue
@@ -88,22 +88,30 @@
More info
-
-
+
+
+
+
+
-
+
+
+
+
+
@@ -313,10 +335,19 @@ export default {
@import 'bootstrap/scss/variables';
@import 'bootstrap/scss/mixins/_breakpoints';
-.square {
- object-fit: cover;
- width: 200px;
- height: 200px;
+.image-wrapper {
+ :deep(img) {
+ object-fit: cover;
+ width: 200px;
+ height: 200px;
+ }
+
+ &.summary {
+ :deep(img) {
+ width: 100%;
+ height: unset;
+ }
+ }
}
.volunteerop__link {
diff --git a/components/VolunteerOpportunityModal.vue b/components/VolunteerOpportunityModal.vue
index c917bf4f..7fff24a9 100644
--- a/components/VolunteerOpportunityModal.vue
+++ b/components/VolunteerOpportunityModal.vue
@@ -39,9 +39,15 @@
+
-
+
-
@@ -410,7 +415,7 @@
:disabled="uploadingPhoto"
@click="dontSave"
>
- Hide
+ Cancel
- {{ tick }}{{ scale }}
+ {{ scale }}{{ tick }}
diff --git a/composables/useCompose.js b/composables/useCompose.js
index a9259462..9b571639 100644
--- a/composables/useCompose.js
+++ b/composables/useCompose.js
@@ -251,16 +251,27 @@ export async function freegleIt(type, router) {
const params = {
newuser: null,
newpassword: null,
+ ids: [],
+ type,
}
await results.forEach(async (res) => {
+ console.log('Consider result', res, type)
+ if (type === 'Offer' && res.id) {
+ params.ids.push(res.id)
+ }
+
if (res.newuser) {
params.newuser = res.newuser
params.newpassword = res.newpassword
- // Fetch the session so that we know we're logged in, and so that we have permission to fetch messages
+ // Make sure we're logged in, and so that we have permission to fetch messages
// below.
- await authStore.fetchUser()
+ console.log('Login', composeStore.email)
+ await authStore.login({
+ email: composeStore.email,
+ password: params.newpassword,
+ })
}
})
@@ -268,23 +279,19 @@ export async function freegleIt(type, router) {
if (results.length > 0 && results[0].groupid) {
results.forEach((res) => {
- console.log('Process result', res)
promises.push(messageStore.fetch(res.id))
})
await Promise.all(promises)
-
- router.push({
- name: 'myposts',
- params,
- })
- } else {
- // Was probably already submitted
- console.log('Router', router)
- router.push({
- name: 'myposts',
- })
}
+
+ // We pass the data in the history state to avoid it showing up in the URL.
+ console.log('Navigate to myposts', params)
+ router.push({
+ name: 'myposts',
+ state: params,
+ })
+ console.log('Navigated')
} catch (e) {
console.log('Submit failed', e, e?.response?.data?.ret)
this.submitting = false
diff --git a/composables/useImageProxy.js b/composables/useImageProxy.js
deleted file mode 100644
index 5b5e31ba..00000000
--- a/composables/useImageProxy.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import { useRuntimeConfig } from '#app'
-
-// This allows us to get images from our codebase or servers, but use Uploadcare's caching/resizing options.
-
-export function imageProxy(img, modifiers = {}) {
- const runtimeConfig = useRuntimeConfig()
- const userSite = runtimeConfig.public.USER_SITE
- const imageSite = runtimeConfig.public.IMAGE_SITE
- const proxy = runtimeConfig.public.UPLOADCARE_PROXY
-
- if (!img.startsWith('http')) {
- // Relative URL - point at our own site.
- img = userSite + img
- console.log('now', img, userSite)
- }
-
- let url = ''
-
- if (img.startsWith(userSite) || img.startsWith(imageSite)) {
- // Can proxy these.
- url = proxy + '/'
-
- // Scan each modifier and add to the URL.
- for (const key in modifiers) {
- if (modifiers[key]) {
- url += `-/${key}/${modifiers[key]}`
- }
- }
-
- url += '/' + img
- }
-
- console.log('Proxy', url)
- return url
-}
diff --git a/composables/useNavbar.js b/composables/useNavbar.js
index e13d682c..6365707c 100644
--- a/composables/useNavbar.js
+++ b/composables/useNavbar.js
@@ -9,28 +9,61 @@ import { useChatStore } from '../stores/chat'
import { useAuthStore } from '~/stores/auth'
import { fetchMe } from '~/composables/useMe'
import { useRuntimeConfig } from '#app'
+import { TYPING_TIME_INVERVAL } from '~/constants'
+import { useCommunityEventStore } from '~/stores/communityevent'
+import { useVolunteeringStore } from '~/stores/volunteering'
export const navBarHidden = ref(false)
let navBarTimeout = null
-export function setNavBarHidden(hidden) {
- // Hide the navbar when typing.
- //
- // Start a timer to show the navbars again after a delay.
- if (navBarHidden.value !== hidden) {
- navBarHidden.value = hidden
- }
-
+export function clearNavBarTimeout() {
if (navBarTimeout) {
clearTimeout(navBarTimeout)
navBarTimeout = null
}
+}
- if (hidden) {
- navBarTimeout = setTimeout(() => {
- navBarHidden.value = false
- }, 5000)
+export function setNavBarHidden(hideRequest) {
+ // Hide the navbar when typing.
+ //
+ // Start a timer to show the navbars again after a delay.
+ if (navBarHidden.value !== hideRequest) {
+ function maybeHide(hidden) {
+ clearNavBarTimeout()
+
+ if (!hidden) {
+ // If we've been typing recently then we don't want to show the navbar. This stops it sliding up
+ // and obscuring the chat box.
+ const lastTyping = useMiscStore().lastTyping
+ if (
+ lastTyping &&
+ new Date().getTime() - lastTyping < TYPING_TIME_INVERVAL
+ ) {
+ // We're still typing. Keep the navbar hidden and check whether to show it again later.
+ console.log('Still typing - hide navbar')
+ navBarHidden.value = true
+ navBarTimeout = setTimeout(maybeHide, 5000, false)
+ } else {
+ // We're not still typing. We can show the navbar.
+ console.log(
+ 'Not still typing - show',
+ new Date().getTime(),
+ useMiscStore().lastTyping
+ )
+
+ navBarHidden.value = false
+ }
+ } else {
+ // We want to hide the navbar, and start a timer to show it again later if we're not still typing.
+ console.log('Hide now, check later')
+ navBarHidden.value = true
+
+ navBarTimeout = setTimeout(maybeHide, 5000, false)
+ }
+ }
+
+ maybeHide(hideRequest)
}
}
@@ -42,6 +75,8 @@ export function useNavbar() {
const notificationStore = useNotificationStore()
const chatStore = useChatStore()
const logoStore = useLogoStore()
+ const communityEventStore = useCommunityEventStore()
+ const volunteeringStore = useVolunteeringStore()
const route = useRoute()
const router = useRouter()
@@ -117,12 +152,32 @@ export function useNavbar() {
return pluralize('unseen post', messageStore.count, true)
})
- const activePostsCountPlural = ref(() => {
+ const activePostsCountPlural = computed(() => {
return pluralize('open post', activePostsCount.value, {
includeNumber: true,
})
})
+ const communityEventCount = computed(() => {
+ return communityEventStore.count
+ })
+
+ const communityEventCountPlural = computed(() => {
+ return pluralize('community event', communityEventCount.value, {
+ includeNumber: true,
+ })
+ })
+
+ const volunteerOpportunityCount = computed(() => {
+ return volunteeringStore.count
+ })
+
+ const volunteerOpportunityCountPlural = ref(() => {
+ return pluralize('volunteer opportunity', volunteerOpportunityCount.value, {
+ includeNumber: true,
+ })
+ })
+
onMounted(() => {
setTimeout(async () => {
// Look for a custom logo.
@@ -132,7 +187,7 @@ export function useNavbar() {
logo.value = ret.logo.path.replace(/.*logos/, '/logos')
logoFormat.value = 'gif'
}
- }, 5000)
+ }, 500000)
getCounts()
})
@@ -178,11 +233,30 @@ export function useNavbar() {
const settings = me?.settings
const distance = settings?.newsfeedarea || 0
await newsfeedStore.fetchCount(distance, false)
- await messageStore.fetchCount(me?.settings?.browseView, false)
// We might get logged out during awaits.
+ if (!myid.value) {
+ throw new Error('Not logged in')
+ }
+
+ await messageStore.fetchCount(me?.settings?.browseView, false)
+
+ if (!myid.value) {
+ throw new Error('Not logged in')
+ }
+
+ await communityEventStore.fetchList()
+
+ if (!myid.value) {
+ throw new Error('Not logged in')
+ }
+
+ await volunteeringStore.fetchList()
+ if (!myid.value) {
+ throw new Error('Not logged in')
+ }
+
if (
- myid.value &&
route.path !== '/profile/' + myid.value &&
!route.path.includes('/unsubscribe')
) {
@@ -207,7 +281,10 @@ export function useNavbar() {
const runtimeConfig = useRuntimeConfig()
- if (runtimeConfig.public.NETLIFY_DEPLOY_ID) {
+ if (
+ runtimeConfig.public.NETLIFY_DEPLOY_ID &&
+ runtimeConfig.public.NETLIFY_BRANCH === 'production'
+ ) {
try {
const response = await fetch(
`https://api.netlify.com/api/v1/sites/${runtimeConfig.public.NETLIFY_SITE_NAME}.netlify.com`
@@ -263,6 +340,10 @@ export function useNavbar() {
newsCountPlural,
browseCount,
browseCountPlural,
+ communityEventCount,
+ communityEventCountPlural,
+ volunteerOpportunityCount,
+ volunteerOpportunityCountPlural,
showAboutMeModal,
homePage,
showBackButton,
diff --git a/composables/useTimeFormat.js b/composables/useTimeFormat.js
index c60b40b2..5bfc8216 100644
--- a/composables/useTimeFormat.js
+++ b/composables/useTimeFormat.js
@@ -110,6 +110,10 @@ export function dateshort(val) {
return dayjs(val).format('MMM DD, YYYY')
}
+export function dateonlyNoYear(val) {
+ return dayjs(val).format('Do MMMM')
+}
+
export function weekdayshort(val) {
return dayjs(val).format('dddd Do HH:mm a')
}
diff --git a/config.js b/config.js
index a4a9d8b3..766183fd 100644
--- a/config.js
+++ b/config.js
@@ -13,8 +13,13 @@ const CONFIG = {
USER_SITE: 'https://www.ilovefreegle.org',
// This is where images are served from.
+ //
+ // Old:
IMAGE_SITE: 'https://images.ilovefreegle.org',
- UPLOADCARE_PROXY: 'https://61ddd294bd3a390019c6.ucr.io/',
+
+ // Very new. Our own uploader, and delivery of those images via a cached use of wsrl.nl.
+ TUS_UPLOADER: 'https://uploads.ilovefreegle.org:8080',
+ IMAGE_DELIVERY: 'https://delivery.ilovefreegle.org',
// OpenStreetMap Tile Server
OSM_TILE:
@@ -43,6 +48,9 @@ const CONFIG = {
TRUSTPILOT_LINK: process.env.TRUSTPILOT_LINK || null,
+ GOOGLE_ADSENSE_ID: process.env.GOOGLE_ADSENSE_ID,
+ GOOGLE_ADSENSE_TEST_MODE: process.env.GOOGLE_ADSENSE_TEST_MODE,
+
AD_PREBID_CONFIG: [
{
code: '/22794232631/freegle_sticky',
diff --git a/constants.js b/constants.js
index 71583eea..c7912190 100644
--- a/constants.js
+++ b/constants.js
@@ -1,7 +1,9 @@
export const EMAIL_REGEX =
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
export const URL_REGEX =
- /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/g
+ /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/g
+export const POSTCODE_REGEX =
+ /([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\s?[0-9][A-Za-z]{2})/
// These are the most common words in UK addresses.
export const ADDRESS_WORDS = [
diff --git a/layouts/default.vue b/layouts/default.vue
index 96635e58..4cae4d99 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -21,7 +21,7 @@ const LoginModal = defineAsyncComponent(() => import('~/components/LoginModal'))
const runtimeConfig = useRuntimeConfig()
const userSite = runtimeConfig.public.USER_SITE
-const proxy = runtimeConfig.public.UPLOADCARE_PROXY
+const proxy = runtimeConfig.public.IMAGE_DELIVERY
let ready = false
const oneTap = ref(false)
@@ -59,15 +59,17 @@ if (!ready) {
if (proxy) {
// Add the wallpaper background, proxying it from our image CDN.
- // Set background image of wallpaper.png on body
+ const bg =
+ 'background-image: url("' +
+ proxy +
+ '?url=' +
+ userSite +
+ '/wallpaper.png' +
+ '&output=webp")'
+
useHead({
bodyAttrs: {
- style:
- 'background-image: url("' +
- proxy +
- '/-/format/webp/' +
- userSite +
- '/wallpaper.png")',
+ style: bg,
},
})
}
diff --git a/layouts/login.vue b/layouts/login.vue
index efc33fc5..45871c07 100644
--- a/layouts/login.vue
+++ b/layouts/login.vue
@@ -39,6 +39,10 @@ export default {
const jwt = authStore.auth.jwt
const persistent = authStore.auth.persistent
+ const runtimeConfig = useRuntimeConfig()
+ const userSite = runtimeConfig.public.USER_SITE
+ const proxy = runtimeConfig.public.IMAGE_DELIVERY
+
if (jwt || persistent) {
// We have some credentials, which may or may not be valid on the server. If they are, then we can crack on and
// start rendering the page. This will be quicker than waiting for GoogleOneTap to load on the client and tell us
@@ -61,6 +65,23 @@ export default {
oneTap.value = true
}
+ if (proxy) {
+ // Add the wallpaper background, proxying it from our image CDN.
+ const bg =
+ 'background-image: url("' +
+ proxy +
+ '?url=' +
+ userSite +
+ '/wallpaper.png' +
+ '&output=webp")'
+
+ useHead({
+ bodyAttrs: {
+ style: bg,
+ },
+ })
+ }
+
return {
ready,
oneTap,
diff --git a/layouts/no-navbar.vue b/layouts/no-navbar.vue
new file mode 100644
index 00000000..52865a0c
--- /dev/null
+++ b/layouts/no-navbar.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
diff --git a/mixins/me.js b/mixins/me.js
index ab26a5be..b5316161 100644
--- a/mixins/me.js
+++ b/mixins/me.js
@@ -118,10 +118,19 @@ export default {
return ret
},
supporter() {
- return this.me && this.me.supporter
+ return this.me?.supporter
},
donor() {
- return this.me && this.me.donor
+ return this.me?.donated
+ },
+ recentDonor() {
+ const donated = this.me?.donated
+
+ // If donated and within last 31 days
+ return (
+ donated &&
+ new Date(donated) > new Date(Date.now() - 31 * 24 * 60 * 60 * 1000)
+ )
},
amMicroVolunteering() {
return (
diff --git a/mixins/replyToPost.js b/mixins/replyToPost.js
index aa6a23c3..7720e632 100644
--- a/mixins/replyToPost.js
+++ b/mixins/replyToPost.js
@@ -14,6 +14,10 @@ export default {
replyingAt: replyStore.replyingAt,
}
+ // ret.replyMsgId = 108251567
+ // ret.replyMessage = 'I am a reply message'
+ // ret.replyingAt = Date.now()
+
if (
ret &&
ret.replyingAt &&
@@ -53,6 +57,9 @@ export default {
// Double-click can result in coming through here after the reply has been sent and cleared.
// Create the chat and send the first message.
+ const replyStore = useReplyStore()
+ const replySent = this.replyToSend.replyMsgId
+
console.log(
'Now open chat',
this.replyToSend.replyMessage,
@@ -68,14 +75,13 @@ export default {
)
// Clear the store of any message to avoid repeatedly sending it.
- const replyStore = useReplyStore()
replyStore.replyMsgId = null
replyStore.replyMessage = null
replyStore.replyingAt = Date.now()
this.replying = false
- this.$emit('sent')
+ this.$emit('sent', replySent)
})
}
},
diff --git a/nuxt.config.ts b/nuxt.config.ts
index f1fa13cb..c62f271e 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -110,6 +110,7 @@ export default defineNuxtConfig({
'/stories/**': { ssr: false },
'/teams': { ssr: false },
'/adtest': { ssr: false },
+ '/googlepay': { ssr: false },
// Render on demand - may never be shown in a given build - then cache for a while.
'/explore/region/**': { isr: 3600 },
@@ -165,10 +166,19 @@ export default defineNuxtConfig({
modules: [
'@pinia/nuxt',
- 'floating-vue/nuxt',
'@nuxt/image',
'nuxt-vite-legacy',
'@bootstrap-vue-next/nuxt',
+ process.env.GTM_ID ? '@zadigetvoltaire/nuxt-gtm' : null,
+ [
+ '@nuxtjs/google-adsense',
+ {
+ id: process.env.GOOGLE_ADSENSE_ID,
+ test: process.env.GOOGLE_ADSENSE_TEST_MODE === 'true',
+ hideUnfilled: false,
+ pauseOnLoad: true,
+ },
+ ],
],
hooks: {
@@ -196,14 +206,33 @@ export default defineNuxtConfig({
GOOGLE_CLIENT_ID: config.GOOGLE_CLIENT_ID,
USER_SITE: config.USER_SITE,
IMAGE_SITE: config.IMAGE_SITE,
- UPLOADCARE_PROXY: config.UPLOADCARE_PROXY,
SENTRY_DSN: config.SENTRY_DSN,
BUILD_DATE: new Date().toISOString(),
NETLIFY_DEPLOY_ID: process.env.DEPLOY_ID,
NETLIFY_SITE_NAME: process.env.SITE_NAME,
+ NETLIFY_BRANCH: process.env.BRANCH,
MATOMO_HOST: process.env.MATOMO_HOST,
COOKIEYES: config.COOKIEYES,
TRUSTPILOT_LINK: config.TRUSTPILOT_LINK,
+ TUS_UPLOADER: config.TUS_UPLOADER,
+ IMAGE_DELIVERY: config.IMAGE_DELIVERY,
+
+ GOOGLE_ADSENSE_ID: config.GOOGLE_ADSENSE_ID,
+ GOOGLE_ADSENSE_TEST_MODE: config.GOOGLE_ADSENSE_TEST_MODE,
+
+ ...(process.env.GTM_ID
+ ? {
+ gtm: {
+ id: process.env.GTM_ID,
+ defer: true,
+ compatibility: true,
+ debug: true,
+ enabled: !!process.env.GTM_ID,
+ enableRouterSync: false,
+ devtools: true,
+ },
+ }
+ : {}),
},
},
@@ -275,6 +304,10 @@ export default defineNuxtConfig({
innerHTML: `try { if (!window.globalThis) { window.globalThis = window; } } catch (e) { console.log('Polyfill error', e.message); }`,
},
// The ecosystem of advertising is complex.
+ //
+ // We might use AdSense. That's fairly simple.
+ //
+ // Or we might use prebid:
// - The underlying ad service is Google Tags (GPT).
// - We use prebid (pbjs), which is some kind of ad broker which gives us a pipeline of ads to use.
// We can also define our own ads in GPT.
@@ -317,7 +350,7 @@ export default defineNuxtConfig({
});
ce_gtag("set", "ads_data_redaction", true);
ce_gtag("set", "url_passthrough", true);
-
+
console.log('Initialising pbjs and googletag...');
window.googletag = window.googletag || {};
window.googletag.cmd = window.googletag.cmd || [];
@@ -331,7 +364,7 @@ export default defineNuxtConfig({
window.googletag.pubads().enableSingleRequest()
window.googletag.enableServices()
});
-
+
window.pbjs = window.pbjs || {};
window.pbjs.que = window.pbjs.que || [];
@@ -446,7 +479,7 @@ export default defineNuxtConfig({
}
}
- function postCookieYes() {
+ window.postCookieYes = function() {
console.log('Consider load of GPT and prebid');
if (!window.weHaveLoadedGPT) {
@@ -458,10 +491,11 @@ export default defineNuxtConfig({
// The ordering is ensured by using defer and appending the script.
//
// prebid isn't compatible with older browsers which don't support Object.entries.
- console.log('Load GPT and prebid');
if (Object.fromEntries) {
- loadScript('https://securepubads.g.doubleclick.net/tag/js/gpt.js', true)
- loadScript('/js/prebid.js', true)
+ // Currently using AdSense so don't need to load GPT and prebid.
+ // console.log('Load GPT and prebid');
+ // loadScript('https://securepubads.g.doubleclick.net/tag/js/gpt.js', true)
+ // loadScript('/js/prebid.js', true)
}
} else {
console.log('GPT and prebid already loaded');
@@ -482,6 +516,8 @@ export default defineNuxtConfig({
// Now we wait until the CookieYes script has set its own cookie.
// This might be later than when the script has loaded in pure JS terms, but we
// need to be sure it's loaded before we can move on.
+ var retries = 10
+
function checkCookieYes() {
if (document.cookie.indexOf('cookieyes-consent') > -1) {
console.log('CookieYes cookie is set, so CookieYes is loaded');
@@ -492,7 +528,7 @@ export default defineNuxtConfig({
window.__tcfapi('getTCData', 2, (tcData, success) => {
if (success && tcData && tcData.tcString) {
console.log('TC data loaded and TC String set');
- postCookieYes();
+ window.postCookieYes();
} else {
console.log('Failed to get TC data or string, retry.')
setTimeout(checkCookieYes, 100);
@@ -503,15 +539,43 @@ export default defineNuxtConfig({
setTimeout(checkCookieYes, 100);
}
} else {
- console.log('CookieYes not yet loaded')
- setTimeout(checkCookieYes, 100);
+ console.log('CookieYes not yet loaded', retries)
+ retries--
+
+ if (retries > 0) {
+ setTimeout(checkCookieYes, 100);
+ } else {
+ // It's not loaded within a reasonable length of time. This may be because it's
+ // blocked by a browser extension. Try to fetch the script here - if this fails with
+ // an exception then it's likely to be because it's blocked.
+ console.log('Try fetching script')
+ fetch('` +
+ config.COOKIEYES +
+ `').then((response) => {
+ console.log('Fetch returned', response)
+
+ if (response.ok) {
+ console.log('Worked, maybe just slow?')
+ retries = 10
+ setTimeout(checkCookieYes, 100);
+ } else {
+ console.log('Failed - assume blocked and proceed')
+ window.postCookieYes()
+ }
+ })
+ .catch((error) => {
+ // Assume blocked and proceed.
+ console.log('Failed to fetch CookieYes script:', error.message)
+ window.postCookieYes()
+ });
+ }
}
}
checkCookieYes();
} else {
console.log('No CookieYes to load')
- postCookieYes();
+ window.postCookieYes();
}
}
@@ -626,32 +690,29 @@ export default defineNuxtConfig({
image: {
uploadcare: {
provider: 'uploadcare',
+ cdnURL: config.UPLOADCARE_CDN,
+ },
- // On some machines we can't resolve ucarecdn.com but can resolve www.ucarecdn.com.
- cdnURL: 'https://www.ucarecdn.com',
+ weserv: {
+ provider: 'weserv',
+ baseURL: config.TUS_UPLOADER,
+ weservURL: config.IMAGE_DELIVERY,
},
// We want sharp images on fancy screens.
densities: [1, 2],
- // Uploadcare only supports images upto 3000. So we drop the top-level screen sizes, which get doubled
- // to produce the images requested.
- //
- // We also want to match the Bootstrap breakpoints.
+ // Uploadcare only supports images upto 3000, and the screen sizes are doubled when requesting because of densities.
+ // So we already need to drop the top-level screen sizes, and we also don't want to request images which are too
+ // large because this affects our charged bandwidth. So we only go up to 768.
screens: {
xs: 320,
sm: 576,
md: 768,
- lg: 992,
- xl: 1200,
- xxl: 1400,
- '2xl': 1400,
- },
-
- providers: {
- uploadcareProxy: {
- provider: '~/providers/uploadcare-proxy.ts',
- },
+ lg: 768,
+ xl: 768,
+ xxl: 768,
+ '2xl': 768,
},
},
})
diff --git a/package-lock.json b/package-lock.json
index 2550e710..9e9b6b33 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,6 +6,7 @@
"": {
"hasInstallScript": true,
"dependencies": {
+ "@algorithm.ts/lcs": "^4.0.3",
"@capacitor/android": "^3.4.3",
"@capacitor/core": "^3.4.3",
"@chenfengyuan/vue-number-input": "^2.0.1",
@@ -15,6 +16,8 @@
"@fortawesome/free-brands-svg-icons": "^6.2.0",
"@fortawesome/free-solid-svg-icons": "^6.1.1",
"@fortawesome/vue-fontawesome": "^3.0.0-5",
+ "@google-pay/button-element": "^3.1.0",
+ "@nuxtjs/google-adsense": "^3.0.0",
"@nuxtjs/sentry": "^5.1.7",
"@pinia/nuxt": "^0.4.6",
"@popperjs/core": "^2.11.4",
@@ -22,7 +25,16 @@
"@sentry/tracing": "^7.17.3",
"@sentry/vite-plugin": "^2.7.0",
"@sentry/vue": "^7.64.0",
- "@uploadcare/blocks": "^0.41",
+ "@uppy/compressor": "^2.0.0",
+ "@uppy/core": "^4.0.1",
+ "@uppy/dashboard": "^4.0.1",
+ "@uppy/drag-drop": "^4.0.1",
+ "@uppy/file-input": "^4.0.0",
+ "@uppy/progress-bar": "^4.0.0",
+ "@uppy/status-bar": "^4.0.0",
+ "@uppy/tus": "^4.0.0",
+ "@uppy/vue": "^2.0.0",
+ "@uppy/webcam": "^4.0.0",
"@vee-validate/rules": "^4.7.1",
"@vitejs/plugin-legacy": "^5.2.0",
"@vue/cli-plugin-eslint": "^5.0.4",
@@ -31,7 +43,7 @@
"@vuelidate/validators": "^2.0.0-alpha.29",
"autoprefixer": "10.4.5",
"bootstrap": "5.3.1",
- "bootstrap-vue-next": "^0.22.1",
+ "bootstrap-vue-next": "^0.24.1",
"core-js": "^3.33.0",
"dayjs": "^1.11.0",
"eslint-plugin-import": "^2.27.5",
@@ -47,6 +59,7 @@
"lodash.clonedeep": "^4.5.0",
"lodash.get": "^4.4.2",
"mitt": "^3.0.0",
+ "object.hasown": "github:es-shims/Object.hasOwn",
"patch-package": "^6.4.7",
"path-browserify": "^1.0.1",
"pinia": "^2.0.17",
@@ -79,15 +92,16 @@
"vue3-popper": "^1.5.0",
"vuedraggable": "^4.1.0",
"wicket": "^1.3.8",
- "zoompinch": "^0.0.37"
+ "zoompinch": "^0.0.38"
},
"devDependencies": {
- "@bootstrap-vue-next/nuxt": "^0.22.1",
+ "@bootstrap-vue-next/nuxt": "^0.24.1",
"@capacitor/cli": "^3.4.3",
"@nuxt/image": "^1.5.0",
"@nuxtjs/eslint-config": "^12.0.0",
"@nuxtjs/eslint-module": "^4.0.2",
"@vue-leaflet/vue-leaflet": "^0.6.1",
+ "@zadigetvoltaire/nuxt-gtm": "^0.0.13",
"eslint": "^8.36.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
@@ -120,6 +134,11 @@
"node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20 || 21 || 22"
}
},
+ "node_modules/@algorithm.ts/lcs": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@algorithm.ts/lcs/-/lcs-4.0.3.tgz",
+ "integrity": "sha512-2semarX30cyk+Vdw9RXKdp7n3/1l1EJx7xJx0qBBPgwg9FokSR+NHPR1ucphl+lbbrvLkuyTjqcKRd1wAel/HA=="
+ },
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -133,9 +152,9 @@
}
},
"node_modules/@antfu/utils": {
- "version": "0.7.8",
- "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.8.tgz",
- "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==",
+ "version": "0.7.10",
+ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz",
+ "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/antfu"
@@ -1841,19 +1860,73 @@
}
},
"node_modules/@bootstrap-vue-next/nuxt": {
- "version": "0.22.1",
- "resolved": "https://registry.npmjs.org/@bootstrap-vue-next/nuxt/-/nuxt-0.22.1.tgz",
- "integrity": "sha512-hZF0xs68FDYWK8cfhf1KMHnjeYGNvQnvML38kVEr/hLdrJyW0QX4sw0mSJdynb+rOWUX/yNgsJ/nH3YsuuDLgQ==",
+ "version": "0.24.1",
+ "resolved": "https://registry.npmjs.org/@bootstrap-vue-next/nuxt/-/nuxt-0.24.1.tgz",
+ "integrity": "sha512-gYugCRKEW4l8o1SBS6WZyCAKi4D/LtedfQIqGfY9KaNTi1r+piOR8+TMqOdOgmHb0JAEmf5OSWj83UZpKLq2XA==",
"dev": true,
"dependencies": {
- "@nuxt/kit": "^3.11.2"
+ "@nuxt/kit": "^3.12.3"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/bootstrap-vue-next"
},
"peerDependencies": {
- "bootstrap-vue-next": "^0.22.1"
+ "bootstrap-vue-next": "^0.24.1"
+ }
+ },
+ "node_modules/@bootstrap-vue-next/nuxt/node_modules/@nuxt/kit": {
+ "version": "3.12.4",
+ "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.12.4.tgz",
+ "integrity": "sha512-aNRD1ylzijY0oYolldNcZJXVyxdGzNTl+Xd0UYyFQCu9f4wqUZqQ9l+b7arCEzchr96pMK0xdpvLcS3xo1wDcw==",
+ "dev": true,
+ "dependencies": {
+ "@nuxt/schema": "3.12.4",
+ "c12": "^1.11.1",
+ "consola": "^3.2.3",
+ "defu": "^6.1.4",
+ "destr": "^2.0.3",
+ "globby": "^14.0.2",
+ "hash-sum": "^2.0.0",
+ "ignore": "^5.3.1",
+ "jiti": "^1.21.6",
+ "klona": "^2.0.6",
+ "knitwork": "^1.1.0",
+ "mlly": "^1.7.1",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.1.3",
+ "scule": "^1.3.0",
+ "semver": "^7.6.3",
+ "ufo": "^1.5.4",
+ "unctx": "^2.3.1",
+ "unimport": "^3.9.0",
+ "untyped": "^1.4.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/@bootstrap-vue-next/nuxt/node_modules/@nuxt/schema": {
+ "version": "3.12.4",
+ "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.12.4.tgz",
+ "integrity": "sha512-H7FwBV4ChssMaeiLyPdVLOLUa0326ebp3pNbJfGgFt7rSoKh1MmgjorecA8JMxOQZziy3w6EELf4+5cgLh/F1w==",
+ "dev": true,
+ "dependencies": {
+ "compatx": "^0.1.8",
+ "consola": "^3.2.3",
+ "defu": "^6.1.4",
+ "hookable": "^5.5.3",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.1.3",
+ "scule": "^1.3.0",
+ "std-env": "^3.7.0",
+ "ufo": "^1.5.4",
+ "uncrypto": "^0.1.3",
+ "unimport": "^3.9.0",
+ "untyped": "^1.4.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
}
},
"node_modules/@capacitor/android": {
@@ -1912,9 +1985,9 @@
}
},
"node_modules/@cloudflare/kv-asset-handler": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.3.tgz",
- "integrity": "sha512-wpE+WiWW2kUNwNE0xyl4CtTAs+STjGtouHGiZPGRaisGB7eXXdbvfZdOrQJQVKgTxZiNAgVgmc7fj0sUmd8zyA==",
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz",
+ "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==",
"dev": true,
"dependencies": {
"mime": "^3.0.0"
@@ -2374,34 +2447,34 @@
}
},
"node_modules/@floating-ui/core": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz",
- "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==",
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.3.tgz",
+ "integrity": "sha512-1ZpCvYf788/ZXOhRQGFxnYQOVgeU+pi0i+d0Ow34La7qjIXETi6RNswGVKkA6KcDO8/+Ysu2E/CeUmmeEBDvTg==",
"dependencies": {
- "@floating-ui/utils": "^0.2.0"
+ "@floating-ui/utils": "^0.2.3"
}
},
"node_modules/@floating-ui/dom": {
- "version": "1.6.5",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz",
- "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==",
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz",
+ "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==",
"dependencies": {
- "@floating-ui/core": "^1.0.0",
- "@floating-ui/utils": "^0.2.0"
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.4"
}
},
"node_modules/@floating-ui/utils": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
- "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw=="
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz",
+ "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA=="
},
"node_modules/@floating-ui/vue": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.0.6.tgz",
- "integrity": "sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.1.tgz",
+ "integrity": "sha512-cyawjk9etPZPl/RVtMRnWrwtAhWbPVSrRVYARgOzhLIqxr0k2up1APrrFjqP9QwRQ0AwjKSvbWg4YC6jESutow==",
"dependencies": {
- "@floating-ui/dom": "^1.6.1",
- "@floating-ui/utils": "^0.2.1",
+ "@floating-ui/dom": "^1.0.0",
+ "@floating-ui/utils": "^0.2.4",
"vue-demi": ">=0.13.0"
}
},
@@ -2538,10 +2611,21 @@
"vue": ">= 3.0.0 < 4"
}
},
+ "node_modules/@google-pay/button-element": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@google-pay/button-element/-/button-element-3.1.0.tgz",
+ "integrity": "sha512-Utw3ZqsdW3Rz1Rf/4OMlENkuGYJps85HjDS9D5aLeOom9siGOaWYnABQy5AtSAInQvmd1Mx/tPITd0jkGU/SBA==",
+ "dependencies": {
+ "@types/googlepay": "^0.7.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/@grpc/grpc-js": {
- "version": "1.10.9",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.9.tgz",
- "integrity": "sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ==",
+ "version": "1.10.10",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.10.tgz",
+ "integrity": "sha512-HPa/K5NX6ahMoeBv15njAc/sfF4/jmiXLar9UlC2UfHFKZzsCVLc3wbe7+7qua7w9VPh2/L6EBxyAV7/E8Wftg==",
"dev": true,
"dependencies": {
"@grpc/proto-loader": "^0.7.13",
@@ -2610,6 +2694,32 @@
"node": ">=12"
}
},
+ "node_modules/@gtm-support/core": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@gtm-support/core/-/core-2.3.1.tgz",
+ "integrity": "sha512-eD0hndQjhgKm5f/7IA9fZYujmHiVMY+fnYv4mdZSmz5XJQlS4TiTmpdZx2l7I2A9rI9J6Ysz8LpXYYNo/Xq4LQ==",
+ "dev": true
+ },
+ "node_modules/@gtm-support/vue-gtm": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@gtm-support/vue-gtm/-/vue-gtm-2.2.0.tgz",
+ "integrity": "sha512-7nhBTRkTG0mD+7r7JvNalJz++YwszZk0oP1HIY6fCgz6wNKxT6LuiXCqdPrZmNPe/WbPIKuqxGZN5s+i6NZqow==",
+ "dev": true,
+ "dependencies": {
+ "@gtm-support/core": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "vue-router": ">= 4.1.0 < 5.0.0"
+ },
+ "peerDependencies": {
+ "vue": ">= 3.2.0 < 4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vue-router": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -3123,12 +3233,6 @@
"node-pre-gyp": "bin/node-pre-gyp"
}
},
- "node_modules/@mapbox/node-pre-gyp/node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
"node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
@@ -3138,21 +3242,6 @@
"node": ">=8"
}
},
- "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "dev": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/@netlify/functions": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.8.0.tgz",
@@ -3297,193 +3386,6 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/@npmcli/git": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz",
- "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==",
- "dev": true,
- "dependencies": {
- "@npmcli/promise-spawn": "^7.0.0",
- "lru-cache": "^10.0.1",
- "npm-pick-manifest": "^9.0.0",
- "proc-log": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "promise-retry": "^2.0.1",
- "semver": "^7.3.5",
- "which": "^4.0.0"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/git/node_modules/isexe": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
- "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
- "dev": true,
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/@npmcli/git/node_modules/lru-cache": {
- "version": "10.2.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
- "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
- "dev": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/@npmcli/git/node_modules/which": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
- "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
- "dev": true,
- "dependencies": {
- "isexe": "^3.1.1"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
- "engines": {
- "node": "^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/installed-package-contents": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz",
- "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==",
- "dev": true,
- "dependencies": {
- "npm-bundled": "^3.0.0",
- "npm-normalize-package-bin": "^3.0.0"
- },
- "bin": {
- "installed-package-contents": "bin/index.js"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/node-gyp": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz",
- "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==",
- "dev": true,
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/package-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz",
- "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==",
- "dev": true,
- "dependencies": {
- "@npmcli/git": "^5.0.0",
- "glob": "^10.2.2",
- "hosted-git-info": "^7.0.0",
- "json-parse-even-better-errors": "^3.0.0",
- "normalize-package-data": "^6.0.0",
- "proc-log": "^4.0.0",
- "semver": "^7.5.3"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/glob": {
- "version": "10.4.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
- "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
- "dev": true,
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/@npmcli/promise-spawn": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz",
- "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==",
- "dev": true,
- "dependencies": {
- "which": "^4.0.0"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/promise-spawn/node_modules/isexe": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
- "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
- "dev": true,
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/@npmcli/promise-spawn/node_modules/which": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
- "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
- "dev": true,
- "dependencies": {
- "isexe": "^3.1.1"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
- "engines": {
- "node": "^16.13.0 || >=18.0.0"
- }
- },
"node_modules/@npmcli/redact": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz",
@@ -3493,47 +3395,6 @@
"node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/@npmcli/run-script": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz",
- "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==",
- "dev": true,
- "dependencies": {
- "@npmcli/node-gyp": "^3.0.0",
- "@npmcli/package-json": "^5.0.0",
- "@npmcli/promise-spawn": "^7.0.0",
- "node-gyp": "^10.0.0",
- "proc-log": "^4.0.0",
- "which": "^4.0.0"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/run-script/node_modules/isexe": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
- "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
- "dev": true,
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/@npmcli/run-script/node_modules/which": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
- "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
- "dev": true,
- "dependencies": {
- "isexe": "^3.1.1"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
- "engines": {
- "node": "^16.13.0 || >=18.0.0"
- }
- },
"node_modules/@nuxt/devalue": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz",
@@ -3541,14 +3402,14 @@
"dev": true
},
"node_modules/@nuxt/devtools": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-1.3.6.tgz",
- "integrity": "sha512-M3sRQDKG/iK+iQmvIl9vfEgc/Nv1D6S7GFvhmq1s7ZCSkrmZPGWLxRkIAJOwZk+WnvjYUHkN6XCcoi9a1EWmrA==",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-1.3.7.tgz",
+ "integrity": "sha512-NcC2JMnBRy+C39F7fdN0bOj6HcRQSzS+L8+ZWsqP4RxFby3/R8S7bG6Ji5MeBbHBOo+4nkSfcOd3X+mxJTQ1vA==",
"dev": true,
"dependencies": {
- "@antfu/utils": "^0.7.8",
- "@nuxt/devtools-kit": "1.3.6",
- "@nuxt/devtools-wizard": "1.3.6",
+ "@antfu/utils": "^0.7.10",
+ "@nuxt/devtools-kit": "1.3.7",
+ "@nuxt/devtools-wizard": "1.3.7",
"@nuxt/kit": "^3.12.2",
"@vue/devtools-core": "7.3.3",
"@vue/devtools-kit": "7.3.3",
@@ -3567,9 +3428,9 @@
"launch-editor": "^2.8.0",
"local-pkg": "^0.5.0",
"magicast": "^0.3.4",
+ "npm-registry-fetch": "^17.1.0",
"nypm": "^0.3.8",
"ohash": "^1.1.3",
- "pacote": "^18.0.6",
"pathe": "^1.1.2",
"perfect-debounce": "^1.0.0",
"pkg-types": "^1.1.1",
@@ -3592,9 +3453,9 @@
}
},
"node_modules/@nuxt/devtools-kit": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-1.3.6.tgz",
- "integrity": "sha512-FM0s9CrTxwvaMcakWZc7oGqzSj4GPalcY3PmyZhollMyR2dqBB1n0ZfnTdLm8KUSgc7jdFR6DuG7PfQwAm06tQ==",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-1.3.7.tgz",
+ "integrity": "sha512-TpvlZuooarsaMk9av2shtT6YZzFyFwlo60Qk5BLm5MEJFoGvIIsKjAxmwb3HWMTnoYJ79dTB5FBPEdpR2Qpueg==",
"dev": true,
"dependencies": {
"@nuxt/kit": "^3.12.2",
@@ -3707,9 +3568,9 @@
}
},
"node_modules/@nuxt/devtools-wizard": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-1.3.6.tgz",
- "integrity": "sha512-M6kEkYCC0EsvvNKXXeVSSBDrUMHNkCyq+E8o+8LEPDQvhZ5pOsB6hpxt0DR+2sOE18zAcHSWeSurnwbW7ac4hA==",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-1.3.7.tgz",
+ "integrity": "sha512-W0ncRMeWWrkbBhu3yhk/5PP6hXNgmeKA70Y4lpMe7aNe/Q8Zm5qwILD09DY026AMQoF9m0tswCI6uBvtur/Avg==",
"dev": true,
"dependencies": {
"consola": "^3.2.3",
@@ -5144,6 +5005,16 @@
"eslint": ">=7"
}
},
+ "node_modules/@nuxtjs/google-adsense": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@nuxtjs/google-adsense/-/google-adsense-3.0.0.tgz",
+ "integrity": "sha512-fR1rbj6mnfBCWMkVSocPUYX11rGzTwSs1v2sajG6wtXGjXLGRjJSFKSynYHdwO3V4o4xRvtve0W/Db96eiTKmA==",
+ "dependencies": {
+ "@nuxt/kit": "^3.6.5",
+ "@vueuse/core": "^10.4.1",
+ "defu": "^6.1.2"
+ }
+ },
"node_modules/@nuxtjs/sentry": {
"version": "5.1.7",
"resolved": "https://registry.npmjs.org/@nuxtjs/sentry/-/sentry-5.1.7.tgz",
@@ -6514,9 +6385,9 @@
}
},
"node_modules/@sentry/babel-plugin-component-annotate": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.19.0.tgz",
- "integrity": "sha512-N2k8cMYu/7X6mzAH5j6bMeNcXQBJLL0lVAF63TDS57hUiT1v2uEqbeYFdH2CZBHb2LepLbMRXmvErIwy76FLTw==",
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.20.1.tgz",
+ "integrity": "sha512-4mhEwYTK00bIb5Y9UWIELVUfru587Vaeg0DQGswv4aIRHIiMKLyNqCEejaaybQ/fNChIZOKmvyqXk430YVd7Qg==",
"engines": {
"node": ">= 14"
}
@@ -6541,12 +6412,12 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/bundler-plugin-core": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.19.0.tgz",
- "integrity": "sha512-PGTwpue2k4HnLlCuvLeg+cILPWHJorzheNq8KVlXed8mpb8kxKeY9EWQFxBqPS+XyktOMAxZmCMZfKdnHNaJVQ==",
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.20.1.tgz",
+ "integrity": "sha512-6ipbmGzHekxeRCbp7eoefr6bdd/lW4cNA9eNnrmd9+PicubweGaZZbH2NjhFHsaxzgOezwipDHjrTaap2kTHgw==",
"dependencies": {
"@babel/core": "^7.18.5",
- "@sentry/babel-plugin-component-annotate": "2.19.0",
+ "@sentry/babel-plugin-component-annotate": "2.20.1",
"@sentry/cli": "^2.22.3",
"dotenv": "^16.3.1",
"find-up": "^5.0.0",
@@ -6913,11 +6784,11 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/vite-plugin": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.19.0.tgz",
- "integrity": "sha512-xmntz/bvRwhhU9q2thZas1vQQch9CLMyD8oCfYlNqN57t5XKhIs2dsCU/uS7HCnxIXuuUb/cZtIS7AXVg16fFA==",
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.20.1.tgz",
+ "integrity": "sha512-IOYAJRcV+Uqn0EL8rxcoCvE77PbtGzKjP+B6iIgDZ229AWbpfbpWY8zHCcufwdDzb5PtgOhWWHT74iAsNyij/A==",
"dependencies": {
- "@sentry/bundler-plugin-core": "2.19.0",
+ "@sentry/bundler-plugin-core": "2.20.1",
"unplugin": "1.0.1"
},
"engines": {
@@ -7053,80 +6924,6 @@
"resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
"integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
},
- "node_modules/@sigstore/bundle": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz",
- "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==",
- "dev": true,
- "dependencies": {
- "@sigstore/protobuf-specs": "^0.3.2"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@sigstore/core": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz",
- "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==",
- "dev": true,
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@sigstore/protobuf-specs": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz",
- "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==",
- "dev": true,
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@sigstore/sign": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz",
- "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==",
- "dev": true,
- "dependencies": {
- "@sigstore/bundle": "^2.3.2",
- "@sigstore/core": "^1.0.0",
- "@sigstore/protobuf-specs": "^0.3.2",
- "make-fetch-happen": "^13.0.1",
- "proc-log": "^4.2.0",
- "promise-retry": "^2.0.1"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@sigstore/tuf": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz",
- "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==",
- "dev": true,
- "dependencies": {
- "@sigstore/protobuf-specs": "^0.3.2",
- "tuf-js": "^2.2.1"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@sigstore/verify": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz",
- "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==",
- "dev": true,
- "dependencies": {
- "@sigstore/bundle": "^2.3.2",
- "@sigstore/core": "^1.1.0",
- "@sigstore/protobuf-specs": "^0.3.2"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
"node_modules/@sinclair/typebox": {
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
@@ -7256,10 +7053,10 @@
"sourcemap-codec": "^1.4.8"
}
},
- "node_modules/@symbiotejs/symbiote": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@symbiotejs/symbiote/-/symbiote-1.11.7.tgz",
- "integrity": "sha512-fUOJwzuldeApJ533YeTdrfnpp4nsA+ss1eiNBodX7RHf4LnhPB2Z9HP4fF3m2YhKYnxK0whjXaKA+wrxTRP5qA=="
+ "node_modules/@transloadit/prettier-bytes": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.4.tgz",
+ "integrity": "sha512-8/SnIF9Q2k52mbjRVAYLranwkaDTLb+O9r4Z/uo8uNw//SjygKvvbF4BHSOuReufaAyum1q13602VcNud25Dfg=="
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
@@ -7269,52 +7066,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/@tufjs/canonical-json": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz",
- "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
- "dev": true,
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@tufjs/models": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz",
- "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==",
- "dev": true,
- "dependencies": {
- "@tufjs/canonical-json": "2.0.0",
- "minimatch": "^9.0.4"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/@tufjs/models/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@tufjs/models/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@types/body-parser": {
"version": "1.19.5",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
@@ -7416,6 +7167,11 @@
"dev": true,
"peer": true
},
+ "node_modules/@types/googlepay": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/@types/googlepay/-/googlepay-0.7.6.tgz",
+ "integrity": "sha512-5003wG+qvf4Ktf1hC9IJuRakNzQov00+Xf09pAWGJLpdOjUrq0SSLCpXX7pwSeTG9r5hrdzq1iFyZcW7WVyr4g=="
+ },
"node_modules/@types/html-minifier-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@@ -7493,9 +7249,9 @@
"peer": true
},
"node_modules/@types/node": {
- "version": "20.14.8",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz",
- "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==",
+ "version": "20.14.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz",
+ "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==",
"dependencies": {
"undici-types": "~5.26.4"
}
@@ -7713,31 +7469,261 @@
"vue": ">=2.7 || >=3"
}
},
- "node_modules/@uploadcare/blocks": {
- "version": "0.41.1",
- "resolved": "https://registry.npmjs.org/@uploadcare/blocks/-/blocks-0.41.1.tgz",
- "integrity": "sha512-xA0GAK/OPWajupUukraEU8jdzisyzkTEdpAlt7QnkqpEfoP9guKLyqncjAyG5ZXU7HyVxmXf9c16xOMneIxTxA==",
+ "node_modules/@uppy/companion-client": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-4.0.0.tgz",
+ "integrity": "sha512-U12JcWApKRgs11ahJo/WJSOlfUNdH24mxGxrQv+x35Y/rLTG62Te9QsHGD0vFa2zSSVrIUm47sHxeqFJfOo9VA==",
+ "dependencies": {
+ "@uppy/utils": "^6.0.0",
+ "namespace-emitter": "^2.0.1",
+ "p-retry": "^6.1.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/companion-client/node_modules/@types/retry": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz",
+ "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow=="
+ },
+ "node_modules/@uppy/companion-client/node_modules/p-retry": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz",
+ "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==",
+ "dependencies": {
+ "@types/retry": "0.12.2",
+ "is-network-error": "^1.0.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@uppy/companion-client/node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@uppy/compressor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/compressor/-/compressor-2.0.0.tgz",
+ "integrity": "sha512-FBjOLZUBNLirQV2jqGlDO4nHwv06LMLFMfxQjrdOLhidBT/dut/znRN43rTQgdjtS955FjuiBDFczjgvOTeqIA==",
+ "dependencies": {
+ "@transloadit/prettier-bytes": "^0.3.4",
+ "@uppy/utils": "^6.0.0",
+ "compressorjs": "^1.2.1",
+ "preact": "^10.5.13",
+ "promise-queue": "^2.2.5"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/core": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@uppy/core/-/core-4.0.1.tgz",
+ "integrity": "sha512-qrWyjvGGrYWJKIrCwLiPrQPl1Pq+TWk+qA3sattxHm1qhqTUjeogkY1HK6wUOq9+kTJe9Fhxfk/mRmcNC5aJkA==",
+ "dependencies": {
+ "@transloadit/prettier-bytes": "^0.3.4",
+ "@uppy/store-default": "^4.0.0",
+ "@uppy/utils": "^6.0.0",
+ "lodash": "^4.17.21",
+ "mime-match": "^1.0.2",
+ "namespace-emitter": "^2.0.1",
+ "nanoid": "^5.0.0",
+ "preact": "^10.5.13"
+ }
+ },
+ "node_modules/@uppy/dashboard": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-4.0.1.tgz",
+ "integrity": "sha512-VODcGB6LnuA+GgN1tq48oqts1EcMRSuh4jy2MuytVJk3x1yvsbtE9L6ROX3AAs9r0WTnMYqqhjRk4oocFyenEQ==",
+ "dependencies": {
+ "@transloadit/prettier-bytes": "^0.3.4",
+ "@uppy/informer": "^4.0.0",
+ "@uppy/provider-views": "^4.0.0",
+ "@uppy/status-bar": "^4.0.0",
+ "@uppy/thumbnail-generator": "^4.0.0",
+ "@uppy/utils": "^6.0.0",
+ "classnames": "^2.2.6",
+ "lodash": "^4.17.21",
+ "memoize-one": "^6.0.0",
+ "nanoid": "^5.0.0",
+ "preact": "^10.5.13",
+ "shallow-equal": "^3.0.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.1"
+ }
+ },
+ "node_modules/@uppy/drag-drop": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-4.0.1.tgz",
+ "integrity": "sha512-YIi//ox0fRmYRlynQ8TcqnxnHzAwvrAxaZcCCXepmzQzpYZH0HbXkjHl6Vht3k+skQvGihX+bjUuu0yB/VZW6w==",
+ "dependencies": {
+ "@uppy/utils": "^6.0.0",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.1"
+ }
+ },
+ "node_modules/@uppy/file-input": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-4.0.0.tgz",
+ "integrity": "sha512-kPFibNVYghsCjGSEiEJYET2TGB5mZjD3PrH5rCqGWrA7FAJXGRHEhMUUYmOEGk1eH2azzICiD60XrunuSVI2PQ==",
+ "dependencies": {
+ "@uppy/utils": "^6.0.0",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/informer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-4.0.0.tgz",
+ "integrity": "sha512-xIiN7vJuBeOtzkPvECCXonGk7Z0hBktKSeq76/LZ2o7HYyDOhC2DdX8g0EBKM1i3TLTp93JVKERXCyuupLKETQ==",
+ "dependencies": {
+ "@uppy/utils": "^6.0.0",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/progress-bar": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-4.0.0.tgz",
+ "integrity": "sha512-hCUjlfGWHlvBPQDO5YBH/8HEr+3+ZEobTblBg0Wbn3ecJSiKkSRi0GkDVp3OMnwfqgK2wm8Ve+tR/5Gds7vE0A==",
+ "dependencies": {
+ "@uppy/utils": "^6.0.0",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/provider-views": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-4.0.0.tgz",
+ "integrity": "sha512-sFRPofSuPQ6pgECi0YR1Ml2eEhyIqaIGKwg8XjzhcfVT1POB5B/evQ/ocYJgZyZ2qb1TAKyzeBRbiSH+2C2Uaw==",
+ "dependencies": {
+ "@uppy/utils": "^6.0.0",
+ "classnames": "^2.2.6",
+ "nanoid": "^5.0.0",
+ "p-queue": "^8.0.0",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/status-bar": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-4.0.0.tgz",
+ "integrity": "sha512-r5b83zsuH1A9Gdx3MCS0EE5k+/K9AYP4JNO0EBSe956gGm76JOfvkNtedIe4Vv49lZVEB4QztzC1bbkHg5TOdw==",
+ "dependencies": {
+ "@transloadit/prettier-bytes": "^0.3.4",
+ "@uppy/utils": "^6.0.0",
+ "classnames": "^2.2.6",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/store-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-4.0.0.tgz",
+ "integrity": "sha512-iUB2C7+6NkXoCh8xp06pyn1xeMtQgRuX9F2ahhrXDwNsD6mwKa5wgsJSnnlmXLD6fKVkfne55dLMalJ1pSIr2Q=="
+ },
+ "node_modules/@uppy/thumbnail-generator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-4.0.0.tgz",
+ "integrity": "sha512-nwgRO/LHLzUqzyB1TDl6g8LNmqtkswXpvRNcPij0gOrPTTWjGY6ULv+ywXYiF5baWF2aGS+K62jJSUGBWonx0w==",
"dependencies": {
- "@symbiotejs/symbiote": "^1.11.7",
- "@uploadcare/image-shrink": "^6.14.1",
- "@uploadcare/upload-client": "^6.14.1"
+ "@uppy/utils": "^6.0.0",
+ "exifr": "^7.0.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/tus": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-4.0.0.tgz",
+ "integrity": "sha512-JEblAGgtciOaO5tmjbbIi+Z4klh/v62lNW7wjW/8r7bRam/zREclbmvBj4eCrNNG/MXyCfTPforgJX/FmZgdmA==",
+ "dependencies": {
+ "@uppy/companion-client": "^4.0.0",
+ "@uppy/utils": "^6.0.0",
+ "tus-js-client": "^4.1.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
+ }
+ },
+ "node_modules/@uppy/utils": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-6.0.0.tgz",
+ "integrity": "sha512-24mvEYlt189setvd0z8l3LJRxiq+W8UAZ3lCHRP1Qzq6rSdd/cVaTiIgV+0ZvNnZMmiEKeKdEcfFG3VeGvE3dg==",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "preact": "^10.5.13"
+ }
+ },
+ "node_modules/@uppy/vue": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/vue/-/vue-2.0.0.tgz",
+ "integrity": "sha512-/HioTkBnAZ1Qru162YjOAwDiON3b0DaZLt0GQb358fOPvoV6ejncZn+Fa8Q0ojv3RuhXhITGcmdUZToHM39Zjw==",
+ "dependencies": {
+ "shallow-equal": "^3.0.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0",
+ "@uppy/dashboard": "^4.0.0",
+ "@uppy/drag-drop": "^4.0.0",
+ "@uppy/file-input": "^4.0.0",
+ "@uppy/progress-bar": "^4.0.0",
+ "@uppy/status-bar": "^4.0.0",
+ "vue": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@uppy/dashboard": {
+ "optional": true
+ },
+ "@uppy/drag-drop": {
+ "optional": true
+ },
+ "@uppy/file-input": {
+ "optional": true
+ },
+ "@uppy/progress-bar": {
+ "optional": true
+ },
+ "@uppy/status-bar": {
+ "optional": true
+ }
}
},
- "node_modules/@uploadcare/image-shrink": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/@uploadcare/image-shrink/-/image-shrink-6.14.1.tgz",
- "integrity": "sha512-r3uu+9xsgqNqL5hvBya7RDDQVPMpTF12C1MRN80O1H6ITVvWLfngtmUbP44qg7YhAraLoynDJlkmHMiHanCw0w=="
- },
- "node_modules/@uploadcare/upload-client": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/@uploadcare/upload-client/-/upload-client-6.14.1.tgz",
- "integrity": "sha512-GvXLq6GGyXHjq7tebfv3IqHFpMzuOSuNPOhwCcNPquUbwoAlTEFPLjB2Ir/EZUuCtTWowluLjo4LPDQwvHbqyA==",
+ "node_modules/@uppy/webcam": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@uppy/webcam/-/webcam-4.0.0.tgz",
+ "integrity": "sha512-dCm5vqA8IHS61CFDX1p3ISLZunLwXJPmaJhMztRfM5S55t1xghAjrJcfMMkKDjYk4UK4IQosWhUVHbFIeZDMrA==",
"dependencies": {
- "form-data": "^4.0.0",
- "ws": "^8.2.3"
+ "@uppy/utils": "^6.0.0",
+ "is-mobile": "^4.0.0",
+ "preact": "^10.5.13"
},
- "engines": {
- "node": ">=16"
+ "peerDependencies": {
+ "@uppy/core": "^4.0.0"
}
},
"node_modules/@vee-validate/rules": {
@@ -9043,15 +9029,27 @@
"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
"integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
},
- "node_modules/abbrev": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
- "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "node_modules/@zadigetvoltaire/nuxt-gtm": {
+ "version": "0.0.13",
+ "resolved": "https://registry.npmjs.org/@zadigetvoltaire/nuxt-gtm/-/nuxt-gtm-0.0.13.tgz",
+ "integrity": "sha512-7SgXtIB8uLdLGJaoUAQSGCSbRnNzplNkNVFKIHaVI4We0vqghstBoVPlJCJ9VdwsfdNyk3/C+Lh1uKpzTrtEuw==",
"dev": true,
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "dependencies": {
+ "@gtm-support/vue-gtm": "^2.0.0",
+ "@nuxt/kit": "^3.5.1",
+ "defu": "^6.1.2",
+ "sirv": "^2.0.3"
+ },
+ "peerDependencies": {
+ "nuxt": "^3.0.0"
}
},
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -9406,9 +9404,9 @@
}
},
"node_modules/archiver-utils/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -9722,11 +9720,6 @@
"integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
"dev": true
},
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -9975,6 +9968,11 @@
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"peer": true
},
+ "node_modules/blueimp-canvas-to-blob": {
+ "version": "3.29.0",
+ "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz",
+ "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg=="
+ },
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
@@ -10069,11 +10067,11 @@
}
},
"node_modules/bootstrap-vue-next": {
- "version": "0.22.1",
- "resolved": "https://registry.npmjs.org/bootstrap-vue-next/-/bootstrap-vue-next-0.22.1.tgz",
- "integrity": "sha512-rzwnKyAvA3ceBXX+AEhhmLUV9GSqyRr68itLg3WF2PeGG3eMsiSYF6BTn6G9XYXqWtVWt7BwYAg17CCVNhLyHQ==",
+ "version": "0.24.1",
+ "resolved": "https://registry.npmjs.org/bootstrap-vue-next/-/bootstrap-vue-next-0.24.1.tgz",
+ "integrity": "sha512-MU0WZ9jE8IT3J52PX/LxGsiJteqI514Cn9CXTv4X5u7lc5u8eDJofMllacxY4uOFKcIpMe7hZslhdKdLaJZmxA==",
"dependencies": {
- "@floating-ui/vue": "^1.0.6",
+ "@floating-ui/vue": "^1.1.1",
"@vueuse/core": "^10.10.0"
},
"funding": {
@@ -10345,9 +10343,9 @@
}
},
"node_modules/cacache/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -10470,9 +10468,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001636",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
- "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
+ "version": "1.0.30001638",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz",
+ "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==",
"funding": [
{
"type": "opencollective",
@@ -10578,6 +10576,11 @@
"integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==",
"dev": true
},
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ },
"node_modules/clean-css": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
@@ -10885,15 +10888,13 @@
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"peer": true
},
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "node_modules/combine-errors": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
+ "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==",
"dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
+ "custom-error-instance": "2.1.1",
+ "lodash.uniqby": "4.5.0"
}
},
"node_modules/commander": {
@@ -11044,6 +11045,26 @@
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"peer": true
},
+ "node_modules/compressorjs": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/compressorjs/-/compressorjs-1.2.1.tgz",
+ "integrity": "sha512-+geIjeRnPhQ+LLvvA7wxBQE5ddeLU7pJ3FsKFWirDw6veY3s9iLxAQEw7lXGHnhCJvBujEQWuNnGzZcvCvdkLQ==",
+ "dependencies": {
+ "blueimp-canvas-to-blob": "^3.29.0",
+ "is-blob": "^2.1.0"
+ }
+ },
+ "node_modules/compressorjs/node_modules/is-blob": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz",
+ "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -11779,6 +11800,11 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
+ "node_modules/custom-error-instance": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz",
+ "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg=="
+ },
"node_modules/data-view-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
@@ -12133,14 +12159,6 @@
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/delegate": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
@@ -12432,9 +12450,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.810",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz",
- "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ=="
+ "version": "1.4.812",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz",
+ "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg=="
},
"node_modules/elementtree": {
"version": "0.1.7",
@@ -12630,9 +12648,9 @@
}
},
"node_modules/es-module-lexer": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz",
- "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg=="
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw=="
},
"node_modules/es-object-atoms": {
"version": "1.0.0",
@@ -13664,6 +13682,11 @@
"which": "bin/which"
}
},
+ "node_modules/exifr": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz",
+ "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw=="
+ },
"node_modules/expand-template": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
@@ -13674,12 +13697,6 @@
"node": ">=6"
}
},
- "node_modules/exponential-backoff": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
- "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==",
- "dev": true
- },
"node_modules/express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
@@ -14090,19 +14107,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -14492,9 +14496,9 @@
}
},
"node_modules/globby": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz",
- "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==",
+ "version": "14.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz",
+ "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==",
"dependencies": {
"@sindresorhus/merge-streams": "^2.1.0",
"fast-glob": "^3.3.2",
@@ -15094,42 +15098,6 @@
"node": ">= 4"
}
},
- "node_modules/ignore-walk": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz",
- "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==",
- "dev": true,
- "dependencies": {
- "minimatch": "^9.0.0"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/ignore-walk/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/ignore-walk/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/image-meta": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.0.tgz",
@@ -15696,6 +15664,11 @@
"integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
"dev": true
},
+ "node_modules/is-mobile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz",
+ "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew=="
+ },
"node_modules/is-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
@@ -15713,6 +15686,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-network-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz",
+ "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -15776,15 +15760,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-primitive": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz",
- "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-reference": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
@@ -16288,13 +16263,9 @@
"peer": true
},
"node_modules/json-parse-even-better-errors": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
- "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
- "dev": true,
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
},
"node_modules/json-schema": {
"version": "0.4.0",
@@ -16811,6 +16782,46 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "node_modules/lodash._baseiteratee": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz",
+ "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==",
+ "dependencies": {
+ "lodash._stringtopath": "~4.8.0"
+ }
+ },
+ "node_modules/lodash._basetostring": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz",
+ "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw=="
+ },
+ "node_modules/lodash._baseuniq": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz",
+ "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==",
+ "dependencies": {
+ "lodash._createset": "~4.0.0",
+ "lodash._root": "~3.0.0"
+ }
+ },
+ "node_modules/lodash._createset": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz",
+ "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA=="
+ },
+ "node_modules/lodash._root": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+ "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ=="
+ },
+ "node_modules/lodash._stringtopath": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz",
+ "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==",
+ "dependencies": {
+ "lodash._basetostring": "~4.12.0"
+ }
+ },
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@@ -16877,11 +16888,25 @@
"integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
"dev": true
},
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+ },
"node_modules/lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
},
+ "node_modules/lodash.uniqby": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz",
+ "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==",
+ "dependencies": {
+ "lodash._baseiteratee": "~4.7.0",
+ "lodash._baseuniq": "~4.6.0"
+ }
+ },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -17117,9 +17142,9 @@
}
},
"node_modules/magic-string-ast": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.6.1.tgz",
- "integrity": "sha512-eczKQUDaBpB/mcEqZZNGEUG1FQNsXCuk3uOrCpu6y7qTygIy6jnpqDa62j9MGKSoqlXhM1lCFQv1THuGDQtvUA==",
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.6.2.tgz",
+ "integrity": "sha512-oN3Bcd7ZVt+0VGEs7402qR/tjgjbM7kPlH/z7ufJnzTLVBzXJITRHOJiwMmmYMgZfdoWQsfQcY+iKlxiBppnMA==",
"dev": true,
"dependencies": {
"magic-string": "^0.30.10"
@@ -17257,6 +17282,11 @@
"node": ">= 4.0.0"
}
},
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+ },
"node_modules/meow": {
"version": "13.2.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
@@ -17337,6 +17367,19 @@
"node": ">= 0.6"
}
},
+ "node_modules/mime-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz",
+ "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+ "dependencies": {
+ "wildcard": "^1.1.0"
+ }
+ },
+ "node_modules/mime-match/node_modules/wildcard": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
+ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+ },
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
@@ -17767,11 +17810,15 @@
"thenify-all": "^1.0.0"
}
},
+ "node_modules/namespace-emitter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+ "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+ },
"node_modules/nanoid": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz",
"integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -17904,30 +17951,6 @@
"node": ">= 6.13.0"
}
},
- "node_modules/node-gyp": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz",
- "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==",
- "dev": true,
- "dependencies": {
- "env-paths": "^2.2.0",
- "exponential-backoff": "^3.1.1",
- "glob": "^10.3.10",
- "graceful-fs": "^4.2.6",
- "make-fetch-happen": "^13.0.0",
- "nopt": "^7.0.0",
- "proc-log": "^3.0.0",
- "semver": "^7.3.5",
- "tar": "^6.1.2",
- "which": "^4.0.0"
- },
- "bin": {
- "node-gyp": "bin/node-gyp.js"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
"node_modules/node-gyp-build": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz",
@@ -17939,128 +17962,48 @@
"node-gyp-build-test": "build-test.js"
}
},
- "node_modules/node-gyp/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/node-gyp/node_modules/glob": {
- "version": "10.4.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
- "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
- "dev": true,
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/node-gyp/node_modules/isexe": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
- "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
- "dev": true,
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/node-gyp/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/node-gyp/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/node-gyp/node_modules/proc-log": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
- "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
- "dev": true,
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/node-gyp/node_modules/which": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
- "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
- "dev": true,
- "dependencies": {
- "isexe": "^3.1.1"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
- "engines": {
- "node": "^16.13.0 || >=18.0.0"
- }
- },
"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=="
},
"node_modules/nopt": {
- "version": "7.2.1",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
- "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
"dev": true,
"dependencies": {
- "abbrev": "^2.0.0"
+ "abbrev": "1"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/normalize-package-data": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz",
- "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^7.0.0",
- "is-core-module": "^2.8.1",
- "semver": "^7.3.5",
- "validate-npm-package-license": "^3.0.4"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": ">=6"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "bin": {
+ "semver": "bin/semver"
}
},
"node_modules/normalize-path": {
@@ -18091,39 +18034,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/npm-bundled": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz",
- "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==",
- "dev": true,
- "dependencies": {
- "npm-normalize-package-bin": "^3.0.0"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/npm-install-checks": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz",
- "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
- "dev": true,
- "dependencies": {
- "semver": "^7.1.1"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/npm-normalize-package-bin": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
- "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
- "dev": true,
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
"node_modules/npm-package-arg": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz",
@@ -18139,33 +18049,6 @@
"node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/npm-packlist": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz",
- "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==",
- "dev": true,
- "dependencies": {
- "ignore-walk": "^6.0.4"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/npm-pick-manifest": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz",
- "integrity": "sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==",
- "dev": true,
- "dependencies": {
- "npm-install-checks": "^6.0.0",
- "npm-normalize-package-bin": "^3.0.0",
- "npm-package-arg": "^11.0.0",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
"node_modules/npm-registry-fetch": {
"version": "17.1.0",
"resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz",
@@ -18804,31 +18687,31 @@
}
},
"node_modules/nuxt/node_modules/nitropack": {
- "version": "2.9.6",
- "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.9.6.tgz",
- "integrity": "sha512-HP2PE0dREcDIBVkL8Zm6eVyrDd10/GI9hTL00PHvjUM8I9Y/2cv73wRDmxNyInfrx/CJKHATb2U/pQrqpzJyXA==",
+ "version": "2.9.7",
+ "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.9.7.tgz",
+ "integrity": "sha512-aKXvtNrWkOCMsQbsk4A0qQdBjrJ1ZcvwlTQevI/LAgLWLYc5L7Q/YiYxGLal4ITyNSlzir1Cm1D2ZxnYhmpMEw==",
"dev": true,
"dependencies": {
- "@cloudflare/kv-asset-handler": "^0.3.1",
- "@netlify/functions": "^2.6.0",
+ "@cloudflare/kv-asset-handler": "^0.3.4",
+ "@netlify/functions": "^2.8.0",
"@rollup/plugin-alias": "^5.1.0",
- "@rollup/plugin-commonjs": "^25.0.7",
+ "@rollup/plugin-commonjs": "^25.0.8",
"@rollup/plugin-inject": "^5.0.5",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.2.3",
- "@rollup/plugin-replace": "^5.0.5",
+ "@rollup/plugin-replace": "^5.0.7",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/pluginutils": "^5.1.0",
"@types/http-proxy": "^1.17.14",
- "@vercel/nft": "^0.26.4",
+ "@vercel/nft": "^0.26.5",
"archiver": "^7.0.1",
- "c12": "^1.10.0",
+ "c12": "^1.11.1",
"chalk": "^5.3.0",
"chokidar": "^3.6.0",
"citty": "^0.1.6",
"consola": "^3.2.3",
"cookie-es": "^1.1.0",
- "croner": "^8.0.1",
+ "croner": "^8.0.2",
"crossws": "^0.2.4",
"db0": "^0.1.4",
"defu": "^6.1.4",
@@ -18840,40 +18723,39 @@
"fs-extra": "^11.2.0",
"globby": "^14.0.1",
"gzip-size": "^7.0.0",
- "h3": "^1.11.1",
+ "h3": "^1.12.0",
"hookable": "^5.5.3",
"httpxy": "^0.1.5",
- "ioredis": "^5.3.2",
- "is-primitive": "^3.0.1",
- "jiti": "^1.21.0",
+ "ioredis": "^5.4.1",
+ "jiti": "^1.21.6",
"klona": "^2.0.6",
"knitwork": "^1.1.0",
"listhen": "^1.7.2",
- "magic-string": "^0.30.8",
- "mime": "^4.0.1",
- "mlly": "^1.6.1",
+ "magic-string": "^0.30.10",
+ "mime": "^4.0.3",
+ "mlly": "^1.7.1",
"mri": "^1.2.0",
"node-fetch-native": "^1.6.4",
"ofetch": "^1.3.4",
"ohash": "^1.1.3",
- "openapi-typescript": "^6.7.5",
+ "openapi-typescript": "^6.7.6",
"pathe": "^1.1.2",
"perfect-debounce": "^1.0.0",
- "pkg-types": "^1.0.3",
+ "pkg-types": "^1.1.1",
"pretty-bytes": "^6.1.1",
"radix3": "^1.1.2",
- "rollup": "^4.13.2",
+ "rollup": "^4.18.0",
"rollup-plugin-visualizer": "^5.12.0",
"scule": "^1.3.0",
- "semver": "^7.6.0",
- "serve-placeholder": "^2.0.1",
+ "semver": "^7.6.2",
+ "serve-placeholder": "^2.0.2",
"serve-static": "^1.15.0",
"std-env": "^3.7.0",
"ufo": "^1.5.3",
"uncrypto": "^0.1.3",
"unctx": "^2.3.1",
"unenv": "^1.9.0",
- "unimport": "^3.7.1",
+ "unimport": "^3.7.2",
"unstorage": "^1.10.2",
"unwasm": "^0.3.9"
},
@@ -19257,6 +19139,22 @@
"node": ">= 0.4"
}
},
+ "node_modules/object.hasown": {
+ "version": "1.1.4",
+ "resolved": "git+ssh://git@github.com/es-shims/Object.hasOwn.git#150c494eb2450c03c6d023b66587413b3bd20e3a",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/object.values": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
@@ -19566,6 +19464,26 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/p-queue": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz",
+ "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==",
+ "dependencies": {
+ "eventemitter3": "^5.0.1",
+ "p-timeout": "^6.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue/node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
+ },
"node_modules/p-retry": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
@@ -19588,6 +19506,17 @@
"node": ">= 4"
}
},
+ "node_modules/p-timeout": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz",
+ "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -19602,58 +19531,6 @@
"integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
"dev": true
},
- "node_modules/pacote": {
- "version": "18.0.6",
- "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz",
- "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==",
- "dev": true,
- "dependencies": {
- "@npmcli/git": "^5.0.0",
- "@npmcli/installed-package-contents": "^2.0.1",
- "@npmcli/package-json": "^5.1.0",
- "@npmcli/promise-spawn": "^7.0.0",
- "@npmcli/run-script": "^8.0.0",
- "cacache": "^18.0.0",
- "fs-minipass": "^3.0.0",
- "minipass": "^7.0.2",
- "npm-package-arg": "^11.0.0",
- "npm-packlist": "^8.0.0",
- "npm-pick-manifest": "^9.0.0",
- "npm-registry-fetch": "^17.0.0",
- "proc-log": "^4.0.0",
- "promise-retry": "^2.0.1",
- "sigstore": "^2.2.0",
- "ssri": "^10.0.0",
- "tar": "^6.1.11"
- },
- "bin": {
- "pacote": "bin/index.js"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/pacote/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/pacote/node_modules/ssri": {
- "version": "10.0.6",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
- "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
- "dev": true,
- "dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
"node_modules/pako": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
@@ -19716,11 +19593,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/parse-json/node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- },
"node_modules/parse-path": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz",
@@ -20179,12 +20051,12 @@
}
},
"node_modules/pkg-types": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz",
- "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz",
+ "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==",
"dependencies": {
"confbox": "^0.1.7",
- "mlly": "^1.7.0",
+ "mlly": "^1.7.1",
"pathe": "^1.1.2"
}
},
@@ -20849,6 +20721,15 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/preact": {
+ "version": "10.22.1",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz",
+ "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
"node_modules/prebuild-install": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz",
@@ -21028,11 +20909,13 @@
"webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0"
}
},
- "node_modules/promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
- "dev": true
+ "node_modules/promise-queue": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz",
+ "integrity": "sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
"node_modules/promise-retry": {
"version": "2.0.1",
@@ -21069,6 +20952,16 @@
"node": ">=6"
}
},
+ "node_modules/proper-lockfile": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+ "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
"node_modules/protobufjs": {
"version": "7.3.2",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz",
@@ -21163,6 +21056,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -21385,30 +21283,6 @@
"node": ">=8"
}
},
- "node_modules/read-pkg/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
- },
- "node_modules/read-pkg/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "bin": {
- "semver": "bin/semver"
- }
- },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -21656,8 +21530,7 @@
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "peer": true
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
"node_modules/resize-observer-polyfill": {
"version": "1.5.1",
@@ -21712,7 +21585,6 @@
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
"integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
- "dev": true,
"engines": {
"node": ">= 4"
}
@@ -22089,9 +21961,9 @@
}
},
"node_modules/semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"bin": {
"semver": "bin/semver.js"
},
@@ -22313,6 +22185,11 @@
"node": ">=8"
}
},
+ "node_modules/shallow-equal": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz",
+ "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg=="
+ },
"node_modules/sharp": {
"version": "0.32.6",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
@@ -22409,23 +22286,6 @@
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
},
- "node_modules/sigstore": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz",
- "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==",
- "dev": true,
- "dependencies": {
- "@sigstore/bundle": "^2.3.2",
- "@sigstore/core": "^1.0.0",
- "@sigstore/protobuf-specs": "^0.3.2",
- "@sigstore/sign": "^2.3.2",
- "@sigstore/tuf": "^2.3.4",
- "@sigstore/verify": "^1.2.1"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
"node_modules/simple-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
@@ -23724,20 +23584,6 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
"integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
},
- "node_modules/tuf-js": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz",
- "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==",
- "dev": true,
- "dependencies": {
- "@tufjs/models": "2.0.1",
- "debug": "^4.3.4",
- "make-fetch-happen": "^13.0.1"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -23784,6 +23630,34 @@
"turf-point": "bin/point.js"
}
},
+ "node_modules/tus-js-client": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-4.1.0.tgz",
+ "integrity": "sha512-e/nC/kJahvNYBcnwcqzuhFIvVELMMpbVXIoOOKdUn74SdQCvJd2JjqV2jZLv2EFOVbV4qLiO0lV7BxBXF21b6Q==",
+ "dependencies": {
+ "buffer-from": "^1.1.2",
+ "combine-errors": "^3.0.3",
+ "is-stream": "^2.0.0",
+ "js-base64": "^3.7.2",
+ "lodash.throttle": "^4.1.1",
+ "proper-lockfile": "^4.1.2",
+ "url-parse": "^1.5.7"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tus-js-client/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/twemoji": {
"version": "14.0.2",
"resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz",
@@ -23942,9 +23816,9 @@
}
},
"node_modules/ufo": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz",
- "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw=="
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
+ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="
},
"node_modules/ultrahtml": {
"version": "1.5.3",
@@ -24103,23 +23977,34 @@
}
},
"node_modules/unimport": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.7.2.tgz",
- "integrity": "sha512-91mxcZTadgXyj3lFWmrGT8GyoRHWuE5fqPOjg5RVtF6vj+OfM5G6WCzXjuYtSgELE5ggB34RY4oiCSEP8I3AHw==",
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.9.0.tgz",
+ "integrity": "sha512-H2ftTISja1BonUVdOKRos6HC6dqYDR40dQTZY3zIDJ/5/z4ihncuL0LqLvtxYqUDMib41eAtunQUhXIWTCZ8rA==",
"dependencies": {
"@rollup/pluginutils": "^5.1.0",
- "acorn": "^8.11.3",
+ "acorn": "^8.12.1",
"escape-string-regexp": "^5.0.0",
"estree-walker": "^3.0.3",
"fast-glob": "^3.3.2",
"local-pkg": "^0.5.0",
"magic-string": "^0.30.10",
- "mlly": "^1.7.0",
+ "mlly": "^1.7.1",
"pathe": "^1.1.2",
- "pkg-types": "^1.1.1",
+ "pkg-types": "^1.1.3",
"scule": "^1.3.0",
"strip-literal": "^2.1.0",
- "unplugin": "^1.10.1"
+ "unplugin": "^1.11.0"
+ }
+ },
+ "node_modules/unimport/node_modules/acorn": {
+ "version": "8.12.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+ "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
}
},
"node_modules/unimport/node_modules/escape-string-regexp": {
@@ -24157,9 +24042,9 @@
}
},
"node_modules/unimport/node_modules/unplugin": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz",
- "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.11.0.tgz",
+ "integrity": "sha512-3r7VWZ/webh0SGgJScpWl2/MRCZK5d3ZYFcNaeci/GQ7Teop7zf0Nl2pUuz7G21BwPd9pcUPOC5KmJ2L3WgC5g==",
"dependencies": {
"acorn": "^8.11.3",
"chokidar": "^3.6.0",
@@ -24439,6 +24324,15 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
"node_modules/urlpattern-polyfill": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz",
@@ -24525,9 +24419,9 @@
}
},
"node_modules/vite": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz",
- "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz",
+ "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==",
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.38",
@@ -25618,11 +25512,6 @@
"node": ">=4.0"
}
},
- "node_modules/webpack/node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- },
"node_modules/websocket-driver": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
@@ -26581,9 +26470,9 @@
}
},
"node_modules/zoompinch": {
- "version": "0.0.37",
- "resolved": "https://registry.npmjs.org/zoompinch/-/zoompinch-0.0.37.tgz",
- "integrity": "sha512-vsU3MarPi3e4CuC8XldiTBfsIRV3IRfqFQhet0fodsYWl+bEi2dGqGbOBHRK4bmzoDsu0rev0IqD2rStX7ad8g==",
+ "version": "0.0.38",
+ "resolved": "https://registry.npmjs.org/zoompinch/-/zoompinch-0.0.38.tgz",
+ "integrity": "sha512-s6IxE5YbAO7m6pffj0AjVgUC7mvDukE9MxxsJLrW7MPy0F8vvOxBNcCb/pTzXpqULwN0M1nzJJ3uyJv7irG8WQ==",
"dependencies": {
"@vueuse/core": "^10.9.0"
},
diff --git a/package.json b/package.json
index 09284244..f75d2b38 100644
--- a/package.json
+++ b/package.json
@@ -17,12 +17,13 @@
}
},
"devDependencies": {
- "@bootstrap-vue-next/nuxt": "^0.22.1",
+ "@bootstrap-vue-next/nuxt": "^0.24.1",
"@capacitor/cli": "^3.4.3",
"@nuxt/image": "^1.5.0",
"@nuxtjs/eslint-config": "^12.0.0",
"@nuxtjs/eslint-module": "^4.0.2",
"@vue-leaflet/vue-leaflet": "^0.6.1",
+ "@zadigetvoltaire/nuxt-gtm": "^0.0.13",
"eslint": "^8.36.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
@@ -36,6 +37,7 @@
"vite-plugin-pwa": "^0.17.4"
},
"dependencies": {
+ "@algorithm.ts/lcs": "^4.0.3",
"@capacitor/android": "^3.4.3",
"@capacitor/core": "^3.4.3",
"@chenfengyuan/vue-number-input": "^2.0.1",
@@ -45,6 +47,8 @@
"@fortawesome/free-brands-svg-icons": "^6.2.0",
"@fortawesome/free-solid-svg-icons": "^6.1.1",
"@fortawesome/vue-fontawesome": "^3.0.0-5",
+ "@google-pay/button-element": "^3.1.0",
+ "@nuxtjs/google-adsense": "^3.0.0",
"@nuxtjs/sentry": "^5.1.7",
"@pinia/nuxt": "^0.4.6",
"@popperjs/core": "^2.11.4",
@@ -52,7 +56,16 @@
"@sentry/tracing": "^7.17.3",
"@sentry/vite-plugin": "^2.7.0",
"@sentry/vue": "^7.64.0",
- "@uploadcare/blocks": "^0.41",
+ "@uppy/compressor": "^2.0.0",
+ "@uppy/core": "^4.0.1",
+ "@uppy/dashboard": "^4.0.1",
+ "@uppy/drag-drop": "^4.0.1",
+ "@uppy/file-input": "^4.0.0",
+ "@uppy/progress-bar": "^4.0.0",
+ "@uppy/status-bar": "^4.0.0",
+ "@uppy/tus": "^4.0.0",
+ "@uppy/vue": "^2.0.0",
+ "@uppy/webcam": "^4.0.0",
"@vee-validate/rules": "^4.7.1",
"@vitejs/plugin-legacy": "^5.2.0",
"@vue/cli-plugin-eslint": "^5.0.4",
@@ -61,7 +74,7 @@
"@vuelidate/validators": "^2.0.0-alpha.29",
"autoprefixer": "10.4.5",
"bootstrap": "5.3.1",
- "bootstrap-vue-next": "^0.22.1",
+ "bootstrap-vue-next": "^0.24.1",
"core-js": "^3.33.0",
"dayjs": "^1.11.0",
"eslint-plugin-import": "^2.27.5",
@@ -77,6 +90,7 @@
"lodash.clonedeep": "^4.5.0",
"lodash.get": "^4.4.2",
"mitt": "^3.0.0",
+ "object.hasown": "github:es-shims/Object.hasOwn",
"patch-package": "^6.4.7",
"path-browserify": "^1.0.1",
"pinia": "^2.0.17",
@@ -109,7 +123,7 @@
"vue3-popper": "^1.5.0",
"vuedraggable": "^4.1.0",
"wicket": "^1.3.8",
- "zoompinch": "^0.0.37"
+ "zoompinch": "^0.0.38"
},
"optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "4.6.1"
diff --git a/pages/NationalReuseDay.vue b/pages/NationalReuseDay.vue
new file mode 100644
index 00000000..3582a818
--- /dev/null
+++ b/pages/NationalReuseDay.vue
@@ -0,0 +1,127 @@
+
+
+
+
National Reuse Day 2024
+
Intro text blah blah blah
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/adsoff.vue b/pages/adsoff.vue
new file mode 100644
index 00000000..e46255c5
--- /dev/null
+++ b/pages/adsoff.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+ Love Freegle, Hate Ads?
+
+
+
+ Hate ads? Donate and we'll turn them off for a month.
+
+
+ Our charity is free to use but not free to run. There are some
+ things we have to pay for to keep going. Ads support this - but
+ wouldn't it be nice not to have them?
+
+
+ If you donate, we'll turn ads off for you for a
+ month:
+
+
+
+
+
+
+
Regular monthly donations are especially helpful.
+
+
+
+
+ Right now we've raised enough in donations over the last 24 hours,
+ so ads are off for everyone. Thanks!
+
+
+ You've donated, so ads are off for you.
+
+ Right now we still need £{{ adsOffTarget }} to reach our
+ donation target of £{{ adsOffTargetMax }}
+ over the last 24 hours. Once we reach that, we'll turn ads off for
+ everyone.
+
+
+ Other ways to donate are here .
+
+
+
+
+
+
+
diff --git a/pages/adtest.vue b/pages/adtest.vue
index e91ab66a..6a3e03f8 100644
--- a/pages/adtest.vue
+++ b/pages/adtest.vue
@@ -11,10 +11,8 @@
>
Browse items
-
-
+
-
-
-
@@ -101,10 +89,8 @@
>
diff --git a/pages/chats/[[id]].vue b/pages/chats/[[id]].vue
index bdc7d606..e9eebf78 100644
--- a/pages/chats/[[id]].vue
+++ b/pages/chats/[[id]].vue
@@ -154,7 +154,8 @@
>
@@ -178,36 +179,18 @@
No chats to show.
-
- Please click on a chat in the left pane.
-
-
-
+
-
@@ -250,6 +233,10 @@ const chatStore = useChatStore()
const authStore = useAuthStore()
const miscStore = useMiscStore()
+const stickyAdRendered = computed(() => {
+ return miscStore.stickyAdRendered
+})
+
definePageMeta({
layout: 'login',
})
@@ -318,14 +305,6 @@ const bump = ref(1)
const distance = ref(1000)
const selectedChatId = ref(null)
const showClosed = ref(false)
-const smallAdVisible = ref(false)
-const largeAdVisible = ref(false)
-const noAdsRendered = ref(false)
-const triedAds = ref(false)
-
-const stickyAdRendered = computed(() => {
- return miscStore.stickyAdRendered
-})
const chats = computed(() => {
return chatStore?.list ? chatStore.list : []
@@ -537,20 +516,6 @@ async function searchMore() {
searching.value = null
}
}
-
-function adRendered(rendered, index, dimension) {
- if (rendered) {
- if (index === 0) {
- largeAdVisible.value = true
- } else {
- smallAdVisible.value = true
- }
- } else {
- noAdsRendered.value = true
- }
-
- triedAds.value = true
-}
diff --git a/pages/chitchat/[[id]].vue b/pages/chitchat/[[id]].vue
index 93be7c57..fce8c29d 100644
--- a/pages/chitchat/[[id]].vue
+++ b/pages/chitchat/[[id]].vue
@@ -37,8 +37,18 @@
to each other ;
occasionally we may moderate to ensure things stay friendly.
+
+
-
+
@@ -257,6 +272,7 @@ export default {
startThread: null,
uploading: false,
imageid: null,
+ ouruid: null,
imageuid: null,
imagemods: null,
distance: 1000,
@@ -270,6 +286,9 @@ export default {
}
},
computed: {
+ stickyAdRendered() {
+ return this.miscStore.stickyAdRendered
+ },
selectedArea: {
get() {
const settings = this.me.settings
@@ -327,7 +346,8 @@ export default {
this.uploading = false
this.imageid = newVal[0].id
- this.imageuid = newVal[0].externaluid
+ this.imageuid = newVal[0].ouruid
+ this.ouruid = newVal[0].ouruid
this.imagemods = newVal[0].externalmods
},
deep: true,
@@ -438,6 +458,7 @@ export default {
// And any image id
this.imageid = null
this.imageuid = null
+ this.ouruid = null
this.imagemods = null
// Show from top.
@@ -457,6 +478,7 @@ export default {
@import 'bootstrap/scss/functions';
@import 'bootstrap/scss/variables';
@import 'bootstrap/scss/mixins/_breakpoints';
+@import 'assets/css/sticky-banner.scss';
:deep(.post__button) {
@include media-breakpoint-up(sm) {
@@ -476,4 +498,14 @@ export default {
.image__uploaded {
width: 100px;
}
+
+.adpad {
+ margin-bottom: calc($sticky-banner-height-mobile * v-bind(stickyAdRendered));
+
+ @include media-breakpoint-up(md) {
+ padding-bottom: calc(
+ $sticky-banner-height-desktop * v-bind(stickyAdRendered)
+ );
+ }
+}
diff --git a/pages/communityevents/[[groupid]].vue b/pages/communityevents/[[groupid]].vue
index c5adeee8..1060ed5a 100644
--- a/pages/communityevents/[[groupid]].vue
+++ b/pages/communityevents/[[groupid]].vue
@@ -126,6 +126,26 @@ const allOfEm = computed(() => {
}
})
+watch(
+ allOfEm,
+ (newVal) => {
+ if (newVal?.length && !groupid.value) {
+ // Save the max event we have seen.
+ const max = newVal.reduce((a, b) => Math.max(a, b), -Infinity)
+
+ const authStore = useAuthStore()
+ const me = useAuthStore().user
+ const settings = me?.settings
+
+ settings.lastCommunityEvent = max
+ authStore.saveAndGet({
+ settings,
+ })
+ }
+ },
+ { immediate: true }
+)
+
const events = computed(() => {
return allOfEm.value.slice(0, toShow.value)
})
diff --git a/pages/donate.vue b/pages/donate.vue
index bd1ceee5..2c3558af 100644
--- a/pages/donate.vue
+++ b/pages/donate.vue
@@ -74,12 +74,22 @@
- You can also donate by bank transfer to sort code 60-83-01,
- account number 20339094. The name of the account is Freegle
- Limited, and the bank is Unity Trust Bank.
+ You can also donate by transfer to sort code 60-83-01, account
+ number 20339094. The account name is Freegle Limited, and the
+ bank is Unity Trust Bank.
- If you do this, please complete a Gift Aid
+ Please use a reference of
+ {{
+ myid
+ }}
+
+ your email
+
+ so we know who it comes from!
+
+
+ If you can, please make a Gift Aid
Declaration here .
@@ -96,11 +106,19 @@
Please make it payable to Freegle Limited and send to Freegle,
64A North Road, Ormesby, Great Yarmouth NR29 3LE. Please
- include your Freegle email, so we can work out who it comes
- from!
+ include
+
+ reference
+ {{ myid }} ,
+
+ your email,
+ so we know who it comes from!
- If you do this, please complete a Gift Aid
+ If you can, please make a Gift Aid
Declaration here .
@@ -164,6 +182,22 @@
+
+
+
+ With Google Pay
+
+
+ You can donate £1 to help us with Google Pay.
+ Thank you for donating!
+
+
+
+
@@ -184,7 +218,6 @@ export default {
DonationThermometer,
DonationButton,
},
- ...mapState(useDonationStore, ['target']),
setup() {
const runtimeConfig = useRuntimeConfig()
const route = useRoute()
@@ -198,5 +231,11 @@ export default {
)
)
},
+ data: function () {
+ return {
+ showThanks: false,
+ }
+ },
+ ...mapState(useDonationStore, ['target']),
}
diff --git a/pages/find/index.vue b/pages/find/index.vue
index 0a64ea70..c40516e7 100644
--- a/pages/find/index.vue
+++ b/pages/find/index.vue
@@ -122,6 +122,14 @@ export default {
return await setup('Wanted')
},
+ mounted() {
+ if (this.$gtm?.enabled()) {
+ this.$gtm.trackEvent({
+ event: 'Give an Item',
+ label: 'QxhuCP7av7kZELy618UD',
+ })
+ }
+ },
methods: {
deleteItem,
addItem,
diff --git a/pages/give/index.vue b/pages/give/index.vue
index 7bdfc864..bc408343 100644
--- a/pages/give/index.vue
+++ b/pages/give/index.vue
@@ -121,6 +121,14 @@ export default {
return await setup('Offer')
},
+ mounted() {
+ if (this.$gtm?.enabled()) {
+ this.$gtm.trackEvent({
+ event: 'Give an Item',
+ label: 'YqHzCIHbv7kZELy618UD',
+ })
+ }
+ },
methods: {
deleteItem,
addItem,
diff --git a/pages/googlepay.vue b/pages/googlepay.vue
new file mode 100644
index 00000000..de1f1432
--- /dev/null
+++ b/pages/googlepay.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
This is a test page for Google Pay.
+
+
+ £1
+
+
+
+
+
+ £5
+
+
+
+ £10
+
+
+
+
+
+
+
+
diff --git a/pages/index.vue b/pages/index.vue
index e2085ae1..c104f202 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -171,18 +171,21 @@ export default {
// Preload some images to speed page load.
const userSite = runtimeConfig.public.USER_SITE
- const proxy = runtimeConfig.public.UPLOADCARE_PROXY
+ const proxy = runtimeConfig.public.IMAGE_DELIVERY
+
+ const bg = proxy + '?url=' + userSite + '/wallpaper.png&output=webp'
+ const logo = proxy + '?url=' + userSite + '/icon.png&output=webp&w=58'
head.link = [
{
rel: 'preload',
as: 'image',
- href: proxy + '/-/resize/58/-/format/webp/' + userSite + '/icon.png',
+ href: logo,
},
{
rel: 'preload',
as: 'image',
- href: proxy + '/-/format/webp/' + userSite + '/wallpaper.png',
+ href: bg,
},
]
@@ -239,9 +242,7 @@ export default {
const router = useRouter()
const route = useRoute()
- console.log('route', route)
if (route.path !== nextroute) {
- console.log('Push', nextroute)
this.$nextTick(() => {
router.push(nextroute)
})
diff --git a/pages/message/[id].vue b/pages/message/[id].vue
index 5a4c6e44..0ea80aee 100644
--- a/pages/message/[id].vue
+++ b/pages/message/[id].vue
@@ -11,9 +11,10 @@
>
@@ -32,7 +33,13 @@
class="bg-white p-2"
>
Sorry, that post isn't around any more.
-
+
+
+ There was a deadline of
+ {{ dateonlyNoYear(message.deadline) }}.
+
+
+
If it was an OFFER, it's probably been TAKEN. If it was a
WANTED, it's probably been RECEIVED.
@@ -78,6 +85,7 @@
-
+
-
-
-
-
-
-
+
diff --git a/pages/myposts.vue b/pages/myposts.vue
index 68c68286..74f8a528 100644
--- a/pages/myposts.vue
+++ b/pages/myposts.vue
@@ -4,29 +4,19 @@
v-if="showDonationAskModal"
@hidden="showDonationAskModal = false"
/>
+
+
My posts
-
-
+
-
-
-
+
+
-
-
+
-
@@ -94,7 +73,6 @@
diff --git a/pages/privacy.vue b/pages/privacy.vue
index d8faf284..c0628b67 100644
--- a/pages/privacy.vue
+++ b/pages/privacy.vue
@@ -2,7 +2,6 @@
-
Privacy
We won’t pass on your email address to any organisation outside
Freegle, and other freeglers can't see it (unless your community
@@ -16,9 +15,9 @@
We try to protect you from spammers and fraudsters. Sometimes our
- volunteers may read what you write to check that it's not spam,
- phishing or fraud. If we happen to find something which is against
- Freegle rules, we may take further action.
+ volunteers may read what you write in Chat to other freeglers to check
+ that it's not spam, phishing or fraud. If we happen to find something
+ which is against Freegle rules, we may take further action.
If you put phone numbers, email addresses or postal addresses into
@@ -115,7 +114,8 @@
Deleting your data
- If you want to leave Freegle, please go
+ We'll delete your data automatically if you're inactive for six
+ months. If you want to leave Freegle, please go
here .
@@ -127,16 +127,29 @@
theory. If this happens then we will be in touch with you to discuss
what should happen to your details.
+
Legal Basis
+
We operate under the legal basis of Legitimate Interest.
Got questions?
Privacy is a complicated and important area, which we take seriously.
If you have questions or concerns, please
- contact us. . Our
+ contact us . Our
registered address is Weaver's Field, Loud Bridge, Chipping PR3 2NX.
+
+ If you're unhappy, you can also contact the Information Commissioner's
+ Office
+ here .
+
Change History
Here are the changes to this page.
+
+ 24/08/2024: Update to mention legal basis, retention period,
+ complain to ICO.
+
15/04/2024: Update to mention case where a community leaves Freegle.
diff --git a/pages/promote.vue b/pages/promote.vue
index fdee29f5..62c99628 100644
--- a/pages/promote.vue
+++ b/pages/promote.vue
@@ -7,7 +7,15 @@
Wouldn't the world be better if more people freegled more often? You can
help!
-
+
+
+ Freegle spreads by word of mouth . Maybe you've got
+ friends, family or work colleagues who've never heard of us, and who
+ could help themseves or others by freegling?
+
+
+ Personalise your message and send it to them using the buttons below.
+
@@ -82,8 +90,22 @@
+
-
+
@@ -250,17 +272,6 @@ export default {
showPosterModal: false,
}
},
- computed: {
- contactPicker() {
- if (process.server) {
- return false
- } else {
- const ret =
- 'contacts' in window.navigator && 'ContactsManager' in window
- return ret
- }
- },
- },
methods: {
added() {
this.showPosterModal = true
diff --git a/pages/settings/index.vue b/pages/settings/index.vue
index 3054dbab..e13f102a 100644
--- a/pages/settings/index.vue
+++ b/pages/settings/index.vue
@@ -42,7 +42,7 @@
-
+
{
if (this.bounds.contains([d[0], d[1]])) {
- weighted.push([d[0], d[1], 1 - lineartolog(1 - d[2] / max)])
+ const val = 1 - lineartolog(1 - d[2] / max)
+ console.log(val, max, minlog, maxlog)
+ if (Number.isFinite(val)) {
+ weighted.push([d[0], d[1], val])
+ }
}
})
}
+ console.log(weighted)
return weighted
},
},
diff --git a/pages/volunteerings/[[groupid]].vue b/pages/volunteerings/[[groupid]].vue
index a98f67d2..85fc3b5e 100644
--- a/pages/volunteerings/[[groupid]].vue
+++ b/pages/volunteerings/[[groupid]].vue
@@ -130,6 +130,26 @@ const allOfEm = computed(() => {
}
})
+watch(
+ allOfEm,
+ (newVal) => {
+ if (newVal?.length && !groupid.value) {
+ // Save the max op we have seen.
+ const max = newVal.reduce((a, b) => Math.max(a, b), -Infinity)
+
+ const authStore = useAuthStore()
+ const me = useAuthStore().user
+ const settings = me?.settings
+
+ settings.lastVolunteerOpportunity = max
+ authStore.saveAndGet({
+ settings,
+ })
+ }
+ },
+ { immediate: true }
+)
+
const volunteerings = computed(() => {
return allOfEm.value.slice(0, toShow.value)
})
diff --git a/patches/@nuxt+image+1.7.0.patch b/patches/@nuxt+image+1.7.0.patch
index 907652aa..e042e74e 100644
--- a/patches/@nuxt+image+1.7.0.patch
+++ b/patches/@nuxt+image+1.7.0.patch
@@ -22,3 +22,16 @@ index d11e82e..6b4a814 100644
as: "image",
imagesrcset: sources.value[0].srcset,
nonce: props.nonce,
+diff --git a/node_modules/@nuxt/image/dist/runtime/providers/weserv.mjs b/node_modules/@nuxt/image/dist/runtime/providers/weserv.mjs
+index d5123f1..2a80517 100644
+--- a/node_modules/@nuxt/image/dist/runtime/providers/weserv.mjs
++++ b/node_modules/@nuxt/image/dist/runtime/providers/weserv.mjs
+@@ -19,7 +19,7 @@ const operationsGenerator = createOperationsGenerator({
+ contrast: "con",
+ blur: "blur",
+ mirror: "flop",
+- rotate: "rot",
++ rotate: "ro",
+ mask: "mask",
+ maskTrim: "mtrim",
+ maskBackground: "mbg"
diff --git a/patches/@nuxtjs+google-adsense+3.0.0.patch b/patches/@nuxtjs+google-adsense+3.0.0.patch
new file mode 100644
index 00000000..319dc49e
--- /dev/null
+++ b/patches/@nuxtjs+google-adsense+3.0.0.patch
@@ -0,0 +1,13 @@
+diff --git a/node_modules/@nuxtjs/google-adsense/dist/module.mjs b/node_modules/@nuxtjs/google-adsense/dist/module.mjs
+index 1993df5..ff819c3 100644
+--- a/node_modules/@nuxtjs/google-adsense/dist/module.mjs
++++ b/node_modules/@nuxtjs/google-adsense/dist/module.mjs
+@@ -15,7 +15,7 @@ function initializeAdClient(options) {
+ return createScriptMeta(
+ `adsbygoogle.onload = function() {
+ adsbygoogle.pauseAdRequests=${options.pauseOnLoad ? "1" : "0"};
+- [].forEach.call(document.getElementsByClassName('adsbygoogle'), function() { adsbygoogle.push(${adsenseScript}); })
++ [].forEach.call(document.querySelectorAll("ins.adsbygoogle[data-ad-client='${options.id}']"), function() { adsbygoogle.push(${adsenseScript}); })
+ };`
+ );
+ }
diff --git a/patches/@vue-leaflet+vue-leaflet+0.6.1.patch b/patches/@vue-leaflet+vue-leaflet+0.6.1.patch
index ec7923f2..9ec4df59 100644
--- a/patches/@vue-leaflet+vue-leaflet+0.6.1.patch
+++ b/patches/@vue-leaflet+vue-leaflet+0.6.1.patch
@@ -1,4 +1,4 @@
-diff --git a/node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js b/node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js
+iff --git a/node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js b/node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js
index 8229c4f..520c4bd 100644
--- a/node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js
+++ b/node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js
diff --git a/plugins/sentry.client.ts b/plugins/sentry.client.ts
index 0a93b7fd..24ab79d1 100644
--- a/plugins/sentry.client.ts
+++ b/plugins/sentry.client.ts
@@ -19,216 +19,262 @@ export default defineNuxtPlugin((nuxtApp) => {
useMiscStore().unloading = true
}
- Sentry.init({
- app: [vueApp],
- dsn: config.public.SENTRY_DSN,
- // Some errors seem benign, and so we ignore them on the client side rather than clutter our sentry logs.
- ignoreErrors: [
- 'ResizeObserver loop limit exceeded', // Benign - see https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded
- 'ResizeObserver loop completed with undelivered notifications.',
- 'Navigation cancelled from ', // This can happen if someone clicks twice in quick succession
-
- // These are very commonly errors caused by fetch() being aborted during page navigation. See for example
- // https://forum.sentry.io/t/typeerror-failed-to-fetch-reported-over-and-overe/8447
- 'TypeError: Failed to fetch',
- 'TypeError: NetworkError when attempting to fetch resource.',
- 'TypeError: Unable to preload',
- ],
- integrations: [
- new Integrations.BrowserTracing({
- routingInstrumentation: Sentry.vueRouterInstrumentation(router),
- tracePropagationTargets: ['localhost', 'ilovefreegle.org', /^\//],
- }),
- new HttpClientIntegration(),
- new ExtraErrorDataIntegration(),
- ],
- logErrors: false, // Note that this doesn't seem to work with nuxt 3
- tracesSampleRate: config.public.SENTRY_TRACES_SAMPLE_RATE || 1.0, // Sentry recommends adjusting this value in production
- debug: config.public.SENTRY_ENABLE_DEBUG || false, // Enable debug mode
- environment: config.public.ENVIRONMENT || 'dev', // Set environment
- // The following enables exceptions to be logged to console despite logErrors being set to false (preventing them from being passed to the default Vue err handler)
- beforeSend(event, hint) {
- if (useMiscStore()?.unloading) {
- // All network requests are aborted during unload, and so we'll get spurious errors. Ignore them.
- console.log('Ignore error in unload')
- return null
- }
-
- // Ignore crawlers, which seems to abort pre-fetching of some assets.
- const userAgent = window.navigator.userAgent?.toLowerCase()
-
- if (
- userAgent.includes('bingpreview') ||
- userAgent.includes('bingbot') ||
- userAgent.includes('linespider') ||
- userAgent.includes('yisou')
- ) {
- return null
- }
-
- // HeadlessChrome triggers an error in Google sign-in. It's not a real user.
- if (userAgent.includes('headlesschrome')) {
- return null
- }
-
- // Check if it is an exception, and if so, log it.
- if (event.exception) {
- console.error(`[Exeption for Sentry]: (${hint.originalException})`, {
- event,
- hint,
- })
- }
-
- if (hint) {
- const originalException = hint?.originalException
- const originalExceptionString = originalException?.toString()
- const originalExceptionStack = originalException?.stack
- const originalExceptionMessage = originalException?.message
- const originalExceptionName = originalException?.name
-
- // Add some more detail if we can.
- if (originalException instanceof Event) {
- event.extra.isTrusted = originalException.isTrusted
- event.extra.detail = originalException.detail
- event.extra.type = originalException.type
- }
-
- console.log(
- 'Original exception was',
- originalException,
- typeof originalException,
- originalExceptionString,
- originalExceptionStack,
- originalExceptionMessage
- )
-
- if (!originalException) {
- // There's basically no info to report, so there's nothing we can do. Suppress it.
- console.log('No info - suppress exception')
- return null
- } else if (originalExceptionStack?.includes('/gpt/')) {
- // Google ads are not our problem.
- console.log('Google ads - suppress exception')
- return null
- } else if (
- originalExceptionStack?.includes('/pageFold/') ||
- originalExceptionStack?.includes('/strikeforce/') ||
- originalExceptionStack?.includes('/ads/js/')
- ) {
- // This is a flaky ad library
- console.log('Pagefold, ads - suppress exception')
- return null
- } else if (
- (originalExceptionStack?.includes('bootstrap-vue-next') &&
- originalExceptionString?.match('removeAttribute')) ||
- originalExceptionStack?.match('_isWithActiveTrigger ')
- ) {
- // This seems to be a bug in bootstrap, and doesn't affect the user.
- console.log('Suppress Bootstrap tooltip exception')
- return null
- } else if (originalExceptionString?.match(/Down for maintenance/)) {
- console.log('Maintenance - suppress exception', this)
- return null
- } else if (
- originalExceptionString?.match(/Piwik undefined after waiting/)
- ) {
- // Some privacy blockers can cause this.
- console.log('Suppress Piwik/Matomo exception')
- return null
- } else if (originalExceptionString?.match(/Google ad script blocked/)) {
- console.log('AdBlocker - no need to log.', this)
- return null
- } else if (
- originalExceptionString?.match(/Attempt to use history.replaceState/)
- ) {
- console.log('History.replaceState too often')
- return null
- } else if (suppressException(originalException)) {
- console.log('Suppress exception')
- return null
- } else if (originalExceptionName === 'TypeError') {
- console.log('TypeError')
- if (
- originalExceptionMessage?.match(
- /can't redefine non-configurable property "userAgent"/
- )
- ) {
- // This exception happens a lot, and the best guess I can find is that it is a bugged browser
- // extension.
- console.log('Suppress userAgent')
- return null
- } else if (originalExceptionMessage?.match(/cancelled/)) {
- // This probably happens due to the user changing their mind and navigating away immediately.
- console.log('Suppress cancelled')
- return null
- } else if (originalExceptionString?.match(/Object.checkLanguage/)) {
- // Some auto translation thing.
- console.log('Translate exception cancelled')
- return null
- } else if (originalExceptionString?.match(/\/js\/gpt/)) {
- // Error inside Google Ads.
- console.log('Ad error ignored')
- return null
- } else if (
- originalExceptionString?.match(
- /NetworkError when attempting to fetch resource./
- )
- ) {
- // Flaky network.
- console.log('Suppress flaky network')
+ // If we initialise Sentry before CookieYes then it seems to attach a click handler which blocks clicking on the
+ // CookieYes banner.
+ function checkCMPComplete() {
+ const runTimeConfig = useRuntimeConfig()
+ if (runTimeConfig.public.COOKIEYES && !window.weHaveLoadedGPT) {
+ setTimeout(checkCMPComplete, 100)
+ } else {
+ console.log('Init Sentry')
+ Sentry.init({
+ app: [vueApp],
+ dsn: config.public.SENTRY_DSN,
+ // Some errors seem benign, and so we ignore them on the client side rather than clutter our sentry logs.
+ ignoreErrors: [
+ 'ResizeObserver loop limit exceeded', // Benign - see https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded
+ 'ResizeObserver loop completed with undelivered notifications.',
+ 'Navigation cancelled from ', // This can happen if someone clicks twice in quick succession
+
+ // These are very commonly errors caused by fetch() being aborted during page navigation. See for example
+ // https://forum.sentry.io/t/typeerror-failed-to-fetch-reported-over-and-overe/8447
+ 'TypeError: Failed to fetch',
+ 'TypeError: NetworkError when attempting to fetch resource.',
+ 'TypeError: Unable to preload',
+ ],
+ integrations: [
+ new Integrations.BrowserTracing({
+ routingInstrumentation: Sentry.vueRouterInstrumentation(router),
+ tracePropagationTargets: ['localhost', 'ilovefreegle.org', /^\//],
+ }),
+ new HttpClientIntegration(),
+ new ExtraErrorDataIntegration(),
+ ],
+ logErrors: false, // Note that this doesn't seem to work with nuxt 3
+ tracesSampleRate: config.public.SENTRY_TRACES_SAMPLE_RATE || 1.0, // Sentry recommends adjusting this value in production
+ debug: config.public.SENTRY_ENABLE_DEBUG || false, // Enable debug mode
+ environment: config.public.ENVIRONMENT || 'dev', // Set environment
+ // The following enables exceptions to be logged to console despite logErrors being set to false (preventing them from being passed to the default Vue err handler)
+ beforeSend(event, hint) {
+ if (useMiscStore()?.unloading) {
+ // All network requests are aborted during unload, and so we'll get spurious errors. Ignore them.
+ console.log('Ignore error in unload')
return null
}
- } else if (originalExceptionName === 'ReferenceError') {
- console.log('ReferenceError')
+
+ // Ignore crawlers, which seems to abort pre-fetching of some assets.
+ const userAgent = window.navigator.userAgent?.toLowerCase()
+
if (
- originalExceptionMessage?.match(/Can't find variable: fieldset/)
+ userAgent.includes('bingpreview') ||
+ userAgent.includes('bingbot') ||
+ userAgent.includes('linespider') ||
+ userAgent.includes('yisou')
) {
- // This happens because of an old bug which is now fixed:
- // https://codereview.chromium.org/2343013005
- console.log('Old Chrome fieldset bug')
return null
}
- } else if (originalExceptionName === 'SecurityError') {
- if (
- (originalExceptionMessage?.match('Blocked a frame') &&
- originalExceptionStack?.match('isRef')) ||
- originalExceptionStack?.match('popupInterval')
- ) {
- // See https://stackoverflow.com/questions/39081098/close-a-window-opened-with-window-open-after-clicking-a-button
- console.log('Suppress error caused by a bug in vue-social-sharing.')
+
+ // HeadlessChrome triggers an error in Google sign-in. It's not a real user.
+ if (userAgent.includes('headlesschrome')) {
return null
}
- } else if (
- originalExceptionStack?.includes('_.ae') &&
- originalExceptionStack?.includes('/gsi/client')
- ) {
- // This is an error in Google One Tap sign-in, often preceded by a console log about malformed JSON
- // response. It's possible that it relates to multiple account sign in. I've failed to reproduce it, and
- // it's not really clear that it's our fault so there's no point beating ourselves up about it.
- console.log('Suppress odd Google One Tap error')
- return null
- }
- }
-
- // Continue sending to Sentry
- return event
- },
- })
-
- vueApp.mixin(
- Sentry.createTracingMixins({
- trackComponents: true,
- timeout: 2000,
- hooks: ['activate', 'mount', 'update'],
- })
- )
- Sentry.attachErrorHandler(vueApp, {
- logErrors: false,
- attachProps: true,
- trackComponents: true,
- timeout: 2000,
- hooks: ['activate', 'mount', 'update'],
- })
+
+ // Check if it is an exception, and if so, log it.
+ if (event.exception) {
+ console.error(
+ `[Exeption for Sentry]: (${hint.originalException})`,
+ {
+ event,
+ hint,
+ }
+ )
+ }
+
+ if (hint) {
+ const originalException = hint?.originalException
+ const originalExceptionString = originalException?.toString()
+ const originalExceptionStack = originalException?.stack
+ const originalExceptionMessage = originalException?.message
+ const originalExceptionName = originalException?.name
+
+ // Add some more detail if we can.
+ if (originalException instanceof Event) {
+ event.extra.isTrusted = originalException.isTrusted
+ event.extra.detail = originalException.detail
+ event.extra.type = originalException.type
+ }
+
+ console.log(
+ 'Original exception was',
+ originalException,
+ typeof originalException,
+ originalExceptionString,
+ originalExceptionStack,
+ originalExceptionMessage
+ )
+
+ if (!originalException) {
+ // There's basically no info to report, so there's nothing we can do. Suppress it.
+ console.log('No info - suppress exception')
+ return null
+ } else if (originalExceptionStack?.includes('/gpt/')) {
+ // Google ads are not our problem.
+ console.log('Google ads - suppress exception')
+ return null
+ } else if (
+ originalExceptionStack?.includes('/pageFold/') ||
+ originalExceptionStack?.includes('/strikeforce/') ||
+ originalExceptionStack?.includes('/ads/js/')
+ ) {
+ // This is a flaky ad library
+ console.log('Pagefold, ads - suppress exception')
+ return null
+ } else if (
+ (originalExceptionStack?.includes('bootstrap-vue-next') &&
+ originalExceptionString?.match('removeAttribute')) ||
+ originalExceptionStack?.match('_isWithActiveTrigger ')
+ ) {
+ // This seems to be a bug in bootstrap, and doesn't affect the user.
+ console.log('Suppress Bootstrap tooltip exception')
+ return null
+ } else if (originalExceptionString?.match(/Down for maintenance/)) {
+ console.log('Maintenance - suppress exception', this)
+ return null
+ } else if (
+ originalExceptionString?.match(/Piwik undefined after waiting/)
+ ) {
+ // Some privacy blockers can cause this.
+ console.log('Suppress Piwik/Matomo exception')
+ return null
+ } else if (
+ originalExceptionString?.match(/Google ad script blocked/)
+ ) {
+ console.log('AdBlocker - no need to log.', this)
+ return null
+ } else if (
+ originalExceptionString?.match(
+ /Attempt to use history.replaceState/
+ )
+ ) {
+ console.log('History.replaceState too often')
+ return null
+ } else if (suppressException(originalException)) {
+ console.log('Suppress exception')
+ return null
+ } else if (originalExceptionName === 'TypeError') {
+ console.log('TypeError')
+ if (
+ originalExceptionMessage?.match(
+ /can't redefine non-configurable property "userAgent"/
+ )
+ ) {
+ // This exception happens a lot, and the best guess I can find is that it is a bugged browser
+ // extension.
+ console.log('Suppress userAgent')
+ return null
+ } else if (originalExceptionMessage?.match(/cancelled/)) {
+ // This probably happens due to the user changing their mind and navigating away immediately.
+ console.log('Suppress cancelled')
+ return null
+ } else if (
+ originalExceptionString?.match(/Object.checkLanguage/)
+ ) {
+ // Some auto translation thing.
+ console.log('Translate exception cancelled')
+ return null
+ } else if (originalExceptionString?.match(/\/js\/gpt/)) {
+ // Error inside Google Ads.
+ console.log('Ad error ignored')
+ return null
+ } else if (
+ originalExceptionString?.match(
+ /NetworkError when attempting to fetch resource./
+ )
+ ) {
+ // Flaky network.
+ console.log('Suppress flaky network')
+ return null
+ }
+ } else if (originalExceptionName === 'ReferenceError') {
+ console.log('ReferenceError')
+ if (
+ originalExceptionMessage?.match(/Can't find variable: fieldset/)
+ ) {
+ // This happens because of an old bug which is now fixed:
+ // https://codereview.chromium.org/2343013005
+ console.log('Old Chrome fieldset bug')
+ return null
+ }
+ } else if (originalExceptionName === 'SecurityError') {
+ if (
+ (originalExceptionMessage?.match('Blocked a frame') &&
+ originalExceptionStack?.match('isRef')) ||
+ originalExceptionStack?.match('popupInterval')
+ ) {
+ // See https://stackoverflow.com/questions/39081098/close-a-window-opened-with-window-open-after-clicking-a-button
+ console.log(
+ 'Suppress error caused by a bug in vue-social-sharing.'
+ )
+ return null
+ }
+ } else if (
+ originalExceptionStack?.includes('_.ae') &&
+ originalExceptionStack?.includes('/gsi/client')
+ ) {
+ // This is an error in Google One Tap sign-in, often preceded by a console log about malformed JSON
+ // response. It's possible that it relates to multiple account sign in. I've failed to reproduce it, and
+ // it's not really clear that it's our fault so there's no point beating ourselves up about it.
+ console.log('Suppress odd Google One Tap error')
+ return null
+ } else if (
+ originalExceptionMessage?.includes(
+ 'Looks like your website URL has changed'
+ ) &&
+ originalExceptionStack?.includes('cookieyes')
+ ) {
+ // This is a common error that is not our fault.
+ console.log('CookieYes domain error - probably test deployment')
+ if (window.postCookieYes) {
+ window.postCookieYes()
+ }
+
+ return null
+ } else if (
+ originalExceptionMessage?.includes(
+ 'Attempted to load an infinite number of tiles'
+ ) ||
+ originalExceptionMessage?.includes(
+ "Cannot read properties of null (reading 'latLngToLayerPoint')"
+ )
+ ) {
+ // This is a leaflet error - don't understand it, but not our fault.
+ return null
+ }
+ }
+
+ // Continue sending to Sentry
+ return event
+ },
+ })
+
+ vueApp.mixin(
+ Sentry.createTracingMixins({
+ trackComponents: true,
+ timeout: 2000,
+ hooks: ['activate', 'mount', 'update'],
+ })
+ )
+ Sentry.attachErrorHandler(vueApp, {
+ logErrors: false,
+ attachProps: true,
+ trackComponents: true,
+ timeout: 2000,
+ hooks: ['activate', 'mount', 'update'],
+ })
+ }
+ }
+
+ checkCMPComplete()
return {
provide: {
diff --git a/plugins/vue-awesome.js b/plugins/vue-awesome.js
index 237880e6..4fb59c42 100644
--- a/plugins/vue-awesome.js
+++ b/plugins/vue-awesome.js
@@ -64,6 +64,7 @@ import {
faMapMarkerAlt,
faMeh,
faMinus,
+ faMinusCircle,
faPen,
faPlus,
faQuestionCircle,
@@ -158,6 +159,7 @@ library.add(
faMapMarkerAlt,
faMeh,
faMinus,
+ faMinusCircle,
faPen,
faPlus,
faQuestionCircle,
diff --git a/providers/uploadcare-proxy.ts b/providers/uploadcare-proxy.ts
deleted file mode 100644
index 5214f02e..00000000
--- a/providers/uploadcare-proxy.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { createOperationsGenerator } from '#image'
-import { useRuntimeConfig } from '#app'
-const operationsGenerator = createOperationsGenerator({
- joinWith: '',
- formatter: (key, value) =>
- `-/${key}/${Array.isArray(value) ? value.join('/') : value}/`,
-})
-
-export const getImage = (src, { modifiers = {}, baseURL = null } = {}) => {
- // Map the modifiers - copied from NuxtImage uploadcare provider.
- if (modifiers?.width || modifiers?.height) {
- modifiers.resize = `${modifiers?.width || ''}x${modifiers?.height || ''}`
- delete modifiers?.width
- delete modifiers?.height
- }
-
- if (modifiers?.fit) {
- switch (modifiers.fit) {
- case 'cover':
- modifiers.scale_crop = [modifiers.resize, 'center']
- delete modifiers.resize
- break
- case 'contain':
- modifiers.stretch = 'off'
- break
- }
-
- delete modifiers.fit
- }
-
- const operations = operationsGenerator(modifiers)
-
- const runtimeConfig = useRuntimeConfig()
- const userSite = runtimeConfig.public.USER_SITE
- const imageSite = runtimeConfig.public.IMAGE_SITE
- const proxy = runtimeConfig.public.UPLOADCARE_PROXY
-
- if (!src.startsWith('http')) {
- // Relative URL - point at our own site.
- return { url: proxy + '/' + operations + '/' + userSite + src }
- } else if (src.startsWith(userSite) || src.startsWith(imageSite)) {
- return { url: proxy + '/' + operations + '/' + src }
- } else {
- return { url: src }
- }
-}
diff --git a/public/ads.txt b/public/ads.txt
index 57589b75..29506557 100644
--- a/public/ads.txt
+++ b/public/ads.txt
@@ -1,114 +1,4 @@
-# ads.txt file for ilovefreegle.org, updated 10/04/2024
+# ads.txt file for ilovefreegle.org, updated 29/07/2024
OWNERDOMAIN=ilovefreegle.org
-CONTACT=sales@zeroads.co
-
-
-Gumgum.com, 15952, DIRECT, ffdef49475d318a9
-rubiconproject.com, 23434, RESELLER, 0bfd66d529a55807
-pubmatic.com, 157897, RESELLER, 5d62403b186f2ace
-appnexus.com, 2758, RESELLER, f5ab79cb980f11d1
-contextweb.com, 558355, RESELLER, 89ff185a4c4e857c
-openx.com, 537149485, RESELLER, 6a698e2ec38604c6
-improvedigital.com, 1884, RESELLER
-smartadserver.com, 4005, RESELLER, 060d053dcf45cbf3
-admanmedia.com, 799, RESELLER
-
-pubmatic.com, 164422, DIRECT, 5d62403b186f2ace
-
-appnexus.com, 15950, DIRECT , f5ab79cb980f11d1
-
-inmobi.com, 3fee5000566e4a06a20be5042a3dab8d, DIRECT, 83e75a7ae333ca9d
-rubiconproject.com, 11726, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 12266, RESELLER, 0bfd66d529a55807
-blis.com, 33, RESELLER, 61453ae19a4b73f4
-verve.com, 5897, RESELLER, 0c8f5958fc2d6270
-loopme.com, 9724, RESELLER, 6c8d5f95897a5a3b
-pubmatic.com, 157097, RESELLER, 5d62403b186f2ace
-pubnative.net, 1006951, RESELLER, d641df8625486a7b
-algorix.co, 54190, RESELLER, 5b394c12fea27a1d
-algorix.co, 60097, RESELLER, 5b394c12fea27a1d
-conversantmedia.com, 40881, RESELLER, 03113cd04947736d
-axonix.com, 57716, RESELLER
-pubmatic.com, 156931, RESELLER, 5d62403b186f2ace
-pubmatic.com, 159035, RESELLER, 5d62403b186f2ace
-thebrave.io, 1234568, RESELLER, c25b2154543746ac
-outbrain.com, 00bba279fec6daa01a0cb6fdccb023f0d5, RESELLER
-se7en.es, 212430, RESELLER, 064bc410192443d8
-mintegral.com, 10003, RESELLER
-mars.media, 1010450, RESELLER, 8624339f102fb076
-gamaigroup.com, 320201, RESELLER
-iqzone.com, IQ87, RESELLER
-opera.com, pub6871903319744, RESELLER, 55a0c5fd61378de3
-yeahmobi.com, 5135082, RESELLER
-rhebus.works, 7597018658, RESELLER
-selectmedia.asia, 645b5a31e427dc0a87094fc4, RESELLER, e365c871a27c655d
-pubmatic.com, 163758, RESELLER, 5d62403b186f2ace
-rubiconproject.com, 16928, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807
-openx.com, 540298543, RESELLER, 6a698e2ec38604c6
-contextweb.com, 562499, RESELLER, 89ff185a4c4e857c
-appnexus.com, 8178, RESELLER, f5ab79cb980f11d1
-advertising.com, 28246, RESELLER
-onetag.com, 59aa7be4921bac8, RESELLER
-algorix.co, 60095, RESELLER, 5b394c12fea27a1d
-appnexus.com, 14077, RESELLER, f5ab79cb980f11d1
-adelement.com, 30020, RESELLER
-adelement.com, 36001, RESELLER
-criteo.com, B-057955, RESELLER, 9fac4a4a87c2a44f
-loopme.com, 11414, RESELLER, 6c8d5f95897a5a3b
-algorix.co, 60367, RESELLER, 5b394c12fea27a1d
-aralego.com, par-9A2627866DA4BBE4F4AA4A67A3DDE686, RESELLER
-sharethrough.com, DQQogebZ, RESELLER, d53b998a7bd4ecd2
-loopme.com, 11605, RESELLER, 6c8d5f95897a5a3b
-lunamedia.io, b82743ba2ddf4bcaab3d1d4f91b1330e, RESELLER, 524ecb396915caaf
-acexchange.co.kr, 1562884725, RESELLER
-rubiconproject.com, 24400, RESELLER, 0bfd66d529a55807
-pubmatic.com, 157559, RESELLER, 5d62403b186f2ace
-jio.com, 1547219295, RESELLER
-lemmatechnologies.com, 89, RESELLER, 7829010c5bebd1fb
-growintech.co, 102275, RESELLER
-prequel.tv, 518, RESELLER
-eskimi.com, 2020000030, RESELLER
-9dotsmedia.com, 122262, RESELLER, 45ff185b4c4e857d
-ssp.e-volution.ai, AJxF6R378a9M6CaTvK, RESELLER
-app-stock.com, 315417, RESELLER
-markappmedia.site, 587286, RESELLER
-keenkale.com, 841, RESELLER
-admanmedia.com, 2063, RESELLER
-peak226.com, 12700, RESELLER
-thunder-monetize.com, 3905806597, RESELLER
-rubiconproject.com, 26064, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 20050, RESELLER, 0bfd66d529a55807
-ucfunnel.com, par-8A2AD843B76A2B93CB24D4B7D694B67E, RESELLER
-aralego.com, par-8A2AD843B76A2B93CB24D4B7D694B67E, RESELLER
-bold-win.com, 148, RESELLER, 71746737d0bab951
-orangeclickmedia.com, C-1034, RESELLER
-openx.com, 539214772, RESELLER, 6a698e2ec38604c6
-castify.ai, 1279123, RESELLER
-bematterfull.com, 111399861, RESELLER
-onlinemediasolutions.com, 29556, RESELLER
-rubiconproject.com, 26168, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 26192, RESELLER, 0bfd66d529a55807
-video.unrulymedia.com, 322585001, RESELLER
-adiiix.com, 3de5db9, RESELLER
-fromthetop.io, 65529, RESELLER
-
-google.com, pub-7943695858541470, DIRECT, f08c47fec0942fa0
-
-gourmetads.com, 16593, DIRECT
-appnexus.com, 1792, RESELLER, f5ab79cb980f11d1
-themediagrid.com, UPO4A3, DIRECT, 35d5010d7789b49d
-openx.com, 537142979, DIRECT, 6a698e2ec38604c6
-yahoo.com, 57830, RESELLER, e1a5b5b6e3255540
-amxrtb.com, 105199507, DIRECT
-rubiconproject.com, 10617, DIRECT, 0bfd66d529a55807
-indexexchange.com, 184268, DIRECT, 50b1c356f2c5c8fc
-pubmatic.com, 99931, DIRECT, 5d62403b186f2ace
-deepintent.com, 1256, DIRECT
-deepintent.com, 1255, DIRECT
-sovrn.com, 227193, DIRECT, fafdf38b16bf6b2b
-adform.com, 1655, DIRECT, 9f5210a2f0999e32
-criteo.com, B-060140, DIRECT, 9fac4a4a87c2a44f
-
-rubiconproject.com, 26548, DIRECT, 0bfd66d529a55807
-
+CONTACT=geeks@ilovefreegle.org
+google.com, pub-9017028318226154, DIRECT, f08c47fec0942fa0
\ No newline at end of file
diff --git a/public/app-ads.txt b/public/app-ads.txt
index 57589b75..457c60c4 100644
--- a/public/app-ads.txt
+++ b/public/app-ads.txt
@@ -1,114 +1,4 @@
# ads.txt file for ilovefreegle.org, updated 10/04/2024
OWNERDOMAIN=ilovefreegle.org
-CONTACT=sales@zeroads.co
-
-
-Gumgum.com, 15952, DIRECT, ffdef49475d318a9
-rubiconproject.com, 23434, RESELLER, 0bfd66d529a55807
-pubmatic.com, 157897, RESELLER, 5d62403b186f2ace
-appnexus.com, 2758, RESELLER, f5ab79cb980f11d1
-contextweb.com, 558355, RESELLER, 89ff185a4c4e857c
-openx.com, 537149485, RESELLER, 6a698e2ec38604c6
-improvedigital.com, 1884, RESELLER
-smartadserver.com, 4005, RESELLER, 060d053dcf45cbf3
-admanmedia.com, 799, RESELLER
-
-pubmatic.com, 164422, DIRECT, 5d62403b186f2ace
-
-appnexus.com, 15950, DIRECT , f5ab79cb980f11d1
-
-inmobi.com, 3fee5000566e4a06a20be5042a3dab8d, DIRECT, 83e75a7ae333ca9d
-rubiconproject.com, 11726, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 12266, RESELLER, 0bfd66d529a55807
-blis.com, 33, RESELLER, 61453ae19a4b73f4
-verve.com, 5897, RESELLER, 0c8f5958fc2d6270
-loopme.com, 9724, RESELLER, 6c8d5f95897a5a3b
-pubmatic.com, 157097, RESELLER, 5d62403b186f2ace
-pubnative.net, 1006951, RESELLER, d641df8625486a7b
-algorix.co, 54190, RESELLER, 5b394c12fea27a1d
-algorix.co, 60097, RESELLER, 5b394c12fea27a1d
-conversantmedia.com, 40881, RESELLER, 03113cd04947736d
-axonix.com, 57716, RESELLER
-pubmatic.com, 156931, RESELLER, 5d62403b186f2ace
-pubmatic.com, 159035, RESELLER, 5d62403b186f2ace
-thebrave.io, 1234568, RESELLER, c25b2154543746ac
-outbrain.com, 00bba279fec6daa01a0cb6fdccb023f0d5, RESELLER
-se7en.es, 212430, RESELLER, 064bc410192443d8
-mintegral.com, 10003, RESELLER
-mars.media, 1010450, RESELLER, 8624339f102fb076
-gamaigroup.com, 320201, RESELLER
-iqzone.com, IQ87, RESELLER
-opera.com, pub6871903319744, RESELLER, 55a0c5fd61378de3
-yeahmobi.com, 5135082, RESELLER
-rhebus.works, 7597018658, RESELLER
-selectmedia.asia, 645b5a31e427dc0a87094fc4, RESELLER, e365c871a27c655d
-pubmatic.com, 163758, RESELLER, 5d62403b186f2ace
-rubiconproject.com, 16928, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807
-openx.com, 540298543, RESELLER, 6a698e2ec38604c6
-contextweb.com, 562499, RESELLER, 89ff185a4c4e857c
-appnexus.com, 8178, RESELLER, f5ab79cb980f11d1
-advertising.com, 28246, RESELLER
-onetag.com, 59aa7be4921bac8, RESELLER
-algorix.co, 60095, RESELLER, 5b394c12fea27a1d
-appnexus.com, 14077, RESELLER, f5ab79cb980f11d1
-adelement.com, 30020, RESELLER
-adelement.com, 36001, RESELLER
-criteo.com, B-057955, RESELLER, 9fac4a4a87c2a44f
-loopme.com, 11414, RESELLER, 6c8d5f95897a5a3b
-algorix.co, 60367, RESELLER, 5b394c12fea27a1d
-aralego.com, par-9A2627866DA4BBE4F4AA4A67A3DDE686, RESELLER
-sharethrough.com, DQQogebZ, RESELLER, d53b998a7bd4ecd2
-loopme.com, 11605, RESELLER, 6c8d5f95897a5a3b
-lunamedia.io, b82743ba2ddf4bcaab3d1d4f91b1330e, RESELLER, 524ecb396915caaf
-acexchange.co.kr, 1562884725, RESELLER
-rubiconproject.com, 24400, RESELLER, 0bfd66d529a55807
-pubmatic.com, 157559, RESELLER, 5d62403b186f2ace
-jio.com, 1547219295, RESELLER
-lemmatechnologies.com, 89, RESELLER, 7829010c5bebd1fb
-growintech.co, 102275, RESELLER
-prequel.tv, 518, RESELLER
-eskimi.com, 2020000030, RESELLER
-9dotsmedia.com, 122262, RESELLER, 45ff185b4c4e857d
-ssp.e-volution.ai, AJxF6R378a9M6CaTvK, RESELLER
-app-stock.com, 315417, RESELLER
-markappmedia.site, 587286, RESELLER
-keenkale.com, 841, RESELLER
-admanmedia.com, 2063, RESELLER
-peak226.com, 12700, RESELLER
-thunder-monetize.com, 3905806597, RESELLER
-rubiconproject.com, 26064, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 20050, RESELLER, 0bfd66d529a55807
-ucfunnel.com, par-8A2AD843B76A2B93CB24D4B7D694B67E, RESELLER
-aralego.com, par-8A2AD843B76A2B93CB24D4B7D694B67E, RESELLER
-bold-win.com, 148, RESELLER, 71746737d0bab951
-orangeclickmedia.com, C-1034, RESELLER
-openx.com, 539214772, RESELLER, 6a698e2ec38604c6
-castify.ai, 1279123, RESELLER
-bematterfull.com, 111399861, RESELLER
-onlinemediasolutions.com, 29556, RESELLER
-rubiconproject.com, 26168, RESELLER, 0bfd66d529a55807
-rubiconproject.com, 26192, RESELLER, 0bfd66d529a55807
-video.unrulymedia.com, 322585001, RESELLER
-adiiix.com, 3de5db9, RESELLER
-fromthetop.io, 65529, RESELLER
-
-google.com, pub-7943695858541470, DIRECT, f08c47fec0942fa0
-
-gourmetads.com, 16593, DIRECT
-appnexus.com, 1792, RESELLER, f5ab79cb980f11d1
-themediagrid.com, UPO4A3, DIRECT, 35d5010d7789b49d
-openx.com, 537142979, DIRECT, 6a698e2ec38604c6
-yahoo.com, 57830, RESELLER, e1a5b5b6e3255540
-amxrtb.com, 105199507, DIRECT
-rubiconproject.com, 10617, DIRECT, 0bfd66d529a55807
-indexexchange.com, 184268, DIRECT, 50b1c356f2c5c8fc
-pubmatic.com, 99931, DIRECT, 5d62403b186f2ace
-deepintent.com, 1256, DIRECT
-deepintent.com, 1255, DIRECT
-sovrn.com, 227193, DIRECT, fafdf38b16bf6b2b
-adform.com, 1655, DIRECT, 9f5210a2f0999e32
-criteo.com, B-060140, DIRECT, 9fac4a4a87c2a44f
-
-rubiconproject.com, 26548, DIRECT, 0bfd66d529a55807
-
+CONTACT=geeks@ilovefreegle.org
+google.com, pub-9017028318226154, DIRECT, f08c47fec0942fa0
\ No newline at end of file
diff --git a/public/businesscards/FreegleBusinessCardSmall.jpg b/public/businesscards/FreegleBusinessCardSmall.jpg
index bef00026..d6436f60 100644
Binary files a/public/businesscards/FreegleBusinessCardSmall.jpg and b/public/businesscards/FreegleBusinessCardSmall.jpg differ
diff --git a/public/businesscards/FreegleBusinessCardSmallWelsh.jpg b/public/businesscards/FreegleBusinessCardSmallWelsh.jpg
index 43c88c85..feab0a1c 100644
Binary files a/public/businesscards/FreegleBusinessCardSmallWelsh.jpg and b/public/businesscards/FreegleBusinessCardSmallWelsh.jpg differ
diff --git a/public/councils/NationalReuseDay2.png b/public/councils/NationalReuseDay2.png
new file mode 100644
index 00000000..d66c6f10
Binary files /dev/null and b/public/councils/NationalReuseDay2.png differ
diff --git a/public/ecosend.png b/public/ecosend.png
new file mode 100644
index 00000000..4649def5
Binary files /dev/null and b/public/ecosend.png differ
diff --git a/public/posters/A4.jpg b/public/posters/A4.jpg
index 7dbf5171..cd34568e 100644
Binary files a/public/posters/A4.jpg and b/public/posters/A4.jpg differ
diff --git a/public/posters/A4Welsh.jpg b/public/posters/A4Welsh.jpg
index 4b623a45..f257f849 100644
Binary files a/public/posters/A4Welsh.jpg and b/public/posters/A4Welsh.jpg differ
diff --git a/public/posters/A5.jpg b/public/posters/A5.jpg
index ef39fc88..b605fc06 100644
Binary files a/public/posters/A5.jpg and b/public/posters/A5.jpg differ
diff --git a/public/posters/A5Welsh.jpg b/public/posters/A5Welsh.jpg
index fb7cd6b7..3e633e80 100644
Binary files a/public/posters/A5Welsh.jpg and b/public/posters/A5Welsh.jpg differ
diff --git a/public/posters/A5x2.jpg b/public/posters/A5x2.jpg
new file mode 100644
index 00000000..604eaaef
Binary files /dev/null and b/public/posters/A5x2.jpg differ
diff --git a/public/posters/A5x2Welsh.jpg b/public/posters/A5x2Welsh.jpg
index 23457163..bfd6acc8 100644
Binary files a/public/posters/A5x2Welsh.jpg and b/public/posters/A5x2Welsh.jpg differ
diff --git a/setvars.cmd b/setvars.cmd
index ae2c8797..4295bc31 100644
--- a/setvars.cmd
+++ b/setvars.cmd
@@ -1,6 +1,8 @@
+@REM Tell Chris if I add anything here.
set path=%HOMEDRIVE%%HOMEPATH%\AppData\Roaming\nvm\v18.12.0\;c:\Program Files\Microsoft\Azure Functions Core Tools\;%path%
set IZNIK_API_V1=https://fdapidbg.ilovefreegle.org/api
set IZNIK_API_V2=http://127.0.0.1:8192/api
set TRUSTPILOT_LINK=https://uk.trustpilot.com/evaluate/ilovefreegle.org
set NODE_OPTIONS=--max_old_space_size=6000
-
+set GOOGLE_ADSENSE_TEST_MODE=false
+set GOOGLE_ADSENSE_ID=ca-pub-9017028318226154
\ No newline at end of file
diff --git a/stores/auth.js b/stores/auth.js
index 6757623b..01837282 100644
--- a/stores/auth.js
+++ b/stores/auth.js
@@ -245,19 +245,31 @@ export const useAuthStore = defineStore({
return { unknown, worked }
},
async signUp(params) {
- const res = await this.$api.user.signUp(params, false)
- const { ret, status, jwt, persistent } = res
+ try {
+ const res = await this.$api.user.signUp(params, false)
+ const { ret, status, jwt, persistent } = res
- if (res.ret === 0) {
- this.forceLogin = false
+ if (res.ret === 0) {
+ this.forceLogin = false
- this.setAuth(jwt, persistent)
+ this.setAuth(jwt, persistent)
- // We need to fetch the user to get the groups, persistent token etc.
- await this.fetchUser()
- } else {
- // Register failed.
- throw new SignUpError(ret, status)
+ // We need to fetch the user to get the groups, persistent token etc.
+ await this.fetchUser()
+ } else {
+ // Register failed.
+ throw new SignUpError(ret, status)
+ }
+ } catch (e) {
+ console.log('exception', e.response.data)
+ if (e?.response?.data?.ret === 2) {
+ throw new SignUpError(2, e.response.data.status)
+ } else {
+ throw new SignUpError(
+ e?.response?.data?.ret,
+ e?.response?.data?.status
+ )
+ }
}
this.loginCount++
diff --git a/stores/communityevent.js b/stores/communityevent.js
index fc7e711a..ca9af72d 100644
--- a/stores/communityevent.js
+++ b/stores/communityevent.js
@@ -3,6 +3,7 @@ import dayjs from 'dayjs'
import { nextTick } from 'vue'
import api from '~/api'
import { earliestDate, addStrings } from '~/composables/useTimeFormat'
+import { useAuthStore } from '~/stores/auth'
export const useCommunityEventStore = defineStore({
id: 'communityevent',
@@ -121,5 +122,13 @@ export const useCommunityEventStore = defineStore({
byId: (state) => (id) => {
return state.list[id]
},
+ count: (state) => {
+ const lastCommunityEvent =
+ useAuthStore().user?.settings?.lastCommunityEvent || 0
+
+ return state.forUser.filter((item) => {
+ return item.id > lastCommunityEvent
+ }).length
+ },
},
})
diff --git a/stores/compose.js b/stores/compose.js
index 3fd02088..713f710e 100644
--- a/stores/compose.js
+++ b/stores/compose.js
@@ -39,7 +39,7 @@ export const useComposeStore = defineStore({
emailAt: null,
postcode: null,
group: null,
- messages: [],
+ messages: {},
attachmentBump: 1,
_progress: 1,
max: 4,
@@ -262,6 +262,8 @@ export const useComposeStore = defineStore({
console.log('Remove attachment', JSON.stringify(params))
let newAtts = []
+ this.ensureMessage(params.id)
+
if (this.messages[params.id]?.attachments) {
newAtts = this.messages[params.id].attachments.filter((obj) => {
return parseInt(obj.id) !== parseInt(params.photoid)
@@ -374,7 +376,7 @@ export const useComposeStore = defineStore({
return results
},
prune() {
- if (!Array.isArray(this.messages)) {
+ if (this.messages && !Array.isArray(this.messages)) {
// This is bad data.
console.log('Bad compose messages, discard')
this.messages = []
diff --git a/stores/config.js b/stores/config.js
new file mode 100644
index 00000000..30ad1f38
--- /dev/null
+++ b/stores/config.js
@@ -0,0 +1,45 @@
+import { defineStore } from 'pinia'
+import { nextTick } from 'vue'
+import api from '~/api'
+
+export const useConfigStore = defineStore({
+ id: 'config',
+ state: () => ({
+ list: {},
+ }),
+ actions: {
+ init(config) {
+ this.config = config
+ this.fetching = {}
+ },
+ async fetch(key, force) {
+ const now = Math.round(Date.now() / 1000)
+ const expired = this.list[key]?.addedToCache
+ ? now - this.list[key].addedToCache > 600
+ : false
+
+ if (force || expired || !this.list[key]) {
+ if (this.fetching[key]) {
+ await this.fetching[key]
+ await nextTick()
+ } else {
+ this.fetching[key] = api(this.config).config.fetchv2(key, false)
+ const ret = await this.fetching[key]
+ this.list[key] = {
+ values: ret,
+ addedToCache: Math.round(Date.now() / 1000),
+ }
+
+ this.fetching[key] = null
+ }
+ }
+
+ return this.list[key].values
+ },
+ },
+ getters: {
+ byKey: (state) => {
+ return (key) => state.list[key].values
+ },
+ },
+})
diff --git a/stores/message.js b/stores/message.js
index 6b1f593f..13d58bb1 100644
--- a/stores/message.js
+++ b/stores/message.js
@@ -337,9 +337,7 @@ export const useMessageStore = defineStore({
},
all: (state) => Object.values(state.list),
byUser: (state) => (userid) => {
- return Object.values(state.list).filter((msg) => {
- return msg.fromuser === userid
- })
+ return state.byUserList[userid] || []
},
},
})
diff --git a/stores/misc.js b/stores/misc.js
index e20a52a1..19ade351 100644
--- a/stores/misc.js
+++ b/stores/misc.js
@@ -28,6 +28,8 @@ export const useMiscStore = defineStore({
online: true,
pageTitle: null,
stickyAdRendered: 0,
+ adsDisabled: false,
+ lastTyping: null,
}),
actions: {
init(config) {
diff --git a/stores/newsfeed.js b/stores/newsfeed.js
index 1b63c288..4eee6a8c 100644
--- a/stores/newsfeed.js
+++ b/stores/newsfeed.js
@@ -33,6 +33,7 @@ export const useNewsfeedStore = defineStore({
},
async fetchCount(distance, log = true) {
this.lastDistance = distance
+ distance = distance || 'anywhere'
const ret = await api(this.config).news.count(distance, log)
this.count = ret?.count || 0
return this.count
@@ -79,6 +80,7 @@ export const useNewsfeedStore = defineStore({
},
async fetchFeed(distance) {
this.lastDistance = distance
+ distance = distance || 'anywhere'
this.feed = await api(this.config).news.fetch(null, distance)
return this.feed
},
diff --git a/stores/volunteering.js b/stores/volunteering.js
index 24675593..5425dfe4 100644
--- a/stores/volunteering.js
+++ b/stores/volunteering.js
@@ -3,6 +3,7 @@ import dayjs from 'dayjs'
import { nextTick } from 'vue'
import api from '~/api'
import { addStrings, earliestDate } from '~/composables/useTimeFormat'
+import { useAuthStore } from '~/stores/auth'
export const useVolunteeringStore = defineStore({
id: 'volunteering',
@@ -123,5 +124,13 @@ export const useVolunteeringStore = defineStore({
byId: (state) => (id) => {
return state.list[id]
},
+ count: (state) => {
+ const lastVolunteerOpportunity =
+ useAuthStore().user?.settings?.lastVolunteerOpportunity || 0
+
+ return state.forUser.filter((item) => {
+ return item.id > lastVolunteerOpportunity
+ }).length
+ },
},
})