Merge pull request #1870 from NNTmux/theme_update

Update site theme appearance
This commit is contained in:
DariusIII
2026-08-28 21:05:23 +02:00
committed by GitHub
136 changed files with 2444 additions and 1592 deletions
+1 -1
View File
@@ -176,7 +176,7 @@ class ProfileController extends BasePageController
// Update color scheme
if ($request->has('color_scheme')) {
$schemeValue = $request->input('color_scheme');
if (in_array($schemeValue, ['blue', 'emerald', 'violet'], true)) {
if (in_array($schemeValue, ['blue', 'indigo', 'cyan', 'teal', 'emerald', 'violet', 'pink', 'rose', 'red', 'orange', 'amber'], true)) {
User::where('id', $userid)->update(['color_scheme' => $schemeValue]);
}
}
+1 -1
View File
@@ -20,7 +20,7 @@ class UpdateProfileRequest extends FormRequest
'email' => ['nullable', 'string', 'email', 'max:255', 'unique:users,email,'.$userId, new ValidEmailDomain],
'password' => ['nullable', 'string', 'min:8', 'confirmed', 'regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/'],
'theme_preference' => ['sometimes', 'in:light,dark,system'],
'color_scheme' => ['sometimes', 'in:blue,emerald,violet'],
'color_scheme' => ['sometimes', 'in:blue,indigo,cyan,teal,emerald,violet,pink,rose,red,orange,amber'],
];
}
}
+1 -1
View File
@@ -15,7 +15,7 @@ class UpdateThemeRequest extends FormRequest
{
return [
'theme_preference' => ['sometimes', 'in:light,dark,system'],
'color_scheme' => ['sometimes', 'in:blue,emerald,violet'],
'color_scheme' => ['sometimes', 'in:blue,indigo,cyan,teal,emerald,violet,pink,rose,red,orange,amber'],
];
}
}
+629 -6
View File
@@ -121,6 +121,294 @@
--color-primary-950: #2e1065;
}
[data-color-scheme="rose"] {
--surface-body: #fff1f2;
--surface-body-dark: #1f0a12;
--surface-sidebar: #3b1825;
--surface-sidebar-dark: #13050a;
--surface-header: #3b1825;
--surface-header-dark: #13050a;
--surface-card: #ffffff;
--surface-card-dark: #32131e;
--surface-dropdown: #2b1019;
--surface-dropdown-dark: #13050a;
--surface-footer: #3b1825;
--surface-footer-dark: #13050a;
--surface-hover: #fff1f2;
--surface-hover-dark: #4c0519;
--border-default: #fecdd3;
--border-default-dark: #9f1239;
--text-muted: #be123c;
--text-muted-dark: #fda4af;
--surface-panel-alt: #fff1f2;
--surface-panel-alt-dark: #3b1825;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #fff1f2;
--color-primary-100: #ffe4e6;
--color-primary-200: #fecdd3;
--color-primary-300: #fda4af;
--color-primary-400: #fb7185;
--color-primary-500: #f43f5e;
--color-primary-600: #e11d48;
--color-primary-700: #be123c;
--color-primary-800: #9f1239;
--color-primary-900: #881337;
--color-primary-950: #4c0519;
}
[data-color-scheme="amber"] {
--surface-body: #fffbeb;
--surface-body-dark: #1c1304;
--surface-sidebar: #3b2a0e;
--surface-sidebar-dark: #120b02;
--surface-header: #3b2a0e;
--surface-header-dark: #120b02;
--surface-card: #ffffff;
--surface-card-dark: #33240d;
--surface-dropdown: #2c1d08;
--surface-dropdown-dark: #120b02;
--surface-footer: #3b2a0e;
--surface-footer-dark: #120b02;
--surface-hover: #fffbeb;
--surface-hover-dark: #78350f;
--border-default: #fde68a;
--border-default-dark: #92400e;
--text-muted: #b45309;
--text-muted-dark: #fcd34d;
--surface-panel-alt: #fffbeb;
--surface-panel-alt-dark: #3b2a0e;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #fffbeb;
--color-primary-100: #fef3c7;
--color-primary-200: #fde68a;
--color-primary-300: #fcd34d;
--color-primary-400: #fbbf24;
--color-primary-500: #f59e0b;
--color-primary-600: #d97706;
--color-primary-700: #b45309;
--color-primary-800: #92400e;
--color-primary-900: #78350f;
--color-primary-950: #451a03;
}
[data-color-scheme="cyan"] {
--surface-body: #ecfeff;
--surface-body-dark: #06191d;
--surface-sidebar: #12343c;
--surface-sidebar-dark: #031014;
--surface-header: #12343c;
--surface-header-dark: #031014;
--surface-card: #ffffff;
--surface-card-dark: #10313a;
--surface-dropdown: #0b2a32;
--surface-dropdown-dark: #031014;
--surface-footer: #12343c;
--surface-footer-dark: #031014;
--surface-hover: #ecfeff;
--surface-hover-dark: #164e63;
--border-default: #a5f3fc;
--border-default-dark: #155e75;
--text-muted: #0e7490;
--text-muted-dark: #67e8f9;
--surface-panel-alt: #ecfeff;
--surface-panel-alt-dark: #12343c;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #ecfeff;
--color-primary-100: #cffafe;
--color-primary-200: #a5f3fc;
--color-primary-300: #67e8f9;
--color-primary-400: #22d3ee;
--color-primary-500: #06b6d4;
--color-primary-600: #0891b2;
--color-primary-700: #0e7490;
--color-primary-800: #155e75;
--color-primary-900: #164e63;
--color-primary-950: #083344;
}
[data-color-scheme="indigo"] {
--surface-body: #eef2ff;
--surface-body-dark: #0b1024;
--surface-sidebar: #1e2850;
--surface-sidebar-dark: #070b1b;
--surface-header: #1e2850;
--surface-header-dark: #070b1b;
--surface-card: #ffffff;
--surface-card-dark: #182143;
--surface-dropdown: #141c39;
--surface-dropdown-dark: #070b1b;
--surface-footer: #1e2850;
--surface-footer-dark: #070b1b;
--surface-hover: #eef2ff;
--surface-hover-dark: #312e81;
--border-default: #c7d2fe;
--border-default-dark: #3730a3;
--text-muted: #4338ca;
--text-muted-dark: #a5b4fc;
--surface-panel-alt: #eef2ff;
--surface-panel-alt-dark: #1e2850;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #eef2ff;
--color-primary-100: #e0e7ff;
--color-primary-200: #c7d2fe;
--color-primary-300: #a5b4fc;
--color-primary-400: #818cf8;
--color-primary-500: #6366f1;
--color-primary-600: #4f46e5;
--color-primary-700: #4338ca;
--color-primary-800: #3730a3;
--color-primary-900: #312e81;
--color-primary-950: #1e1b4b;
}
[data-color-scheme="teal"] {
--surface-body: #f0fdfa;
--surface-body-dark: #061a18;
--surface-sidebar: #123b36;
--surface-sidebar-dark: #021412;
--surface-header: #123b36;
--surface-header-dark: #021412;
--surface-card: #ffffff;
--surface-card-dark: #10332f;
--surface-dropdown: #0b2b27;
--surface-dropdown-dark: #021412;
--surface-footer: #123b36;
--surface-footer-dark: #021412;
--surface-hover: #f0fdfa;
--surface-hover-dark: #134e4a;
--border-default: #99f6e4;
--border-default-dark: #115e59;
--text-muted: #0f766e;
--text-muted-dark: #5eead4;
--surface-panel-alt: #f0fdfa;
--surface-panel-alt-dark: #123b36;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #f0fdfa;
--color-primary-100: #ccfbf1;
--color-primary-200: #99f6e4;
--color-primary-300: #5eead4;
--color-primary-400: #2dd4bf;
--color-primary-500: #14b8a6;
--color-primary-600: #0d9488;
--color-primary-700: #0f766e;
--color-primary-800: #115e59;
--color-primary-900: #134e4a;
--color-primary-950: #042f2e;
}
[data-color-scheme="orange"] {
--surface-body: #fff7ed;
--surface-body-dark: #1f1007;
--surface-sidebar: #452515;
--surface-sidebar-dark: #160a03;
--surface-header: #452515;
--surface-header-dark: #160a03;
--surface-card: #ffffff;
--surface-card-dark: #3a2012;
--surface-dropdown: #32190b;
--surface-dropdown-dark: #160a03;
--surface-footer: #452515;
--surface-footer-dark: #160a03;
--surface-hover: #fff7ed;
--surface-hover-dark: #7c2d12;
--border-default: #fed7aa;
--border-default-dark: #9a3412;
--text-muted: #c2410c;
--text-muted-dark: #fdba74;
--surface-panel-alt: #fff7ed;
--surface-panel-alt-dark: #452515;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #fff7ed;
--color-primary-100: #ffedd5;
--color-primary-200: #fed7aa;
--color-primary-300: #fdba74;
--color-primary-400: #fb923c;
--color-primary-500: #f97316;
--color-primary-600: #ea580c;
--color-primary-700: #c2410c;
--color-primary-800: #9a3412;
--color-primary-900: #7c2d12;
--color-primary-950: #431407;
}
[data-color-scheme="red"] {
--surface-body: #fef2f2;
--surface-body-dark: #200a0a;
--surface-sidebar: #461818;
--surface-sidebar-dark: #170505;
--surface-header: #461818;
--surface-header-dark: #170505;
--surface-card: #ffffff;
--surface-card-dark: #3a1414;
--surface-dropdown: #310f0f;
--surface-dropdown-dark: #170505;
--surface-footer: #461818;
--surface-footer-dark: #170505;
--surface-hover: #fef2f2;
--surface-hover-dark: #7f1d1d;
--border-default: #fecaca;
--border-default-dark: #991b1b;
--text-muted: #b91c1c;
--text-muted-dark: #fca5a5;
--surface-panel-alt: #fef2f2;
--surface-panel-alt-dark: #461818;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #fef2f2;
--color-primary-100: #fee2e2;
--color-primary-200: #fecaca;
--color-primary-300: #fca5a5;
--color-primary-400: #f87171;
--color-primary-500: #ef4444;
--color-primary-600: #dc2626;
--color-primary-700: #b91c1c;
--color-primary-800: #991b1b;
--color-primary-900: #7f1d1d;
--color-primary-950: #450a0a;
}
[data-color-scheme="pink"] {
--surface-body: #fdf2f8;
--surface-body-dark: #200a17;
--surface-sidebar: #45172f;
--surface-sidebar-dark: #17040f;
--surface-header: #45172f;
--surface-header-dark: #17040f;
--surface-card: #ffffff;
--surface-card-dark: #391326;
--surface-dropdown: #310f20;
--surface-dropdown-dark: #17040f;
--surface-footer: #45172f;
--surface-footer-dark: #17040f;
--surface-hover: #fdf2f8;
--surface-hover-dark: #831843;
--border-default: #fbcfe8;
--border-default-dark: #9d174d;
--text-muted: #be185d;
--text-muted-dark: #f9a8d4;
--surface-panel-alt: #fdf2f8;
--surface-panel-alt-dark: #45172f;
--surface-chrome-border: rgba(255,255,255,0.08);
--surface-chrome-border-dark: rgba(255,255,255,0.05);
--color-primary-50: #fdf2f8;
--color-primary-100: #fce7f3;
--color-primary-200: #fbcfe8;
--color-primary-300: #f9a8d4;
--color-primary-400: #f472b6;
--color-primary-500: #ec4899;
--color-primary-600: #db2777;
--color-primary-700: #be185d;
--color-primary-800: #9d174d;
--color-primary-900: #831843;
--color-primary-950: #500724;
}
/* Theme customization (replaces theme.extend in tailwind.config.js) */
@theme {
--font-sans: "Figtree", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
@@ -285,24 +573,161 @@
@apply border-amber-200 bg-amber-50/95 text-amber-950 dark:border-amber-800 dark:bg-amber-950/80 dark:text-amber-100;
}
.app-page-header,
.admin-page-header {
border-bottom: 1px solid var(--border-default);
background-image: linear-gradient(120deg, color-mix(in srgb, var(--color-primary-50) 72%, white), transparent 62%);
position: relative;
isolation: isolate;
border: 1px solid var(--border-default);
background-image:
radial-gradient(circle at 92% 12%, color-mix(in srgb, var(--color-primary-400) 16%, transparent), transparent 15rem),
linear-gradient(125deg, color-mix(in srgb, var(--color-primary-50) 80%, white), var(--surface-card) 68%);
}
.dark .app-page-header,
.dark .admin-page-header {
border-bottom-color: var(--border-default-dark);
background-image: linear-gradient(120deg, color-mix(in srgb, var(--color-primary-950) 35%, transparent), transparent 62%);
border-color: var(--border-default-dark);
background-image:
radial-gradient(circle at 92% 12%, color-mix(in srgb, var(--color-primary-500) 18%, transparent), transparent 17rem),
linear-gradient(125deg, color-mix(in srgb, var(--color-primary-950) 42%, var(--surface-card-dark)), var(--surface-card-dark) 68%);
}
.app-page-header {
isolation: isolate;
border: 1px solid color-mix(in srgb, var(--color-primary-400) 20%, transparent);
background: linear-gradient(135deg, color-mix(in srgb, var(--color-primary-950) 92%, #020617), var(--color-primary-700));
}
.workspace-hero__glow {
position: absolute;
border-radius: 9999px;
background: rgb(255 255 255 / 0.12);
filter: blur(1px);
pointer-events: none;
}
.workspace-hero__glow--one {
width: 18rem;
height: 18rem;
top: -11rem;
right: 8%;
}
.workspace-hero__glow--two {
width: 11rem;
height: 11rem;
right: -4rem;
bottom: -6rem;
background: rgb(255 255 255 / 0.08);
}
.workspace-hero__icon,
.workspace-hero__stat,
.workspace-hero__action {
border: 1px solid rgb(255 255 255 / 0.18);
background: rgb(255 255 255 / 0.12);
color: #fff;
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.12);
}
.workspace-hero__icon {
display: inline-flex;
width: 3.25rem;
height: 3.25rem;
flex-shrink: 0;
align-items: center;
justify-content: center;
border-radius: 1rem;
font-size: 1.25rem;
}
.workspace-hero__stat,
.workspace-hero__action {
display: inline-flex;
align-items: center;
gap: 0.5rem;
border-radius: 9999px;
background: rgb(15 23 42 / 0.24);
color: rgb(255 255 255 / 0.88);
backdrop-filter: blur(8px);
}
.workspace-hero__stat {
padding: 0.4rem 0.75rem;
}
.workspace-hero__action {
min-height: 2.75rem;
padding: 0.65rem 1rem;
font-size: 0.875rem;
font-weight: 600;
transition: background-color 160ms ease, border-color 160ms ease, transform 160ms ease;
}
.workspace-hero__action:hover {
border-color: rgb(255 255 255 / 0.3);
background: rgb(255 255 255 / 0.16);
transform: translateY(-1px);
}
.workspace-hero__action:focus-visible {
outline: 2px solid rgb(255 255 255 / 0.9);
outline-offset: 2px;
}
.inline-search-widget {
display: grid;
width: min(100%, 17.5rem);
grid-template-columns: minmax(0, 1fr) 2.5rem;
align-items: center;
gap: 0.5rem;
isolation: isolate;
}
.inline-search-widget__field,
.inline-search-widget__input {
width: 100%;
min-width: 0;
}
.inline-search-widget__input {
padding-inline-start: 2.5rem !important;
}
.inline-search-widget__button {
position: relative;
z-index: 1;
}
.workspace-page-header::after {
position: absolute;
z-index: -1;
width: 9rem;
height: 9rem;
right: -3rem;
bottom: -5rem;
border-radius: 9999px;
background: color-mix(in srgb, var(--color-primary-500) 10%, transparent);
content: '';
}
.workspace-page-header__icon,
.admin-page-header__icon {
display: inline-flex;
width: 2.75rem;
height: 2.75rem;
flex-shrink: 0;
align-items: center;
justify-content: center;
border: 1px solid color-mix(in srgb, var(--color-primary-500) 24%, transparent);
border-radius: 0.875rem;
background-color: color-mix(in srgb, var(--color-primary-500) 11%, transparent);
color: var(--color-primary-700);
}
.admin-page-header__icon {
width: 2.75rem;
height: 2.75rem;
}
.dark .workspace-page-header__icon,
.dark .admin-page-header__icon {
color: var(--color-primary-300);
}
@@ -329,6 +754,17 @@
.admin-data-table-wrap {
border-radius: 0.875rem;
background-color: var(--surface-card);
box-shadow: 0 10px 32px -26px rgb(15 23 42 / 0.55);
}
.dark .admin-data-table-wrap {
background-color: var(--surface-card-dark);
box-shadow: 0 12px 34px -24px rgb(0 0 0 / 0.8);
}
.admin-data-table__head th {
background-image: linear-gradient(180deg, color-mix(in srgb, var(--surface-dropdown) 94%, white), var(--surface-dropdown));
}
.admin-dashboard-page__hero {
@@ -395,6 +831,183 @@
}
}
/* Shared treatment for all first-party application views. */
.app-view-stack > .surface-panel,
.app-view-stack > .bg-white {
border: 1px solid var(--border-default);
border-radius: 1rem;
box-shadow: 0 12px 36px -28px rgb(15 23 42 / 0.55);
}
.dark .app-view-stack > .surface-panel,
.dark .app-view-stack > .bg-white {
border-color: var(--border-default-dark);
box-shadow: 0 14px 38px -26px rgb(0 0 0 / 0.78);
}
.app-view-stack :where(a, button, input, select, textarea):focus-visible {
outline: 2px solid var(--color-primary-500);
outline-offset: 2px;
}
.app-view-stack :where(
input[type='text'],
input[type='search'],
input[type='email'],
input[type='url'],
input[type='tel'],
input[type='number'],
input[type='password'],
input[type='date'],
input[type='datetime-local'],
input[type='time'],
select,
textarea
) {
border-radius: 0.75rem;
transition: border-color 160ms ease, box-shadow 160ms ease, background-color 160ms ease;
}
.app-view-stack :where(
input[type='text'],
input[type='search'],
input[type='email'],
input[type='url'],
input[type='tel'],
input[type='number'],
input[type='password'],
input[type='date'],
input[type='datetime-local'],
input[type='time'],
select
) {
min-height: 2.75rem;
}
.app-view-stack :where(button, .btn) {
border-radius: 0.75rem;
}
.app-view-stack nav[aria-label='breadcrumb' i] a,
.breadcrumb-bar a {
border-radius: 0.375rem;
font-weight: 500;
}
.breadcrumb-bar {
background-image: linear-gradient(90deg, color-mix(in srgb, var(--color-primary-50) 52%, transparent), transparent 65%);
}
.dark .breadcrumb-bar {
background-image: linear-gradient(90deg, color-mix(in srgb, var(--color-primary-950) 26%, transparent), transparent 65%);
}
.empty-state__icon {
border: 1px solid color-mix(in srgb, var(--color-primary-500) 18%, transparent);
background: color-mix(in srgb, var(--color-primary-500) 9%, white);
color: var(--color-primary-600);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.55);
}
.dark .empty-state__icon {
background: color-mix(in srgb, var(--color-primary-500) 16%, var(--surface-card-dark));
color: var(--color-primary-300);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.05);
}
.catalog-results-toolbar,
.catalog-release-row,
.admin-card,
.admin-stat-card {
transition: border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease;
}
.catalog-release-row:hover,
.admin-card:hover,
.admin-stat-card:hover {
border-color: color-mix(in srgb, var(--color-primary-500) 30%, var(--border-default));
box-shadow: 0 14px 34px -28px rgb(15 23 42 / 0.55);
}
.dark .catalog-release-row:hover,
.dark .admin-card:hover,
.dark .admin-stat-card:hover {
border-color: color-mix(in srgb, var(--color-primary-400) 34%, var(--border-default-dark));
box-shadow: 0 16px 36px -26px rgb(0 0 0 / 0.78);
}
.guest-view-stack {
min-height: 100vh;
background:
radial-gradient(circle at 12% 8%, color-mix(in srgb, var(--color-primary-500) 12%, transparent), transparent 28rem),
radial-gradient(circle at 92% 88%, color-mix(in srgb, var(--color-primary-400) 8%, transparent), transparent 24rem),
var(--surface-body);
}
.workspace-brand-mark {
border: 1px solid color-mix(in srgb, var(--color-primary-500) 24%, transparent);
background: color-mix(in srgb, var(--color-primary-500) 11%, white);
color: var(--color-primary-700);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.6), 0 12px 30px -20px rgb(15 23 42 / 0.5);
}
.dark .workspace-brand-mark {
background: color-mix(in srgb, var(--color-primary-500) 18%, var(--surface-card-dark));
color: var(--color-primary-300);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.06), 0 14px 32px -20px rgb(0 0 0 / 0.85);
}
.workspace-document-header {
background-image:
radial-gradient(circle at 92% 0%, color-mix(in srgb, var(--color-primary-500) 12%, transparent), transparent 12rem),
linear-gradient(120deg, color-mix(in srgb, var(--color-primary-50) 70%, white), transparent 68%);
}
.dark .workspace-document-header {
background-image:
radial-gradient(circle at 92% 0%, color-mix(in srgb, var(--color-primary-500) 14%, transparent), transparent 14rem),
linear-gradient(120deg, color-mix(in srgb, var(--color-primary-950) 34%, transparent), transparent 68%);
}
.header-gradient {
border: 1px solid color-mix(in srgb, var(--color-primary-500) 30%, transparent);
background:
radial-gradient(circle at 92% 12%, rgb(255 255 255 / 0.13), transparent 14rem),
linear-gradient(135deg, color-mix(in srgb, var(--color-primary-950) 92%, #020617), var(--color-primary-700));
color: #fff;
}
.info-card-gradient {
border-color: color-mix(in srgb, var(--color-primary-500) 32%, var(--border-default));
background:
linear-gradient(120deg, color-mix(in srgb, var(--color-primary-50) 72%, white), var(--surface-card));
box-shadow: 0 12px 30px -26px rgb(15 23 42 / 0.48);
}
.dark .info-card-gradient {
border-color: color-mix(in srgb, var(--color-primary-400) 34%, var(--border-default-dark));
background:
linear-gradient(120deg, color-mix(in srgb, var(--color-primary-950) 34%, var(--surface-card-dark)), var(--surface-card-dark));
box-shadow: 0 14px 32px -24px rgb(0 0 0 / 0.78);
}
.table-header-gradient {
background:
linear-gradient(90deg, color-mix(in srgb, var(--color-primary-50) 64%, white), var(--surface-card));
}
.dark .table-header-gradient {
background:
linear-gradient(90deg, color-mix(in srgb, var(--color-primary-950) 30%, var(--surface-card-dark)), var(--surface-card-dark));
}
.dark .guest-view-stack {
background:
radial-gradient(circle at 12% 8%, color-mix(in srgb, var(--color-primary-500) 15%, transparent), transparent 30rem),
radial-gradient(circle at 92% 88%, color-mix(in srgb, var(--color-primary-600) 10%, transparent), transparent 26rem),
var(--surface-body-dark);
}
/* Default document flow - public/guest pages need vertical scrolling */
html,
body {
@@ -514,6 +1127,7 @@ footer {
.surface-panel {
background-color: var(--surface-card) !important;
border-color: var(--border-default);
transition: border-color 180ms ease, box-shadow 180ms ease, background-color 180ms ease;
}
.surface-panel.border {
border-width: 1px;
@@ -550,10 +1164,13 @@ footer {
.auth-card {
background-color: var(--surface-card) !important;
border: 1px solid var(--border-default);
border-radius: 1.25rem;
box-shadow: 0 24px 65px -38px rgb(15 23 42 / 0.55);
}
.dark .auth-card {
background-color: var(--surface-card-dark) !important;
border-color: var(--border-default-dark);
box-shadow: 0 26px 70px -38px rgb(0 0 0 / 0.9);
}
.release-chip {
@apply inline-flex items-center rounded px-2 py-0.5 text-xs font-medium;
@@ -628,6 +1245,11 @@ main table {
main thead th {
background-color: var(--surface-dropdown) !important;
border-bottom-color: var(--border-default) !important;
color: rgb(241 245 249);
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.045em;
text-transform: uppercase;
}
.dark main thead th {
background-color: var(--surface-dropdown-dark) !important;
@@ -643,6 +1265,7 @@ main tbody {
main tbody tr {
background-color: var(--surface-card) !important;
border-bottom-color: var(--border-default);
transition: background-color 140ms ease;
}
.dark main tbody tr {
background-color: var(--surface-card-dark) !important;
+404 -42
View File
@@ -787,73 +787,436 @@ code.api-token::-webkit-scrollbar-thumb:hover {
}
/* ------------------------------------------------------------------ */
/* Movies grid: layout toggle (1-column default, 2-column on lg+) */
/* Driven by [data-layout] attribute set via Alpine.js */
/* Movies library */
/* ------------------------------------------------------------------ */
.movies-hero {
background:
linear-gradient(135deg, color-mix(in srgb, var(--color-primary-950) 92%, #020617), var(--color-primary-700));
}
.movies-hero__glow {
position: absolute;
border-radius: 9999px;
background: rgb(255 255 255 / 0.12);
filter: blur(1px);
pointer-events: none;
}
.movies-hero__glow--one {
width: 18rem;
height: 18rem;
top: -11rem;
right: 8%;
}
.movies-hero__glow--two {
width: 11rem;
height: 11rem;
right: -4rem;
bottom: -6rem;
background: rgb(255 255 255 / 0.08);
}
.movies-hero__icon {
display: inline-flex;
width: 3.25rem;
height: 3.25rem;
flex-shrink: 0;
align-items: center;
justify-content: center;
border: 1px solid rgb(255 255 255 / 0.18);
border-radius: 1rem;
background: rgb(255 255 255 / 0.12);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.12);
font-size: 1.25rem;
}
.movies-hero__stat,
.movies-hero__action {
display: inline-flex;
align-items: center;
gap: 0.5rem;
border: 1px solid rgb(255 255 255 / 0.16);
border-radius: 9999px;
background: rgb(15 23 42 / 0.24);
color: rgb(255 255 255 / 0.88);
backdrop-filter: blur(8px);
}
.movies-hero__stat {
padding: 0.4rem 0.75rem;
}
.movies-hero__action {
min-height: 2.75rem;
padding: 0.65rem 1rem;
font-size: 0.875rem;
font-weight: 600;
transition: background-color 160ms ease, border-color 160ms ease, transform 160ms ease;
}
.movies-hero__action:hover {
border-color: rgb(255 255 255 / 0.3);
background: rgb(255 255 255 / 0.16);
transform: translateY(-1px);
}
.movies-hero__action:focus-visible {
outline: 2px solid rgb(255 255 255 / 0.9);
outline-offset: 2px;
}
.movies-hero__action--accent {
border-color: rgb(251 146 60 / 0.45);
background: linear-gradient(135deg, rgb(249 115 22 / 0.94), rgb(220 38 38 / 0.94));
color: #fff;
}
.movie-filter-control {
width: 100%;
min-height: 2.75rem;
border: 1px solid rgb(209 213 219);
border-radius: 0.75rem;
background-color: #fff;
color: rgb(17 24 39);
font-size: 0.875rem;
transition: border-color 160ms ease, box-shadow 160ms ease, background-color 160ms ease;
}
.movie-filter-control:focus {
border-color: var(--color-primary-500);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary-500) 20%, transparent);
outline: none;
}
.dark .movie-filter-control {
border-color: rgb(75 85 99);
background-color: rgb(31 41 55);
color: rgb(243 244 246);
}
.movie-filter-chip {
display: inline-flex;
align-items: center;
gap: 0.25rem;
border: 1px solid color-mix(in srgb, var(--color-primary-500) 24%, transparent);
border-radius: 9999px;
background-color: color-mix(in srgb, var(--color-primary-500) 9%, white);
padding: 0.35rem 0.65rem;
color: var(--color-primary-800);
font-size: 0.75rem;
}
.dark .movie-filter-chip {
background-color: color-mix(in srgb, var(--color-primary-500) 16%, rgb(15 23 42));
color: var(--color-primary-200);
}
.movies-grid {
display: grid;
grid-template-columns: 1fr;
gap: 1.5rem;
transition: gap 0.3s ease;
grid-template-columns: minmax(0, 1fr);
gap: 1rem;
}
@media (min-width: 1024px) {
.movies-grid[data-layout="2"] {
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
.movie-card {
position: relative;
transition: border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease;
}
.movie-card:hover {
border-color: color-mix(in srgb, var(--color-primary-500) 38%, var(--border-default));
box-shadow: 0 16px 36px -24px rgb(15 23 42 / 0.55);
transform: translateY(-2px);
}
.dark .movie-card:hover {
border-color: color-mix(in srgb, var(--color-primary-400) 45%, var(--border-default-dark));
box-shadow: 0 18px 42px -24px rgb(0 0 0 / 0.8);
}
.movie-card__layout {
display: flex;
flex-direction: column;
min-width: 0;
}
.movie-card__poster-wrap {
position: relative;
flex-shrink: 0;
overflow: hidden;
background: var(--surface-panel-alt);
}
.dark .movie-card__poster-wrap {
background: var(--surface-panel-alt-dark);
}
.movie-card__poster-link {
display: block;
}
/* Cover image / placeholder sizing */
.movies-grid .movie-cover {
width: 12rem;
height: 18rem;
transition: width 0.3s ease, height 0.3s ease;
display: block;
width: 100%;
height: 15rem;
object-fit: cover;
transition: transform 240ms ease;
}
.movies-grid[data-layout="2"] .movie-cover {
width: 8rem;
height: 12rem;
.movie-card:hover .movie-cover {
transform: scale(1.015);
}
.movie-card__poster-placeholder {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.5rem;
color: var(--text-muted);
}
.dark .movie-card__poster-placeholder {
color: var(--text-muted-dark);
}
.movie-card__poster-placeholder i {
font-size: 2rem;
}
.movie-card__poster-placeholder span {
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.movie-card__release-count {
position: absolute;
right: 0.75rem;
bottom: 0.75rem;
display: inline-flex;
align-items: center;
gap: 0.35rem;
border: 1px solid rgb(255 255 255 / 0.18);
border-radius: 9999px;
background: rgb(15 23 42 / 0.84);
padding: 0.35rem 0.6rem;
color: #fff;
font-size: 0.7rem;
font-weight: 700;
backdrop-filter: blur(6px);
}
.movie-card__content {
display: flex;
flex-direction: column;
padding: 1.25rem;
}
.movie-card__title {
overflow-wrap: anywhere;
}
.movie-meta-chip {
display: inline-flex;
align-items: center;
gap: 0.35rem;
border-radius: 9999px;
background: var(--surface-panel-alt);
padding: 0.35rem 0.6rem;
color: var(--text-muted);
}
.dark .movie-meta-chip {
background: var(--surface-panel-alt-dark);
color: var(--text-muted-dark);
}
.movie-meta-chip--rating {
background: rgb(254 249 195);
color: rgb(161 98 7);
}
.dark .movie-meta-chip--rating {
background: rgb(113 63 18 / 0.45);
color: rgb(253 224 71);
}
.movie-card__metadata-row {
display: grid;
grid-template-columns: 5rem minmax(0, 1fr);
gap: 0.65rem;
min-width: 0;
}
.movie-card__metadata-row dt {
display: flex;
align-items: baseline;
gap: 0.4rem;
color: var(--text-muted);
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.dark .movie-card__metadata-row dt {
color: var(--text-muted-dark);
}
.movie-card__metadata-row dd {
min-width: 0;
color: rgb(55 65 81);
}
.dark .movie-card__metadata-row dd {
color: rgb(209 213 219);
}
.movie-card__metadata-row dd a {
color: var(--color-primary-600);
}
.dark .movie-card__metadata-row dd a {
color: var(--color-primary-400);
}
.movie-source-link {
display: inline-flex;
min-height: 2rem;
align-items: center;
gap: 0.35rem;
border-radius: 0.5rem;
padding: 0.35rem 0.6rem;
font-size: 0.75rem;
font-weight: 700;
transition: filter 160ms ease, transform 160ms ease;
}
.movie-source-link:hover {
filter: brightness(0.96);
transform: translateY(-1px);
}
.movie-source-link:focus-visible {
outline: 2px solid var(--color-primary-500);
outline-offset: 2px;
}
.movie-source-link--imdb {
background: rgb(254 240 138);
color: rgb(113 63 18);
}
.movie-source-link--tmdb {
background: color-mix(in srgb, var(--color-primary-500) 13%, white);
color: var(--color-primary-800);
}
.movie-source-link--trakt {
background: rgb(254 226 226);
color: rgb(153 27 27);
}
.dark .movie-source-link--imdb {
background: rgb(113 63 18 / 0.6);
color: rgb(254 240 138);
}
.dark .movie-source-link--tmdb {
background: color-mix(in srgb, var(--color-primary-500) 20%, rgb(15 23 42));
color: var(--color-primary-200);
}
.dark .movie-source-link--trakt {
background: rgb(127 29 29 / 0.5);
color: rgb(254 202 202);
}
/* Release card: row layout by default (1-col), column in 2-col */
.movies-grid .release-card-container {
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: space-between;
gap: 1rem;
transition: gap 0.2s ease;
}
.movies-grid[data-layout="2"] .release-card-container {
flex-direction: column;
gap: 0.75rem;
}
.movies-grid .release-info-wrapper {
flex: 1;
min-width: 0;
}
.movies-grid[data-layout="2"] .release-info-wrapper {
flex: unset;
min-width: unset;
}
/* Release action buttons */
.movies-grid .release-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
flex-shrink: 0;
}
.movies-grid[data-layout="2"] .release-actions {
flex-shrink: unset;
margin-top: 0.5rem;
.movies-grid .release-actions .release-action-sm {
gap: 0.35rem;
min-height: 2rem;
border-radius: 0.5rem;
}
.movie-release-row {
transition: border-color 160ms ease, background-color 160ms ease;
}
.movie-release-row:hover {
border-color: color-mix(in srgb, var(--color-primary-500) 28%, var(--border-default));
}
@media (min-width: 640px) {
.movie-card__layout {
flex-direction: row;
}
.movie-card__poster-wrap,
.movies-grid .movie-cover {
width: 10rem;
}
.movies-grid .movie-cover {
height: 15rem;
}
}
@media (min-width: 1024px) {
.movies-grid[data-layout="2"] {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.movies-grid[data-layout="1"] .movie-card__poster-wrap,
.movies-grid[data-layout="1"] .movie-cover {
width: 12rem;
}
.movies-grid[data-layout="1"] .movie-cover {
height: 18rem;
}
.movies-grid[data-layout="1"] .release-card-container {
flex-direction: row;
align-items: flex-start;
justify-content: space-between;
}
.movies-grid[data-layout="1"] .release-actions {
flex-shrink: 0;
justify-content: flex-end;
}
}
@media (prefers-reduced-motion: reduce) {
.movie-card,
.movie-cover,
.movies-hero__action,
.movie-source-link {
transition: none;
}
.movie-card:hover,
.movie-card:hover .movie-cover,
.movies-hero__action:hover,
.movie-source-link:hover {
transform: none;
}
}
/* Sidebar - Useful Links Content Styling */
@@ -1008,4 +1371,3 @@ code.api-token::-webkit-scrollbar-thumb:hover {
.series-detail-page .series-detail-poster {
@apply rounded-xl shadow-xl transition-shadow duration-300;
}
@@ -16,11 +16,11 @@ Alpine.data('moviesPage', () => ({
},
get layoutLabel() {
return this.layout === 1 ? '1 Column' : '2 Columns';
return this.layout === 1 ? 'Comfortable list' : 'Compact grid';
},
get layoutIcon() {
return this.layout === 1 ? 'fas fa-th-list' : 'fas fa-th-large';
return this.layout === 1 ? 'fas fa-list' : 'fas fa-table-cells-large';
},
toggleLayout() {
+6 -3
View File
@@ -5,6 +5,7 @@
import Alpine from '@alpinejs/csp';
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
const colorSchemes = ['blue', 'indigo', 'cyan', 'teal', 'emerald', 'violet', 'pink', 'rose', 'red', 'orange', 'amber'];
Alpine.store('theme', {
current: 'light',
@@ -19,18 +20,19 @@ Alpine.store('theme', {
const schemeMeta = document.querySelector('meta[name="color-scheme-preference"]');
const schemeData = document.getElementById('current-theme-data');
this.colorScheme = (isAuth && isAuth.content === 'true')
const preferredScheme = (isAuth && isAuth.content === 'true')
? (schemeMeta ? schemeMeta.content : (schemeData?.dataset?.colorScheme || 'blue'))
: (localStorage.getItem('color_scheme') || 'blue');
this.colorScheme = colorSchemes.includes(preferredScheme) ? preferredScheme : 'blue';
this.apply();
this.applyScheme();
this._listenOS();
},
/** Set and persist color scheme (blue, emerald, violet) */
/** Set and persist a supported color scheme. */
setScheme(scheme) {
if (!['blue', 'emerald', 'violet'].includes(scheme)) return;
if (!colorSchemes.includes(scheme)) return;
this.colorScheme = scheme;
this.applyScheme();
this._save();
@@ -114,6 +116,7 @@ Alpine.store('theme', {
// Update color scheme swatch buttons
document.querySelectorAll('.dropdown-scheme-btn, .mobile-scheme-btn').forEach(function(btn) {
var isActive = btn.dataset.scheme === self.colorScheme;
btn.setAttribute('aria-pressed', isActive ? 'true' : 'false');
btn.classList.remove('ring-2', 'ring-offset-2', 'ring-offset-gray-900', 'ring-primary-500', 'ring-white');
if (isActive) {
btn.classList.add('ring-2', 'ring-offset-2', 'ring-offset-gray-900', 'ring-primary-500', 'dark:ring-offset-gray-950');
+5 -11
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-edit mr-2"></i>{{ $title }}
</h1>
<a href="{{ route('admin.anidb-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="route('admin.anidb-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Edit Form -->
<div class="p-6">
+7 -11
View File
@@ -3,17 +3,13 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-dragon mr-2"></i>{{ $title }}
</h1>
<div class="text-sm text-gray-600 dark:text-gray-400">
Total: {{ $anidblist->total() }} anime
</div>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-dragon">
<x-slot:actions>
<span class="inline-flex min-h-11 items-center rounded-xl border border-gray-200 bg-white/70 px-4 text-sm font-medium text-gray-700 dark:border-gray-600 dark:bg-gray-800/70 dark:text-gray-200">
{{ number_format($anidblist->total()) }} anime
</span>
</x-slot:actions>
</x-admin.page-header>
<!-- Search Form -->
<div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700">
+5 -12
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-unlink mr-2"></i>{{ $title }}
</h1>
<a href="{{ route('admin.anidb-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-unlink">
<x-slot:actions>
<x-admin.button :href="route('admin.anidb-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Content -->
<div class="p-6">
@@ -114,4 +108,3 @@
</x-admin.card>
</div>
@endsection
+5 -12
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800">
<i class="fas fa-edit mr-2"></i>{{ $title ?? 'Binary Black/Whitelist Edit' }}
</h1>
<a href="{{ url('/admin/binaryblacklist-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Binary Black/Whitelist Edit'" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="url('/admin/binaryblacklist-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Form -->
<form action="{{ url('/admin/binaryblacklist-edit?action=submit') }}" method="POST" id="blacklistForm" class="px-6 py-6">
@@ -182,4 +176,3 @@
{{-- Scripts moved to resources/js/csp-safe.js --}}
@endsection
+5 -11
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-edit mr-2"></i>{{ $title }}
</h1>
<a href="{{ route('admin.book-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="route('admin.book-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Edit Form -->
<div class="p-6">
+7 -11
View File
@@ -3,17 +3,13 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-book mr-2"></i>{{ $title }}
</h1>
<div class="text-sm text-gray-600 dark:text-gray-400">
Total: {{ $bookList->total() }} books
</div>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-book">
<x-slot:actions>
<span class="inline-flex min-h-11 items-center rounded-xl border border-gray-200 bg-white/70 px-4 text-sm font-medium text-gray-700 dark:border-gray-600 dark:bg-gray-800/70 dark:text-gray-200">
{{ number_format($bookList->total()) }} books
</span>
</x-slot:actions>
</x-admin.page-header>
<!-- Books Table -->
<x-admin.data-table>
+5 -11
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-edit mr-2"></i>{{ $title }}
</h1>
<a href="{{ route('admin.console-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="route('admin.console-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Edit Form -->
<div class="p-6">
+7 -11
View File
@@ -3,17 +3,13 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-gamepad mr-2"></i>{{ $title }}
</h1>
<div class="text-sm text-gray-600 dark:text-gray-400">
Total: {{ $consoleList->total() }} games
</div>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-gamepad">
<x-slot:actions>
<span class="inline-flex min-h-11 items-center rounded-xl border border-gray-200 bg-white/70 px-4 text-sm font-medium text-gray-700 dark:border-gray-600 dark:bg-gray-800/70 dark:text-gray-200">
{{ number_format($consoleList->total()) }} games
</span>
</x-slot:actions>
</x-admin.page-header>
<!-- Console Table -->
<x-admin.data-table>
+1 -7
View File
@@ -7,12 +7,7 @@
@endphp
<div class="space-y-6" x-data="tinyMceEditor">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800">
<i class="fas fa-file-alt mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-file-alt" />
<!-- Content Form -->
<form method="post" action="{{ route('admin.content-add') }}" class="p-6">
@@ -185,4 +180,3 @@
</x-admin.card>
</div>
@endsection
+5 -11
View File
@@ -18,22 +18,16 @@
data-data-url="{{ route('admin.api.dashboard-data') }}"
data-refresh-interval="{{ 60 * 1000 }}">
<div class="admin-dashboard-page__content space-y-6" data-dashboard-content>
<!-- Welcome Section -->
<x-admin.card class="admin-dashboard-page__hero p-6">
<div class="flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
<div>
<p class="mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-primary-600 dark:text-primary-300">Operations overview</p>
<h1 class="text-2xl font-semibold tracking-tight text-gray-950 dark:text-white sm:text-3xl">Admin Dashboard</h1>
<p class="mt-2 text-gray-600 dark:text-gray-300">Monitor index health, users, releases, and site activity from one workspace.</p>
</div>
<div class="rounded-lg bg-gray-50 dark:bg-gray-900 px-4 py-3 text-sm text-gray-600 dark:text-gray-300 lg:text-right">
<x-admin.page-header title="Admin Dashboard" icon="fas fa-gauge-high" subtitle="Monitor index health, users, releases, and site activity from one workspace." class="admin-dashboard-page__hero">
<x-slot:actions>
<div class="rounded-xl border border-gray-200 bg-white/70 px-4 py-2 text-sm text-gray-600 dark:border-gray-600 dark:bg-gray-800/70 dark:text-gray-300 lg:text-right">
<p class="font-medium text-gray-700 dark:text-gray-200">
<i class="fas fa-sync-alt mr-1"></i> Last dashboard refresh: <span data-stat="last-refresh">{{ $dashboardLastRefreshedAt }}</span>
</p>
<p class="mt-1 text-xs text-green-600 dark:text-green-400">Auto-refreshes every minute</p>
</div>
</div>
</x-admin.card>
</x-slot:actions>
</x-admin.page-header>
<!-- Stats Grid -->
<div class="admin-dashboard-page__stats-grid grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6">
+1 -6
View File
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-gamepad mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-gamepad" />
<!-- Success/Error/Warning Messages -->
@if(session('success'))
+1 -9
View File
@@ -3,14 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-gamepad mr-2"></i>{{ $title }}
</h1>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-gamepad" />
<!-- Success/Error/Warning Messages -->
@if(session('success'))
@@ -131,4 +124,3 @@
</x-admin.card>
</div>
@endsection
+1 -8
View File
@@ -3,13 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-shield-alt mr-2"></i>{{ $title }}
</h1>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-shield-alt" />
@if(session('success'))
<div class="mx-6 mt-4 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg text-green-800 dark:text-green-200">
@@ -103,4 +97,3 @@
</x-admin.card>
</div>
@endsection
+5 -11
View File
@@ -3,16 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-shield-alt mr-2"></i>{{ $title }}
</h1>
<a href="{{ route('admin.gdpr-requests.index') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-shield-alt">
<x-slot:actions>
<x-admin.button :href="route('admin.gdpr-requests.index')" tone="gray" icon="fas fa-arrow-left">Back</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
@if(session('success'))
<div class="mx-6 mt-4 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg text-green-800 dark:text-green-200">
@@ -145,4 +140,3 @@
</x-admin.card>
</div>
@endsection
+5 -12
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-plus-square mr-2"></i>{{ $title ?? 'Bulk Add Newsgroups' }}
</h1>
<a href="{{ url('/admin/group-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600">
<i class="fas fa-list mr-2"></i>View All Groups
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Bulk Add Newsgroups'" icon="fas fa-plus-square">
<x-slot:actions>
<x-admin.button :href="url('/admin/group-list')" tone="gray" icon="fas fa-list">View All Groups</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<div class="px-6 py-6">
@if(!empty($groupmsglist))
@@ -179,4 +173,3 @@
</div>
@endsection
+5 -12
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-edit mr-2"></i>{{ $title ?? 'Group Edit' }}
</h1>
<a href="{{ url('/admin/group-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200">
<i class="fas fa-arrow-left mr-2"></i>Back to Groups
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Group Edit'" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="url('/admin/group-list')" tone="gray" icon="fas fa-arrow-left">Back to Groups</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Error Message -->
@if(isset($error) && $error != '')
@@ -263,4 +257,3 @@
</div>
@endsection
@@ -3,35 +3,25 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-envelope mr-2"></i>{{ $title }}
</h1>
<div class="space-x-2">
<x-admin.page-header :title="$title" icon="fas fa-envelope">
<x-slot:actions>
<div class="flex flex-wrap gap-2">
@if(!$invitation->used_at)
<form method="POST" action="{{ url('admin/invitations/' . $invitation->id . '/resend') }}" class="inline">
@csrf
<button type="submit" class="px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700">
<i class="fas fa-paper-plane mr-2"></i>Resend
</button>
<x-admin.button type="submit" tone="success" icon="fas fa-paper-plane">Resend</x-admin.button>
</form>
<form method="POST" action="{{ url('admin/invitations/' . $invitation->id . '/cancel') }}" class="inline"
x-data="confirmForm"
data-message="Are you sure you want to cancel this invitation?">
@csrf
<button type="button" class="px-4 py-2 bg-yellow-600 text-white rounded-lg hover:bg-yellow-700" @click="submit()">
<i class="fas fa-ban mr-2"></i>Cancel
</button>
<x-admin.button type="button" tone="warning" icon="fas fa-ban" @click="submit()">Cancel</x-admin.button>
</form>
@endif
<a href="{{ url('admin/invitations') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
<x-admin.button :href="url('admin/invitations')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</div>
</div>
</div>
</x-slot:actions>
</x-admin.page-header>
<!-- Invitation Details -->
<div class="p-6">
@@ -205,4 +195,3 @@
{{-- Scripts moved to resources/js/csp-safe.js --}}
@endsection
+1 -7
View File
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-film mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-film" />
<!-- Success/Error/Warning Messages -->
@if(session('success'))
@@ -101,4 +96,3 @@
</x-admin.card>
</div>
@endsection
+6 -17
View File
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-edit mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-edit" />
<!-- Success/Error/Warning Messages -->
@if(session('success'))
@@ -264,17 +259,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-film mr-2"></i>{{ $title }}
</h1>
<a href="{{ url('admin/movie-add') }}" class="px-4 py-2 bg-blue-600 dark:bg-blue-700 text-white rounded-lg hover:bg-blue-700">
<i class="fas fa-plus mr-2"></i>Add Movie
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-film">
<x-slot:actions>
<x-admin.button :href="url('admin/movie-add')" icon="fas fa-plus">Add Movie</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Search Form -->
<div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700">
+1 -6
View File
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-music mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-music" />
<!-- Success/Error/Warning Messages -->
@if(session('success'))
+1 -9
View File
@@ -3,14 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-music mr-2"></i>{{ $title }}
</h1>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-music" />
<!-- Success/Error/Warning Messages -->
@if(session('success'))
@@ -137,4 +130,3 @@
</x-admin.card>
</div>
@endsection
+7 -12
View File
@@ -3,17 +3,13 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-database mr-2"></i>{{ $title }}
</h1>
<div class="text-sm text-gray-600 dark:text-gray-400">
Total: {{ $results->total() }} entries
</div>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-database">
<x-slot:actions>
<span class="inline-flex min-h-11 items-center rounded-xl border border-gray-200 bg-white/70 px-4 text-sm font-medium text-gray-700 dark:border-gray-600 dark:bg-gray-800/70 dark:text-gray-200">
{{ number_format($results->total()) }} entries
</span>
</x-slot:actions>
</x-admin.page-header>
<!-- Search Form -->
<div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700">
@@ -171,4 +167,3 @@
@endif
</div>
@endsection
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card class="max-w-3xl mx-auto">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-plus mr-2"></i>Create New Promotion
</h1>
</div>
<x-admin.page-header title="Create New Promotion" icon="fas fa-plus" />
<!-- Form -->
<form action="{{ route('admin.promotions.store') }}" method="POST" class="p-6">
@@ -129,4 +124,3 @@
</x-admin.card>
</div>
@endsection
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card class="max-w-3xl mx-auto">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-edit mr-2"></i>Edit Promotion
</h1>
</div>
<x-admin.page-header title="Edit Promotion" icon="fas fa-edit" />
<!-- Form -->
<form action="{{ route('admin.promotions.update', $promotion->id) }}" method="POST" class="p-6">
@@ -135,4 +130,3 @@
</x-admin.card>
</div>
@endsection
@@ -3,23 +3,12 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-gift mr-2"></i>Role Promotions
</h1>
<div class="flex gap-2">
<a href="{{ route('admin.promotions.statistics') }}" class="px-4 py-2 bg-purple-600 dark:bg-purple-700 text-white rounded-lg hover:bg-purple-700">
<i class="fas fa-chart-bar mr-2"></i>View Statistics
</a>
<a href="{{ route('admin.promotions.create') }}" class="px-4 py-2 bg-blue-600 dark:bg-blue-700 text-white rounded-lg hover:bg-blue-700">
<i class="fas fa-plus mr-2"></i>Add New Promotion
</a>
</div>
</div>
</div>
<x-admin.page-header title="Role Promotions" icon="fas fa-gift">
<x-slot:actions>
<x-admin.button :href="route('admin.promotions.statistics')" tone="gray" icon="fas fa-chart-bar">View Statistics</x-admin.button>
<x-admin.button :href="route('admin.promotions.create')" icon="fas fa-plus">Add New Promotion</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Promotions Table -->
@if(count($promotions) > 0)
@@ -135,4 +124,3 @@
</x-admin.card>
</div>
@endsection
@@ -2,25 +2,12 @@
@section('content')
<div class="space-y-6">
<!-- Header -->
<div class="mb-6">
<div class="flex justify-between items-center">
<div>
<h1 class="text-3xl font-bold text-gray-800 dark:text-gray-200">
<i class="fas fa-chart-line mr-2"></i>{{ $promotion->name }} - Statistics
</h1>
<p class="text-gray-600 dark:text-gray-400 mt-1">Detailed statistics for this promotion</p>
</div>
<div class="flex gap-2">
<a href="{{ route('admin.promotions.statistics') }}" class="px-4 py-2 bg-purple-600 dark:bg-purple-700 text-white rounded-lg hover:bg-purple-700">
<i class="fas fa-chart-bar mr-2"></i>All Statistics
</a>
<a href="{{ route('admin.promotions.index') }}" class="px-4 py-2 bg-gray-600 dark:bg-gray-700 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to Promotions
</a>
</div>
</div>
</div>
<x-admin.page-header :title="$promotion->name.' - Statistics'" icon="fas fa-chart-line" subtitle="Detailed statistics for this promotion">
<x-slot:actions>
<x-admin.button :href="route('admin.promotions.statistics')" tone="gray" icon="fas fa-chart-bar">All Statistics</x-admin.button>
<x-admin.button :href="route('admin.promotions.index')" tone="gray" icon="fas fa-arrow-left">Back to Promotions</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Promotion Info Card -->
<x-admin.card class="p-6 mb-6">
@@ -294,4 +281,3 @@
</x-admin.card>
</div>
@endsection
@@ -2,20 +2,11 @@
@section('content')
<div class="space-y-6">
<!-- Header -->
<div class="mb-6">
<div class="flex justify-between items-center">
<div>
<h1 class="text-3xl font-bold text-gray-800 dark:text-gray-200">
<i class="fas fa-chart-bar mr-2"></i>Promotion Statistics
</h1>
<p class="text-gray-600 dark:text-gray-400 mt-1">Overview of all promotion activities</p>
</div>
<a href="{{ route('admin.promotions.index') }}" class="px-4 py-2 bg-gray-600 dark:bg-gray-700 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to Promotions
</a>
</div>
</div>
<x-admin.page-header title="Promotion Statistics" icon="fas fa-chart-bar" subtitle="Overview of all promotion activities">
<x-slot:actions>
<x-admin.button :href="route('admin.promotions.index')" tone="gray" icon="fas fa-arrow-left">Back to Promotions</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Date Range Filter -->
<x-admin.card class="p-6 mb-6">
@@ -299,4 +290,3 @@
</x-admin.card>
</div>
@endsection
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800">
<i class="fas fa-edit mr-2"></i>{{ $title ?? 'Category Regex Edit' }}
</h1>
<a href="{{ url('/admin/category_regexes-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Category Regex Edit'" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="url('/admin/category_regexes-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Form -->
<form action="{{ url('/admin/category_regexes-edit?action=submit') }}" method="POST" id="regexForm" class="px-6 py-6">
@@ -185,4 +179,3 @@
{{-- Scripts moved to resources/js/csp-safe.js --}}
@endsection
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-folder-open mr-2"></i>{{ $title ?? 'Category Regex List' }}
</h1>
<a href="{{ url('/admin/category-regexes-edit') }}" class="px-4 py-2 bg-blue-600 dark:bg-blue-700 text-white rounded-lg hover:bg-blue-700 dark:hover:bg-blue-800">
<i class="fas fa-plus mr-2"></i>Add New Regex
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Category Regex List'" icon="fas fa-folder-open">
<x-slot:actions>
<x-admin.button :href="url('/admin/category-regexes-edit')" icon="fas fa-plus">Add New Regex</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Info Alert -->
<div class="px-6 py-4 bg-blue-50 dark:bg-blue-900/20 border-b border-blue-100 dark:border-blue-800">
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-edit mr-2"></i>{{ $title ?? 'Collection Regex Edit' }}
</h1>
<a href="{{ url('/admin/collection_regexes-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Collection Regex Edit'" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="url('/admin/collection_regexes-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Form -->
<form action="{{ url('/admin/collection_regexes-edit?action=submit') }}" method="POST" id="regexForm" class="px-6 py-6">
@@ -159,4 +153,3 @@
{{-- Scripts moved to resources/js/csp-safe.js --}}
@endsection
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-layer-group mr-2"></i>{{ $title ?? 'Collection Regex List' }}
</h1>
<a href="{{ url('/admin/collection_regexes-edit') }}" class="px-4 py-2 bg-blue-600 dark:bg-blue-700 text-white rounded-lg hover:bg-blue-700 dark:hover:bg-blue-800">
<i class="fas fa-plus mr-2"></i>Add New Regex
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Collection Regex List'" icon="fas fa-layer-group">
<x-slot:actions>
<x-admin.button :href="url('/admin/collection_regexes-edit')" icon="fas fa-plus">Add New Regex</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Info Alert -->
<div class="px-6 py-4 bg-blue-50 dark:bg-blue-900/20 border-b border-blue-100 dark:border-blue-800">
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800">
<i class="fas fa-flask mr-2"></i>{{ $title ?? 'Collection Regex Test' }}
</h1>
<a href="{{ url('/admin/collection_regexes-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Collection Regex Test'" icon="fas fa-flask">
<x-slot:actions>
<x-admin.button :href="url('/admin/collection_regexes-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Info Alert -->
<div class="px-6 py-4 bg-blue-50 border-b border-blue-100">
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800">
<i class="fas fa-edit mr-2"></i>{{ $title ?? 'Release Naming Regex Edit' }}
</h1>
<a href="{{ url('/admin/release_naming_regexes-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Release Naming Regex Edit'" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="url('/admin/release_naming_regexes-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Form -->
<form action="{{ url('/admin/release_naming_regexes-edit?action=submit') }}" method="POST" id="regexForm" class="px-6 py-6">
@@ -159,4 +153,3 @@
{{-- Scripts moved to resources/js/csp-safe.js --}}
@endsection
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-tag mr-2"></i>{{ $title ?? 'Release Naming Regex List' }}
</h1>
<a href="{{ url('/admin/release_naming_regexes-edit') }}" class="px-4 py-2 bg-blue-600 dark:bg-blue-700 text-white rounded-lg hover:bg-blue-700 dark:hover:bg-blue-800">
<i class="fas fa-plus mr-2"></i>Add New Regex
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Release Naming Regex List'" icon="fas fa-tag">
<x-slot:actions>
<x-admin.button :href="url('/admin/release_naming_regexes-edit')" icon="fas fa-plus">Add New Regex</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Info Alert -->
<div class="px-6 py-4 bg-blue-50 dark:bg-blue-900/20 border-b border-blue-100 dark:border-blue-800">
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800">
<i class="fas fa-flask mr-2"></i>{{ $title ?? 'Release Naming Regex Test' }}
</h1>
<a href="{{ url('/admin/release_naming_regexes-list') }}" class="px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title ?? 'Release Naming Regex Test'" icon="fas fa-flask">
<x-slot:actions>
<x-admin.button :href="url('/admin/release_naming_regexes-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Info Alert -->
<div class="px-6 py-4 bg-blue-50 border-b border-blue-100">
+5 -11
View File
@@ -4,16 +4,11 @@
@section('content')
<div class="space-y-6">
<div class="mb-6">
<h1 class="text-3xl font-bold text-gray-800 dark:text-gray-100">Edit Release</h1>
<nav class="text-sm text-gray-600 dark:text-gray-400 mt-2">
<a href="{{ route('admin.index') }}" class="hover:text-blue-600">Dashboard</a>
<i class="fas fa-chevron-right mx-2 text-xs"></i>
<a href="{{ route('admin.release-list') }}" class="hover:text-blue-600">Releases</a>
<i class="fas fa-chevron-right mx-2 text-xs"></i>
<span>Edit</span>
</nav>
</div>
<x-admin.page-header title="Edit Release" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="route('admin.release-list')" tone="gray" icon="fas fa-arrow-left">Back to Releases</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
@if(session('success'))
<div class="bg-green-100 dark:bg-green-900/20 border border-green-400 dark:border-green-900 text-green-700 dark:text-green-300 px-4 py-3 rounded mb-4">
@@ -253,4 +248,3 @@
</div>
</div>
@endsection
@@ -3,17 +3,11 @@
@section('content')
<div x-data="adminReleaseList" class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-exclamation-triangle mr-2"></i>{{ $title }}
</h1>
<a href="{{ url('/admin/release-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-list mr-2"></i>View All Releases
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-exclamation-triangle">
<x-slot:actions>
<x-admin.button :href="url('/admin/release-list')" tone="gray" icon="fas fa-list">View All Releases</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Success/Error/Warning Messages -->
@if(session('success'))
@@ -181,4 +175,3 @@
</x-admin.card>
</div>
@endsection
+1 -7
View File
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-user-shield mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-user-shield" />
<!-- Role Add Form -->
<form method="post" action="{{ url('admin/role-add') }}" class="p-6">
@@ -214,4 +209,3 @@
</x-admin.card>
</div>
@endsection
+1 -7
View File
@@ -3,12 +3,7 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-user-shield mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-user-shield" />
<!-- Role Edit Form -->
@if($role)
@@ -254,4 +249,3 @@
</x-admin.card>
</div>
@endsection
+5 -11
View File
@@ -13,16 +13,11 @@
@section('content')
<div class="space-y-6" x-data="showAddForm" data-config="{{ $configJson }}">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-tv mr-2"></i>{{ $title }}
</h1>
<a href="{{ url('admin/show-list') }}"
class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700 text-sm">
<i class="fas fa-arrow-left mr-2"></i>Back to TV Shows List
</a>
</div>
<x-admin.page-header :title="$title" icon="fas fa-tv">
<x-slot:actions>
<x-admin.button :href="url('admin/show-list')" tone="gray" icon="fas fa-arrow-left">Back to TV Shows List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Flash Messages -->
@if(session('success'))
@@ -162,4 +157,3 @@
</x-admin.card>
</div>
@endsection
+5 -12
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-edit mr-2"></i>{{ $title }}
</h1>
<a href="{{ route('admin.show-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-edit">
<x-slot:actions>
<x-admin.button :href="route('admin.show-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Edit Form -->
<div class="p-6">
@@ -225,4 +219,3 @@
</x-admin.card>
</div>
@endsection
+8 -17
View File
@@ -3,23 +3,14 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-tv mr-2"></i>{{ $title }}
</h1>
<div class="flex items-center gap-4">
<div class="text-sm text-gray-600 dark:text-gray-400">
Total: {{ $tvshowlist->total() }} shows
</div>
<a href="{{ route('admin.show-add') }}"
class="px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 text-sm">
<i class="fas fa-plus mr-2"></i>Add TV Show
</a>
</div>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-tv">
<x-slot:actions>
<span class="inline-flex min-h-11 items-center rounded-xl border border-gray-200 bg-white/70 px-4 text-sm font-medium text-gray-700 dark:border-gray-600 dark:bg-gray-800/70 dark:text-gray-200">
{{ number_format($tvshowlist->total()) }} shows
</span>
<x-admin.button :href="route('admin.show-add')" tone="success" icon="fas fa-plus">Add TV Show</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Search Form -->
<div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700">
+5 -12
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-unlink mr-2"></i>{{ $title }}
</h1>
<a href="{{ route('admin.show-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to List
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-unlink">
<x-slot:actions>
<x-admin.button :href="route('admin.show-list')" tone="gray" icon="fas fa-arrow-left">Back to List</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Content -->
<div class="p-6">
@@ -114,4 +108,3 @@
</x-admin.card>
</div>
@endsection
+1 -6
View File
@@ -4,12 +4,7 @@
<div class="space-y-6" x-data="tinyMceEditor">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-cog mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-cog" />
<!-- Error Messages -->
@if(!empty($error))
+1 -13
View File
@@ -2,18 +2,7 @@
@section('content')
<div class="space-y-6">
<!-- Header -->
<div class="mb-8">
<div class="flex items-center space-x-3">
<div class="flex items-center justify-center w-12 h-12 bg-linear-to-br from-blue-400 to-purple-500 rounded-xl shadow-md">
<i class="fas fa-chart-bar text-white text-xl"></i>
</div>
<div>
<h1 class="text-3xl font-bold text-gray-700 dark:text-white">{{ $title }}</h1>
<p class="text-sm text-gray-600 dark:text-gray-400 mt-1">Overview of your site's performance and activity</p>
</div>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-chart-bar" subtitle="Overview of your site's performance and activity" />
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<!-- Top Grabbers -->
@@ -159,4 +148,3 @@
@endif
</div>
@endsection
@@ -1,11 +1,6 @@
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<h1 class="text-2xl font-semibold text-gray-800">
<i class="fas fa-terminal mr-2"></i>{{ $title }}
</h1>
</div>
<x-admin.page-header :title="$title" icon="fas fa-terminal" />
<!-- Success Message -->
@if(session('success'))
@@ -3,14 +3,7 @@
@section('content')
<div class="space-y-6">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-history mr-2"></i>{{ $title }}
</h1>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-history" />
<!-- Search Filters -->
<div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700">
@@ -184,4 +177,3 @@
</div>
</div>
@endsection
@@ -3,22 +3,12 @@
@section('content')
<div class="space-y-6">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-history mr-2"></i>{{ $title }}
</h1>
<div class="flex gap-2">
<a href="{{ url('admin/user-edit?id=' . $user->id) }}" class="px-4 py-2 bg-blue-600 dark:bg-blue-700 text-white rounded-lg hover:bg-blue-700 dark:hover:bg-blue-800">
<i class="fas fa-edit mr-2"></i>Edit User
</a>
<a href="{{ url('admin/user-role-history') }}" class="px-4 py-2 bg-gray-600 dark:bg-gray-700 text-white rounded-lg hover:bg-gray-700 dark:hover:bg-gray-800">
<i class="fas fa-arrow-left mr-2"></i>Back to All
</a>
</div>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-history">
<x-slot:actions>
<x-admin.button :href="url('admin/user-edit?id='.$user->id)" icon="fas fa-edit">Edit User</x-admin.button>
<x-admin.button :href="url('admin/user-role-history')" tone="gray" icon="fas fa-arrow-left">Back to All</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- User Info -->
<div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700">
@@ -170,4 +160,3 @@
</div>
</div>
@endsection
+5 -12
View File
@@ -3,17 +3,11 @@
@section('content')
<div class="space-y-6" x-data="adminDeletedUsers">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-100">
<i class="fas fa-trash-restore mr-2"></i>{{ $title }}
</h1>
<a href="{{ url('admin/user-list') }}" class="px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700">
<i class="fas fa-arrow-left mr-2"></i>Back to Active Users
</a>
</div>
</div>
<x-admin.page-header :title="$title" icon="fas fa-trash-restore">
<x-slot:actions>
<x-admin.button :href="url('admin/user-list')" tone="gray" icon="fas fa-arrow-left">Back to Active Users</x-admin.button>
</x-slot:actions>
</x-admin.page-header>
<!-- Search Filters -->
<div class="px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700">
@@ -266,4 +260,3 @@
@csrf
</form>
@endsection
+5 -12
View File
@@ -3,19 +3,13 @@
@section('content')
<div class="space-y-6">
<x-admin.card>
<!-- Header -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-user mr-2"></i>{{ $title }}
</h1>
<x-admin.page-header :title="$title" icon="fas fa-user">
<x-slot:actions>
@if(!empty($user['id']))
<a href="{{ url('admin/user-role-history/' . $user['id']) }}" class="px-4 py-2 bg-purple-600 dark:bg-purple-700 text-white rounded-lg hover:bg-purple-700 dark:hover:bg-purple-800">
<i class="fas fa-history mr-2"></i>View Role History
</a>
<x-admin.button :href="url('admin/user-role-history/'.$user['id'])" tone="gray" icon="fas fa-history">View Role History</x-admin.button>
@endif
</div>
</div>
</x-slot:actions>
</x-admin.page-header>
<!-- Error Messages -->
@if(!empty($error))
@@ -173,4 +167,3 @@
</div>
</x-admin.card>
@endsection
+1 -5
View File
@@ -1,11 +1,7 @@
@extends('layouts.main')
@section('content')
<div class="surface-panel rounded-xl shadow-sm mb-6">
<div class="surface-panel-alt px-6 py-4 border-b rounded-t-lg">
<h3 class="text-2xl font-bold text-gray-900 dark:text-gray-100 flex items-center">
<i class="fa fa-code mr-2 text-primary-600 dark:text-primary-400"></i>{{ $title }}
</h3>
</div>
<x-page-header :title="$title" eyebrow="Developer resources" description="Integrate with the index using the Newznab-compatible XML API and authenticated download endpoints." icon="fas fa-code" />
<div class="p-6">
<p class="text-lg text-gray-700 dark:text-gray-300 mb-6 dark:text-gray-300">
Here lives the documentation for the API for accessing NZB and index data. API functions require your API key
+1 -5
View File
@@ -2,11 +2,7 @@
@section('content')
<div class="surface-panel rounded-xl shadow-sm mb-6">
<div class="surface-panel-alt px-6 py-4 border-b rounded-t-lg">
<h3 class="text-2xl font-bold text-gray-900 dark:text-gray-100 flex items-center">
<i class="fa fa-code mr-2 text-primary-600 dark:text-primary-400"></i>{{ $title }}
</h3>
</div>
<x-page-header :title="$title" eyebrow="Developer resources" description="Build JSON integrations with the versioned API, authenticated search, and capability endpoints." icon="fas fa-code-branch" />
<div class="p-6">
<p class="text-lg text-gray-700 dark:text-gray-300 mb-6 dark:text-gray-300">
Here lives the documentation for the API v2 for accessing NZB and index data. API functions can be called by providing an API token.
+6 -14
View File
@@ -2,20 +2,12 @@
@section('content')
<div class="surface-panel rounded-xl shadow-sm">
<!-- Breadcrumb -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<nav aria-label="breadcrumb">
<ol class="flex items-center space-x-2 text-sm text-gray-600">
<li><a href="{{ url($site['home_link'] ?? '/') }}" class="hover:text-blue-600">Home</a></li>
<li><i class="fas fa-chevron-right text-xs mx-2"></i></li>
<li><a href="{{ url('/browse/Books') }}" class="hover:text-blue-600">Books</a></li>
@if(!empty($categorytitle) && $categorytitle !== 'All')
<li><i class="fas fa-chevron-right text-xs mx-2"></i></li>
<li class="text-gray-500">{{ $categorytitle }}</li>
@endif
</ol>
</nav>
</div>
<x-page-header title="Books" :current="!empty($categorytitle) ? $categorytitle : 'All books'" eyebrow="Discover and download" description="Browse books, compare releases, and narrow the library by author, title, or category." icon="fas fa-book-open">
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-book" aria-hidden="true"></i>{{ number_format($results->total()) }} books</span>
<span class="workspace-hero__stat"><i class="fas fa-folder-open" aria-hidden="true"></i>{{ $categorytitle ?: 'All books' }}</span>
</x-slot:stats>
</x-page-header>
<div class="px-6 py-4">
<!-- Search Filters -->
+12 -14
View File
@@ -7,21 +7,19 @@
@section('content')
<div class="surface-panel rounded-xl shadow-sm transition-colors duration-200">
@php
$crumbs = [['label' => 'Home', 'url' => url($site['home_link'] ?? '/'), 'icon' => 'fas fa-home']];
$currentCategoryLabel = isset($catname) && is_string($catname) && strtolower($catname) === 'all'
? 'All'
: ($catname ?? 'All');
if (isset($parentcat) && $parentcat != '') {
$crumbs[] = ['label' => $parentcat, 'url' => url('/browse/' . ($parentcat == 'music' ? 'Audio' : $parentcat))];
if (isset($catname) && $catname != '' && $catname != 'all') {
$crumbs[] = ['label' => $catname];
}
} else {
$crumbs[] = ['label' => 'Browse', 'url' => route('All')];
$crumbs[] = ['label' => $currentCategoryLabel];
}
$currentCategoryLabel = match (true) {
is_object($catname ?? null) => $catname->title ?? 'All',
is_string($catname ?? null) && strtolower($catname) !== 'all' => $catname,
default => 'All',
};
$browseTitle = !empty($parentcat) && $parentcat !== 'All' ? $parentcat : 'Browse releases';
@endphp
<x-breadcrumb :items="$crumbs" />
<x-page-header :title="$browseTitle" :current="$currentCategoryLabel" eyebrow="Discover and download" description="Browse the latest indexed releases, refine the list, and send selections to your download basket." icon="fas fa-compass">
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-layer-group" aria-hidden="true"></i>{{ number_format($results->total()) }} releases</span>
<span class="workspace-hero__stat"><i class="fas fa-folder-open" aria-hidden="true"></i>{{ $currentCategoryLabel }}</span>
</x-slot:stats>
</x-page-header>
@if($results->count() > 0)
@php
+8 -21
View File
@@ -1,23 +1,11 @@
<!-- Breadcrumb -->
<div class="mb-6">
<nav aria-label="breadcrumb">
<ol class="flex items-center space-x-2 text-sm">
<li>
<a href="{{ url($site['home_link']) }}" class="text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:text-blue-400 transition-colors">
Home
</a>
</li>
<li class="text-gray-400">/</li>
<li>
<a href="{{ url('/browse') }}" class="text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:text-blue-400 transition-colors">
Browse
</a>
</li>
<li class="text-gray-400">/</li>
<li class="text-gray-900 dark:text-gray-100 font-medium">Groups</li>
</ol>
</nav>
</div>
<x-page-header title="Browse groups" eyebrow="Explore Usenet" description="Search indexed groups and jump directly into their available releases." icon="fas fa-layer-group">
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-list" aria-hidden="true"></i>{{ isset($results) ? number_format($results->total()) : 0 }} groups</span>
@if(!empty($search))
<span class="workspace-hero__stat"><i class="fas fa-filter" aria-hidden="true"></i>Filtered by {{ $search }}</span>
@endif
</x-slot:stats>
</x-page-header>
{!! $site['adbrowse'] ?? '' !!}
@@ -138,4 +126,3 @@
</div>
</div>
@endif
+5 -10
View File
@@ -2,16 +2,11 @@
@section('content')
<div class="surface-panel rounded-xl shadow-sm">
<!-- Breadcrumb -->
<div class="surface-panel-alt px-6 py-4 border-b">
<nav aria-label="breadcrumb">
<ol class="flex items-center space-x-2 text-sm text-gray-600 dark:text-gray-400">
<li><a href="{{ url($site['home_link'] ?? '/') }}" class="hover:text-primary-600 dark:hover:text-primary-400">Home</a></li>
<li><i class="fas fa-chevron-right text-xs mx-2"></i></li>
<li class="text-gray-500 dark:text-gray-400">Download Basket</li>
</ol>
</nav>
</div>
<x-page-header title="Download basket" eyebrow="Your saved releases" description="Review saved NZBs, download selected releases, or use the private RSS feed with your downloader." icon="fas fa-basket-shopping">
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-box-archive" aria-hidden="true"></i>{{ number_format(count($results)) }} saved</span>
</x-slot:stats>
</x-page-header>
<div class="px-6 py-4">
@@ -1,5 +1,5 @@
{{-- Dense action/filter bar for admin list pages --}}
<div {{ $attributes->merge(['class' => 'px-4 sm:px-6 py-3 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700']) }}>
<div {{ $attributes->merge(['class' => 'surface-panel-alt border-b px-4 py-3 sm:px-6']) }}>
<div class="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
{{ $slot }}
</div>
@@ -15,7 +15,7 @@
'warning' => 'bg-yellow-600 text-white hover:bg-yellow-700 focus:ring-yellow-500',
][$tone] ?? 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500';
$base = 'inline-flex min-h-9 items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-900 '.$classes;
$base = 'inline-flex min-h-11 items-center justify-center gap-2 rounded-xl px-4 py-2.5 text-sm font-semibold shadow-sm transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900 '.$classes;
@endphp
@if($href)
@@ -5,11 +5,11 @@
'striped' => false,
])
<div class="admin-data-table-wrap overflow-x-auto overscroll-x-contain">
<div class="admin-data-table-wrap overflow-x-auto overscroll-x-contain rounded-xl border shadow-sm">
<table {{ $attributes->merge(['class' => 'min-w-full table-auto divide-y divide-gray-200 dark:divide-gray-700']) }}>
@if(isset($head))
<thead @class([
'bg-gray-50 dark:bg-gray-900',
'admin-data-table__head',
'sticky top-0 z-10' => $sticky,
])>
<tr>
@@ -4,9 +4,9 @@
'message' => null,
])
<div {{ $attributes->merge(['class' => 'px-6 py-12 text-center']) }}>
<i class="{{ $icon }} mb-4 text-4xl text-gray-400 dark:text-gray-600" aria-hidden="true"></i>
<h3 class="text-base font-semibold text-gray-900 dark:text-gray-100">{{ $title }}</h3>
<div {{ $attributes->merge(['class' => 'empty-state px-6 py-14 text-center']) }}>
<span class="empty-state__icon mb-5 inline-flex h-16 w-16 items-center justify-center rounded-2xl" aria-hidden="true"><i class="{{ $icon }} text-2xl"></i></span>
<h3 class="text-lg font-semibold tracking-tight text-gray-900 dark:text-gray-100">{{ $title }}</h3>
@if($message)
<p class="mt-2 text-sm text-gray-500 dark:text-gray-400">{{ $message }}</p>
@endif
@@ -1,4 +1,4 @@
{{-- Compact filter panel for admin list pages --}}
<div {{ $attributes->merge(['class' => 'px-4 sm:px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700']) }}>
<div {{ $attributes->merge(['class' => 'surface-panel-alt border-b px-4 py-4 sm:px-6']) }}>
{{ $slot }}
</div>
@@ -1,12 +1,13 @@
{{-- Admin blue info alert box --}}
<div class="px-6 py-4 bg-blue-50 dark:bg-blue-900/20 border-b border-blue-100 dark:border-blue-800">
<div class="border-b border-blue-100 bg-blue-50/80 px-6 py-4 dark:border-blue-800 dark:bg-blue-900/20" role="note">
<div class="flex">
<div class="shrink-0">
<i class="fas fa-info-circle text-blue-500 dark:text-blue-400 text-xl mr-3"></i>
<span class="inline-flex h-9 w-9 items-center justify-center rounded-xl bg-blue-100 text-blue-600 dark:bg-blue-900/60 dark:text-blue-300">
<i class="fas fa-info-circle" aria-hidden="true"></i>
</span>
</div>
<div class="text-sm text-blue-700 dark:text-blue-300">
<div class="ml-3 self-center text-sm leading-6 text-blue-800 dark:text-blue-200">
{{ $slot }}
</div>
</div>
</div>
@@ -5,7 +5,7 @@
'subtitle' => null,
])
<div {{ $attributes->merge(['class' => 'admin-page-header px-4 py-5 sm:px-6']) }}>
<header {{ $attributes->merge(['class' => 'admin-page-header workspace-page-header overflow-hidden rounded-2xl px-5 py-6 shadow-sm sm:px-7']) }}>
<div class="flex flex-wrap items-start justify-between gap-4">
<div class="min-w-0">
<h1 class="flex items-center gap-3 text-2xl font-semibold tracking-tight text-gray-950 dark:text-white">
@@ -26,4 +26,4 @@
</div>
@endif
</div>
</div>
</header>
@@ -10,8 +10,7 @@
? 'border-b border-gray-200 dark:border-gray-700'
: 'border-t border-gray-200 dark:border-gray-700';
@endphp
<div class="px-6 py-4 {{ $borderClass }} bg-gray-50 dark:bg-gray-900">
<nav class="surface-panel-alt px-6 py-4 {{ $borderClass }}" aria-label="Pagination">
{{ $paginator->onEachSide(5)->links() }}
</div>
</nav>
@endif
@@ -1,5 +1,4 @@
{{-- Admin search/filter bar container --}}
<div {{ $attributes->merge(['class' => 'px-6 py-4 bg-gray-50 dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700']) }}>
<div {{ $attributes->merge(['class' => 'surface-panel-alt border-b px-4 py-4 sm:px-6']) }}>
{{ $slot }}
</div>
@@ -13,6 +13,6 @@
$widthClass = $width ? "w-{$width}" : '';
@endphp
<th {{ $attributes->merge(['class' => "px-4 py-2.5 {$alignClass} text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide {$widthClass}"]) }}>
<th {{ $attributes->merge(['class' => "px-4 py-3 {$alignClass} text-xs font-semibold text-gray-600 dark:text-gray-300 uppercase tracking-wider {$widthClass}"]) }}>
{{ $slot }}
</th>
@@ -2,9 +2,9 @@
'items' => []
])
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<div class="breadcrumb-bar border-b border-gray-200 px-5 py-3.5 dark:border-gray-700 sm:px-6">
<nav class="flex" aria-label="Breadcrumb">
<ol class="inline-flex items-center space-x-1 md:space-x-2 text-sm">
<ol class="inline-flex flex-wrap items-center gap-1.5 text-sm">
@foreach($items as $index => $item)
@if($index > 0)
<li aria-hidden="true">
@@ -15,14 +15,14 @@
@if(!empty($item['url']))
<a href="{{ $item['url'] }}" class="text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400 inline-flex items-center transition">
@if(!empty($item['icon']))
<i class="{{ $item['icon'] }} mr-1.5"></i>
<i class="{{ $item['icon'] }} mr-1.5" aria-hidden="true"></i>
@endif
{{ $item['label'] }}
</a>
@else
<span class="text-gray-500 dark:text-gray-400 inline-flex items-center">
@if(!empty($item['icon']))
<i class="{{ $item['icon'] }} mr-1.5"></i>
<i class="{{ $item['icon'] }} mr-1.5" aria-hidden="true"></i>
@endif
{{ $item['label'] }}
</span>
@@ -32,4 +32,3 @@
</ol>
</nav>
</div>
@@ -1,4 +1,4 @@
@blaze(fold: true)
<div class="flex items-center [&_a:first-child]:rounded-r-none [&_a:last-child]:rounded-l-none" role="group">
<div class="inline-flex items-center overflow-hidden rounded-xl border border-gray-200 shadow-sm dark:border-gray-700 [&_a]:rounded-none [&_button]:rounded-none" role="group">
{{ $slot }}
</div>
@@ -6,13 +6,13 @@
])
@php
$base = 'inline-flex items-center justify-center gap-2 rounded-lg border font-semibold transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900';
$base = 'inline-flex items-center justify-center gap-2 rounded-xl border font-semibold shadow-sm transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900';
$sizes = [
'sm' => 'px-3 py-1.5 text-xs',
'md' => 'px-4 py-2 text-sm',
'lg' => 'px-6 py-3 text-base',
'icon' => 'h-9 w-9 p-0 text-sm',
'sm' => 'min-h-9 px-3 py-1.5 text-xs',
'md' => 'min-h-11 px-4 py-2 text-sm',
'lg' => 'min-h-12 px-6 py-3 text-base',
'icon' => 'h-11 w-11 p-0 text-sm',
];
$variants = [
+5 -5
View File
@@ -7,13 +7,13 @@
])
@php
$base = 'inline-flex items-center justify-center gap-2 rounded-lg border font-semibold transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900 disabled:cursor-not-allowed disabled:opacity-60';
$base = 'inline-flex items-center justify-center gap-2 rounded-xl border font-semibold shadow-sm transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900 disabled:cursor-not-allowed disabled:opacity-60';
$sizes = [
'sm' => 'px-3 py-1.5 text-xs',
'md' => 'px-4 py-2 text-sm',
'lg' => 'px-6 py-3 text-base',
'icon' => 'h-9 w-9 p-0 text-sm',
'sm' => 'min-h-9 px-3 py-1.5 text-xs',
'md' => 'min-h-11 px-4 py-2 text-sm',
'lg' => 'min-h-12 px-6 py-3 text-base',
'icon' => 'h-11 w-11 p-0 text-sm',
];
$variants = [
@@ -20,9 +20,9 @@
@endphp
@if(!empty($displayReleases))
<div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-700">
<h4 class="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
Available Releases
<div class="mt-4 border-t border-gray-200 pt-4 dark:border-gray-700">
<h4 class="mb-2 text-sm font-semibold text-gray-800 dark:text-gray-200">
<i class="fas fa-box-open mr-1.5 text-primary-500" aria-hidden="true"></i>Available releases
@if($totalReleaseCount > $maxReleases)
<span class="text-xs font-normal text-gray-500">(Showing {{ $maxReleases }} of {{ $totalReleaseCount }})</span>
@endif
@@ -30,14 +30,14 @@
<div class="space-y-2">
@foreach($displayReleases as $release)
@if(!empty($release->searchname))
<div class="surface-panel-alt rounded-lg p-2 border">
<div class="catalog-release-row surface-panel-alt rounded-xl border p-3">
<div class="space-y-2">
<div class="{{ $shouldShowCheckbox ? 'flex items-start justify-between gap-2' : '' }}">
<a href="{{ url('/details/' . $release->guid) }}" class="text-sm text-gray-800 dark:text-gray-200 hover:text-primary-600 dark:hover:text-primary-400 font-medium block break-all {{ $shouldShowCheckbox ? 'flex-1' : '' }}" title="{{ $release->searchname }}">
{{ $release->searchname }}
</a>
@if($shouldShowCheckbox)
<label class="inline-flex items-center shrink-0">
<label class="inline-flex shrink-0 items-center" aria-label="Select {{ $release->searchname }}">
<input type="checkbox" class="chkRelease form-checkbox h-4 w-4 text-primary-600" value="{{ $release->guid }}" name="release[]" @change="onCheckboxChange()">
</label>
@endif
@@ -46,12 +46,12 @@
<div class="flex flex-wrap items-center gap-1.5">
@if(isset($release->size))
<span class="release-chip">
<i class="fas fa-hdd mr-1"></i>{{ number_format($release->size / 1073741824, 2) }} GB
<i class="fas fa-hard-drive mr-1" aria-hidden="true"></i>{{ number_format($release->size / 1073741824, 2) }} GB
</span>
@endif
@if(isset($release->postdate))
<span class="release-chip">
<i class="fas fa-calendar-alt mr-1"></i>{{ date('M d, Y H:i', strtotime($release->postdate)) }}
<i class="fas fa-calendar-days mr-1" aria-hidden="true"></i>{{ date('M d, Y H:i', strtotime($release->postdate)) }}
</span>
@endif
@if($shouldShowAddDate && isset($release->adddate))
@@ -14,10 +14,10 @@
$totalResults = is_object($results) && method_exists($results, 'total') ? $results->total() : count($results);
@endphp
<div class="mb-4 flex flex-wrap justify-between items-center gap-4">
<div class="flex items-center gap-4">
<h2 class="text-xl font-semibold text-gray-800 dark:text-gray-200">
<i class="{{ $icon }} mr-2 text-blue-600 dark:text-blue-400"></i>
<div class="catalog-results-toolbar mb-4 flex flex-col gap-4 rounded-2xl border border-gray-200 bg-white px-4 py-3 shadow-sm dark:border-gray-700 dark:bg-gray-800 lg:flex-row lg:items-center lg:justify-between sm:px-5">
<div class="flex flex-wrap items-center gap-4">
<h2 class="text-xl font-semibold tracking-tight text-gray-900 dark:text-gray-100">
<i class="{{ $icon }} mr-2 text-primary-600 dark:text-primary-400" aria-hidden="true"></i>
{{ $title }}
</h2>
<x-view-toggle
@@ -28,10 +28,10 @@
:shows="false"
/>
</div>
<div class="flex items-center gap-4">
<div class="flex flex-col gap-3 sm:flex-row sm:items-center">
<x-inline-search :placeholder="$searchPlaceholder" :category="$searchCategory" />
<span class="text-sm text-gray-600 dark:text-gray-400">
{{ $totalResults }} {{ $totalLabel }}
<span class="font-semibold text-gray-800 dark:text-gray-200">{{ number_format($totalResults) }}</span> {{ $totalLabel }}
</span>
</div>
</div>
@@ -7,19 +7,18 @@
'actionIcon' => null,
])
<div class="px-6 py-12 text-center">
<div class="inline-flex items-center justify-center w-20 h-20 bg-gray-100 dark:bg-gray-700 rounded-full mb-6">
<i class="{{ $icon }} text-gray-400 dark:text-gray-500 text-4xl"></i>
<div class="empty-state px-6 py-14 text-center">
<div class="empty-state__icon mb-6 inline-flex h-20 w-20 items-center justify-center rounded-2xl">
<i class="{{ $icon }} text-3xl" aria-hidden="true"></i>
</div>
<h3 class="text-xl font-semibold text-gray-700 dark:text-gray-300 mb-2">{{ $title }}</h3>
<p class="text-gray-500 dark:text-gray-400 max-w-md mx-auto mb-4">{{ $message }}</p>
<h3 class="mb-2 text-xl font-semibold tracking-tight text-gray-900 dark:text-gray-100">{{ $title }}</h3>
<p class="mx-auto mb-5 max-w-md text-sm leading-6 text-gray-500 dark:text-gray-400">{{ $message }}</p>
@if($actionUrl && $actionLabel)
<a href="{{ $actionUrl }}" class="inline-flex items-center px-4 py-2 bg-primary-600 dark:bg-primary-700 text-white rounded-lg hover:bg-primary-700 dark:hover:bg-primary-800 transition shadow-sm">
<a href="{{ $actionUrl }}" class="inline-flex min-h-11 items-center gap-2 rounded-xl bg-primary-600 px-5 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:bg-primary-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:bg-primary-700 dark:hover:bg-primary-600">
@if($actionIcon)
<i class="{{ $actionIcon }} mr-2"></i>
<i class="{{ $actionIcon }}" aria-hidden="true"></i>
@endif
{{ $actionLabel }}
</a>
@endif
</div>
@@ -1,7 +1,7 @@
@blaze
@props(['label', 'for', 'help' => null])
<div class="space-y-1">
<div class="space-y-2">
@if($label)
<x-label :for="$for" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
{{ $label }}
@@ -11,7 +11,6 @@
{{ $slot }}
@if($help)
<small class="text-gray-600 dark:text-gray-400 text-xs">{{ $help }}</small>
<small class="block text-xs leading-5 text-gray-600 dark:text-gray-400">{{ $help }}</small>
@endif
</div>
@@ -11,21 +11,22 @@
}
@endphp
<div class="inline-search-widget flex items-center gap-2" data-base-url="{{ $baseUrl }}">
<div class="relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-search text-gray-400 dark:text-gray-500 text-sm"></i>
<div class="inline-search-widget min-w-0" data-base-url="{{ $baseUrl }}">
<div class="inline-search-widget__field relative min-w-0">
<div class="inline-search-widget__icon pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
<i class="fas fa-search text-sm text-gray-400 dark:text-gray-500" aria-hidden="true"></i>
</div>
<input type="text"
data-role="inline-search-input"
placeholder="{{ $placeholder }}"
class="w-48 lg:w-56 pl-9 pr-3 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-primary-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 transition"
class="inline-search-widget__input min-h-10 w-full rounded-xl border border-gray-300 bg-white py-2 pl-10 pr-3 text-sm text-gray-900 shadow-sm transition placeholder-gray-400 focus:border-primary-500 focus:ring-2 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500"
aria-label="{{ $placeholder }}"
autocomplete="off">
</div>
<button type="button"
data-role="inline-search-btn"
class="px-3 py-1.5 bg-primary-600 dark:bg-primary-700 text-white rounded-lg hover:bg-primary-700 dark:hover:bg-primary-800 transition text-sm">
<i class="fas fa-search"></i>
class="inline-search-widget__button inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-primary-600 text-sm text-white shadow-sm transition hover:bg-primary-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:bg-primary-700 dark:hover:bg-primary-600"
aria-label="Search">
<i class="fas fa-search" aria-hidden="true"></i>
</button>
</div>
+1 -1
View File
@@ -1,2 +1,2 @@
@blaze(fold: true)
<input {{ $attributes->merge(['type' => 'text', 'class' => 'w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-gray-900 shadow-sm transition placeholder:text-gray-400 focus:border-primary-500 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder:text-gray-500']) }}>
<input {{ $attributes->merge(['type' => 'text', 'class' => 'min-h-11 w-full rounded-xl border border-gray-300 bg-white px-3.5 py-2.5 text-gray-900 shadow-sm transition placeholder:text-gray-400 focus:border-primary-500 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder:text-gray-500']) }}>
+1 -1
View File
@@ -1,4 +1,4 @@
@blaze(fold: true)
<label {{ $attributes->merge(['class' => 'mb-1 block w-full text-sm font-medium text-gray-700 dark:text-gray-300']) }}>
<label {{ $attributes->merge(['class' => 'mb-1.5 block w-full text-sm font-semibold text-gray-700 dark:text-gray-300']) }}>
{{ $slot }}
</label>
@@ -2,26 +2,56 @@
'title',
'description' => null,
'icon' => null,
'eyebrow' => 'Explore',
'current' => null,
])
<div {{ $attributes->merge(['class' => 'app-page-header px-4 py-5 sm:px-6 sm:py-6']) }}>
<div class="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
<div class="min-w-0">
<h1 class="flex items-center gap-3 text-2xl font-semibold tracking-tight text-gray-950 dark:text-white sm:text-3xl">
<header {{ $attributes->merge(['class' => 'app-page-header workspace-hero relative mb-6 overflow-hidden rounded-2xl px-5 py-4 text-white shadow-lg sm:px-7 sm:py-5']) }}>
<div class="workspace-hero__glow workspace-hero__glow--one" aria-hidden="true"></div>
<div class="workspace-hero__glow workspace-hero__glow--two" aria-hidden="true"></div>
<div class="relative z-10 flex flex-col gap-4 xl:flex-row xl:items-end xl:justify-between">
<div class="min-w-0 max-w-3xl xl:flex-1">
<nav aria-label="Breadcrumb" class="mb-2 text-sm text-white/70">
<ol class="flex flex-wrap items-center gap-2">
<li><a href="{{ url('/') }}" class="rounded hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/70">Home</a></li>
<li aria-hidden="true"><i class="fas fa-chevron-right text-[0.65rem]"></i></li>
<li aria-current="page" class="font-medium text-white">{{ $current ?? $title }}</li>
</ol>
</nav>
<div class="flex items-center gap-3">
@if($icon)
<i class="{{ $icon }} text-primary-600 dark:text-primary-400" aria-hidden="true"></i>
<span class="workspace-hero__icon" aria-hidden="true"><i class="{{ $icon }}"></i></span>
@endif
<span class="break-words">{{ $title }}</span>
</h1>
<div>
@if($eyebrow)
<p class="mb-1 text-xs font-semibold uppercase tracking-[0.18em] text-white/65">{{ $eyebrow }}</p>
@endif
<h1 class="break-words text-3xl font-bold tracking-tight text-white sm:text-4xl">{{ $title }}</h1>
</div>
</div>
@if($description)
<p class="mt-2 text-sm text-gray-600 dark:text-gray-400 sm:text-base">{{ $description }}</p>
<p class="mt-2 max-w-2xl text-sm leading-5 text-white/75 sm:text-base">{{ $description }}</p>
@endif
</div>
@isset($actions)
<div class="app-page-header__actions flex shrink-0 flex-wrap items-center gap-2">
{{ $actions }}
@if(isset($stats) || isset($actions))
<div class="app-page-header__meta flex min-w-0 flex-wrap items-center gap-3 xl:max-w-[48%] xl:justify-end">
@isset($stats)
<div class="flex flex-wrap gap-2 text-sm xl:justify-end">
{{ $stats }}
</div>
@endisset
@isset($actions)
<div class="app-page-header__actions flex flex-wrap items-center gap-3">
{{ $actions }}
</div>
@endisset
</div>
@endisset
@endif
</div>
</div>
</header>
+1 -1
View File
@@ -18,6 +18,6 @@
];
@endphp
<div {{ $attributes->merge(['class' => 'rounded-xl '.($surfaces[$variant] ?? $surfaces['default']).' '.($paddings[$padding] ?? $paddings['md'])]) }}>
<div {{ $attributes->merge(['class' => 'rounded-2xl '.($surfaces[$variant] ?? $surfaces['default']).' '.($paddings[$padding] ?? $paddings['md'])]) }}>
{{ $slot }}
</div>
@@ -0,0 +1,40 @@
@props([
'categoryName' => null,
'parentCategory' => null,
'subCategory' => null,
])
@php
$categoryLabel = trim((string) ($categoryName ?: 'Other'));
$resolvedParentCategory = trim((string) ($parentCategory ?? ''));
$resolvedSubCategory = trim((string) ($subCategory ?? ''));
if ($resolvedParentCategory === '' || $resolvedSubCategory === '') {
$categoryParts = preg_split('/\s*>\s*/u', $categoryLabel, 2);
if (is_array($categoryParts) && count($categoryParts) === 2) {
$resolvedParentCategory = trim($categoryParts[0]);
$resolvedSubCategory = trim($categoryParts[1]);
}
}
$categoryUrl = $resolvedParentCategory !== '' && $resolvedSubCategory !== ''
? route('browse', [
'parentCategory' => $resolvedParentCategory,
'id' => $resolvedSubCategory,
])
: null;
$categoryClasses = 'inline-flex items-center rounded-full bg-primary-100 px-2.5 py-0.5 text-xs font-medium text-primary-800 transition dark:bg-primary-900/50 dark:text-primary-200';
@endphp
@if($categoryUrl !== null)
<a href="{{ $categoryUrl }}"
class="{{ $categoryClasses }} hover:bg-primary-200 hover:text-primary-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:hover:bg-primary-800 dark:hover:text-white"
title="Browse releases in {{ $categoryLabel }}"
aria-label="Browse releases in {{ $categoryLabel }}">
{{ $categoryLabel }}
</a>
@else
<span class="{{ $categoryClasses }}">{{ $categoryLabel }}</span>
@endif
@@ -135,9 +135,11 @@
</div>
</td>
<td class="px-3 py-4 whitespace-nowrap">
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-primary-100 dark:bg-primary-900/50 text-primary-800 dark:text-primary-200">
{{ $result->category_name ?? 'Other' }}
</span>
<x-release-category-link
:category-name="$result->category_name ?? null"
:parent-category="$result->parent_category ?? null"
:sub-category="$result->sub_category ?? null"
/>
</td>
<td class="px-3 py-4 whitespace-nowrap text-sm text-gray-600 dark:text-gray-400">
{{ $dateValue ? userDateDiffForHumans($dateValue) : 'Unknown' }}
@@ -238,9 +240,11 @@
@endif
</div>
<div class="flex flex-wrap items-center gap-2 mt-2 text-sm text-gray-600 dark:text-gray-400">
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-primary-100 dark:bg-primary-900/50 text-primary-800 dark:text-primary-200">
{{ $result->category_name ?? 'Other' }}
</span>
<x-release-category-link
:category-name="$result->category_name ?? null"
:parent-category="$result->parent_category ?? null"
:sub-category="$result->sub_category ?? null"
/>
<span><i class="fas fa-clock mr-1"></i>{{ $dateValue ? userDateDiffForHumans($dateValue) : 'Unknown' }}</span>
<span><i class="fas fa-hdd mr-1"></i>{{ $sizeLabel }}</span>
<span><i class="fas fa-file mr-1"></i>{{ $result->totalpart ?? 0 }} files</span>
@@ -23,10 +23,11 @@
@endphp
<form method="GET" action="{{ route('search') }}" class="relative" id="{{ $formId }}" data-autocomplete-form>
<div class="flex items-center">
<div class="flex items-stretch rounded-xl shadow-sm">
@if($categorySelect && !empty($categories))
<select name="t"
class="bg-gray-700 text-white {{ $sizeClasses }} rounded-l border-r border-gray-600 focus:outline-none focus:ring-2 focus:ring-primary-500">
aria-label="Search category"
class="min-h-11 border border-r-0 border-gray-300 bg-gray-50 text-gray-800 {{ $sizeClasses }} rounded-l-xl focus:outline-none focus:ring-2 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-white">
<option value="-1">All</option>
@foreach($categories as $category)
@php
@@ -60,20 +61,21 @@
data-autocomplete-input="{{ $inputId }}-dropdown"
data-autocomplete-form="{{ $formId }}"
class="w-full bg-white dark:bg-gray-700 text-gray-900 dark:text-white {{ $sizeClasses }}
{{ $categorySelect ? '' : 'rounded-l' }}
{{ $submitButton ? '' : 'rounded-r' }}
{{ $categorySelect ? '' : 'rounded-l-xl' }}
{{ $submitButton ? '' : 'rounded-r-xl' }}
border border-gray-300 dark:border-gray-600 focus:outline-none focus:ring-2 focus:ring-primary-500">
<!-- Autocomplete Dropdown -->
<div id="{{ $inputId }}-dropdown"
class="hidden absolute z-50 w-full mt-1 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto">
class="absolute z-50 mt-2 hidden max-h-60 w-full overflow-y-auto rounded-xl border border-gray-300 bg-white shadow-xl dark:border-gray-600 dark:bg-gray-800">
</div>
</div>
@if($submitButton)
<button type="submit"
class="bg-primary-600 dark:bg-primary-700 hover:bg-primary-700 dark:hover:bg-primary-800 text-white {{ $sizeClasses }} rounded-r transition font-medium">
<i class="fas fa-search"></i>
aria-label="Search releases"
class="min-h-11 rounded-r-xl bg-primary-600 text-white {{ $sizeClasses }} font-semibold transition hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:bg-primary-700 dark:hover:bg-primary-600">
<i class="fas fa-search" aria-hidden="true"></i>
<span class="sr-only">Search</span>
</button>
@endif
+1 -1
View File
@@ -1,4 +1,4 @@
@blaze(fold: true)
<select {{ $attributes->merge(['class' => 'w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-gray-900 shadow-sm transition focus:border-primary-500 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100']) }}>
<select {{ $attributes->merge(['class' => 'min-h-11 w-full rounded-xl border border-gray-300 bg-white px-3.5 py-2.5 text-gray-900 shadow-sm transition focus:border-primary-500 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100']) }}>
{{ $slot }}
</select>
@@ -2,11 +2,13 @@
<button
type="button"
@click="toggle"
class="inline-flex items-center gap-2 px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400 transition shadow-sm"
class="inline-flex min-h-11 items-center gap-2 rounded-xl border border-gray-300 bg-white px-4 py-2 text-sm font-semibold text-gray-700 shadow-sm transition hover:border-primary-300 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:border-primary-600 dark:hover:bg-gray-700 dark:focus:ring-primary-400"
aria-haspopup="menu"
x-bind:aria-expanded="open"
>
<i class="fas {{ $currentIcon }} text-gray-500 dark:text-gray-300"></i>
<i class="fas {{ $currentIcon }} text-primary-600 dark:text-primary-400" aria-hidden="true"></i>
<span>Sort: {{ $currentLabel }}</span>
<i class="fas fa-chevron-down text-xs text-gray-400 dark:text-gray-300 transition-transform" :class="chevronClass()"></i>
<i class="fas fa-chevron-down text-xs text-gray-400 transition-transform dark:text-gray-300" :class="chevronClass()" aria-hidden="true"></i>
</button>
<div x-show="open"
@@ -17,12 +19,14 @@
x-transition:leave="transition ease-in duration-75"
x-transition:leave-start="opacity-100 scale-100"
x-transition:leave-end="opacity-0 scale-95"
class="absolute right-0 z-50 mt-2 w-56 origin-top-right rounded-lg bg-white dark:bg-gray-700 shadow-lg border border-gray-200 dark:border-gray-600 focus:outline-none">
class="absolute right-0 z-50 mt-2 w-56 origin-top-right overflow-hidden rounded-xl border border-gray-200 bg-white shadow-xl focus:outline-none dark:border-gray-600 dark:bg-gray-800"
role="menu">
<div class="py-1 max-h-80 overflow-y-auto">
@foreach($sortOptions as $sortKey => $sortData)
<a
href="{{ $sortUrls[$sortKey] }}"
class="flex items-center gap-3 px-4 py-2 text-sm transition {{ $currentSort === $sortKey ? 'bg-primary-100 dark:bg-primary-600 text-primary-800 dark:text-white font-medium' : 'text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-600' }}"
class="flex min-h-10 items-center gap-3 px-4 py-2 text-sm transition {{ $currentSort === $sortKey ? 'bg-primary-100 dark:bg-primary-700 text-primary-800 dark:text-white font-semibold' : 'text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700' }}"
role="menuitem"
>
<i class="fas {{ $sortData['icon'] }} w-4 text-center {{ $currentSort === $sortKey ? 'text-primary-600 dark:text-primary-200' : 'text-gray-400 dark:text-gray-400' }}"></i>
<span class="flex-1">{{ $sortData['label'] }}</span>
@@ -1,2 +1,2 @@
@blaze(fold: true)
<textarea {{ $attributes->merge(['type' => 'text', 'class' => 'px-3 py-2 border-gray-300 dark:border-gray-600 focus:border-primary-500 focus:ring-primary-500 rounded-lg border shadow-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 transition']) }}>{{ $slot }}</textarea>
<textarea {{ $attributes->merge(['class' => 'w-full rounded-xl border border-gray-300 bg-white px-3.5 py-2.5 text-gray-900 shadow-sm transition focus:border-primary-500 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100']) }}>{{ $slot }}</textarea>
@@ -85,31 +85,28 @@
$showThumbnails = request()->query('thumbs', '0') === '1';
@endphp
<div class="flex items-center gap-2 text-sm">
<span class="text-gray-600 dark:text-gray-400">View:</span>
<div class="inline-flex min-h-11 flex-wrap items-center gap-1 rounded-xl border border-gray-200 bg-white/80 p-1 text-sm shadow-sm dark:border-gray-700 dark:bg-gray-800/80" aria-label="Result view options">
<span class="px-2 text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">View</span>
@if($currentView === 'covers')
{{-- Currently in cover view --}}
<span class="font-semibold text-gray-800 dark:text-gray-200">Covers</span>
<span class="text-gray-400 dark:text-gray-500">|</span>
<a href="{{ $listUrl }}" class="text-primary-600 dark:text-primary-400 hover:text-primary-800 dark:hover:text-primary-300">List</a>
<span class="inline-flex min-h-9 items-center rounded-lg bg-primary-600 px-3 font-semibold text-white shadow-sm">Covers</span>
<a href="{{ $listUrl }}" class="inline-flex min-h-9 items-center rounded-lg px-3 font-medium text-gray-600 transition hover:bg-gray-100 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white">List</a>
@else
{{-- Currently in list view --}}
@if($covgroup || $shows)
<a href="{{ $coverUrl }}" class="text-primary-600 dark:text-primary-400 hover:text-primary-800 dark:hover:text-primary-300">Covers</a>
<span class="text-gray-400 dark:text-gray-500">|</span>
<a href="{{ $coverUrl }}" class="inline-flex min-h-9 items-center rounded-lg px-3 font-medium text-gray-600 transition hover:bg-gray-100 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white">Covers</a>
@endif
<span class="font-semibold text-gray-800 dark:text-gray-200">List</span>
<span class="inline-flex min-h-9 items-center rounded-lg bg-primary-600 px-3 font-semibold text-white shadow-sm">List</span>
{{-- Thumbnail toggle in list view - client-side via Alpine --}}
@if($covgroup || $shows)
<span class="text-gray-400 dark:text-gray-500 ml-2">|</span>
<button type="button"
@click="toggleThumbs()"
class="inline-flex items-center gap-1 hover:text-primary-800 dark:hover:text-primary-300 cursor-pointer"
x-bind:class="showThumbs ? 'text-green-600 dark:text-green-400' : 'text-primary-600 dark:text-primary-400'"
class="inline-flex min-h-9 cursor-pointer items-center gap-1.5 rounded-lg px-3 font-medium transition hover:bg-gray-100 dark:hover:bg-gray-700"
x-bind:class="showThumbs ? 'text-green-700 dark:text-green-300' : 'text-gray-600 dark:text-gray-300'"
x-bind:title="showThumbs ? 'Hide thumbnails' : 'Show thumbnails'">
<i class="fas fa-image text-xs"></i>
<i class="fas fa-image text-xs" aria-hidden="true"></i>
<span x-text="showThumbs ? 'Hide Thumbs' : 'Show Thumbs'"></span>
</button>
@endif
+7 -8
View File
@@ -7,15 +7,14 @@
@section('content')
<div class="surface-panel rounded-xl shadow-sm">
@php
$crumbs = [['label' => 'Home', 'url' => url($site['home_link'] ?? '/'), 'icon' => 'fas fa-home']];
if (!empty($catname) && is_object($catname) && !empty($catname->parent)) {
$crumbs[] = ['label' => $catname->parent->title, 'url' => url('/browse/' . $catname->parent->title)];
$crumbs[] = ['label' => $catname->title, 'url' => url('/browse/' . $catname->title)];
} else {
$crumbs[] = ['label' => 'Console / ' . (is_object($catname) ? $catname->title : $catname)];
}
$consoleCategory = is_object($catname) ? $catname->title : ($catname ?: 'All consoles');
@endphp
<x-breadcrumb :items="$crumbs" />
<x-page-header title="Console" :current="$consoleCategory" eyebrow="Games and releases" description="Explore console titles and compare every indexed release in one place." icon="fas fa-gamepad">
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-gamepad" aria-hidden="true"></i>{{ number_format($results->total()) }} releases</span>
<span class="workspace-hero__stat"><i class="fas fa-folder-open" aria-hidden="true"></i>{{ $consoleCategory }}</span>
</x-slot:stats>
</x-page-header>
@if($results->count() > 0)
<form id="nzb_multi_operations_form" method="get" x-data="releaseMultiOps">
+1 -11
View File
@@ -4,16 +4,7 @@
@section('content')
<div class="w-full contact-page-container mx-auto">
<div class="surface-panel rounded-xl shadow-sm mb-6">
<div class="surface-panel-alt px-6 py-4 border-b rounded-t-lg">
<h4 class="text-xl font-semibold text-gray-800 dark:text-gray-200 mb-0">Contact Us</h4>
<nav class="mt-2" aria-label="breadcrumb">
<ol class="flex space-x-2 text-sm">
<li><a href="{{ url($site['home_link'] ?? '/') }}" class="text-primary-600 dark:text-primary-400 hover:text-primary-800 dark:hover:text-primary-300">Home</a></li>
<li class="text-gray-500 dark:text-gray-400">/</li>
<li class="text-gray-600 dark:text-gray-300">Contact</li>
</ol>
</nav>
</div>
<x-page-header title="Contact us" eyebrow="We are here to help" description="Send a message to the site team and we will get back to you as soon as possible." icon="fas fa-message" />
<div class="px-6 py-8 lg:px-12 lg:py-10">
@if(isset($msg) && $msg != '')
@@ -132,4 +123,3 @@
{!! \App\Support\CaptchaHelper::renderJs() !!}
@endif
@endpush
+3 -3
View File
@@ -2,6 +2,8 @@
@section('content')
<div class="surface-panel rounded-xl shadow-sm">
<x-page-header :title="$front ? ($site['title'] ?? config('app.name')) : 'Content'" :eyebrow="$front ? 'Welcome' : 'Explore the site'" :description="$front ? 'Discover the latest site information and start exploring the index.' : 'Browse our published information and useful content pages.'" icon="fas fa-file-alt" />
@if($front)
<!-- Front Page Content -->
<div class="px-6 py-8">
@@ -11,7 +13,7 @@
<article class="surface-panel rounded-lg shadow-sm p-6 border transition-shadow duration-200 hover:shadow-md">
<div class="surface-prose">
@if(filled($item->title))
<h1 class="mb-4 text-3xl font-bold">{{ $item->title }}</h1>
<h2 class="mb-4 text-3xl font-bold">{{ $item->title }}</h2>
@endif
@if(isset($item->body))
@@ -37,8 +39,6 @@
</div>
@else
<!-- Content List Page -->
<x-page-header title="Content" description="Browse our content pages" icon="fas fa-file-alt" />
<div class="px-6 pb-6">
@if(!empty($content) && count($content) > 0)
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
+6 -8
View File
@@ -6,14 +6,12 @@
@section('content')
<div class="release-detail-page surface-panel rounded-xl shadow-sm p-6">
<div class="mb-6">
<h1 class="text-2xl font-bold text-gray-800 dark:text-gray-200 mb-2">Release Details</h1>
<nav class="text-sm text-gray-600 dark:text-gray-400">
<a href="{{ url('/') }}" class="hover:text-primary-600 dark:hover:text-primary-400">Home</a>
<i class="fas fa-chevron-right mx-2 text-xs"></i>
<span class="wrap-break-word break-all">{{ $release->searchname }}</span>
</nav>
</div>
<x-page-header title="Release details" :current="$release->searchname" eyebrow="Inspect this release" description="Review metadata, previews, files, reports, and download options for this indexed release." icon="fas fa-circle-info" class="mb-6">
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-folder-open" aria-hidden="true"></i>{{ $release->category_name ?? 'Release' }}</span>
<span class="workspace-hero__stat"><i class="fas fa-database" aria-hidden="true"></i>{{ isset($release->size) ? number_format($release->size / 1073741824, 2).' GB' : 'Size unavailable' }}</span>
</x-slot:stats>
</x-page-header>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Main Content -->
+6 -14
View File
@@ -6,20 +6,12 @@
@section('content')
<div class="surface-panel rounded-xl shadow-sm">
<!-- Breadcrumb -->
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
<nav aria-label="breadcrumb">
<ol class="flex items-center space-x-2 text-sm text-gray-600">
<li><a href="{{ url($site['home_link'] ?? '/') }}" class="hover:text-blue-600">Home</a></li>
<li><i class="fas fa-chevron-right text-xs mx-2"></i></li>
<li><a href="{{ url('/browse/PC') }}" class="hover:text-blue-600">PC</a></li>
@if(!empty($catname) && $catname !== 'All')
<li><i class="fas fa-chevron-right text-xs mx-2"></i></li>
<li class="text-gray-500">{{ $catname }}</li>
@endif
</ol>
</nav>
</div>
<x-page-header title="Games" :current="!empty($catname) ? $catname : 'All games'" eyebrow="Play and discover" description="Browse PC games and refine the catalog by title, genre, year, or category." icon="fas fa-dice-d20">
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-gamepad" aria-hidden="true"></i>{{ number_format($results->total()) }} games</span>
<span class="workspace-hero__stat"><i class="fas fa-folder-open" aria-hidden="true"></i>{{ $catname ?: 'All games' }}</span>
</x-slot:stats>
</x-page-header>
<div class="px-6 py-4">
<!-- Search Filters -->
+6 -13
View File
@@ -1,17 +1,10 @@
@extends('layouts.main')
@section('content')
<x-panel class="mx-auto max-w-4xl">
<div class="flex flex-col gap-6 sm:flex-row sm:items-center sm:justify-between">
<div>
<h1 class="text-2xl font-bold text-gray-900 dark:text-gray-100">Welcome back</h1>
<p class="mt-2 text-gray-600 dark:text-gray-400">Jump back into browsing releases, searching the index, or managing your account.</p>
</div>
<div class="flex flex-wrap gap-2">
<x-button-link href="{{ route('search') }}" icon="fas fa-search">Search</x-button-link>
<x-button-link href="{{ route('All') }}" variant="secondary" icon="fas fa-list-ul">Browse</x-button-link>
</div>
</div>
</x-panel>
<x-page-header title="Welcome back" eyebrow="Your index workspace" description="Jump back into browsing releases, searching the index, or managing your account." icon="fas fa-house">
<x-slot:actions>
<a href="{{ route('search') }}" class="workspace-hero__action"><i class="fas fa-search" aria-hidden="true"></i>Search</a>
<a href="{{ route('All') }}" class="workspace-hero__action"><i class="fas fa-list-ul" aria-hidden="true"></i>Browse</a>
</x-slot:actions>
</x-page-header>
@endsection
+11 -56
View File
@@ -1,34 +1,18 @@
@extends('layouts.main')
@section('content')
<x-page-header :title="$invite_mode ? 'Send an invitation' : 'Invitations disabled'" eyebrow="Invite someone new" :description="$invite_mode ? 'Share a secure, time-limited invitation and track it from your account.' : 'User invitations are currently unavailable on this site.'" icon="fas fa-paper-plane">
@if($invite_mode)
<x-slot:stats>
<span class="workspace-hero__stat"><i class="fas fa-envelope" aria-hidden="true"></i>{{ number_format($user_invites_left) }} invites left</span>
</x-slot:stats>
<x-slot:actions>
<a href="{{ url('/invitations') }}" class="workspace-hero__action"><i class="fas fa-arrow-left" aria-hidden="true"></i>My invitations</a>
</x-slot:actions>
@endif
</x-page-header>
@unless($invite_mode)
<div class="mb-6">
<nav class="flex" aria-label="breadcrumb">
<ol class="inline-flex items-center space-x-1 md:space-x-3">
<li class="inline-flex items-center">
<a href="{{ $site['home_link'] }}" class="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:text-blue-400 dark:text-gray-400 dark:hover:text-white">Home</a>
</li>
<li>
<div class="flex items-center">
<svg class="w-3 h-3 text-gray-400 mx-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path></svg>
<a href="{{ url('/profile') }}" class="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:text-blue-400 dark:text-gray-400 dark:hover:text-white">Profile</a>
</div>
</li>
<li>
<div class="flex items-center">
<svg class="w-3 h-3 text-gray-400 mx-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path></svg>
<a href="{{ url('/invitations') }}" class="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:text-blue-400 dark:text-gray-400 dark:hover:text-white">My Invitations</a>
</div>
</li>
<li aria-current="page">
<div class="flex items-center">
<svg class="w-3 h-3 text-gray-400 mx-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path></svg>
<span class="text-gray-500 dark:text-gray-400">Invitations Disabled</span>
</div>
</li>
</ol>
</nav>
</div>
<div class="max-w-4xl mx-auto px-4 py-3">
<div class="bg-yellow-50 border border-yellow-200 text-yellow-800 rounded-lg p-6 shadow-sm dark:bg-yellow-900 dark:border-yellow-700 dark:text-yellow-300">
<h5 class="text-lg font-semibold mb-2 flex items-center">
@@ -41,34 +25,6 @@
</div>
</div>
@else
<div class="mb-6">
<nav class="flex" aria-label="breadcrumb">
<ol class="inline-flex items-center space-x-1 md:space-x-3">
<li class="inline-flex items-center">
<a href="{{ $site['home_link'] }}" class="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:text-blue-400 dark:text-gray-400 dark:hover:text-white">Home</a>
</li>
<li>
<div class="flex items-center">
<svg class="w-3 h-3 text-gray-400 mx-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path></svg>
<a href="{{ url('/profile') }}" class="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:text-blue-400 dark:text-gray-400 dark:hover:text-white">Profile</a>
</div>
</li>
<li>
<div class="flex items-center">
<svg class="w-3 h-3 text-gray-400 mx-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path></svg>
<a href="{{ url('/invitations') }}" class="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:text-blue-400 dark:text-gray-400 dark:hover:text-white">My Invitations</a>
</div>
</li>
<li aria-current="page">
<div class="flex items-center">
<svg class="w-3 h-3 text-gray-400 mx-1" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path></svg>
<span class="text-gray-500 dark:text-gray-400">Send New Invitation</span>
</div>
</li>
</ol>
</nav>
</div>
<div class="max-w-4xl mx-auto px-4 py-3">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm dark:bg-gray-800">
<div class="bg-gray-50 dark:bg-gray-900 px-6 py-4 border-b border-gray-200 dark:border-gray-700 rounded-t-lg flex justify-between items-center dark:bg-gray-700 dark:border-gray-600">
@@ -231,4 +187,3 @@
</div>
@endif
@endsection

Some files were not shown because too many files have changed in this diff Show More