mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-28 21:01:22 +00:00
Merge pull request #1870 from NNTmux/theme_update
Update site theme appearance
This commit is contained in:
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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() {
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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,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,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>
|
||||
|
||||
@@ -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,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,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">
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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,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 -->
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user