This commit is contained in:
Realmlist 2024-01-22 16:59:13 +01:00
commit c6467114c5
28 changed files with 2822 additions and 883 deletions

View File

@ -3,10 +3,13 @@ contact_links:
- name: Feature Request
url: https://github.com/orgs/LinkStackOrg/discussions/categories/feature-requests
about: Requests regarding new features, enhancements, or changes
- name: Commission Custom Features
url: https://linkstack.org/contact/
about: Accelerate feature implementation with our commissioned services. Reach out to us for a personalized quote and fast-track the features you need.
- name: Button requests
url: https://github.com/orgs/LinkStackOrg/discussions/categories/predefined-links
about: Requests regarding new buttons, brands, updated styling or changes
- name: Docker Issues
url: https://github.com/LinkStackOrg/linkstack-docker/issues
about: Issues regarding the Docker version exclusively or reverse proxy issues related to the Docker instance

View File

@ -27,6 +27,7 @@ use App\Models\Admin;
use App\Models\Button;
use App\Models\Link;
use App\Models\Page;
use App\Models\UserData;
class AdminController extends Controller
{
@ -113,13 +114,31 @@ public function SendTestMail(Request $request)
return redirect('admin/users/all');
}
//Verify user
public function verifyCheckUser(request $request)
{
$id = $request->id;
$status = $request->verify;
if ($status == 'vip') {
$verify = 'vip';
UserData::saveData($id, 'checkmark', true);
} elseif ($status == 'user') {
$verify = 'user';
}
User::where('id', $id)->update(['role' => $verify]);
return redirect(url('u')."/".$id);
}
//Verify or un-verify users emails
public function verifyUser(request $request)
{
$id = $request->id;
$status = $request->verify;
if ($status == '-') {
if ($status == "true") {
$verify = '0000-00-00 00:00:00';
} else {
$verify = NULL;
@ -147,9 +166,25 @@ public function SendTestMail(Request $request)
return implode('', $pieces);
}
$names = User::pluck('name')->toArray();
$adminCreatedNames = array_filter($names, function($name) {
return strpos($name, 'Admin-Created-') === 0;
});
$numbers = array_map(function($name) {
return (int) str_replace('Admin-Created-', '', $name);
}, $adminCreatedNames);
$maxNumber = !empty($numbers) ? max($numbers) : 0;
$newNumber = $maxNumber + 1;
$domain = parse_url(url(''), PHP_URL_HOST);
$domain = ($domain == 'localhost') ? 'example.com' : $domain;
$user = User::create([
'name' => 'Admin-Created-' . random_str(8),
'email' => random_str(8) . '@example.com',
'name' => 'Admin-Created-' . $newNumber,
'email' => strtolower(random_str(8)) . '@' . $domain,
'password' => Hash::make(random_str(32)),
'role' => 'user',
'block' => 'no',

View File

@ -11,33 +11,36 @@ use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
class RegisteredUserController extends Controller
{
/**
* Display the registration view.
*
* @return \Illuminate\View\View
*/
public function create()
{
return view('auth.register');
}
/**
* Handle an incoming registration request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function validateHandle(Request $request)
{
$validator = Validator::make($request->all(), [
'littlelink_name' => 'required|string|max:50|unique:users',
]);
if ($validator->fails()) {
return response()->json(['valid' => false]);
}
return response()->json(['valid' => true]);
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'littlelink_name' => 'required|string|max:50|unique:users',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|confirmed|min:8',
'password' => 'required|string|min:8',
]);
$name = $request->input('name');
@ -48,23 +51,13 @@ class RegisteredUserController extends Controller
$block = 'no';
}
if(DB::table('users')->where('littlelink_name', $request->name)->exists())
{
Auth::login($user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'role' => 'user',
]));
} else {
Auth::login($user = User::create([
'name' => $request->name,
'email' => $request->email,
'littlelink_name' => $request->name,
'password' => Hash::make($request->password),
'role' => 'user',
]));
}
Auth::login($user = User::create([
'name' => $request->name,
'email' => $request->email,
'littlelink_name' => $request->littlelink_name,
'password' => Hash::make($request->password),
'role' => 'user',
]));
$user->block = $block;
$user->save();

View File

@ -789,6 +789,7 @@ class UserController extends Controller
$name = $request->name;
$checkmark = $request->checkmark;
$sharebtn = $request->sharebtn;
$tablinks = $request->tablinks;
if(env('HOME_URL') !== '' && $pageName != $littlelink_name && $littlelink_name == env('HOME_URL')){
EnvEditor::editKey('HOME_URL', $pageName);
@ -816,6 +817,12 @@ class UserController extends Controller
} else {
UserData::saveData($userId, 'disable-sharebtn', true);
}
if ($tablinks == "on") {
UserData::saveData($userId, 'links-new-tab', true);
} else {
UserData::saveData($userId, 'links-new-tab', false);
}
return Redirect('/studio/page');
}

View File

@ -54,6 +54,7 @@ class Kernel extends HttpKernel
* @var array
*/
protected $routeMiddleware = [
'disableCookies' => \App\Http\Middleware\DisableCookies::class,
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,

View File

@ -23,6 +23,10 @@ class UserTable extends DataTableComponent
public function columns(): array
{
return [
// Column::make("", "id")
// ->format(function ($value, $row, Column $column) {
// return view('components.table-components.select', ['user' => $row]);
// }),
Column::make(__('messages.ID'), "id")
->sortable()
->searchable(),
@ -37,7 +41,7 @@ class UserTable extends DataTableComponent
->searchable()
->format(function ($value, $row, Column $column) {
if (!$row->littlelink_name == NULL) {
return "<a href='" . url('') . "/@" . $row->littlelink_name . "' target='_blank' class='text-info'><i class='bi bi-box-arrow-up-right'></i>&nbsp; " . $row->littlelink_name . " </a>";
return "<a href='" . url('') . "/@" . htmlspecialchars($row->littlelink_name) . "' target='_blank' class='text-info'><i class='bi bi-box-arrow-up-right'></i>&nbsp; " . $row->littlelink_name . " </a>";
} else {
return 'N/A';
}
@ -61,20 +65,25 @@ class UserTable extends DataTableComponent
->format(function ($value, $row, Column $column) {
if (env('REGISTER_AUTH') !== 'auth') {
if ($row->role == 'admin' && $row->email_verified_at != '') {
return '<center>-</center>';
return '<div class="text-center">-</div>';
} else {
if($row->email_verified_at == ''){
$verifyLinkBool = 'true';
} else {
$verifyLinkBool = 'false';
}
$verifyLink = route('verifyUser', [
'verify' => '-' . $row->email_verified_at,
'verify' => $verifyLinkBool,
'id' => $row->id
]);
if ($row->email_verified_at == '') {
return '<a style="cursor:pointer" data-id="'.$verifyLink.'" class="user-email text-danger"><span class="badge bg-danger">' . __('messages.Pending') . '</span></a>';
return '<div class="text-center"><a style="cursor:pointer" data-id="'.$verifyLink.'" class="user-email text-danger"><span class="badge bg-danger">' . __('messages.Pending') . '</span></a></div>';
} else {
return '<a style="cursor:pointer" data-id="'.$verifyLink.'" class="user-email text-danger"><span class="badge bg-success">' . __('messages.Verified') . '</span></a>';
return '<div class="text-center"><a style="cursor:pointer" data-id="'.$verifyLink.'" class="user-email text-danger"><span class="badge bg-success">' . __('messages.Verified') . '</span></a></div>';
}
}
} else {
return '<center>-</center>';
return '<div class="text-center">-</div>';
}
return '';
})->html(),
@ -82,13 +91,13 @@ class UserTable extends DataTableComponent
->sortable()
->format(function ($value, $row, Column $column) {
if ($row->role === 'admin' && $row->id === 1) {
return '<center>-</center>';
return '<div class="text-center">-</div>';
} else {
$route = route('blockUser', ['block' => $row->block, 'id' => $row->id]);
if ($row->block === 'yes') {
$badge = '<a style="cursor:pointer" data-id="'.$route.'" class="user-block text-danger"><span class="badge bg-danger">'.__('messages.Pending').'</span></a>';
$badge = '<div class="text-center"><a style="cursor:pointer" data-id="'.$route.'" class="user-block text-danger"><span class="badge bg-danger">'.__('messages.Pending').'</span></a></div>';
} elseif ($row->block === 'no') {
$badge = '<a style="cursor:pointer" data-id="'.$route.'" class="user-block text-danger"><span class="badge bg-success">'.__('messages.Approved').'</span></a>';
$badge = '<div class="text-center"><a style="cursor:pointer" data-id="'.$route.'" class="user-block text-danger"><span class="badge bg-success">'.__('messages.Approved').'</span></a></div>';
}
return "<a href=\"$route\">$badge</a>";
}

View File

@ -0,0 +1,29 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Http\Request;
class DisableCookies
{
public function handle(Request $request, Closure $next)
{
$cookiesAlreadySet = $request->hasCookie(strtolower(config('app.name')).'_session') || $request->hasCookie('XSRF-TOKEN');
if ($cookiesAlreadySet) {
return $next($request);
}
Cookie::queue(Cookie::forget(strtolower(config('app.name')).'_session'));
Cookie::queue(Cookie::forget('XSRF-TOKEN'));
config(['session.driver' => 'array']);
$response = $next($request);
$response->headers->remove('Set-Cookie');
return $response;
}
}

View File

@ -1,14 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1432_8560)">
<path d="M20 0H4C1.79086 0 0 1.79086 0 4V20C0 22.2091 1.79086 24 4 24H20C22.2091 24 24 22.2091 24 20V4C24 1.79086 22.2091 0 20 0Z" fill="url(#paint0_linear_1432_8560)"/>
</g>
<defs>
<linearGradient id="paint0_linear_1432_8560" x1="12" y1="0" x2="12" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#0066FF"/>
<stop offset="1" stop-color="#71C0FF"/>
</linearGradient>
<clipPath id="clip0_1432_8560">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
<svg viewBox="0 0 36 36" xml:space="preserve" width="36" height="36">
<path d="M17.985 16.236c-1.6-3.1-5.94-8.89-9.98-11.74-3.87-2.73-5.35-2.26-6.31-1.82-1.12.51-1.32 2.23-1.32 3.24 0 1.01.55 8.3.92 9.51 1.2 4.02 5.45 5.38 9.37 4.94.2-.03.4-.06.61-.08-.2.03-.41.06-.61.08-5.74.85-10.85 2.94-4.15 10.39 7.36 7.62 10.09-1.63 11.49-6.33 1.4 4.69 3.01 13.61 11.35 6.33 6.27-6.33 1.72-9.54-4.02-10.39-.2-.02-.41-.05-.61-.08.21.03.41.05.61.08 3.92.44 8.18-.92 9.37-4.94.36-1.22.92-8.5.92-9.51 0-1.01-.2-2.73-1.32-3.24-.97-.44-2.44-.91-6.31 1.82-4.07 2.86-8.41 8.64-10.01 11.74z" style="fill:#1185fe"/>
</svg>

Before

Width:  |  Height:  |  Size: 614 B

After

Width:  |  Height:  |  Size: 605 B

View File

@ -23,14 +23,15 @@
"spatie/laravel-backup": "^8.17"
},
"require-dev": {
"spatie/laravel-ignition": "^1.0",
"barryvdh/laravel-ide-helper": "^2.12",
"fakerphp/faker": "^1.9.1",
"laravel-lang/common": "^2.0",
"laravel/breeze": "^1.1",
"laravel/sail": "^1.0.1",
"mockery/mockery": "^1.4.2",
"nunomaduro/collision": "^6.1",
"phpunit/phpunit": "^9.3.3"
"phpunit/phpunit": "^9.3.3",
"spatie/laravel-ignition": "^1.0"
},
"autoload": {
"files": [
@ -48,14 +49,15 @@
}
},
"scripts": {
"post-update-cmd": [
"php artisan vendor:publish --tag=laravel-assets --ansi --force",
"php artisan lang:update",
"echo.> storage/app/ISINSTALLED"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-update-cmd": ["echo.> storage/app/ISINSTALLED"]
]
},
"extra": {
"laravel": {

1784
composer.lock generated

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -764,6 +764,8 @@ return [
'Create the admin user' => '3. Erstellen Sie den Admin-Benutzer',
'Configure the app' => '4. Konfigurieren Sie die App',
'Choose a language' => 'Wählen Sie eine Sprache',
'setup.disclaimer' => 'Es gelten unsere',
'Terms and Conditions' => 'Allgemeinen Geschäftsbedingungen',
'Next' => 'Nächste',
'Yes' => 'Ja',

View File

@ -761,6 +761,8 @@ return [
'Create the admin user' => '3. Create the admin user',
'Configure the app' => '4. Configure the app',
'Choose a language' => 'Choose a language',
'setup.disclaimer' => 'By continuing, you agree to abide by our',
'Terms and Conditions' => 'Terms and Conditions',
'Next' => 'Next',
'Yes' => 'Yes',

View File

@ -18,7 +18,7 @@ foreach($pages as $page)
<!-- Validation Errors -->
<x-auth-validation-errors class="mb-4" :errors="$errors" />
<div style="max-width:480px" class="container mt-5 w-100">
<div class="container mt-5 w-100">
<div class="card p-5">
<a href="{{ url('') }}" class="d-flex align-items-center mb-3">
<!--Logo start-->
@ -53,6 +53,16 @@ foreach($pages as $page)
<input type="text" class="form-control" id="name" name="name" aria-describedby="name" placeholder=" " :value="old('name')" required autofocus >
</div>
</div>
<div class="col-lg-12">
<div class="form-group">
<label for="littlelink_name" class="form-label">{{__('messages.Page URL')}}</label>
<div class="input-group mb-3 has-validation">
<span class="input-group-text" id="basic-addon3">{{str_replace(['http://', 'https://'], '', url(''))}}/@</span>
<input type="littlelink_name" class="form-control" id="littlelink_name" name="littlelink_name" aria-describedby="littlelink_name" placeholder=" " :value="old('littlelink_name')" required autofocus >
</div>
</div>
</div>
@include('auth.url-validation')
<div class="col-lg-12">
<div class="form-group">
<label for="email" class="form-label">{{__('messages.Email')}}</label>
@ -65,12 +75,6 @@ foreach($pages as $page)
<input type="password" class="form-control" id="password" aria-describedby="password" placeholder=" " name="password" required autocomplete="new-password" />
</div>
</div>
<div class="col-lg-12">
<div class="form-group">
<label for="password_confirmation" class="form-label">{{__('messages.Confirm Password')}}</label>
<input type="password" class="form-control" id="password_confirmation" aria-describedby="password_confirmation" placeholder=" " name="password_confirmation" required />
</div>
</div>
<div class="col-lg-12 d-flex justify-content-between">
<div class="form-check mb-3">
<input type="checkbox" class="form-check-input" name="remember" id="remember_me">
@ -79,7 +83,7 @@ foreach($pages as $page)
</div>
</div>
<div class="d-flex justify-content-center">
<button type="submit" class="btn btn-primary">{{__('messages.Sign Up')}}</button>
<button id="submit-btn" type="submit" class="btn btn-primary">{{__('messages.Sign Up')}}</button>
</div>
@if(env('ENABLE_SOCIAL_LOGIN') == 'true')
<p class="text-center my-3">{{__('messages.or sign in with other accounts?')}}</p>

View File

@ -0,0 +1,42 @@
<script>{!! file_get_contents(base_path("assets/js/jquery.min.js")) !!}</script>
<script>
$(document).ready(function () {
var submitBtn = $('#submit-btn');
$('#littlelink_name').on('keyup', function () {
var littlelinkName = $(this).val();
if (littlelinkName.trim() !== '') {
$.ajax({
type: 'POST',
url: '{{url("/validate-handle")}}',
data: {
'_token': '{{ csrf_token() }}',
'littlelink_name': littlelinkName
},
success: function (data) {
$('#littlelink_name').removeClass('is-valid is-invalid');
$('#username-error').remove();
if (typeof exceptionvar !== 'undefined' && littlelinkName.trim() === exceptionvar) {
submitBtn.prop('disabled', false);
} else {
if (data.valid) {
$('#littlelink_name').addClass('is-valid');
submitBtn.prop('disabled', false);
} else {
$('#littlelink_name').addClass('is-invalid');
$('<div id="username-error" class="invalid-feedback">That username is already taken</div>').insertAfter('#littlelink_name');
submitBtn.prop('disabled', true);
}
}
}
});
} else {
$('#littlelink_name').removeClass('is-valid is-invalid');
$('#username-error').remove();
submitBtn.prop('disabled', true);
}
});
});
</script>

View File

@ -149,6 +149,18 @@ use App\Models\Page;
Page::first()->update(['home_message' => $home_message]);
}
$migrationFiles = glob(database_path('migrations/*.php'));
$fileNames = array_map(function ($file) {
return basename($file, '.php');
}, $migrationFiles);
foreach ($fileNames as $fileName) {
if (!DB::table('migrations')->where('migration', $fileName)->exists()) {
DB::table('migrations')->insert(['migration' => $fileName, 'batch' => 1]);
}
}
/* Updates button database entries */
Schema::disableForeignKeyConstraints();
$existingMigration = '2021_03_17_044922_create_buttons_table';

View File

@ -0,0 +1,7 @@
@if($user->id == 1)
<input class="form-check-input" type="checkbox" id="disabledFieldsetCheck" disabled="">
@else
<div class="form-check">
<input wire:model="selected" wire:loading.attr.delay="disabled" data-id="{{ $user->id }}" value="{{ $user->id }}" type="checkbox" class="form-check-input">
</div>
@endif

View File

@ -65,6 +65,8 @@
</form>
{{-- end language --}}
<p style="margin:25px;max-width:350px;">{{__('messages.setup.disclaimer')}} <a href="https://linkstack.org/terms-and-conditions/" target="_blank">{{__('messages.Terms and Conditions')}}</a>.</p>
&ensp;<a class="btn" href="{{url('?2')}}"><button>{{__('messages.Next')}}</button></a>&ensp;
@endif

View File

@ -264,83 +264,6 @@
}
</style>
<style>
/* cyrillic */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-300-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-300-normal.woff) format('woff');
unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
}
/* cyrillic-ext */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-ext-300-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-ext-300-normal.woff) format('woff');
unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
}
/* greek */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-300-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-300-normal.woff) format('woff');
unicode-range: U+0370-03FF;
}
/* greek-ext */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-ext-300-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-ext-300-normal.woff) format('woff');
unicode-range: U+1F00-1FFF;
}
/* latin */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-300-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-300-normal.woff) format('woff');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
/* latin-ext */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-ext-300-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-ext-300-normal.woff) format('woff');
unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
/* vietnamese */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-vietnamese-300-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-vietnamese-300-normal.woff) format('woff');
unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;
}
/* cyrillic */
@font-face {
font-family: 'Inter';
@ -348,8 +271,8 @@
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-400-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-400-normal.woff) format('woff');
unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
src: url({{ asset('assets/fonts/Inter/inter-cyrillic-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-cyrillic-400-normal.woff')}} ) format('woff');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* cyrillic-ext */
@ -359,8 +282,8 @@
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-ext-400-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-ext-400-normal.woff) format('woff');
unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
src: url({{ asset('assets/fonts/Inter/inter-cyrillic-ext-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-cyrillic-ext-400-normal.woff')}} ) format('woff');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* greek */
@ -370,7 +293,7 @@
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-400-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-400-normal.woff) format('woff');
src: url({{ asset('assets/fonts/Inter/inter-greek-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-greek-400-normal.woff')}} ) format('woff');
unicode-range: U+0370-03FF;
}
@ -381,10 +304,21 @@
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-ext-400-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-ext-400-normal.woff) format('woff');
src: url({{ asset('assets/fonts/Inter/inter-greek-ext-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-greek-ext-400-normal.woff')}} ) format('woff');
unicode-range: U+1F00-1FFF;
}
/* hebrew */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url({{ asset('assets/fonts/Inter/inter-hebrew-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-hebrew-400-normal.woff')}} ) format('woff');
unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
/* latin */
@font-face {
font-family: 'Inter';
@ -392,8 +326,8 @@
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-400-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-400-normal.woff) format('woff');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
src: url({{ asset('assets/fonts/Inter/inter-latin-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-latin-400-normal.woff')}} ) format('woff');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@ -403,8 +337,8 @@
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-ext-400-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-ext-400-normal.woff) format('woff');
unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
src: url({{ asset('assets/fonts/Inter/inter-latin-ext-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-latin-ext-400-normal.woff')}} ) format('woff');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* vietnamese */
@ -414,85 +348,8 @@
font-weight: 400;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-vietnamese-400-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-vietnamese-400-normal.woff) format('woff');
unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;
}
/* cyrillic */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-500-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-500-normal.woff) format('woff');
unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
}
/* cyrillic-ext */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-ext-500-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-ext-500-normal.woff) format('woff');
unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
}
/* greek */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-500-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-500-normal.woff) format('woff');
unicode-range: U+0370-03FF;
}
/* greek-ext */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-ext-500-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-ext-500-normal.woff) format('woff');
unicode-range: U+1F00-1FFF;
}
/* latin */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-500-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-500-normal.woff) format('woff');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
/* latin-ext */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-ext-500-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-ext-500-normal.woff) format('woff');
unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
/* vietnamese */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-vietnamese-500-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-vietnamese-500-normal.woff) format('woff');
unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;
src: url({{ asset('assets/fonts/Inter/inter-vietnamese-400-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-vietnamese-400-normal.woff')}} ) format('woff');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* cyrillic */
@ -502,8 +359,8 @@
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-600-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-600-normal.woff) format('woff');
unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
src: url({{ asset('assets/fonts/Inter/inter-cyrillic-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-cyrillic-600-normal.woff')}} ) format('woff');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* cyrillic-ext */
@ -513,8 +370,8 @@
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-ext-600-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-ext-600-normal.woff) format('woff');
unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
src: url({{ asset('assets/fonts/Inter/inter-cyrillic-ext-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-cyrillic-ext-600-normal.woff')}} ) format('woff');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* greek */
@ -524,7 +381,7 @@
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-600-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-600-normal.woff) format('woff');
src: url({{ asset('assets/fonts/Inter/inter-greek-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-greek-600-normal.woff')}} ) format('woff');
unicode-range: U+0370-03FF;
}
@ -535,10 +392,21 @@
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-ext-600-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-ext-600-normal.woff) format('woff');
src: url({{ asset('assets/fonts/Inter/inter-greek-ext-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-greek-ext-600-normal.woff')}} ) format('woff');
unicode-range: U+1F00-1FFF;
}
/* hebrew */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url({{ asset('assets/fonts/Inter/inter-hebrew-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-hebrew-600-normal.woff')}} ) format('woff');
unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
/* latin */
@font-face {
font-family: 'Inter';
@ -546,8 +414,8 @@
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-600-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-600-normal.woff) format('woff');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
src: url({{ asset('assets/fonts/Inter/inter-latin-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-latin-600-normal.woff')}} ) format('woff');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@ -557,8 +425,8 @@
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-ext-600-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-ext-600-normal.woff) format('woff');
unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
src: url({{ asset('assets/fonts/Inter/inter-latin-ext-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-latin-ext-600-normal.woff')}} ) format('woff');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* vietnamese */
@ -568,8 +436,8 @@
font-weight: 600;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-vietnamese-600-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-vietnamese-600-normal.woff) format('woff');
unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;
src: url({{ asset('assets/fonts/Inter/inter-vietnamese-600-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-vietnamese-600-normal.woff')}} ) format('woff');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* cyrillic */
@ -579,8 +447,8 @@
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-700-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-700-normal.woff) format('woff');
unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
src: url({{ asset('assets/fonts/Inter/inter-cyrillic-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-cyrillic-700-normal.woff')}} ) format('woff');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* cyrillic-ext */
@ -590,8 +458,8 @@
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-cyrillic-ext-700-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-cyrillic-ext-700-normal.woff) format('woff');
unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
src: url({{ asset('assets/fonts/Inter/inter-cyrillic-ext-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-cyrillic-ext-700-normal.woff')}} ) format('woff');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* greek */
@ -601,7 +469,7 @@
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-700-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-700-normal.woff) format('woff');
src: url({{ asset('assets/fonts/Inter/inter-greek-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-greek-700-normal.woff')}} ) format('woff');
unicode-range: U+0370-03FF;
}
@ -612,10 +480,21 @@
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-greek-ext-700-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-greek-ext-700-normal.woff) format('woff');
src: url({{ asset('assets/fonts/Inter/inter-greek-ext-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-greek-ext-700-normal.woff')}} ) format('woff');
unicode-range: U+1F00-1FFF;
}
/* hebrew */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url({{ asset('assets/fonts/Inter/inter-hebrew-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-hebrew-700-normal.woff')}} ) format('woff');
unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
/* latin */
@font-face {
font-family: 'Inter';
@ -623,8 +502,8 @@
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-700-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-700-normal.woff) format('woff');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
src: url({{ asset('assets/fonts/Inter/inter-latin-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-latin-700-normal.woff')}} ) format('woff');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@ -634,8 +513,8 @@
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-latin-ext-700-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-latin-ext-700-normal.woff) format('woff');
unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;
src: url({{ asset('assets/fonts/Inter/inter-latin-ext-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-latin-ext-700-normal.woff')}} ) format('woff');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* vietnamese */
@ -645,8 +524,7 @@
font-weight: 700;
font-stretch: 100%;
font-display: swap;
src: url(assets/fonts/Inter/inter-vietnamese-700-normal.woff2) format('woff2'), url(assets/fonts/Inter/inter-vietnamese-700-normal.woff) format('woff');
unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB;
src: url({{ asset('assets/fonts/Inter/inter-vietnamese-700-normal.woff2')}} ) format('woff2'), url({{ asset('assets/fonts/Inter/inter-vietnamese-700-normal.woff')}} ) format('woff');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
</style>

