Templates update
This commit is contained in:
@@ -261,6 +261,9 @@
|
|||||||
.sticky {
|
.sticky {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
}
|
}
|
||||||
|
.inset-0 {
|
||||||
|
inset: calc(var(--spacing) * 0);
|
||||||
|
}
|
||||||
.inset-x-4 {
|
.inset-x-4 {
|
||||||
inset-inline: calc(var(--spacing) * 4);
|
inset-inline: calc(var(--spacing) * 4);
|
||||||
}
|
}
|
||||||
@@ -291,18 +294,15 @@
|
|||||||
max-width: 96rem;
|
max-width: 96rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.-mx-6 {
|
|
||||||
margin-inline: calc(var(--spacing) * -6);
|
|
||||||
}
|
|
||||||
.-mx-8 {
|
|
||||||
margin-inline: calc(var(--spacing) * -8);
|
|
||||||
}
|
|
||||||
.mx-2 {
|
.mx-2 {
|
||||||
margin-inline: calc(var(--spacing) * 2);
|
margin-inline: calc(var(--spacing) * 2);
|
||||||
}
|
}
|
||||||
.mx-auto {
|
.mx-auto {
|
||||||
margin-inline: auto;
|
margin-inline: auto;
|
||||||
}
|
}
|
||||||
|
.my-12 {
|
||||||
|
margin-block: calc(var(--spacing) * 12);
|
||||||
|
}
|
||||||
.mt-0\.5 {
|
.mt-0\.5 {
|
||||||
margin-top: calc(var(--spacing) * 0.5);
|
margin-top: calc(var(--spacing) * 0.5);
|
||||||
}
|
}
|
||||||
@@ -312,9 +312,6 @@
|
|||||||
.mt-2 {
|
.mt-2 {
|
||||||
margin-top: calc(var(--spacing) * 2);
|
margin-top: calc(var(--spacing) * 2);
|
||||||
}
|
}
|
||||||
.mt-3 {
|
|
||||||
margin-top: calc(var(--spacing) * 3);
|
|
||||||
}
|
|
||||||
.mt-4 {
|
.mt-4 {
|
||||||
margin-top: calc(var(--spacing) * 4);
|
margin-top: calc(var(--spacing) * 4);
|
||||||
}
|
}
|
||||||
@@ -366,6 +363,12 @@
|
|||||||
.ml-4 {
|
.ml-4 {
|
||||||
margin-left: calc(var(--spacing) * 4);
|
margin-left: calc(var(--spacing) * 4);
|
||||||
}
|
}
|
||||||
|
.line-clamp-2 {
|
||||||
|
overflow: hidden;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
}
|
||||||
.block {
|
.block {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
@@ -535,13 +538,6 @@
|
|||||||
.gap-8 {
|
.gap-8 {
|
||||||
gap: calc(var(--spacing) * 8);
|
gap: calc(var(--spacing) * 8);
|
||||||
}
|
}
|
||||||
.space-y-1 {
|
|
||||||
:where(& > :not(:last-child)) {
|
|
||||||
--tw-space-y-reverse: 0;
|
|
||||||
margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));
|
|
||||||
margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.space-y-2 {
|
.space-y-2 {
|
||||||
:where(& > :not(:last-child)) {
|
:where(& > :not(:last-child)) {
|
||||||
--tw-space-y-reverse: 0;
|
--tw-space-y-reverse: 0;
|
||||||
@@ -600,15 +596,6 @@
|
|||||||
border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
|
border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.divide-y-2 {
|
|
||||||
:where(& > :not(:last-child)) {
|
|
||||||
--tw-divide-y-reverse: 0;
|
|
||||||
border-bottom-style: var(--tw-border-style);
|
|
||||||
border-top-style: var(--tw-border-style);
|
|
||||||
border-top-width: calc(2px * var(--tw-divide-y-reverse));
|
|
||||||
border-bottom-width: calc(2px * calc(1 - var(--tw-divide-y-reverse)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.divide-gray-200 {
|
.divide-gray-200 {
|
||||||
:where(& > :not(:last-child)) {
|
:where(& > :not(:last-child)) {
|
||||||
border-color: var(--color-gray-200);
|
border-color: var(--color-gray-200);
|
||||||
@@ -669,8 +656,8 @@
|
|||||||
.border-amber-200 {
|
.border-amber-200 {
|
||||||
border-color: var(--color-amber-200);
|
border-color: var(--color-amber-200);
|
||||||
}
|
}
|
||||||
.border-blue-200 {
|
.border-blue-300 {
|
||||||
border-color: var(--color-blue-200);
|
border-color: var(--color-blue-300);
|
||||||
}
|
}
|
||||||
.border-gray-100 {
|
.border-gray-100 {
|
||||||
border-color: var(--color-gray-100);
|
border-color: var(--color-gray-100);
|
||||||
@@ -708,9 +695,6 @@
|
|||||||
.bg-amber-100 {
|
.bg-amber-100 {
|
||||||
background-color: var(--color-amber-100);
|
background-color: var(--color-amber-100);
|
||||||
}
|
}
|
||||||
.bg-blue-50 {
|
|
||||||
background-color: var(--color-blue-50);
|
|
||||||
}
|
|
||||||
.bg-blue-100 {
|
.bg-blue-100 {
|
||||||
background-color: var(--color-blue-100);
|
background-color: var(--color-blue-100);
|
||||||
}
|
}
|
||||||
@@ -767,10 +751,6 @@
|
|||||||
--tw-gradient-position: to right in oklab;
|
--tw-gradient-position: to right in oklab;
|
||||||
background-image: linear-gradient(var(--tw-gradient-stops));
|
background-image: linear-gradient(var(--tw-gradient-stops));
|
||||||
}
|
}
|
||||||
.from-blue-50 {
|
|
||||||
--tw-gradient-from: var(--color-blue-50);
|
|
||||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
|
||||||
}
|
|
||||||
.from-blue-500 {
|
.from-blue-500 {
|
||||||
--tw-gradient-from: var(--color-blue-500);
|
--tw-gradient-from: var(--color-blue-500);
|
||||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||||
@@ -783,10 +763,6 @@
|
|||||||
--tw-gradient-to: var(--color-blue-700);
|
--tw-gradient-to: var(--color-blue-700);
|
||||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||||
}
|
}
|
||||||
.to-indigo-50 {
|
|
||||||
--tw-gradient-to: var(--color-indigo-50);
|
|
||||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
|
||||||
}
|
|
||||||
.to-indigo-600 {
|
.to-indigo-600 {
|
||||||
--tw-gradient-to: var(--color-indigo-600);
|
--tw-gradient-to: var(--color-indigo-600);
|
||||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||||
@@ -798,9 +774,6 @@
|
|||||||
.bg-clip-text {
|
.bg-clip-text {
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
}
|
}
|
||||||
.p-1 {
|
|
||||||
padding: calc(var(--spacing) * 1);
|
|
||||||
}
|
|
||||||
.p-2 {
|
.p-2 {
|
||||||
padding: calc(var(--spacing) * 2);
|
padding: calc(var(--spacing) * 2);
|
||||||
}
|
}
|
||||||
@@ -864,8 +837,8 @@
|
|||||||
.pb-4 {
|
.pb-4 {
|
||||||
padding-bottom: calc(var(--spacing) * 4);
|
padding-bottom: calc(var(--spacing) * 4);
|
||||||
}
|
}
|
||||||
.pb-6 {
|
.pb-8 {
|
||||||
padding-bottom: calc(var(--spacing) * 6);
|
padding-bottom: calc(var(--spacing) * 8);
|
||||||
}
|
}
|
||||||
.text-center {
|
.text-center {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -981,6 +954,9 @@
|
|||||||
.text-green-800 {
|
.text-green-800 {
|
||||||
color: var(--color-green-800);
|
color: var(--color-green-800);
|
||||||
}
|
}
|
||||||
|
.text-indigo-600 {
|
||||||
|
color: var(--color-indigo-600);
|
||||||
|
}
|
||||||
.text-orange-600 {
|
.text-orange-600 {
|
||||||
color: var(--color-orange-600);
|
color: var(--color-orange-600);
|
||||||
}
|
}
|
||||||
@@ -1319,16 +1295,6 @@
|
|||||||
margin-inline: calc(var(--spacing) * 0);
|
margin-inline: calc(var(--spacing) * 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.sm\:mt-0 {
|
|
||||||
@media (width >= 40rem) {
|
|
||||||
margin-top: calc(var(--spacing) * 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.sm\:ml-4 {
|
|
||||||
@media (width >= 40rem) {
|
|
||||||
margin-left: calc(var(--spacing) * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.sm\:inline {
|
.sm\:inline {
|
||||||
@media (width >= 40rem) {
|
@media (width >= 40rem) {
|
||||||
display: inline;
|
display: inline;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
class="block py-4 hover:bg-gray-50 px-6 transition-colors group">
|
class="block py-4 hover:bg-gray-50 px-6 transition-colors group">
|
||||||
<div class="flex items-start justify-between">
|
<div class="flex items-start justify-between">
|
||||||
<div class="flex-1 min-w-0">
|
<div class="flex-1 min-w-0">
|
||||||
<div class="flex items-center space-x-2 mb-2">
|
<div class="mb-1">
|
||||||
<span class="text-sm font-medium text-gray-900">
|
<span class="text-sm font-medium text-gray-900">
|
||||||
{% if let Some(name) = comment.author %}
|
{% if let Some(name) = comment.author %}
|
||||||
{{ name }}
|
{{ name }}
|
||||||
@@ -10,14 +10,9 @@
|
|||||||
Anonymous
|
Anonymous
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-gray-400">•</span>
|
|
||||||
<span class="text-xs text-gray-500">on</span>
|
|
||||||
<a href="/posts/{{ comment.post_id }}" class="text-sm text-blue-600 hover:underline truncate">
|
|
||||||
#{{ comment.post_id.to_string()[..8] }}
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<p class="text-sm text-gray-700 mb-2 line-clamp-2">{{ comment.content }}</p>
|
<p class="text-sm text-gray-700 mb-2 line-clamp-2">{{ comment.content }}</p>
|
||||||
<div class="flex items-center text-sm text-gray-500">
|
<div class="flex items-center text-xs text-gray-500 mb-1">
|
||||||
<svg class="w-4 h-4 mr-1.5"
|
<svg class="w-4 h-4 mr-1.5"
|
||||||
fill="none"
|
fill="none"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@@ -29,6 +24,12 @@
|
|||||||
{{ comment.formatted_date() }}
|
{{ comment.formatted_date() }}
|
||||||
</time>
|
</time>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex items-center text-xs text-gray-500">
|
||||||
|
<span class="mr-1">on</span>
|
||||||
|
<a href="/posts/{{ comment.post_id }}" class="text-blue-600 hover:underline truncate">
|
||||||
|
#{{ comment.post_id }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button hx-delete="/admin/comments/{{ comment.comment_id }}"
|
<button hx-delete="/admin/comments/{{ comment.comment_id }}"
|
||||||
hx-target="#comment-{{ comment.comment_id }}"
|
hx-target="#comment-{{ comment.comment_id }}"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<div class="bg-white rounded-lg shadow-md border border-gray-200 mb-8">
|
<div class="bg-white rounded-lg shadow-md border border-gray-200">
|
||||||
<div class="p-6 border-b border-gray-200">
|
<div class="p-6 border-b border-gray-200">
|
||||||
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
||||||
<div>
|
<div>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/>
|
d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"/>
|
||||||
</svg>
|
</svg>
|
||||||
<span>Comments management ({{ comments_count }})</span>
|
<span>Comments ({{ comments_count }})</span>
|
||||||
</h2>
|
</h2>
|
||||||
<p class="text-sm text-gray-600 mt-1">View and moderate all comments.</p>
|
<p class="text-sm text-gray-600 mt-1">View and moderate all comments.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
<div class="mb-8">
|
<div class="mb-8">
|
||||||
<h1 class="text-3xl font-bold text-gray-900">Dashboard</h1>
|
<h1 class="text-3xl font-bold text-gray-900">Dashboard</h1>
|
||||||
<p class="mt-2 text-gray-600 items-start">
|
<p class="mt-2 text-gray-600 items-start">
|
||||||
<span>Connected as
|
<span>Connected as
|
||||||
<a href="/users/{{ user.username }}"
|
<a href="/users/{{ user.username }}"
|
||||||
class="hover:text-blue-600 hover:underline font-bold">{{ user.username }}</a></span>
|
class="hover:text-blue-600 hover:underline font-bold">{{ user.username }}</a></span>
|
||||||
{% if user.is_admin() %}
|
{% if user.is_admin() %}
|
||||||
<span class="ml-2 inline-flex items-center rounded-full bg-blue-100 px-2.5 py-0.5 text-xs font-medium text-blue-800">
|
<span class="ml-2 inline-flex items-center rounded-full bg-blue-100 px-2.5 py-0.5 text-xs font-medium text-blue-800">
|
||||||
admin
|
admin
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</p>
|
</p>
|
||||||
<button hx-get="/admin/logout"
|
<button hx-get="/admin/logout"
|
||||||
@@ -24,23 +24,37 @@
|
|||||||
<span>Logout</span>
|
<span>Logout</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{% if user.is_admin() %}
|
|
||||||
<div class="mb-8 p-6 bg-gradient-to-br from-blue-50 to-indigo-50 bg-blue-50 rounded-lg border border-blue-200">
|
{% include "stats.html" %}
|
||||||
<h2 class="text-lg font-semibold text-blue-900 mb-6">Administration</h2>
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
|
||||||
{% include "stats.html" %}
|
|
||||||
{% include "subscribers/list.html" %}
|
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
|
||||||
{% include "users/list.html" %}
|
|
||||||
{% include "users/form.html" %}
|
|
||||||
</div>
|
|
||||||
{% include "posts/list.html" %}
|
|
||||||
{% include "comments/list.html" %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
|
||||||
{% include "publish.html" %}
|
{% include "publish.html" %}
|
||||||
{% include "send_email.html" %}
|
{% include "send_email.html" %}
|
||||||
{% include "change_password.html" %}
|
{% include "change_password.html" %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if user.is_admin() %}
|
||||||
|
<div class="relative my-12">
|
||||||
|
<div class="absolute inset-0 flex items-center" aria-hidden="true">
|
||||||
|
<div class="w-full border-t-2 border-blue-300"></div>
|
||||||
|
</div>
|
||||||
|
<div class="relative flex justify-center">
|
||||||
|
<span class="bg-gray-50 px-4 text-sm font-semibold text-blue-900 flex items-center gap-2">
|
||||||
|
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
|
d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
|
||||||
|
</svg>
|
||||||
|
Administration
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
||||||
|
{% include "subscribers/list.html" %}
|
||||||
|
{% include "users/list.html" %}
|
||||||
|
{% include "users/form.html" %}
|
||||||
|
{% include "posts/list.html" %}
|
||||||
|
{% include "comments/list.html" %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -7,31 +7,29 @@
|
|||||||
{{ post.title }}
|
{{ post.title }}
|
||||||
</h3>
|
</h3>
|
||||||
</a>
|
</a>
|
||||||
<div class="flex items-center text-sm text-gray-500 space-x-4">
|
<div class="flex items-center text-sm text-gray-500 mb-1">
|
||||||
<div class="flex items-center">
|
<svg class="w-4 h-4 mr-1.5"
|
||||||
<svg class="w-4 h-4 mr-1.5"
|
fill="none"
|
||||||
fill="none"
|
viewBox="0 0 24 24"
|
||||||
viewBox="0 0 24 24"
|
stroke="currentColor">
|
||||||
stroke="currentColor">
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
||||||
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
</svg>
|
||||||
</svg>
|
<a href="/users/{{ post.author }}" class="hover:text-blue-600 hover:underline">
|
||||||
<a href="/users/{{ post.author }}" class="hover:text-blue-600 hover:underline">
|
{{ post.author }}
|
||||||
{{ post.author }}
|
</a>
|
||||||
</a>
|
</div>
|
||||||
</div>
|
<div class="flex items-center text-sm text-gray-500">
|
||||||
<div class="flex items-center">
|
<svg class="w-4 h-4 mr-1.5"
|
||||||
<svg class="w-4 h-4 mr-1.5"
|
fill="none"
|
||||||
fill="none"
|
viewBox="0 0 24 24"
|
||||||
viewBox="0 0 24 24"
|
stroke="currentColor">
|
||||||
stroke="currentColor">
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
||||||
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
</svg>
|
||||||
</svg>
|
<time datetime="{{ post.published_at }}">
|
||||||
<time datetime="{{ post.published_at }}">
|
{{ post.formatted_date() }}
|
||||||
{{ post.formatted_date() }}
|
</time>
|
||||||
</time>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button hx-delete="/admin/posts/{{ post.post_id }}"
|
<button hx-delete="/admin/posts/{{ post.post_id }}"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<div class="bg-white rounded-lg shadow-md border border-gray-200 mb-8">
|
<div class="bg-white rounded-lg shadow-md border border-gray-200">
|
||||||
<div class="p-6 border-b border-gray-200">
|
<div class="p-6 border-b border-gray-200">
|
||||||
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
||||||
<div>
|
<div>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
|
d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
|
||||||
</svg>
|
</svg>
|
||||||
<span>Posts management ({{ posts_count }})</span>
|
<span>Posts ({{ posts_count }})</span>
|
||||||
</h2>
|
</h2>
|
||||||
<p class="text-sm text-gray-600 mt-1">View and manage all published posts.</p>
|
<p class="text-sm text-gray-600 mt-1">View and manage all published posts.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
class="block py-4 hover:bg-gray-50 px-6 transition-colors group {% if subscriber.confirmed() %}border-l-4 border-l-green-500{% else %}border-l-4 border-l-yellow-500{% endif %}">
|
class="block py-4 hover:bg-gray-50 px-6 transition-colors group {% if subscriber.confirmed() %}border-l-4 border-l-green-500{% else %}border-l-4 border-l-yellow-500{% endif %}">
|
||||||
<div class="flex items-start justify-between">
|
<div class="flex items-start justify-between">
|
||||||
<div class="flex-1 min-w-0">
|
<div class="flex-1 min-w-0">
|
||||||
<h3 class="text-sm font-medium text-gray-900 group-hover:text-blue-600 transition-colors mb-1 break-all">
|
<h3 class="text-sm truncate font-medium text-gray-900 group-hover:text-blue-600 transition-colors mb-1 break-all">
|
||||||
{{ subscriber.email }}</h3>
|
{{ subscriber.email }}</h3>
|
||||||
<div class="flex items-center text-sm text-gray-500">
|
<div class="flex items-center text-sm text-gray-500">
|
||||||
<svg class="w-4 h-4 mr-1.5"
|
<svg class="w-4 h-4 mr-1.5"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<div class="bg-white rounded-lg shadow-md border border-gray-200 mb-8">
|
<div class="bg-white rounded-lg shadow-md border border-gray-200">
|
||||||
<div class="p-6 border-b border-gray-200">
|
<div class="p-6 border-b border-gray-200">
|
||||||
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
||||||
<div>
|
<div>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
|
<path d="M23 21v-2a4 4 0 0 0-3-3.87"/>
|
||||||
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
|
<path d="M16 3.13a4 4 0 0 1 0 7.75"/>
|
||||||
</svg>
|
</svg>
|
||||||
Subscribers management ({{ count }})
|
Subscribers ({{ count }})
|
||||||
</h2>
|
</h2>
|
||||||
<p class="text-sm text-gray-600 mt-1">View and manage your subscribers.</p>
|
<p class="text-sm text-gray-600 mt-1">View and manage your subscribers.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<div class="bg-white rounded-lg shadow-md border border-gray-200 mb-8">
|
<div class="bg-white rounded-lg shadow-md border border-gray-200">
|
||||||
<div class="p-6 border-b border-gray-200">
|
<div class="p-6 border-b border-gray-200">
|
||||||
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<div class="bg-white rounded-lg shadow-md border border-gray-200 mb-8">
|
<div class="bg-white rounded-lg shadow-md border border-gray-200">
|
||||||
<div class="p-6 border-b border-gray-200">
|
<div class="p-6 border-b border-gray-200">
|
||||||
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between">
|
||||||
<div>
|
<div>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"/>
|
d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"/>
|
||||||
</svg>
|
</svg>
|
||||||
Users management
|
Users
|
||||||
</h2>
|
</h2>
|
||||||
<p class="text-sm text-gray-600 mt-1">View and manage users.</p>
|
<p class="text-sm text-gray-600 mt-1">View and manage users.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,31 +3,31 @@
|
|||||||
<div class="flex items-start justify-between">
|
<div class="flex items-start justify-between">
|
||||||
<div class="flex-1 min-w-0">
|
<div class="flex-1 min-w-0">
|
||||||
<a href="/posts/{{ post.post_id }}">
|
<a href="/posts/{{ post.post_id }}">
|
||||||
<h2 class="text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors">{{ post.title }}</h2>
|
<h2 class="text-xl font-semibold text-gray-900 mb-3 hover:text-blue-600 transition-colors">{{
|
||||||
|
post.title }}</h2>
|
||||||
</a>
|
</a>
|
||||||
|
<div class="flex items-center text-sm text-gray-500 mb-1">
|
||||||
|
<svg class="w-4 h-4 mr-1"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
|
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
||||||
|
</svg>
|
||||||
|
<time datetime="{{ post.published_at }}">
|
||||||
|
{{ post.formatted_date() }}
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
<div class="flex items-center text-sm text-gray-500">
|
<div class="flex items-center text-sm text-gray-500">
|
||||||
<div class="flex items-center">
|
<svg class="w-4 h-4 mr-1"
|
||||||
<svg class="w-4 h-4 mr-1"
|
fill="none"
|
||||||
fill="none"
|
viewBox="0 0 24 24"
|
||||||
viewBox="0 0 24 24"
|
stroke="currentColor">
|
||||||
stroke="currentColor">
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
|
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
||||||
</svg>
|
</svg>
|
||||||
<time datetime="{{ post.published_at }}">
|
<a href="/users/{{ post.author }}"
|
||||||
{{ post.formatted_date() }}
|
class="hover:text-blue-600 hover:underline">{{ post.author }}</a>
|
||||||
</time>
|
|
||||||
</div>
|
|
||||||
<span class="mx-2">•</span>
|
|
||||||
<div class="flex items-center">
|
|
||||||
<svg class="w-4 h-4 mr-1"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke="currentColor">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
|
|
||||||
</svg>
|
|
||||||
<a href="/users/{{ post.author }}"
|
|
||||||
class="hover:text-blue-600 hover:underline">{{ post.author }}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a href="/posts/{{ post.post_id }}" class="flex-shrink-0 ml-4">
|
<a href="/posts/{{ post.post_id }}" class="flex-shrink-0 ml-4">
|
||||||
@@ -35,9 +35,9 @@
|
|||||||
fill="none"
|
fill="none"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
stroke="currentColor">
|
stroke="currentColor">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
Reference in New Issue
Block a user