chore: cleanup project structure and update readme for beta release

This commit is contained in:
2025-12-23 04:59:21 +07:00
parent 1640ced748
commit 10a00bac0e
122 changed files with 8320 additions and 661 deletions

View File

@@ -0,0 +1,24 @@
@props([
'url',
'color' => 'primary',
'align' => 'center',
])
<table class="action" align="{{ $align }}" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="{{ $align }}">
<table width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="{{ $align }}">
<table border="0" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td>
<a href="{{ $url }}" class="button button-{{ $color }}" target="_blank" rel="noopener">{!! $slot !!}</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>

View File

@@ -0,0 +1,11 @@
<tr>
<td>
<table class="footer" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="content-cell" align="center">
{{ Illuminate\Mail\Markdown::parse($slot) }}
</td>
</tr>
</table>
</td>
</tr>

View File

@@ -0,0 +1,8 @@
@props(['url'])
<tr>
<td class="header">
<a href="{{ $url }}" style="display: inline-block;">
<img src="{{ config('app.url') }}/images/logo/logo.png" class="logo" alt="{{ config('app.name') }}" style="height: 40px; width: auto;">
</a>
</td>
</tr>

View File

@@ -0,0 +1,58 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{{ config('app.name') }}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="color-scheme" content="light dark" />
<meta name="supported-color-schemes" content="light dark" />
<style>
@media only screen and (max-width: 600px) {
.inner-body {
width: 100% !important;
}
.footer {
width: 100% !important;
}
}
@media only screen and (max-width: 500px) {
.button {
width: 100% !important;
}
}
</style>
{!! $head ?? '' !!}
</head>
<body>
<table class="wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table class="content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
{!! $header ?? '' !!}
<!-- Email Body -->
<tr>
<td class="body" width="100%" cellpadding="0" cellspacing="0" style="border: hidden !important;">
<table class="inner-body" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<!-- Body content -->
<tr>
<td class="content-cell">
{!! Illuminate\Mail\Markdown::parse($slot) !!}
{!! $subcopy ?? '' !!}
</td>
</tr>
</table>
</td>
</tr>
{!! $footer ?? '' !!}
</table>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -0,0 +1,28 @@
<x-mail::layout>
{{-- Header --}}
<x-slot:header>
<x-mail::header :url="config('app.url')">
{{ config('app.name') }}
</x-mail::header>
</x-slot:header>
{{-- Body --}}
{!! $slot !!}
{{-- Subcopy --}}
@isset($subcopy)
<x-slot:subcopy>
<x-mail::subcopy>
{!! $subcopy !!}
</x-mail::subcopy>
</x-slot:subcopy>
@endisset
{{-- Footer --}}
<x-slot:footer>
<x-mail::footer>
© {{ date('Y') }} **{{ config('app.name') }}**. [Visit Portal]({{ config('app.url') }}) <br>
{{ __('Secure Certificate Management for Developers.') }}
</x-mail::footer>
</x-slot:footer>
</x-mail::layout>

View File

@@ -0,0 +1,14 @@
<table class="panel" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="panel-content">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td class="panel-item">
{{ Illuminate\Mail\Markdown::parse($slot) }}
</td>
</tr>
</table>
</td>
</tr>
</table>

View File

@@ -0,0 +1,7 @@
<table class="subcopy" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td>
{{ Illuminate\Mail\Markdown::parse($slot) }}
</td>
</tr>
</table>

View File

@@ -0,0 +1,3 @@
<div class="table">
{{ Illuminate\Mail\Markdown::parse($slot) }}
</div>

View File