View File

@ -31,10 +31,10 @@
@break
@case('custom')
@if($link->custom_css === "" or $link->custom_css === "NULL" or (theme('allow_custom_buttons') == "false"))
<div style="--delay: {{ $initial++ }}s" class="button-entrance"><a id="{{ $link->id }}" class="button button-{{ $link->name }} button-click button-hover icon-hover" rel="noopener noreferrer nofollow noindex" href="{{ $link->link }}" @if((UserData::getData($userinfo->id, 'links-new-tab') != false))target="_blank"@endif ><i style="color: {{$link->custom_icon}}" class="icon hvr-icon fa {{$link->custom_icon}}"></i>{{ $link->title }}</a></div>
<div style="--delay: {{ $initial++ }}s" class="button-entrance"><a id="{{ $link->id }}" class="button button-custom button-click button-hover icon-hover" rel="noopener noreferrer nofollow noindex" href="{{ $link->link }}" @if((UserData::getData($userinfo->id, 'links-new-tab') != false))target="_blank"@endif ><i style="color: {{$link->custom_icon}}" class="icon hvr-icon fa {{$link->custom_icon}}"></i>{{ $link->title }}</a></div>
@break
@elseif($link->custom_css != "")
<div style="--delay: {{ $initial++ }}s" class="button-entrance"><a id="{{ $link->id }}" class="button-click button-hover icon-hover" style="{{ $link->custom_css }}" rel="noopener noreferrer nofollow noindex" href="{{ $link->link }}" @if((UserData::getData($userinfo->id, 'links-new-tab') != false))target="_blank"@endif ><i style="color: {{$link->custom_icon}}" class="icon hvr-icon fa {{$link->custom_icon}}"></i>{{ $link->title }}</a></div>
<div style="--delay: {{ $initial++ }}s" class="button-entrance"><a id="{{ $link->id }}" class="button button-custom button-click button-hover icon-hover" style="{{ $link->custom_css }}" rel="noopener noreferrer nofollow noindex" href="{{ $link->link }}" @if((UserData::getData($userinfo->id, 'links-new-tab') != false))target="_blank"@endif ><i style="color: {{$link->custom_icon}}" class="icon hvr-icon fa {{$link->custom_icon}}"></i>{{ $link->title }}</a></div>
@break
@endif
@case('custom_website')
@ -42,7 +42,7 @@
<div style="--delay: {{ $initial++ }}s" class="button-entrance"><a id="{{ $link->id }}" class="button button-custom_website button-click button-hover icon-hover" rel="noopener noreferrer nofollow noindex" href="{{ $link->link }}" @if((UserData::getData($userinfo->id, 'links-new-tab') != false))target="_blank"@endif ><img alt="{{ $link->name }}" class="icon hvr-icon" src="@if(file_exists(base_path("assets/favicon/icons/").localIcon($link->id))){{url('assets/favicon/icons/'.localIcon($link->id))}}@else{{getFavIcon($link->id)}}@endif" onerror="this.onerror=null; this.src='{{asset('assets/linkstack/icons/website.svg')}}';">{{ $link->title }}</a></div>
@break
@elseif($link->custom_css != "")
<div style="--delay: {{ $initial++ }}s" class="button-entrance"><a id="{{ $link->id }}" class="button-click button-hover icon-hover" style="{{ $link->custom_css }}" rel="noopener noreferrer nofollow noindex" href="{{ $link->link }}" @if((UserData::getData($userinfo->id, 'links-new-tab') != false))target="_blank"@endif ><img alt="{{ $link->name }}" class="icon hvr-icon" src="@if(file_exists(base_path("assets/favicon/icons/").localIcon($link->id))){{url('assets/favicon/icons/'.localIcon($link->id))}}@else{{getFavIcon($link->id)}}@endif" onerror="this.onerror=null; this.src='{{asset('assets/linkstack/icons/website.svg')}}';">{{ $link->title }}</a></div>
<div style="--delay: {{ $initial++ }}s" class="button-entrance"><a id="{{ $link->id }}" class="button button-custom_website button-click button-hover icon-hover" style="{{ $link->custom_css }}" rel="noopener noreferrer nofollow noindex" href="{{ $link->link }}" @if((UserData::getData($userinfo->id, 'links-new-tab') != false))target="_blank"@endif ><img alt="{{ $link->name }}" class="icon hvr-icon" src="@if(file_exists(base_path("assets/favicon/icons/").localIcon($link->id))){{url('assets/favicon/icons/'.localIcon($link->id))}}@else{{getFavIcon($link->id)}}@endif" onerror="this.onerror=null; this.src='{{asset('assets/linkstack/icons/website.svg')}}';">{{ $link->title }}</a></div>
@break
@endif
@default

