diff --git a/app/Http/Controllers/FileFunctions/EditItemsController.php b/app/Http/Controllers/FileFunctions/EditItemsController.php
index 7a6b451f..48844099 100644
--- a/app/Http/Controllers/FileFunctions/EditItemsController.php
+++ b/app/Http/Controllers/FileFunctions/EditItemsController.php
@@ -116,7 +116,7 @@ class EditItemsController extends Controller
}
// If request have a change folder icon values set the folder icon
- if ($request->type === 'folder' && $request->filled('folder_icon')) {
+ if ($request->type === 'folder' && $request->filled('icon')) {
Editor::set_folder_icon($request->folder_icon, $id);
}
@@ -158,9 +158,9 @@ class EditItemsController extends Controller
}
// If request have a change folder icon values set the folder icon
- if ($request->type === 'folder' && $request->filled('folder_icon')) {
+ if ($request->type === 'folder' && $request->filled('icon')) {
- Editor::set_folder_icon($request->folder_icon, $unique_id, $shared);
+ Editor::set_folder_icon($request->icon, $unique_id, $shared);
}
// Rename item
diff --git a/app/Http/Tools/Demo.php b/app/Http/Tools/Demo.php
index bc575845..2f1ae6ff 100644
--- a/app/Http/Tools/Demo.php
+++ b/app/Http/Tools/Demo.php
@@ -42,6 +42,8 @@ class Demo
'unique_id' => random_int(1000, 9999),
'user_scope' => $user_scope,
'items' => '0',
+ 'icon_color' => isset($request->icon['color']) ? $request->icon['color'] : null,
+ 'icon_emoji' => isset($request->icon['emoji']) ? $request->icon['emoji'] : null,
'updated_at' => Carbon::now()->format('j M Y \a\t H:i'),
'created_at' => Carbon::now()->format('j M Y \a\t H:i'),
];
@@ -72,8 +74,8 @@ class Demo
if ($item) {
$item->name = $request->name;
- $item->icon_emoji = $request->folder_icon['emoji'] ?? null;
- $item->icon_color = $request->folder_icon['color'] ?? null;
+ $item->icon_emoji = $request->icon['emoji'] ?? null;
+ $item->icon_color = $request->icon['color'] ?? null;
return $item;
diff --git a/app/Http/Tools/Editor.php b/app/Http/Tools/Editor.php
index 9457eafa..821511f0 100644
--- a/app/Http/Tools/Editor.php
+++ b/app/Http/Tools/Editor.php
@@ -29,11 +29,11 @@ class Editor
/**
* Store folder icon
*
- * @param $folder_icon
+ * @param $icon
* @param $unique_id
* @param $shared
*/
- public static function set_folder_icon($folder_icon, $unique_id, $shared = null)
+ public static function set_folder_icon($icon, $unique_id, $shared = null)
{
$user_id = is_null($shared) ? Auth::id() : $shared->user_id;
@@ -43,21 +43,21 @@ class Editor
->first();
// Set default folder icon
- if ($folder_icon === 'default') {
+ if ($icon === 'default') {
$folder->icon_emoji = null;
$folder->icon_color = null;
}
// If request have emoji set folder icon emoji
- if (isset($folder_icon['emoji'])) {
- $folder->icon_emoji = $folder_icon['emoji'];
+ if (isset($icon['emoji'])) {
+ $folder->icon_emoji = $icon['emoji'];
$folder->icon_color = null;
}
// If request have color set folder icon color
- if (isset($folder_icon['color'])) {
+ if (isset($icon['color'])) {
$folder->icon_emoji = null;
- $folder->icon_color = $folder_icon['color'];
+ $folder->icon_color = $icon['color'];
}
// Save changes
@@ -235,6 +235,8 @@ class Editor
'user_id' => $user_id,
'type' => 'folder',
'name' => $name,
+ 'icon_color' => isset($request->icon['color']) ? $request->icon['color'] : null,
+ 'icon_emoji' => isset($request->icon['emoji']) ? $request->icon['emoji'] : null,
]);
// Return new folder
diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php
index 74320caa..b7d63541 100644
--- a/app/Notifications/ResetPassword.php
+++ b/app/Notifications/ResetPassword.php
@@ -41,14 +41,15 @@ class ResetPassword extends Notification
public function toMail($notifiable)
{
$reset_url = url('/create-new-password?token=' . $this->token);
+ $app_name = get_setting('app_title') ?? 'VueFileManager';
return (new MailMessage)
- ->subject(__('vuefilemanager.reset_password_subject') . config('vuefilemanager.app_name'))
+ ->subject(__('vuefilemanager.reset_password_subject') . $app_name)
->greeting(__('vuefilemanager.reset_password_greeting'))
->line(__('vuefilemanager.reset_password_line_1'))
->action(__('vuefilemanager.reset_password_action'), $reset_url)
->line(__('vuefilemanager.reset_password_line_2'))
- ->salutation(__('vuefilemanager.salutation') . ', ' . config('vuefilemanager.app_name'));
+ ->salutation(__('vuefilemanager.salutation') . ', ' . $app_name);
}
/**
diff --git a/app/Notifications/SharedSendViaEmail.php b/app/Notifications/SharedSendViaEmail.php
index 7cd1a2b5..cc1f9057 100644
--- a/app/Notifications/SharedSendViaEmail.php
+++ b/app/Notifications/SharedSendViaEmail.php
@@ -46,7 +46,8 @@ class SharedSendViaEmail extends Notification
->subject(__('vuefilemanager.shared_link_email_subject' , ['user' => $this->user->name]))
->greeting(__('vuefilemanager.shared_link_email_greeting'))
->line(__('vuefilemanager.shared_link_email_user', ['user' => $this->user->name, 'email' => $this->user->email]))
- ->action(__('vuefilemanager.shared_link_email_link'), url('/shared', ['token' => $this->token]));
+ ->action(__('vuefilemanager.shared_link_email_link'), url('/shared', ['token' => $this->token]))
+ ->salutation(__('vuefilemanager.shared_link_email_salutation', ['app_name' => get_setting('app_title') ?? 'VueFileManager']));
}
/**
diff --git a/resources/js/components/FilesView/ContextMenu.vue b/resources/js/components/FilesView/ContextMenu.vue
index 9330b94d..a7a0988c 100644
--- a/resources/js/components/FilesView/ContextMenu.vue
+++ b/resources/js/components/FilesView/ContextMenu.vue
@@ -114,8 +114,8 @@
-
-
diff --git a/resources/js/components/Others/ColorPicker.vue b/resources/js/components/Others/ColorPicker.vue
new file mode 100644
index 00000000..a1a59743
--- /dev/null
+++ b/resources/js/components/Others/ColorPicker.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/components/Others/CreateFolder.vue b/resources/js/components/Others/CreateFolder.vue
index 45ab116b..a64e30d1 100644
--- a/resources/js/components/Others/CreateFolder.vue
+++ b/resources/js/components/Others/CreateFolder.vue
@@ -16,6 +16,10 @@
{{ errors[0] }}
+
+
+
+ {{ moreOptionsTitle }}
@@ -44,11 +48,11 @@
import PopupContent from '@/components/Others/Popup/PopupContent'
import PopupHeader from '@/components/Others/Popup/PopupHeader'
import ThumbnailItem from '@/components/Others/ThumbnailItem'
+ import SetFolderIcon from '@/components/Others/SetFolderIcon'
import ActionButton from '@/components/Others/ActionButton'
import ButtonBase from '@/components/FilesView/ButtonBase'
import {required} from 'vee-validate/dist/rules'
import {events} from '@/bus'
- import axios from 'axios'
export default {
name: 'CreateFolder',
@@ -56,6 +60,7 @@
ValidationProvider,
ValidationObserver,
ThumbnailItem,
+ SetFolderIcon,
ActionButton,
PopupWrapper,
PopupActions,
@@ -64,19 +69,29 @@
ButtonBase,
required,
},
+ computed: {
+ moreOptionsTitle() {
+ return this.isMoreOptions ? this.$t('shared_form.button_close_options') : this.$t('shared_form.button_folder_icon_open')
+ }
+ },
data() {
return {
name: undefined,
+ isMoreOptions: false,
+ folderIcon: undefined
}
},
methods: {
+ moreOptions() {
+ this.isMoreOptions = !this.isMoreOptions
+ },
async createFolder() {
// Validate fields
const isValid = await this.$refs.createForm.validate();
if (isValid) {
- this.$store.dispatch('createFolder', this.name)
+ this.$store.dispatch('createFolder', {'name':this.name, 'icon': this.folderIcon})
this.$closePopup()
@@ -85,11 +100,19 @@
},
},
mounted() {
+ events.$on('setFolderIcon', (icon) => {
+ this.folderIcon = icon
+ })
+
events.$on('popup:open', ({name}) => {
if (name === 'create-folder' && ! this.$isMobile())
this.$nextTick(() => this.$refs.input.focus())
})
+
+ events.$on('setFolderIcon', (icon) => {
+ this.setFolderIcon = icon
+ })
}
}
diff --git a/resources/js/components/Others/EmojiPicker.vue b/resources/js/components/Others/EmojiPicker.vue
new file mode 100644
index 00000000..b17d519d
--- /dev/null
+++ b/resources/js/components/Others/EmojiPicker.vue
@@ -0,0 +1,497 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ $t('popup_rename.emoji_list_not_found') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/components/Others/Popup/PopupWrapper.vue b/resources/js/components/Others/Popup/PopupWrapper.vue
index 7e5945e0..8b1e8790 100644
--- a/resources/js/components/Others/Popup/PopupWrapper.vue
+++ b/resources/js/components/Others/Popup/PopupWrapper.vue
@@ -33,6 +33,9 @@
if (this.name === name)
this.isVisibleWrapper = true
+
+ if( (this.name !== name))
+ this.isVisibleWrapper = false
})
// Open called popup
diff --git a/resources/js/components/Others/RenameItem.vue b/resources/js/components/Others/RenameItem.vue
index 88d83097..748c9189 100644
--- a/resources/js/components/Others/RenameItem.vue
+++ b/resources/js/components/Others/RenameItem.vue
@@ -24,7 +24,7 @@
{{ errors[0] }}
-
+
{{ moreOptionsTitle }}
@@ -56,7 +56,6 @@ import ButtonBase from '@/components/FilesView/ButtonBase'
import { XIcon } from 'vue-feather-icons'
import { required } from 'vee-validate/dist/rules'
import { events } from '@/bus'
-import axios from 'axios'
export default {
name: 'RenameItem',
@@ -100,7 +99,7 @@ export default {
unique_id: this.pickedItem.unique_id,
type: this.pickedItem.type,
name: this.pickedItem.name,
- folder_icon: this.setFolderIcon ? this.setFolderIcon : null
+ icon: this.setFolderIcon ? this.setFolderIcon : null
}
// Rename item request
@@ -133,7 +132,7 @@ export default {
})
events.$on('setFolderIcon', (icon) => {
- this.setFolderIcon = icon.value
+ this.setFolderIcon = icon
})
}
}
diff --git a/resources/js/components/Others/SetFolderIcon.vue b/resources/js/components/Others/SetFolderIcon.vue
index 9afef742..9e35f626 100644
--- a/resources/js/components/Others/SetFolderIcon.vue
+++ b/resources/js/components/Others/SetFolderIcon.vue
@@ -1,595 +1,101 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{ $t('popup_rename.emoji_list_not_found') }}
-
-
-
-
-
-
+
+
+
-
+
-
-
-
-
+
-
diff --git a/resources/js/components/Others/ShareEdit.vue b/resources/js/components/Others/ShareEdit.vue
index 8d154677..9e89bb43 100644
--- a/resources/js/components/Others/ShareEdit.vue
+++ b/resources/js/components/Others/ShareEdit.vue
@@ -333,6 +333,7 @@
if (args.sentToEmail)
this.sendToRecipientsMenu = true
+ this.isEmailSended = false
this.canChangePassword = args.item.shared.protected
})
diff --git a/resources/js/store/modules/fileFunctions.js b/resources/js/store/modules/fileFunctions.js
index 64b62165..d04dae2f 100644
--- a/resources/js/store/modules/fileFunctions.js
+++ b/resources/js/store/modules/fileFunctions.js
@@ -113,7 +113,7 @@ const actions = {
})
.catch(() => Vue.prototype.$isSomethingWrong())
},
- createFolder: ({ commit, getters, dispatch }, folderName) => {
+ createFolder: ({ commit, getters, dispatch }, folder) => {
// Get route
let route = getters.sharedDetail && !getters.sharedDetail.protected
@@ -123,7 +123,8 @@ const actions = {
axios
.post(route, {
parent_id: getters.currentFolder.unique_id,
- name: folderName
+ name: folder.name,
+ icon: folder.icon
})
.then(response => {
commit('ADD_NEW_FOLDER', response.data)
@@ -158,7 +159,7 @@ const actions = {
.post(route, {
name: data.name,
type: data.type,
- folder_icon: data.folder_icon,
+ icon: data.icon,
_method: 'patch'
})
.then(response => {
diff --git a/resources/lang/cn/vuefilemanager.php b/resources/lang/cn/vuefilemanager.php
index 627117ba..83715e14 100644
--- a/resources/lang/cn/vuefilemanager.php
+++ b/resources/lang/cn/vuefilemanager.php
@@ -12,6 +12,7 @@ return [
'shared_link_email_greeting' => 'Hello!',
'shared_link_email_user' => ':user (:email) send you a link to shared files.',
'shared_link_email_link' => 'Open your files',
+ 'shared_link_email_salutation' => 'Regards, :app_name',
// Reset password email
'reset_password_greeting' => 'Hello!',
diff --git a/resources/lang/en/vuefilemanager.php b/resources/lang/en/vuefilemanager.php
index c0717c38..3095fb51 100644
--- a/resources/lang/en/vuefilemanager.php
+++ b/resources/lang/en/vuefilemanager.php
@@ -8,10 +8,11 @@ return [
'home' => 'Home',
//Shared link email message
- 'shared_link_email_subject' => '🙋 :user share some files with you. Look at it!',
- 'shared_link_email_greeting' => 'Hello!',
- 'shared_link_email_user' => ':user (:email) send you a link to shared files.',
- 'shared_link_email_link' => 'Open your files',
+ 'shared_link_email_subject' => '🙋 :user share some files with you. Look at it!',
+ 'shared_link_email_greeting' => 'Hello!',
+ 'shared_link_email_user' => ':user (:email) send you a link to shared files.',
+ 'shared_link_email_link' => 'Open your files',
+ 'shared_link_email_salutation' => 'Regards, :app_name',
// Reset password email
'reset_password_greeting' => 'Hello!',
diff --git a/resources/lang/sk/vuefilemanager.php b/resources/lang/sk/vuefilemanager.php
index 0d88dc5f..ba130ab0 100644
--- a/resources/lang/sk/vuefilemanager.php
+++ b/resources/lang/sk/vuefilemanager.php
@@ -12,6 +12,7 @@ return [
'shared_link_email_greeting' => 'Ahoj!',
'shared_link_email_user' => ':user (:email) vám posiela odkaz pre zdieľané súbory.',
'shared_link_email_link' => 'Vaše súbory',
+ 'shared_link_email_salutation' => 'S pozdravom, :app_name',
// Reset password email
'reset_password_greeting' => 'Ahoj!',
diff --git a/resources/sass/app.scss b/resources/sass/app.scss
index 1186fdb6..43ff842a 100644
--- a/resources/sass/app.scss
+++ b/resources/sass/app.scss
@@ -459,21 +459,22 @@
width: 18px;
height: 18px;
cursor: pointer;
-
}
::-webkit-scrollbar-thumb {
- border: 6px solid white;
+ border: 6px solid transparent;
background: #7f7f7f;
border-radius: 25px;
+ background-clip: padding-box ;
}
}
@media (prefers-color-scheme: dark) {
.windows {
::-webkit-scrollbar-thumb {
- border: 6px solid $dark_mode_background;
+ border: 6px solid transparent;
background: $dark_mode_foreground !important;
+ background-clip: padding-box !important ;
}
}
}
\ No newline at end of file
diff --git a/resources/views/vendor/mail/html/button.blade.php b/resources/views/vendor/mail/html/button.blade.php
new file mode 100644
index 00000000..e74fe55a
--- /dev/null
+++ b/resources/views/vendor/mail/html/button.blade.php
@@ -0,0 +1,19 @@
+
diff --git a/resources/views/vendor/mail/html/footer.blade.php b/resources/views/vendor/mail/html/footer.blade.php
new file mode 100644
index 00000000..3ff41f89
--- /dev/null
+++ b/resources/views/vendor/mail/html/footer.blade.php
@@ -0,0 +1,11 @@
+
+|
+
+ |
+
diff --git a/resources/views/vendor/mail/html/header.blade.php b/resources/views/vendor/mail/html/header.blade.php
new file mode 100644
index 00000000..fa1875ca
--- /dev/null
+++ b/resources/views/vendor/mail/html/header.blade.php
@@ -0,0 +1,11 @@
+
+
+
diff --git a/resources/views/vendor/mail/html/layout.blade.php b/resources/views/vendor/mail/html/layout.blade.php
new file mode 100644
index 00000000..02a54e2d
--- /dev/null
+++ b/resources/views/vendor/mail/html/layout.blade.php
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+{{ $header ?? '' }}
+
+
+
+
+
+
+
+|
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+
+{{ $subcopy ?? '' }}
+ |
+
+
+ |
+
+
+{{ $footer ?? '' }}
+
+ |
+
+
+
+
diff --git a/resources/views/vendor/mail/html/message.blade.php b/resources/views/vendor/mail/html/message.blade.php
new file mode 100644
index 00000000..1a980860
--- /dev/null
+++ b/resources/views/vendor/mail/html/message.blade.php
@@ -0,0 +1,28 @@
+
+@component('mail::layout')
+{{-- Header --}}
+@slot('header')
+@component('mail::header', ['url' => config('app.url')])
+{{ get_setting('app_title') ?? 'VueFileManager' }}
+@endcomponent
+@endslot
+
+{{-- Body --}}
+{{ $slot }}
+
+{{-- Subcopy --}}
+@isset($subcopy)
+@slot('subcopy')
+@component('mail::subcopy')
+{{ $subcopy }}
+@endcomponent
+@endslot
+@endisset
+
+{{-- Footer --}}
+@slot('footer')
+@component('mail::footer')
+© {{ date('Y') }} {{ get_setting('app_title') ?? 'VueFileManager' }}. @lang('All rights reserved.')
+@endcomponent
+@endslot
+@endcomponent
diff --git a/resources/views/vendor/mail/html/panel.blade.php b/resources/views/vendor/mail/html/panel.blade.php
new file mode 100644
index 00000000..2975a60a
--- /dev/null
+++ b/resources/views/vendor/mail/html/panel.blade.php
@@ -0,0 +1,14 @@
+
+
+
+
+
+|
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+ |
+
+
+ |
+
+
+
diff --git a/resources/views/vendor/mail/html/subcopy.blade.php b/resources/views/vendor/mail/html/subcopy.blade.php
new file mode 100644
index 00000000..790ce6c2
--- /dev/null
+++ b/resources/views/vendor/mail/html/subcopy.blade.php
@@ -0,0 +1,7 @@
+
+
+|
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+ |
+
+
diff --git a/resources/views/vendor/mail/html/table.blade.php b/resources/views/vendor/mail/html/table.blade.php
new file mode 100644
index 00000000..a5f3348b
--- /dev/null
+++ b/resources/views/vendor/mail/html/table.blade.php
@@ -0,0 +1,3 @@
+
+{{ Illuminate\Mail\Markdown::parse($slot) }}
+
diff --git a/resources/views/vendor/mail/html/themes/default.css b/resources/views/vendor/mail/html/themes/default.css
new file mode 100644
index 00000000..350fb838
--- /dev/null
+++ b/resources/views/vendor/mail/html/themes/default.css
@@ -0,0 +1,289 @@
+/* Base */
+
+body,
+body *:not(html):not(style):not(br):not(tr):not(code) {
+ box-sizing: border-box;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+ position: relative;
+}
+
+body {
+ -webkit-text-size-adjust: none;
+ background-color: #ffffff;
+ color: #718096;
+ height: 100%;
+ line-height: 1.4;
+ margin: 0;
+ padding: 0;
+ width: 100% !important;
+}
+
+p,
+ul,
+ol,
+blockquote {
+ line-height: 1.4;
+ text-align: left;
+}
+
+a {
+ color: #3869d4;
+}
+
+a img {
+ border: none;
+}
+
+/* Typography */
+
+h1 {
+ color: #3d4852;
+ font-size: 18px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+h2 {
+ font-size: 16px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+h3 {
+ font-size: 14px;
+ font-weight: bold;
+ margin-top: 0;
+ text-align: left;
+}
+
+p {
+ font-size: 16px;
+ line-height: 1.5em;
+ margin-top: 0;
+ text-align: left;
+}
+
+p.sub {
+ font-size: 12px;
+}
+
+img {
+ max-width: 100%;
+}
+
+/* Layout */
+
+.wrapper {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ background-color: #edf2f7;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+.content {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+/* Header */
+
+.header {
+ padding: 25px 0;
+ text-align: center;
+}
+
+.header a {
+ color: #3d4852;
+ font-size: 19px;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+/* Logo */
+
+.logo {
+ height: 75px;
+ width: 75px;
+}
+
+/* Body */
+
+.body {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ background-color: #edf2f7;
+ border-bottom: 1px solid #edf2f7;
+ border-top: 1px solid #edf2f7;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+.inner-body {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 570px;
+ background-color: #ffffff;
+ border-color: #e8e5ef;
+ border-radius: 2px;
+ border-width: 1px;
+ box-shadow: 0 2px 0 rgba(0, 0, 150, 0.025), 2px 4px 0 rgba(0, 0, 150, 0.015);
+ margin: 0 auto;
+ padding: 0;
+ width: 570px;
+}
+
+/* Subcopy */
+
+.subcopy {
+ border-top: 1px solid #e8e5ef;
+ margin-top: 25px;
+ padding-top: 25px;
+}
+
+.subcopy p {
+ font-size: 14px;
+}
+
+/* Footer */
+
+.footer {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 570px;
+ margin: 0 auto;
+ padding: 0;
+ text-align: center;
+ width: 570px;
+}
+
+.footer p {
+ color: #b0adc5;
+ font-size: 12px;
+ text-align: center;
+}
+
+.footer a {
+ color: #b0adc5;
+ text-decoration: underline;
+}
+
+/* Tables */
+
+.table table {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 30px auto;
+ width: 100%;
+}
+
+.table th {
+ border-bottom: 1px solid #edeff2;
+ margin: 0;
+ padding-bottom: 8px;
+}
+
+.table td {
+ color: #74787e;
+ font-size: 15px;
+ line-height: 18px;
+ margin: 0;
+ padding: 10px 0;
+}
+
+.content-cell {
+ max-width: 100vw;
+ padding: 32px;
+}
+
+/* Buttons */
+
+.action {
+ -premailer-cellpadding: 0;
+ -premailer-cellspacing: 0;
+ -premailer-width: 100%;
+ margin: 30px auto;
+ padding: 0;
+ text-align: center;
+ width: 100%;
+}
+
+.button {
+ -webkit-text-size-adjust: none;
+ border-radius: 4px;
+ color: #fff;
+ display: inline-block;
+ overflow: hidden;
+ text-decoration: none;
+}
+
+.button-blue,
+.button-primary {
+ background-color: #2d3748;
+ border-bottom: 8px solid #2d3748;
+ border-left: 18px solid #2d3748;
+ border-right: 18px solid #2d3748;
+ border-top: 8px solid #2d3748;
+}
+
+.button-green,
+.button-success {
+ background-color: #48bb78;
+ border-bottom: 8px solid #48bb78;
+ border-left: 18px solid #48bb78;
+ border-right: 18px solid #48bb78;
+ border-top: 8px solid #48bb78;
+}
+
+.button-red,
+.button-error {
+ background-color: #e53e3e;
+ border-bottom: 8px solid #e53e3e;
+ border-left: 18px solid #e53e3e;
+ border-right: 18px solid #e53e3e;
+ border-top: 8px solid #e53e3e;
+}
+
+/* Panels */
+
+.panel {
+ border-left: #2d3748 solid 4px;
+ margin: 21px 0;
+}
+
+.panel-content {
+ background-color: #edf2f7;
+ color: #718096;
+ padding: 16px;
+}
+
+.panel-content p {
+ color: #718096;
+}
+
+.panel-item {
+ padding: 0;
+}
+
+.panel-item p:last-of-type {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+/* Utilities */
+
+.break-all {
+ word-break: break-all;
+}
diff --git a/resources/views/vendor/mail/text/button.blade.php b/resources/views/vendor/mail/text/button.blade.php
new file mode 100644
index 00000000..97444ebd
--- /dev/null
+++ b/resources/views/vendor/mail/text/button.blade.php
@@ -0,0 +1 @@
+{{ $slot }}: {{ $url }}
diff --git a/resources/views/vendor/mail/text/footer.blade.php b/resources/views/vendor/mail/text/footer.blade.php
new file mode 100644
index 00000000..3338f620
--- /dev/null
+++ b/resources/views/vendor/mail/text/footer.blade.php
@@ -0,0 +1 @@
+{{ $slot }}
diff --git a/resources/views/vendor/mail/text/header.blade.php b/resources/views/vendor/mail/text/header.blade.php
new file mode 100644
index 00000000..aaa3e575
--- /dev/null
+++ b/resources/views/vendor/mail/text/header.blade.php
@@ -0,0 +1 @@
+[{{ $slot }}]({{ $url }})
diff --git a/resources/views/vendor/mail/text/layout.blade.php b/resources/views/vendor/mail/text/layout.blade.php
new file mode 100644
index 00000000..9378baa0
--- /dev/null
+++ b/resources/views/vendor/mail/text/layout.blade.php
@@ -0,0 +1,9 @@
+{!! strip_tags($header) !!}
+
+{!! strip_tags($slot) !!}
+@isset($subcopy)
+
+{!! strip_tags($subcopy) !!}
+@endisset
+
+{!! strip_tags($footer) !!}
diff --git a/resources/views/vendor/mail/text/message.blade.php b/resources/views/vendor/mail/text/message.blade.php
new file mode 100644
index 00000000..1ae9ed8f
--- /dev/null
+++ b/resources/views/vendor/mail/text/message.blade.php
@@ -0,0 +1,27 @@
+@component('mail::layout')
+ {{-- Header --}}
+ @slot('header')
+ @component('mail::header', ['url' => config('app.url')])
+ {{ config('app.name') }}
+ @endcomponent
+ @endslot
+
+ {{-- Body --}}
+ {{ $slot }}
+
+ {{-- Subcopy --}}
+ @isset($subcopy)
+ @slot('subcopy')
+ @component('mail::subcopy')
+ {{ $subcopy }}
+ @endcomponent
+ @endslot
+ @endisset
+
+ {{-- Footer --}}
+ @slot('footer')
+ @component('mail::footer')
+ © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.')
+ @endcomponent
+ @endslot
+@endcomponent
diff --git a/resources/views/vendor/mail/text/panel.blade.php b/resources/views/vendor/mail/text/panel.blade.php
new file mode 100644
index 00000000..3338f620
--- /dev/null
+++ b/resources/views/vendor/mail/text/panel.blade.php
@@ -0,0 +1 @@
+{{ $slot }}
diff --git a/resources/views/vendor/mail/text/subcopy.blade.php b/resources/views/vendor/mail/text/subcopy.blade.php
new file mode 100644
index 00000000..3338f620
--- /dev/null
+++ b/resources/views/vendor/mail/text/subcopy.blade.php
@@ -0,0 +1 @@
+{{ $slot }}
diff --git a/resources/views/vendor/mail/text/table.blade.php b/resources/views/vendor/mail/text/table.blade.php
new file mode 100644
index 00000000..3338f620
--- /dev/null
+++ b/resources/views/vendor/mail/text/table.blade.php
@@ -0,0 +1 @@
+{{ $slot }}