diff --git a/craft/config/project/entryTypes/contact--89c1ac6d-58d9-4a4a-967f-7fa809a70215.yaml b/craft/config/project/entryTypes/contact--89c1ac6d-58d9-4a4a-967f-7fa809a70215.yaml index cd927940..fb04cbab 100644 --- a/craft/config/project/entryTypes/contact--89c1ac6d-58d9-4a4a-967f-7fa809a70215.yaml +++ b/craft/config/project/entryTypes/contact--89c1ac6d-58d9-4a4a-967f-7fa809a70215.yaml @@ -4,82 +4,200 @@ fieldLayouts: - elements: - + autocapitalize: true + autocomplete: false + autocorrect: true + class: null + disabled: false + id: null instructions: null - label: Title + label: null + max: null + min: null + name: null + orientation: null + placeholder: null + readonly: false + requirable: false + size: null + step: null + tip: null + title: null type: craft\fieldlayoutelements\EntryTitleField + warning: null + width: 100 - fieldUid: e4a284e3-2244-492e-89de-7fcbb7e392d8 - required: false - type: craft\fieldlayoutelements\CustomField - - - fieldUid: 6027c90e-6bf7-4408-ac4b-5ed40857fc4f - required: true + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: f223541d-0057-4b42-8f60-11587c05dbf9 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 name: Main sortOrder: 1 - elements: - fieldUid: 13c6850e-3517-47ef-87e2-e01f728a06d5 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: 3fd6881a-8adc-40ad-990a-ae8344de3362 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: aff46670-72d3-4242-baa5-ce06a7dc3952 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 name: Meta sortOrder: 2 - elements: - - fieldUid: f94cdc90-b38d-4b88-86fd-973ecb58cf62 + fieldUid: 6027c90e-6bf7-4408-ac4b-5ed40857fc4f + instructions: null + label: null + required: '1' + tip: null + type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 + - + fieldUid: c29135c5-12a9-402c-bbdd-9df2ed2400a3 + instructions: null + label: null required: false + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - - fieldUid: 2ad2c7f5-b2bd-4612-a7e0-3eff1f2b7f3a + fieldUid: c407100c-c7bf-4445-a0d1-8ed28872359c + instructions: null + label: null required: false + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 + name: Form + sortOrder: 3 + - + elements: + - + fieldUid: f94cdc90-b38d-4b88-86fd-973ecb58cf62 + instructions: null + label: null + required: '0' + tip: null + type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 + - + fieldUid: 2ad2c7f5-b2bd-4612-a7e0-3eff1f2b7f3a + instructions: null + label: null + required: '0' + tip: null + type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: 9c982c7d-2cf8-4aa7-97b3-942a58eae4c3 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: 2cdb40be-2324-479c-9c81-d9969a8209ad - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: a113a8b3-4496-4568-a853-5c570df872f5 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: e5648baf-4d97-4494-979b-83d20590f499 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: 40704421-15a9-47a3-ae0b-9a493b494ba6 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: 03dca4c0-2afa-461b-be54-c116b4183458 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 - fieldUid: e6759eb9-e696-415e-b3f3-a4937ef0b486 - required: false + instructions: null + label: null + required: '0' + tip: null type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 name: 'Google Maps' - sortOrder: 3 + sortOrder: 4 handle: contact hasTitleField: true name: Contact section: 25fdcba8-77b9-4110-a0e1-ec7a9894321c sortOrder: 1 titleFormat: '{section.name|raw}' +titleTranslationKeyFormat: null +titleTranslationMethod: site diff --git a/craft/config/project/fieldGroups/01e54fd7-954a-449d-baee-f11148cbb95d.yaml b/craft/config/project/fieldGroups/01e54fd7-954a-449d-baee-f11148cbb95d.yaml new file mode 100644 index 00000000..9b216951 --- /dev/null +++ b/craft/config/project/fieldGroups/01e54fd7-954a-449d-baee-f11148cbb95d.yaml @@ -0,0 +1 @@ +name: Form diff --git a/craft/config/project/fields/confirmationMailText--114a318e-21fc-4304-a4d9-7b6702c52fa2.yaml b/craft/config/project/fields/confirmationMailText--114a318e-21fc-4304-a4d9-7b6702c52fa2.yaml new file mode 100644 index 00000000..57eea40e --- /dev/null +++ b/craft/config/project/fields/confirmationMailText--114a318e-21fc-4304-a4d9-7b6702c52fa2.yaml @@ -0,0 +1,27 @@ +contentColumnType: text +fieldGroup: 01e54fd7-954a-449d-baee-f11148cbb95d +handle: confirmationMailText +instructions: '' +name: 'Confirmation Mail Text' +searchable: false +settings: + availableTransforms: '*' + availableVolumes: '*' + cleanupHtml: true + columnType: text + configSelectionMode: choose + defaultTransform: '' + manualConfig: '' + purifierConfig: '' + purifyHtml: '1' + redactorConfig: Simple.json + removeEmptyTags: '1' + removeInlineStyles: '1' + removeNbsp: '1' + showHtmlButtonForNonAdmins: '' + showUnpermittedFiles: false + showUnpermittedVolumes: false + uiMode: enlarged +translationKeyFormat: null +translationMethod: language +type: craft\redactor\Field diff --git a/craft/config/project/fields/errorMessage--c407100c-c7bf-4445-a0d1-8ed28872359c.yaml b/craft/config/project/fields/errorMessage--c407100c-c7bf-4445-a0d1-8ed28872359c.yaml new file mode 100644 index 00000000..92b01de0 --- /dev/null +++ b/craft/config/project/fields/errorMessage--c407100c-c7bf-4445-a0d1-8ed28872359c.yaml @@ -0,0 +1,18 @@ +contentColumnType: text +fieldGroup: 01e54fd7-954a-449d-baee-f11148cbb95d +handle: errorMessage +instructions: '' +name: 'Error Message' +searchable: false +settings: + byteLimit: null + charLimit: null + code: '' + columnType: null + initialRows: '4' + multiline: '' + placeholder: 'An error occurred while sending the form, please try again later.' + uiMode: normal +translationKeyFormat: null +translationMethod: language +type: craft\fields\PlainText diff --git a/craft/config/project/fields/successMessage--c29135c5-12a9-402c-bbdd-9df2ed2400a3.yaml b/craft/config/project/fields/successMessage--c29135c5-12a9-402c-bbdd-9df2ed2400a3.yaml new file mode 100644 index 00000000..eee384dd --- /dev/null +++ b/craft/config/project/fields/successMessage--c29135c5-12a9-402c-bbdd-9df2ed2400a3.yaml @@ -0,0 +1,18 @@ +contentColumnType: text +fieldGroup: 01e54fd7-954a-449d-baee-f11148cbb95d +handle: successMessage +instructions: '' +name: 'Success Message' +searchable: false +settings: + byteLimit: null + charLimit: null + code: '' + columnType: null + initialRows: '4' + multiline: '' + placeholder: 'Your message has been sent' + uiMode: normal +translationKeyFormat: null +translationMethod: language +type: craft\fields\PlainText diff --git a/craft/config/project/globalSets/email--44ac8d35-2ce7-4de7-a60b-eb2595afac3e.yaml b/craft/config/project/globalSets/email--44ac8d35-2ce7-4de7-a60b-eb2595afac3e.yaml new file mode 100644 index 00000000..c0812153 --- /dev/null +++ b/craft/config/project/globalSets/email--44ac8d35-2ce7-4de7-a60b-eb2595afac3e.yaml @@ -0,0 +1,18 @@ +fieldLayouts: + 8dc87168-69b4-4eb0-b36c-9cc3b155033c: + tabs: + - + elements: + - + fieldUid: 114a318e-21fc-4304-a4d9-7b6702c52fa2 + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + warning: null + width: 100 + name: Main + sortOrder: 1 +handle: email +name: Email diff --git a/craft/config/project/project.yaml b/craft/config/project/project.yaml index ad6829b2..6a56e881 100644 --- a/craft/config/project/project.yaml +++ b/craft/config/project/project.yaml @@ -1,4 +1,4 @@ -dateModified: 1612781056 +dateModified: 1612792003 email: fromEmail: $SYSTEM_EMAIL fromName: $SENDER_NAME diff --git a/craft/templates/_includes/footer.twig b/craft/templates/_includes/footer.twig index 16080004..9a75cef3 100644 --- a/craft/templates/_includes/footer.twig +++ b/craft/templates/_includes/footer.twig @@ -10,11 +10,7 @@
- {% if craft.app.language == 'de' %} - Mehr links - {% else %} - More links - {% endif %} + {{ 'footer.moreLinks'|t }} {% set footerGlobal = craft.app.globals.getSetByHandle('footer') %}
diff --git a/craft/templates/_layout.twig b/craft/templates/_layout.twig index a6a87996..183280f7 100644 --- a/craft/templates/_layout.twig +++ b/craft/templates/_layout.twig @@ -136,9 +136,12 @@ + {% set recaptchaKey = getenv('RECAPTCHA_SITE') %} diff --git a/craft/templates/_mail/confirmation.twig b/craft/templates/_mail/confirmation.twig index 8d954806..c898b2f7 100644 --- a/craft/templates/_mail/confirmation.twig +++ b/craft/templates/_mail/confirmation.twig @@ -1,8 +1,7 @@ -{% set homepage = craft.entries.section('homepage').one() %} +{% set emailGlobal = craft.app.globals.getSetByHandle('email') %}
- {% set confirmationText = homepage["confirmationMailText"] ?? null %} - {% if confirmationText %} -
{{ confirmationText }}
+ {% if emailGlobal.confirmationMailText is defined and emailGlobal.confirmationMailText is not empty %} +
{{ emailGlobal.confirmationText }}
{% endif %}
diff --git a/craft/templates/contact.twig b/craft/templates/contact.twig index 536fb4df..8dbb35d8 100644 --- a/craft/templates/contact.twig +++ b/craft/templates/contact.twig @@ -14,30 +14,6 @@ {% set title = entry.title %} - - -{% if craft.app.language == 'de' %} - {% set contactTitle = 'Kontaktformular' %} - {% set contactName = 'Name' %} - {% set contactSurname = 'Nachname' %} - {% set contactEmail = 'Email' %} - {% set contactSubject = 'Betreff' %} - {% set contactMessage = 'Nachricht' %} - {% set contactPrivacyText = 'Ich bestätige hiermit das Lesen und akzeptiere den ' %} - {% set contactPrivacy = 'Datenschutz' %} - {% set contactSubmit = 'Senden' %} -{% else %} - {% set contactTitle = 'Contact Form' %} - {% set contactName = 'Name' %} - {% set contactSurname = 'Surname' %} - {% set contactEmail = 'Email' %} - {% set contactSubject = 'Subject' %} - {% set contactMessage = 'Message' %} - {% set contactPrivacyText = 'I have read and agree to the ' %} - {% set contactPrivacy = 'Data Policy' %} - {% set contactSubmit = 'Submit' %} -{% endif %} - {% block hero %} {#Hero#}
@@ -66,102 +42,20 @@
-

{{ contactTitle }}

-
-
+

{{ 'form.contactForm'|t }}

+ + +
diff --git a/craft/templates/index.twig b/craft/templates/index.twig index b8d53159..d4acf15d 100644 --- a/craft/templates/index.twig +++ b/craft/templates/index.twig @@ -12,12 +12,6 @@ {% block content %}
-
-
-

Craft Helium

-
-
- {% for component in entry.components.level(1).all() %} {% include "_components/" ~ component.type %} {% endfor %} diff --git a/craft/translations/de/site.php b/craft/translations/de/site.php new file mode 100644 index 00000000..c60a0b50 --- /dev/null +++ b/craft/translations/de/site.php @@ -0,0 +1,9 @@ + 'Kontaktformular', + 'footer.moreLinks' => 'Mehr links', + 'email.dataPolicy' => 'Datenschutzbestimmungen', + 'email.accepted' => 'Akzeptiert', + 'email.rejected' => 'Abgelehnt', +]; \ No newline at end of file diff --git a/craft/translations/en-GB/site.php b/craft/translations/en-GB/site.php new file mode 100644 index 00000000..54b8d0af --- /dev/null +++ b/craft/translations/en-GB/site.php @@ -0,0 +1,9 @@ + 'Contact Form', + 'footer.moreLinks' => 'More links', + 'email.dataPolicy' => 'Privacy Policy', + 'email.accepted' => 'Accepted', + 'email.rejected' => 'Rejected', +]; \ No newline at end of file diff --git a/frontend/application/src/components/custom-form.vue b/frontend/application/src/components/custom-form.vue new file mode 100644 index 00000000..24410500 --- /dev/null +++ b/frontend/application/src/components/custom-form.vue @@ -0,0 +1,81 @@ + + + \ No newline at end of file diff --git a/frontend/application/src/components/custom-select.vue b/frontend/application/src/components/custom-select.vue index c6cca36e..ec0d2ee0 100644 --- a/frontend/application/src/components/custom-select.vue +++ b/frontend/application/src/components/custom-select.vue @@ -8,6 +8,7 @@ ref="select" :class="{'hidden':isHidden}" :id="selectId" + :name="selectId" @focus="focusSelect()" @blur="blurSelect()" @change="changeSelect()" diff --git a/frontend/application/src/components/scripts/custom-form.ts b/frontend/application/src/components/scripts/custom-form.ts new file mode 100644 index 00000000..d77a4a72 --- /dev/null +++ b/frontend/application/src/components/scripts/custom-form.ts @@ -0,0 +1,83 @@ +import {Vue, prop} from "vue-class-component"; +import {IReCaptchaComposition, useReCaptcha} from 'vue-recaptcha-v3'; + +class Props { + dataPolicyPage = prop({ + default: '', + }); + successMessage = prop({ + default: 'Your message has been sent', + }); + errorMessage = prop({ + default: 'An error occurred while sending the form, please try again later.', + }); +} + +export default class CustomForm extends Vue.with(Props) { + customSelectValues = [ + { value: 'sir', label: 'Sir' }, + { value: 'madam', label: 'Madam' }, + { value: 'diverse', label: 'Diverse'} + ]; + action = 'contact-form/send'; + success = false; + error = false; + errors: object = { message: {}}; + recaptchaToken: string = ''; + recaptcha: IReCaptchaComposition; + + mounted() { + const recaptcha = useReCaptcha(); + if (!!recaptcha) { + this.recaptcha = recaptcha; + } + } + + onPrivacyClick() { + if(this.recaptcha) { + this.recaptcha.recaptchaLoaded().then(() => { + // Execute reCAPTCHA with action "login". + this.recaptcha.executeRecaptcha('submit').then((token) => { + this.recaptchaToken = token; + }); + }); + } + } + + sendForm(e) { + e.preventDefault(); + + const data = new FormData((this.$refs.form as HTMLFormElement)); + + fetch('/', { + method: 'POST', + credentials: 'include', + body: data, + }).then(response => { + if (response.status === 200) { + this.success = true; + this.error = false; + } else if (response.status >= 500) { + this.error = true; + this.success = false; + } else if (response.status >= 400) { + // @ts-ignore + const errors = response.errors; + if(errors) { + this.errors = errors; + } + this.error = true; + this.success = false; + } + }).catch(error => { + console.error(error); + this.error = true; + this.success = false; + }); + } + + onInput(e) { + const el = e.target; + el.classList.add('dirty'); + } +} \ No newline at end of file diff --git a/frontend/application/src/i18n/index.ts b/frontend/application/src/i18n/index.ts new file mode 100644 index 00000000..fe4c4485 --- /dev/null +++ b/frontend/application/src/i18n/index.ts @@ -0,0 +1,7 @@ +import { createI18n } from "vue-i18n"; +import messages from "./messages"; + +export const i18n = createI18n({ + locale: 'en-GB', + messages +}) \ No newline at end of file diff --git a/frontend/application/src/i18n/messages.ts b/frontend/application/src/i18n/messages.ts new file mode 100644 index 00000000..2580e1bb --- /dev/null +++ b/frontend/application/src/i18n/messages.ts @@ -0,0 +1,38 @@ +export default { + en: { + form: { + salutation: 'Salutation', + name: 'Name', + surname: 'Surname', + email: 'Email', + subject: 'Subject', + message: 'Message', + submit: 'Submit', + privacyText: 'I have read and agree to the ', + privacy: 'Data Policy', + recaptchaText: 'This site is protected by reCAPTCHA and the Google', + recaptchaTextEnd: ' apply.', + dataPolicy: 'Privacy Policy', + terms: 'Terms of Service', + and: 'and', + } + }, + de: { + form: { + salutation: 'Anrede', + name: 'Name', + surname: 'Nachname', + email: 'E-Mail', + subject: 'Betreff', + message: 'Nachricht', + submit: 'Senden', + privacyText: 'Ich bestätige hiermit das Lesen und akzeptiere den ', + privacy: 'Datenschutz', + recaptchaText: 'Diese Website ist durch reCAPTCHA geschützt (es gelten die Google', + recaptchaTextEnd: ').', + dataPolicy: 'Datenschutzbestimmungen', + terms: 'Nutzungsbedingungen', + and: 'und', + } + } +} \ No newline at end of file diff --git a/frontend/application/src/main.ts b/frontend/application/src/main.ts index 9b2492ed..9a309427 100644 --- a/frontend/application/src/main.ts +++ b/frontend/application/src/main.ts @@ -1,8 +1,10 @@ /* --- Application --- */ import { createApp } from 'vue'; import scrollIntoViewport from './helpers/scroll-into-viewport'; -import {Section} from './models/Section'; +import { Section } from './models/Section'; import { store } from './store'; +import { i18n } from "./i18n"; +import { VueReCaptcha } from "vue-recaptcha-v3"; /* --- Styles --- */ import 'tailwindcss/tailwind.css'; @@ -18,6 +20,7 @@ import LazyMedia from './components/lazy-media.vue'; import Carousel from './components/carousel.vue'; import CarouselSlide from './components/carousel-slide.vue'; import Swipe from "./components/swipe.vue"; +import CustomForm from "./components/custom-form.vue"; // Create the vue instance const app = createApp({ @@ -46,6 +49,9 @@ const app = createApp({ return this.$store.getters.activeSectionId; }, }, + created() { + this.$i18n.locale = document.documentElement.lang; + }, mounted() { this.flyoutScrollbox = document.querySelector('#flyoutScrollbox') as HTMLElement; @@ -131,8 +137,17 @@ app.component('lazy-media', LazyMedia as any); app.component('multi-carousel', Carousel as any); app.component('carousel-slide', CarouselSlide as any); app.component('swipe', Swipe as any); +app.component('custom-form', CustomForm as any); app.use(store); +app.use(i18n); +app.use(VueReCaptcha, { + // @ts-ignore + siteKey: window.recaptchaKey, + loaderOptions: { + autoHideBadge: true + } +}) // Connect the Vue instance to the whole
container // Avoid to use the standard DOM API as a virtual-dom will handle it diff --git a/frontend/application/src/styles/styles-async/form.css b/frontend/application/src/styles/styles-async/form.css index b4ff89af..e625d049 100644 --- a/frontend/application/src/styles/styles-async/form.css +++ b/frontend/application/src/styles/styles-async/form.css @@ -158,8 +158,8 @@ textarea:focus { border-color: var(--form-active-color); } -.input-wrapper.filled input:invalid, -textarea:invalid { +input.dirty:invalid, +textarea.dirty:invalid { @apply outline-none; border-color: var(--form-error-color); } @@ -192,7 +192,7 @@ textarea:focus + label { color: var(--form-active-color); } -input:invalid + label { +input.dirty:invalid + label { color: var(--form-error-color); } diff --git a/frontend/package.json b/frontend/package.json index 5c6ddf39..4453dbed 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -51,8 +51,9 @@ "v8n": "^1.3.3", "vue": "^3.0.0", "vue-class-component": "^8.0.0-rc.1", - "vue-i18n": "^8.21.1", + "vue-i18n": "^9.0.0-rc.4", "vue-loader": "^16.1.2", + "vue-recaptcha-v3": "^2.0.0", "vue-template-compiler": "^2.6.12", "vuex": "^4.0.0-rc.1", "vuex-class": "^0.3.2", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 21134e44..d11605fe 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -49,6 +49,44 @@ dependencies: purgecss "^3.1.3" +"@intlify/core-base@9.0.0-rc.4": + version "9.0.0-rc.4" + resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.0.0-rc.4.tgz#a0f4cab4fa6d449228bcb390ddc4ef076c92125a" + integrity sha512-U4YhxDr53ypDVRus6Q+tkmoD2LErsiPsaBULhJ1HcHTSFqNXGbmAYlp4uhQDIp/pvQHQN2uy/FRnQw7Xd2np6A== + dependencies: + "@intlify/message-compiler" "9.0.0-rc.4" + "@intlify/message-resolver" "9.0.0-rc.4" + "@intlify/runtime" "9.0.0-rc.4" + "@intlify/shared" "9.0.0-rc.4" + +"@intlify/message-compiler@9.0.0-rc.4": + version "9.0.0-rc.4" + resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.0.0-rc.4.tgz#0f21c8cca8ee7f8d0e2e3f6460c33731d41b91ee" + integrity sha512-hny4Mjw4ah8i5m9UoSf1twfeQbXk1vc3LgiOF3ZIu5/tOBlG16hh5+Ma2N949ottHwFaVAHxjRFNzvVXDEEM3Q== + dependencies: + "@intlify/message-resolver" "9.0.0-rc.4" + "@intlify/shared" "9.0.0-rc.4" + source-map "0.6.1" + +"@intlify/message-resolver@9.0.0-rc.4": + version "9.0.0-rc.4" + resolved "https://registry.yarnpkg.com/@intlify/message-resolver/-/message-resolver-9.0.0-rc.4.tgz#0141eabbc88c94ed4c4c8a1c3a0777ea6e05e026" + integrity sha512-OAjfDVE77oLbizpVuZIh2iYZdr3xEyzXCpBtfZ4QuWgOuEIaFTF0ti769UucR5C8MXJr0PJwuW1RHpJahYldWw== + +"@intlify/runtime@9.0.0-rc.4": + version "9.0.0-rc.4" + resolved "https://registry.yarnpkg.com/@intlify/runtime/-/runtime-9.0.0-rc.4.tgz#bb54c07c388bac63b57f595e951985e26981e6a7" + integrity sha512-PfMdCINVB1A61w52B4Kz5D/eWuP8U9Uci07cAhg1galeEf/qdEwPWOepQK+Qyx5jIl5dcLOCasRyV6rCBtcnzQ== + dependencies: + "@intlify/message-compiler" "9.0.0-rc.4" + "@intlify/message-resolver" "9.0.0-rc.4" + "@intlify/shared" "9.0.0-rc.4" + +"@intlify/shared@9.0.0-rc.4": + version "9.0.0-rc.4" + resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.0.0-rc.4.tgz#22b25d364cc36ae8a3ce562be4382983d3bbb4c1" + integrity sha512-R5MK/4syRGP7/JQ+7apdvj8H1RlLxsMyZz6NIcZxcna8w7tv3yWUo/xiFKKwEfiiEH3r9DJfBOrpiWPkYo5GEA== + "@kazupon/vue-i18n-loader@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@kazupon/vue-i18n-loader/-/vue-i18n-loader-0.3.0.tgz#e068de2d75d891275814ae28ad1fcaf1b537694f" @@ -257,6 +295,11 @@ "@vue/compiler-dom" "3.0.4" "@vue/shared" "3.0.4" +"@vue/devtools-api@^6.0.0-beta.3": + version "6.0.0-beta.6" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.0.0-beta.6.tgz#bceabad6631156c57bdf790bfbbd5df27545e2a2" + integrity sha512-BRQOUjncqTRmYRXH76TWYYzi3O+Xhto2/wD6GN30pbFoYimgJHCwfYaeL8iSZ2aBTNHgO9Rd73qXt1kn9p3S8g== + "@vue/reactivity@3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.0.4.tgz#b6599dd8271a745960a03f05744ccf7991ba5d8d" @@ -4413,6 +4456,11 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +recaptcha-v3@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/recaptcha-v3/-/recaptcha-v3-1.8.0.tgz#b39ae7cba5322ed7027359c3f14502e44e909f83" + integrity sha512-ugtg4JHDZiYJwv3ZjWBBZntsTCVpRk2BD8AhVVpSw9jv71SSx+SS9H342VaE0D2XV78DpRdDuiMO9ZIgl4zI3A== + reduce-css-calc@^2.1.6: version "2.1.8" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" @@ -4754,16 +4802,16 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" @@ -5287,10 +5335,14 @@ vue-class-component@^8.0.0-rc.1: resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-8.0.0-rc.1.tgz#db692cd97656eb9a08206c03d0b7398cdb1d9420" integrity sha512-w1nMzsT/UdbDAXKqhwTmSoyuJzUXKrxLE77PCFVuC6syr8acdFDAq116xgvZh9UCuV0h+rlCtxXolr3Hi3HyPQ== -vue-i18n@^8.21.1: - version "8.22.2" - resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.22.2.tgz#58299a5a050e67b4f799d96fee7dd8bd269e0907" - integrity sha512-rb569fVJInPUgS/bbCxEQ9DrAoFTntuJvYoK4Fpk2VfNbA09WzdTKk57ppjz3S+ps9hW+p9H+2ASgMvojedkow== +vue-i18n@^9.0.0-rc.4: + version "9.0.0-rc.4" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.0.0-rc.4.tgz#717d9604e61bc8f5af74a023c40881a194f88a58" + integrity sha512-PPOQpMVnR7p0IqVSWAc0PN/qowvF6IA0IVdp0NQ/VcaqqBrVGGOyeo5YENdVePT5U1oF9MY8ZKVxFLKdqMTMJw== + dependencies: + "@intlify/core-base" "9.0.0-rc.4" + "@intlify/shared" "9.0.0-rc.4" + "@vue/devtools-api" "^6.0.0-beta.3" vue-loader@^16.1.2: version "16.1.2" @@ -5301,6 +5353,13 @@ vue-loader@^16.1.2: hash-sum "^2.0.0" loader-utils "^2.0.0" +vue-recaptcha-v3@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vue-recaptcha-v3/-/vue-recaptcha-v3-2.0.0.tgz#d8fd29d74d159895f3c68dd9bcfd0d9538e38f00" + integrity sha512-33UEpaBoIHW2XWf+Kc+ny2ri7d2LN/UgaxUNqo30fSzAxmNc71E+/mJrSBhG95iaOQCzj54fxtz/KSfesSS5sA== + dependencies: + recaptcha-v3 "^1.8.0" + vue-template-compiler@^2.6.12: version "2.6.12" resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e"