View File

@ -80,6 +80,19 @@ if(Auth::user()->id == $userinfo->id){
</div>
</li>
@endif
@if(!$isUser and $userinfo->role != 'admin')
<li id="linkstack-admin-bar-defaultsp">
@if($userinfo->role == 'vip')
<a class="ab-item" href="{{route('verifyCheckUser', ['verify' => 'user', 'id' => $userinfo->id]);}}">
<svg style="top:5px;position:relative;" xmlns="http://www.w3.org/2000/svg" height="30" width="30" viewBox="0 0 350 512"><path fill="#f0301e" d="M148.318 339.734c-9.872-6.385-17.162-14.661-22.502-24.945-24.141 6.892-45.916 2.799-63.712-15.055-17.662-17.719-21.743-39.341-14.888-63.082C1.827 213.511.832 150.051 47.123 125.64c-6.813-23.82-2.936-45.607 14.941-63.466 17.733-17.715 39.283-21.87 63.403-14.97 12.205-21.609 30.238-34.318 55.597-34.289 25.157.028 43.112 12.552 55.366 34.228 24.033-6.869 45.778-2.839 63.585 15.104 17.645 17.779 21.659 39.38 14.824 63.116 45.417 23.578 46 86.753.043 111.052 6.798 23.843 2.901 45.626-14.998 63.468-17.746 17.69-39.311 21.819-63.461 14.884-9.296 17.366-23.263 28.952-42.682 33.063-15.981 3.383-31.116.675-45.424-8.094m44.037-122.589l33.372 33.511 24.901-25.162-45.585-45.032 44.783-44.014-24.731-25.203-44.89 45.258-43.587-44.332-25.288 24.678 45.226 44.8-44.559 43.814 24.977 25.155 44.405-45.082 10.977 11.61z"/><path fill="#fefdfd" d="M192.089 216.912l-10.711-11.377-44.405 45.082-24.977-25.155 44.559-43.814-45.226-44.8 25.288-24.678 43.587 44.332 44.89-45.258 24.731 25.203-44.783 44.014 45.585 45.032-24.901 25.162-33.638-33.744z"/></svg>
</a>
@else
<a class="ab-item" href="{{route('verifyCheckUser', ['verify' => 'vip', 'id' => $userinfo->id]);}}">
<svg style="top:5px;position:relative;" xmlns="http://www.w3.org/2000/svg" height="30" width="30" viewBox="0 0 350 512"><path fill="#1CAC78" d="M315.781 241.008c.091.153.181.305-.07.893-4.665 3.842-1.388 8.16-1.639 12.026-.577 8.9-.804 17.822-1.173 26.735-11.409 26.671-42.123 44.84-76.299 34.094-12.105 21.438-30.064 34.219-55.381 34.261-25.297.042-43.281-12.605-55.707-34.304-11.566 3.608-23.199 4.461-34.937 1.252-23.151-6.328-37.968-21.15-44.461-44.158-2.988-10.587-2.368-21.345.407-31.88.782-2.968.006-4.047-2.319-5.454-22.857-13.836-33.473-34.2-30.93-60.766 1.187-12.401 5.59-23.861 15.203-32.634L46.82 124.08c-.04-.157-.435-1.732-.536-3.907 4.172-7.605.812-14.996 1.326-22.185.043-.599-1.7-1.325-2.613-1.992.863-9.097 4.426-17.161 10.118-24.828 3.078-.394 5.489 4.931 8.22-.218.113-1.018-.109-1.986-.114-3.249l5.439-7.557c.008.017-.633-1.308-1.274-2.633 0 0 .083.054.384.09.608-.425.914-.885 1.22-1.345 17.06-12.62 35.8-14.991 56.069-9.119 3.342-4.577 6.377-9.536 10.181-13.811 20.699-23.259 55.789-27.717 80.509-9.45 8.177 6.042 14.499 14.593 22.384 22.735 22.04-5.889 43.011-2.211 61.41 15.536 18.695 18.032 19.652 39.543 15.672 63.668l3.889 2.278c31.648 18.919 39.984 61.207 17.263 90.134-4.799 6.109-11.69 10.574-18.199 15.56-2.079.42-4.662.857-4.848 1.778-.393 1.951-1.83 5.276 2.461 5.444m-86.803-116.516l-68.172 70.225-32.758-31.453c-2.706-2.662-4.39-3.254-7.183-.112-4.198 4.723-8.905 8.993-13.365 13.486l-9.373 9.608 62.678 60.889 104.155-106.212-27.15-25.74-8.833 9.309z"/><path fill="#42ef28" d="M313.103 280.406c.165-8.658.392-17.581.969-26.48.251-3.865-3.026-8.184 1.614-11.761 3.136 9.303 3.01 18.764.267 28.232l-2.849 10.009z"/><path fill="#33e919" d="M67.096 57.645c.932 1.192 1.573 2.517 1.565 2.5l-5.441 7.559c-.219.296-.222.301-.472.484-.082 1.059.085 1.935.253 2.812-2.396 5.1-4.807-.225-7.588-.003 3.545-4.415 7.47-8.817 11.684-13.352z"/><path fill="#33f017" d="M44.755 96.342c1.155.321 2.897 1.047 2.854 1.646-.514 7.188 2.847 14.58-1.31 21.796-.781-7.558-1.284-15.327-1.545-23.442M46 102.14v7.776l.722-.007V98.772c-.469 1.699-.593 2.147-.722 3.368z"/><path fill="#42ef28" d="M315.787 240.643c-4.298.197-2.861-3.128-2.468-5.079.186-.921 2.769-1.358 4.502-1.719-2.209 1.718-3.657 3.508-2.034 6.798z"/><path fill="#33e919" d="M68.738 56.302c-.054.414-.36.874-.961 1.25.04-.457.374-.83.961-1.25z"/><path fill="#fefffe" d="M229.224 124.238l8.586-9.056 27.15 25.74-104.155 106.212-62.678-60.889 9.373-9.608c4.461-4.492 9.167-8.762 13.365-13.486 2.792-3.142 4.477-2.55 7.183.112l32.758 31.453 68.418-70.479z"/><path fill="#33e919" d="M63.002 67.998c.224.966.446 1.934.333 2.952C63 71 63 71 63.001 70.625l-.004-2.62z"/><path d="M62.746 68.188c.252.566.253 1.315.254 2.437-.169-.502-.336-1.379-.254-2.437zm-16.743 33.566c.126-.835.25-1.283.719-2.982v11.137l-.722.007.002-8.162z" fill="#1CAC78"/></svg>
</a>
@endif
</li>
@endif
</ul>
<ul id="linkstack-admin-bar-top-secondary" class="ab-top-secondary ab-top-menu">
<li id="linkstack-admin-bar-my-account" class="menupop with-avatar">

View File

@ -15,7 +15,7 @@
@if(env('CUSTOM_META_TAGS') == 'true')
@include('layouts.meta')
@else
<meta name="description" content="{{ $userinfo->littlelink_description }}">
<meta name="description" content="{{ strip_tags($userinfo->littlelink_description) }}">
<meta name="author" content="{{ $userinfo->name }}">
<meta name="viewport" content="width=device-width, initial-scale=1">
@endif

View File

@ -22,98 +22,140 @@
<h2 class="mb-4 card-header"><i class="bi bi-person"> {{__('messages.Manage Users')}}</i></h2>
<div class="card-body p-0 p-md-3">
<div id="select-active" class="d-none">
<h5 class="mb-2">{{__('messages.Select Action')}}:</h3>
<button class="mb-3 btn btn-danger rounded-pill btn-sm">
<span class="btn-inner">
<svg class="icon-16" width="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2871 5.24297C20.6761 5.24297 21 5.56596 21 5.97696V6.35696C21 6.75795 20.6761 7.09095 20.2871 7.09095H3.71385C3.32386 7.09095 3 6.75795 3 6.35696V5.97696C3 5.56596 3.32386 5.24297 3.71385 5.24297H6.62957C7.22185 5.24297 7.7373 4.82197 7.87054 4.22798L8.02323 3.54598C8.26054 2.61699 9.0415 2 9.93527 2H14.0647C14.9488 2 15.7385 2.61699 15.967 3.49699L16.1304 4.22698C16.2627 4.82197 16.7781 5.24297 17.3714 5.24297H20.2871ZM18.8058 19.134C19.1102 16.2971 19.6432 9.55712 19.6432 9.48913C19.6626 9.28313 19.5955 9.08813 19.4623 8.93113C19.3193 8.78413 19.1384 8.69713 18.9391 8.69713H5.06852C4.86818 8.69713 4.67756 8.78413 4.54529 8.93113C4.41108 9.08813 4.34494 9.28313 4.35467 9.48913C4.35646 9.50162 4.37558 9.73903 4.40755 10.1359C4.54958 11.8992 4.94517 16.8102 5.20079 19.134C5.38168 20.846 6.50498 21.922 8.13206 21.961C9.38763 21.99 10.6811 22 12.0038 22C13.2496 22 14.5149 21.99 15.8094 21.961C17.4929 21.932 18.6152 20.875 18.8058 19.134Z" fill="currentColor"></path>
</svg>
</span>
Delete
</button>
</div>
<livewire:user-table />
<a href="{{ url('') }}/admin/new-user">+ {{__('messages.Add new user')}}</a>
<script type="text/javascript">
// Function to confirm and delete users
var elems = document.getElementsByClassName('confirmation');
var confirmIt = function (e) {
var confirmIt = function(e) {
e.preventDefault();
if (confirm("{{ __('messages.confirm.delete.user') }}")) {
var userId = this.getAttribute('data-id');
this.innerHTML = '<div class="d-flex justify-content-center"><div class="spinner-border spinner-border-sm text-primary" role="status"><span class="visually-hidden">Loading...</span></div></div>';
deleteUserData(userId);
}
};
var deleteUserData = function(userId) {
var url = "{{ route('deleteTableUser', ['id' => ':id']) }}".replace(':id', userId);
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.open('POST', `{{ route('deleteTableUser', ['id' => ':id']) }}`.replace(':id', userId), true);
xhr.setRequestHeader('X-CSRF-TOKEN', '{{ csrf_token() }}');
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.onreadystatechange = function () {
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
refreshLivewireTable();
}
};
var data = JSON.stringify({ id: userId });
xhr.send(data);
xhr.send(JSON.stringify({ id: userId }));
};
// Function to handle user actions (verification and blocking)
var handleUserClick = function(e) {
e.preventDefault();
var userId = this.getAttribute('data-id');
this.innerHTML = '<div class="d-flex justify-content-center"><div class="spinner-border spinner-border-sm text-primary" role="status"><span class="visually-hidden">Loading...</span></div></div>';
sendUserAction(userId);
};
var sendUserAction = function(userId) {
var xhr = new XMLHttpRequest();
xhr.open('GET', userId, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
refreshLivewireTable();
}
};
xhr.send();
};
// Attach click event listeners to elements with class 'confirmation', 'user-email', and 'user-block'
var attachClickEventListeners = function(className, handler) {
var elems = document.getElementsByClassName(className);
for (var i = 0, l = elems.length; i < l; i++) {
elems[i].addEventListener('click', handler, false);
}
};
// Function to refresh the Livewire table
var refreshLivewireTable = function () {
var refreshLivewireTable = function() {
Livewire.components.getComponentsByName('user-table')[0].$wire.$refresh()
};
// Attach click event listeners to elements with class 'confirmation'
for (var i = 0, l = elems.length; i < l; i++) {
elems[i].addEventListener('click', confirmIt, false);
}
</script>
<script type="text/javascript">
// Function to handle user verification requests
var elems = document.getElementsByClassName('user-email');
var handleUserClick = function (e) {
e.preventDefault();
var userId = this.getAttribute('data-id');
sendVerificationRequest(userId);
};
var sendVerificationRequest = function(userId) {
var xhr = new XMLHttpRequest();
xhr.open('GET', userId, true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
refreshLivewireTable();
}
};
xhr.send();
};
// Attach click event listeners to elements with class 'user-email'
for (var i = 0, l = elems.length; i < l; i++) {
elems[i].addEventListener('click', handleUserClick, false);
}
</script>
<script type="text/javascript">
// Function to handle user blocking
var elems = document.getElementsByClassName('user-block');
var handleUserClick = function (e) {
e.preventDefault();
var userId = this.getAttribute('data-id');
sendVerificationRequest(userId);
};
var sendVerificationRequest = function(userId) {
var xhr = new XMLHttpRequest();
xhr.open('GET', userId, true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
refreshLivewireTable();
}
};
xhr.send();
};
// Attach click event listeners to elements with class 'user-block'
for (var i = 0, l = elems.length; i < l; i++) {
elems[i].addEventListener('click', handleUserClick, false);
}
</script>
attachClickEventListeners('confirmation', confirmIt);
attachClickEventListeners('user-email', handleUserClick);
attachClickEventListeners('user-block', handleUserClick);
</script>
{{-- <script type="text/javascript">
// Get the delete button div
var deleteButtonDiv = document.getElementById('select-active');
// Get all checkboxes
var checkboxes = document.querySelectorAll('.form-check-input');
// Function to check if at least one checkbox is selected
var isAnyCheckboxSelected = function() {
for (var i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].checked) {
return true;
}
}
return false;
};
// Function to show or hide the delete button div
var showOrHideDeleteButton = function() {
if (isAnyCheckboxSelected()) {
deleteButtonDiv.classList.remove('d-none');
} else {
setTimeout(function() {
deleteButtonDiv.classList.add('d-none');
});
}
};
// Add event listener to checkboxes
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].addEventListener('change', showOrHideDeleteButton);
}
// Get the delete button
var deleteButton = deleteButtonDiv.querySelector('button');
// Function to delete selected users
var deleteSelectedUsers = function() {
for (var i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].checked && checkboxes[i].getAttribute('data-id') !== null) {
var userId = checkboxes[i].getAttribute('data-id');
// Find the corresponding <a> element
var deleteButton = document.querySelector('a[data-id="' + userId + '"]');
// If the <a> element exists, add loading spinner to it
if (deleteButton) {
deleteButton.innerHTML = '<div class="d-flex justify-content-center"><div class="spinner-border spinner-border-sm text-primary" role="status"><span class="visually-hidden">Loading...</span></div></div>';
}
deleteUserData(userId);
}
}
};
// Add event listener to delete button
deleteButton.addEventListener('click', deleteSelectedUsers);
</script> --}}
</div>
</section>