@@ -0,0 +1,220 @@
/* Base */
body,
body *:not(html):not(style):not(br):not(tr):not(code) {
box-sizing: border-box;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
position: relative;
}
body {
-webkit-text-size-adjust: none;
background-color: #f8fafc;
color: #475569;
height: 100%;
line-height: 1.6;
margin: 0;
padding: 0;
width: 100% !important;
}
p,
ul,
ol,
blockquote {
line-height: 1.6;
text-align: left;
}
a {
color: #3b82f6;
text-decoration: none;
font-weight: 500;
}
a img {
border: none;
}
/* Typography */
h1 {
color: #1e293b;
font-size: 22px;
font-weight: 800;
margin-top: 0;
margin-bottom: 24px;
text-align: left;
letter-spacing: -0.025em;
}
h2 {
color: #1e293b;
font-size: 18px;
font-weight: 700;
margin-top: 0;
text-align: left;
}
h3 {
color: #1e293b;
font-size: 16px;
font-weight: 700;
margin-top: 0;
text-align: left;
}
p {
font-size: 16px;
line-height: 1.6em;
margin-top: 0;
margin-bottom: 16px;
text-align: left;
}
p.sub {
font-size: 12px;
}
img {
max-width: 100%;
}
/* Layout */
.wrapper {
background-color: #f8fafc;
margin: 0;
padding: 0;
width: 100%;
}
.content {
margin: 0;
padding: 0;
width: 100%;
}
/* Header */
.header {
padding: 40px 0;
text-align: center;
}
.header a {
color: #1e293b;
font-size: 19px;
font-weight: 900;
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Logo */
.logo {
height: auto;
max-height: 48px;
width: auto;
}
/* Body */
.body {
background-color: #f8fafc;
margin: 0;
padding: 0;
width: 100%;
}
.inner-body {
background-color: #ffffff;
border-radius: 24px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
margin: 0 auto;
padding: 0;
width: 570px;
}
.content-cell {
padding: 48px;
}
/* Buttons */
.action {
margin: 32px auto;
text-align: center;
}
.button {
border-radius: 12px;
color: #fff !important;
display: inline-block;
font-size: 15px;
font-weight: 700;
padding: 12px 32px;
text-decoration: none;
transition: all 0.2s;
}
.button-primary {
background-color: #3b82f6;
box-shadow: 0 10px 15px -3px rgba(59, 130, 246, 0.3);
}
/* Panels */
.panel {
border-left: #3b82f6 solid 4px;
margin: 24px 0;
border-radius: 0 12px 12px 0;
overflow: hidden;
}
.panel-content {
background-color: #eff6ff;
color: #1e40af;
padding: 20px;
}
/* Footer */
.footer {
padding: 40px 0;
text-align: center;
}
.footer p {
color: #94a3b8;
font-size: 13px;
text-align: center;
}
/* Dark Mode Support */
@media (prefers-color-scheme: dark) {
body, .wrapper, .body {
background-color: #0f172a !important;
color: #94a3b8 !important;
}
.inner-body {
background-color: #1e293b !important;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.5) !important;
}
h1, h2, h3, .header a {
color: #f1f5f9 !important;
}
p {
color: #94a3b8 !important;
}
.panel-content {
background-color: #1e293b !important;
color: #60a5fa !important;
border: 1px solid #334155 !important;
}
}

View File

@@ -0,0 +1 @@
{{ $slot }}: {{ $url }}

View File

@@ -0,0 +1 @@
{{ $slot }}

View File

@@ -0,0 +1 @@
{{ $slot }}: {{ $url }}

View File

@@ -0,0 +1,9 @@
{!! strip_tags($header ?? '') !!}
{!! strip_tags($slot) !!}
@isset($subcopy)
{!! strip_tags($subcopy) !!}
@endisset
{!! strip_tags($footer ?? '') !!}

View File

@@ -0,0 +1,27 @@
<x-mail::layout>
{{-- Header --}}
<x-slot:header>
<x-mail::header :url="config('app.url')">
{{ config('app.name') }}
</x-mail::header>
</x-slot:header>
{{-- Body --}}
{{ $slot }}
{{-- Subcopy --}}
@isset($subcopy)
<x-slot:subcopy>
<x-mail::subcopy>
{{ $subcopy }}
</x-mail::subcopy>
</x-slot:subcopy>
@endisset
{{-- Footer --}}
<x-slot:footer>
<x-mail::footer>
© {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.')
</x-mail::footer>
</x-slot:footer>
</x-mail::layout>

View File

@@ -0,0 +1 @@
{{ $slot }}

View File

@@ -0,0 +1 @@
{{ $slot }}

View File

@@ -0,0 +1 @@
{{ $slot }}