View File

@ -229,14 +229,13 @@
$url = $_SERVER['REQUEST_URI'];
if( strpos( $url, "no_page_name" ) == true ) echo '<span style="color:#FF0000; font-size:120%;">You do not have a Page URL</span>'; ?>
<br>
<label>{{__('messages.Page URL')}}</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="d-none d-md-block input-group-text">{{ url('') }}/@</div>
<div class="d-md-none input-group-text">@</div>
</div>
<input type="text" class="form-control" name="littlelink_name" value="{{ $page->littlelink_name ?? '' }}" required>
<label for="littlelink_name" class="form-label">{{__('messages.Page URL')}}</label>
<div class="input-group mb-3 has-validation">
<span class="input-group-text" id="basic-addon3">{{str_replace(['http://', 'https://'], '', url(''))}}/@</span>
<input type="littlelink_name" class="form-control" id="littlelink_name" name="littlelink_name" aria-describedby="littlelink_name" value="{{ $page->littlelink_name ?? '' }}" :value="old('littlelink_name')" required autofocus >
</div>
<script>var exceptionvar = " value="{{ $page->littlelink_name }}";</script>
@include('auth.url-validation')
<label style="margin-top:15px">{{__('messages.Display name')}}</label>
<div class="input-group">
@ -280,7 +279,7 @@
<label class="form-check-label" for="tablinks">{{__('messages.Enable')}}</label>
</div>
<button type="submit" class="mt-3 ml-3 btn btn-primary">{{__('messages.Save')}}</button>
<button id="submit-btn" type="submit" class="mt-3 ml-3 btn btn-primary">{{__('messages.Save')}}</button>
</form>
@if(env('ALLOW_USER_HTML') === true)

View File

@ -28,6 +28,7 @@ if(config('advanced-config.forgot_password_url') != '') {
$forgot_password = "/forgot-password";
}
Route::post('/validate-handle', [RegisteredUserController::class, 'validateHandle']);
if(env('ALLOW_REGISTRATION') or $register !== '/register') {
Route::get($register, [RegisteredUserController::class, 'create'])
->middleware('guest')

View File

@ -1,6 +1,8 @@
<?php
use App\Http\Controllers\UserController;
Route::middleware('disableCookies')->group(function () {
$host = request()->getHost();
$customConfigs = config('advanced-config.custom_domains', []);
@ -43,3 +45,5 @@ if (env('HOME_URL') != '') {
Route::get('/', [App\Http\Controllers\HomeController::class, 'home'])->name('home');
}
}
});

View File

@ -68,13 +68,13 @@ Route::get('/panel/diagnose', function () {
//Public route
$custom_prefix = config('advanced-config.custom_url_prefix');
Route::get('/going/{id?}', [UserController::class, 'clickNumber'])->where('link', '.*')->name('clickNumber');
Route::get('/going/{id?}', [UserController::class, 'clickNumber'])->where('link', '.*')->name('clickNumber')->middleware('disableCookies');
Route::get('/info/{id?}', [AdminController::class, 'redirectInfo'])->name('redirectInfo');
if($custom_prefix != ""){Route::get('/' . $custom_prefix . '{littlelink}', [UserController::class, 'littlelink'])->name('littlelink');}
Route::get('/@{littlelink}', [UserController::class, 'littlelink'])->name('littlelink');
Route::get('/pages/'.strtolower(footer('Terms')), [AdminController::class, 'pagesTerms'])->name('pagesTerms');
Route::get('/pages/'.strtolower(footer('Privacy')), [AdminController::class, 'pagesPrivacy'])->name('pagesPrivacy');
Route::get('/pages/'.strtolower(footer('Contact')), [AdminController::class, 'pagesContact'])->name('pagesContact');
Route::get('/@{littlelink}', [UserController::class, 'littlelink'])->name('littlelink')->middleware('disableCookies');
Route::get('/pages/'.strtolower(footer('Terms')), [AdminController::class, 'pagesTerms'])->name('pagesTerms')->middleware('disableCookies');
Route::get('/pages/'.strtolower(footer('Privacy')), [AdminController::class, 'pagesPrivacy'])->name('pagesPrivacy')->middleware('disableCookies');
Route::get('/pages/'.strtolower(footer('Contact')), [AdminController::class, 'pagesContact'])->name('pagesContact')->middleware('disableCookies');
Route::get('/theme/@{littlelink}', [UserController::class, 'theme'])->name('theme');
Route::get('/vcard/{id?}', [UserController::class, 'vcard'])->name('vcard');
Route::get('/u/{id?}', [UserController::class, 'userRedirect'])->name('userRedirect');
@ -82,7 +82,7 @@ Route::get('/u/{id?}', [UserController::class, 'userRedirect'])->name('userRedir
Route::get('/report', function () {return view('report');});
Route::post('/report', [UserController::class, 'report'])->name('report');
Route::get('/demo-page', [App\Http\Controllers\HomeController::class, 'demo'])->name('demo');
Route::get('/demo-page', [App\Http\Controllers\HomeController::class, 'demo'])->name('demo')->middleware('disableCookies');
}
@ -152,7 +152,8 @@ Route::group([
Route::get('/admin/links/{id}', [AdminController::class, 'showLinksUser'])->name('showLinksUser');
Route::get('/admin/deleteLink/{id}', [AdminController::class, 'deleteLinkUser'])->name('deleteLinkUser');
Route::get('/admin/users/block/{block}/{id}', [AdminController::class, 'blockUser'])->name('blockUser');
Route::get('/admin/users/verify/-{verify}/{id}', [AdminController::class, 'verifyUser'])->name('verifyUser');
Route::get('/admin/users/verify/{verify}/{id}', [AdminController::class, 'verifyCheckUser'])->name('verifyCheckUser');
Route::get('/admin/users/verify-mail/{verify}/{id}', [AdminController::class, 'verifyUser'])->name('verifyUser');
Route::get('/admin/edit-user/{id}', [AdminController::class, 'showUser'])->name('showUser');
Route::post('/admin/edit-user/{id}', [AdminController::class, 'editUser'])->name('editUser');
Route::get('/admin/new-user', [AdminController::class, 'createNewUser'])->name('createNewUser')->middleware('max.users');

View File

@ -1 +1 @@
4.6.1
4.7.1