This commit is contained in:
Joey Kimsey
2024-12-18 08:56:58 -05:00
parent 06bd337d36
commit 59279c8349
23 changed files with 339 additions and 51 deletions

View File

@ -39,7 +39,7 @@ if ( ! defined( 'CONFIG_DIRECTORY' ) ) {
define( 'CANARY_SECURE_HASH', 'd73ed7591a30f0ca7d686a0e780f0d05' );
# Tempus Project Core
define( 'APP_NAME', 'All The Bookmarks');
define( 'TP_DEFAULT_LOGO', 'images/logo.png');
define( 'TP_DEFAULT_LOGO', 'images/logo180.png');
// Check
define( 'MINIMUM_PHP_VERSION', 8.1);
// Cookies

View File

@ -310,3 +310,8 @@ body {
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
background: linear-gradient(to right, #2c2c2c, #1e1e1e, #1e1e1e);
}
.bookmark-card.dragging {
opacity: 0.7;
cursor: move; /* Show a move cursor when dragging */
}

View File

@ -56,6 +56,9 @@ class Bookmarks extends Controller {
Components::set( 'userFolderTabs', $userFolderTabsView );
Components::set( 'SITE_URL', Routes::getAddress() );
Views::raw( $tabsView );
Components::append( 'TEMPLATE_JS_INCLUDES', Template::parse('<script language="JavaScript" crossorigin="anonymous" type="text/javascript" src="{ROOT_URL}app/plugins/bookmarks/js/bookmarks.js"></script>' ) );
$options = Views::simpleView( 'bookmarks.nav.viewOptions' );
Components::set( 'VIEW_OPTIONS', $options );
}
public function index() {
@ -71,6 +74,7 @@ class Bookmarks extends Controller {
$folderObject->ID = $folder->ID;
$folderObject->title = $folder->title;
$folderObject->color = $folder->color;
$folderObject->uuid = $folder->uuid;
$folderObject->bookmarkListRows = Views::simpleView( 'bookmarks.components.bookmarkListRows', $folderObject->bookmarks );
$panelArray[] = $folderObject;
}

View File

@ -0,0 +1,186 @@
document.addEventListener('DOMContentLoaded', () => {
// Handle all bootstrap popover inits
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
const masonryContainer = document.querySelector('[data-masonry]');
if ( ! masonryContainer ) {
return;
}
const masonryInstance = new Masonry(masonryContainer, {
columnHeight: '.accordion',
percentPosition: true
});
const updateMasonryLayout = () => masonryInstance.layout();
masonryContainer.addEventListener('hidden.bs.collapse', updateMasonryLayout);
masonryContainer.addEventListener('shown.bs.collapse', updateMasonryLayout);
const observer = new MutationObserver(() => {
updateMasonryLayout();
});
// Observe all cards for changes in the DOM
document.querySelectorAll('.card').forEach((card) => {
observer.observe(card, { childList: true, subtree: true });
});
// Initialize all toggle functions
toggleVisibility('editModeSwitch', 'edit-mode');
toggleVisibility('showArchivedSwitch', 'link-archived');
toggleVisibility('showHiddenSwitch', 'link-hidden');
toggleVisibility('archiveButtonSwitch', 'btn-archive');
toggleVisibility('visibilityButtonSwitch', 'btn-hideshow');
toggleVisibility('privacyButtonSwitch', 'btn-publish');
toggleVisibility('addButtonSwitch', 'btn-addlink');
toggleVisibility('shareButtonSwitch', 'btn-share');
});
// Function to handle showing or hiding elements based on the checkbox state
function toggleVisibility(switchId, className) {
const switchElement = document.getElementById(switchId);
const elementsToToggle = document.querySelectorAll(`.${className}`);
// Listen for changes to the checkbox
switchElement.addEventListener('change', () => {
if (switchElement.checked) {
elementsToToggle.forEach(element => {
element.style.display = ''; // Show the element (default display)
});
} else {
elementsToToggle.forEach(element => {
element.style.display = 'none'; // Hide the element
});
}
});
// Trigger the toggle initially to set the correct visibility on page load
switchElement.dispatchEvent(new Event('change'));
}
document.addEventListener('DOMContentLoaded', function () {
const bookmarkSort = document.getElementById('bookmarkSort');
let draggingElement = null;
let placeholder = null;
let initialX = 0;
let initialY = 0;
let offsetX = 0;
let offsetY = 0;
// Function to handle the drag start
const handleDragStart = (e, element) => {
draggingElement = element;
// Create a placeholder to maintain layout
placeholder = document.createElement('div');
placeholder.style.height = `${draggingElement.offsetHeight}px`;
placeholder.style.marginBottom = getComputedStyle(draggingElement).marginBottom;
placeholder.classList.add('placeholder');
draggingElement.parentNode.insertBefore(placeholder, draggingElement);
const rect = element.getBoundingClientRect();
initialX = e.clientX;
initialY = e.clientY;
offsetX = e.clientX - rect.left;
offsetY = e.clientY - rect.top;
// Prevent the element from moving in the normal flow
element.classList.add('dragging');
element.style.position = 'absolute';
draggingElement.style.width = `${rect.width}px`; // Preserve width
draggingElement.style.height = `${rect.height}px`; // Preserve height
element.style.zIndex = 1000; // Bring the element on top of others
element.style.left = `${rect.left}px`;
element.style.top = `${rect.top}px`;
e.preventDefault();
};
// Function to handle dragging movement
const handleDragMove = (e) => {
if (draggingElement) {
const dx = e.clientX - initialX + offsetX;
const dy = e.clientY - initialY + offsetY;
draggingElement.style.left = `${dx}px`;
draggingElement.style.top = `${dy}px`;
}
};
// Function to handle the drag end
const handleDragEnd = () => {
if (draggingElement) {
const rect = draggingElement.getBoundingClientRect();
// Reset the position styles of the dragged element
draggingElement.style.position = '';
draggingElement.style.zIndex = ''; // Reset z-index
draggingElement.style.left = '';
draggingElement.style.top = '';
draggingElement.classList.remove('dragging');
// Re-insert the element back into the DOM properly
const closestElement = getClosestElement(rect.left, rect.top);
console.error(closestElement.id);
if (closestElement) {
bookmarkSort.insertBefore(draggingElement, closestElement);
console.log( 'insertBefore' );
} else {
bookmarkSort.appendChild(draggingElement);
console.log( 'append' );
}
// Reorder the elements after the drag ends
reorderElements();
draggingElement = null;
}
};
// Function to reorder the elements inside the container
const reorderElements = () => {
const elements = Array.from(bookmarkSort.children);
const sortedIds = elements.map(element => element.id);
console.log('New order:', sortedIds);
};
// Function to handle the drop event
const handleDrop = (e) => {
e.preventDefault();
};
// Helper function to find the closest element based on mouse position
const getClosestElement = (x, y) => {
const elements = Array.from(bookmarkSort.children).filter(
(el) => el !== placeholder && el !== draggingElement
);
let closest = null;
let closestDistance = Number.POSITIVE_INFINITY;
elements.forEach((child) => {
const rect = child.getBoundingClientRect();
const distance = Math.abs(rect.top - y);
if (distance < closestDistance) {
closestDistance = distance;
closest = child;
}
});
return closest;
};
// Attach event listeners to all .card-header elements for dragging
Array.from(document.querySelectorAll('.mover-arrow')).forEach(cardHeader => {
cardHeader.addEventListener('mousedown', (e) => handleDragStart(e, cardHeader.closest('.bookmark-card')));
});
// Handle the dragging process
document.addEventListener('mousemove', handleDragMove);
document.addEventListener('mouseup', handleDragEnd);
bookmarkSort.addEventListener('dragover', handleDrop); // Listen for the drop event to update the order
});

View File

@ -322,15 +322,6 @@ class Bookmarks extends DatabaseModel {
return $finalUrl;
// $headers = get_headers( $url, 1 );
$headers = @get_headers($url, 1);
if ( $headers === false ) {
@ -358,35 +349,33 @@ class Bookmarks extends DatabaseModel {
$instance->iconHtml = '<i class="fa fa-fw fa-link"></i>';
} else {
if (strpos($instance->icon, 'http') !== false) {
$instance->iconHtml = '<img src="' . $instance->icon .'" />';
$instance->iconHtml = '<img src="' . $instance->icon .'">';
} else {
$instance->iconHtml = '<img src="' . $base_url . ltrim( $instance->icon, '/' ) .'" />';
$instance->iconHtml = '<img src="' . $base_url . ltrim( $instance->icon, '/' ) .'">';
}
}
if ( $instance->privacy == 'private' ) {
$instance->privacyBadge = '<span class="mx-2 translate-center badge bg-success rounded-pill">Private</span>';
} else {
$instance->privacyBadge = '<span class="mx-2 translate-center badge bg-danger rounded-pill">Public</span>';
}
if ( $instance->privacy == 'private' ) {
$instance->publish = '
<a href="{ROOT_URL}bookmarks/publish/'.$instance->ID.'" class="btn btn-sm btn-outline-danger">
<i class="fa fa-fw fa-lock"></i>
</a>';
} else {
$instance->privacyBadge = '<span class="mx-2 translate-center badge bg-danger rounded-pill">Public</span>';
$instance->publish = '
<a href="{ROOT_URL}bookmarks/retract/'.$instance->ID.'" class="btn btn-sm btn-outline-secondary">
<i class="fa fa-fw fa-lock"></i>
</a>';
}
if ( empty( $instance->hiddenAt ) ) {
$instance->hidden_class = '';
$instance->hideBtn = '
<a href="{ROOT_URL}bookmarks/hideBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-warning">
<i class="fa fa-fw fa-eye"></i>
</a>';
} else {
$instance->hidden_class = 'link-hidden';
$instance->hideBtn = '
<a href="{ROOT_URL}bookmarks/showBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-secondary">
<i class="fa fa-fw fa-eye"></i>
@ -394,11 +383,13 @@ class Bookmarks extends DatabaseModel {
}
if ( empty( $instance->archivedAt ) ) {
$instance->archived_class = '';
$instance->archiveBtn = '
<a href="{ROOT_URL}bookmarks/archiveBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-info">
<i class="fa fa-fw fa-briefcase"></i>
</a>';
} else {
$instance->archived_class = 'link-archived';
$instance->archiveBtn = '
<a href="{ROOT_URL}bookmarks/unarchiveBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-secondary">
<i class="fa fa-fw fa-briefcase"></i>

View File

@ -1,10 +1,31 @@
{LOOP}
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6 bookmark-card">
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6 bookmark-card" id="folderCard{ID}">
<div class="card m-3 accordion">
<div class="accordion-item">
<div class="card-header accordion-header text-center bg-{color} context-main" data-bs-target="#Collapse{ID}" data-bs-toggle="collapse" aria-expanded="true" aria-controls="Collapse{ID}">
<span class="h4 text-center">{title}</span>
<div class="card-header accordion-header text-center bg-{color} context-main">
<span class="h4 float-left mover-arrow"><i class="fa-solid fa-arrows-up-down-left-right"></i></span>
<span class="h4 text-center mx-5" data-bs-target="#Collapse{ID}" data-bs-toggle="collapse" aria-expanded="true" aria-controls="Collapse{ID}">{title}</span>
<a class="btn btn-sm btn-primary btn-rounded float-end btn-share" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<i class="fa fa-fw fa-share"></i>
</a>
</div>
<div class="modal fade context-main" id="linkShare{ID}" tabindex="-1" style="display: none;" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header context-main-bg">
<h1 class="modal-title fs-5">Share Url</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body context-second-bg">
<p>This link can be shared with anyone and will show display info as long as it is set to public privacy.</p>
<input type="text" value="{SITE_URL}shared/folder/{uuid}" name="input" class="w-100 form-control" id="shareFolderUrlInput{ID}">
<button class="btn btn-secondary mt-2" onclick="copyElementText('shareFolderUrlInput{ID}')">Copy</button>
</div>
</div>
</div>
</div>
<div id="Collapse{ID}" class="accordion-collapse collapse w-100 position-relative show">
<div class="card-body accordion-body p-2 context-second-bg">
<ul class="list-group">
@ -12,12 +33,12 @@
</ul>
</div>
<div class="card-footer d-flex justify-content-center align-items-center context-main-bg">
<a href="{ROOT_URL}bookmarks/createBookmark/{ID}" class="btn btn-sm btn-success"><i class="fa fa-fw fa-plus"></i></a></td>
<a href="{ROOT_URL}bookmarks/createBookmark/{ID}" class="btn btn-sm btn-success btn-addlink"><i class="fa fa-fw fa-plus"></i></a></td>
<span class="ms-auto">
<a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="btn btn-sm btn-outline-primary"><i class="fa fa-fw fa-list"></i></a>
<a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-outline-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
<a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
<a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-warning edit-mode"><i class="fa fa-fw fa-pencil"></i></a></td>
<a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-danger edit-mode"><i class="fa fa-fw fa-trash"></i></a></td>
</span>
</div>
</div>

View File

@ -1,14 +1,30 @@
{LOOP}
<li class="list-group-item context-main-b bg-{color}">
<li class="list-group-item context-main-b bg-{color} {hidden_class} {archived_class}">
<a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>
<span class="float-end">
{hideBtn}
{archiveBtn}
{publish}
<a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a>
<span class="btn-hideshow">{hideBtn}</span>
<span class="btn-archive">{archiveBtn}</span>
<span class="btn-publish">{publish}</span>
<a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-warning edit-mode"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-danger edit-mode"><i class="fa fa-fw fa-trash"></i></a>
<a class="btn btn-sm btn-primary btn-share" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<i class="fa fa-fw fa-share"></i>
</a>
<div class="modal fade" id="linkShare{ID}" tabindex="-1" style="display: none;" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Share Url</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="text" value="{SITE_URL}shared/link/{uuid}" name="input" class="w-100 form-control" id="shareLinkUrlInput{ID}">
<button class="btn btn-secondary mt-2" onclick="copyElementText('shareLinkUrlInput{ID}')">Copy</button>
</div>
</div>
</div>
</div>
</span>
</li>
{/LOOP}

View File

@ -9,7 +9,7 @@
<span class="text-center px-5">{privacyBadge}</span>
<span class="h4 text-center px-5">{title}</span>
</span>
<a class="btn btn-sm btn-primary btn-rounded" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<a class="btn btn-sm btn-primary btn-rounded btn-share" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<i class="fa fa-fw fa-share"></i>
</a>
</div>

View File

@ -4,7 +4,7 @@
<a href="{url}"> {title}</a>{privacyBadge}
<span class="float-end">
{publish}
<a class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<a class="btn btn-sm btn-primary btn-share" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<i class="fa fa-fw fa-share"></i>
</a>
<div class="modal fade" id="linkShare{ID}" tabindex="-1" style="display: none;" aria-hidden="true">

View File

@ -12,6 +12,7 @@
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Bookmarks</legend>
{VIEW_OPTIONS}
<hr>
<div class="row g-3" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
{folderPanels}

View File

@ -10,7 +10,7 @@
<tr>
<th class="text-center" style="width: 80%">Title</th>
<th style="width: 20%">
<input type="checkbox" onchange="checkAll(this)" name="check.g" value="BF_[]"/>
<input type="checkbox" onchange="checkAll(this)" name="check.g" value="BF_[]">
</th>
</tr>
</thead>

View File

@ -0,0 +1,59 @@
<div class="container mt-3">
<div class="card">
<div class="card-header">
<a class="btn btn-link text-decoration-none w-100" data-bs-toggle="collapse" href="#filterOptions" role="button" aria-expanded="false" aria-controls="filterOptions">
<strong>Filter Options</strong>
</a>
</div>
<div id="filterOptions" class="collapse">
<div class="card-body">
<!-- Edit Mode -->
<div class="d-flex align-items-center border p-2 rounded mb-3">
<div class="me-3 fw-bold">Edit Mode:</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="editModeSwitch">
<label class="form-check-label" for="editModeSwitch"></label>
</div>
</div>
<!-- Status Filters -->
<div class="d-flex align-items-center border p-2 rounded mb-3">
<div class="me-3 fw-bold">Status:</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" id="showArchivedSwitch">
<label class="form-check-label" for="showArchivedSwitch">Show Archived</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="showHiddenSwitch">
<label class="form-check-label" for="showHiddenSwitch">Show Hidden</label>
</div>
</div>
<!-- Buttons Filters -->
<div class="d-flex align-items-center border p-2 rounded mb-3">
<div class="me-3 fw-bold">Buttons:</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" id="archiveButtonSwitch">
<label class="form-check-label" for="archiveButtonSwitch">Archive Button</label>
</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" id="visibilityButtonSwitch">
<label class="form-check-label" for="visibilityButtonSwitch">Visibility Button</label>
</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" id="privacyButtonSwitch">
<label class="form-check-label" for="privacyButtonSwitch">Privacy Button</label>
</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" id="shareButtonSwitch">
<label class="form-check-label" for="shareButtonSwitch">Share Button</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="addButtonSwitch">
<label class="form-check-label" for="addButtonSwitch">Add Button</label>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -14,7 +14,7 @@
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.f" value="F_[]"/>
<INPUT type="checkbox" onchange="checkAll(this)" name="check.f" value="F_[]">
</th>
</tr>
</thead>

View File

@ -64,8 +64,8 @@
<div class="card-footer text-center">
{ADMIN}
<form action="{ROOT_URL}admin/feedback/delete" method="post">
<INPUT type="hidden" name="F_" value="{ID}"/>
<input type="hidden" name="token" value="{TOKEN}" />
<INPUT type="hidden" name="F_" value="{ID}">
<input type="hidden" name="token" value="{TOKEN}">
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
{/ADMIN}

View File

@ -13,7 +13,7 @@
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.f" value="F_[]"/>
<INPUT type="checkbox" onchange="checkAll(this)" name="check.f" value="F_[]">
</th>
</tr>
</thead>

View File

@ -60,8 +60,8 @@
<div class="card-footer text-center">
{ADMIN}
<form action="{ROOT_URL}admin/feedback/delete" method="post">
<INPUT type="hidden" name="F_" value="{ID}"/>
<input type="hidden" name="token" value="{TOKEN}" />
<input type="hidden" name="F_" value="{ID}">
<input type="hidden" name="token" value="{TOKEN}">
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
{/ADMIN}

View File

@ -44,7 +44,7 @@ class Reviews extends Controller {
self::$reviews = new Review;
self::$categories = new ReviewCategory;
Components::append( 'TEMPLATE_JS_INCLUDES', Template::parse('<script language="JavaScript" crossorigin="anonymous" type="text/javascript" src="{ROOT_URL}app/plugins/reviews/js/reviews.js"></script>' ) );
Components::append( 'TEMPLATE_CSS_INCLUDES', Template::parse('<link rel="stylesheet" href="{ROOT_URL}app/plugins/reviews/css/reviews.css" />') );
Components::append( 'TEMPLATE_CSS_INCLUDES', Template::parse('<link rel="stylesheet" href="{ROOT_URL}app/plugins/reviews/css/reviews.css">') );
}
public function index() {
@ -67,7 +67,7 @@ class Reviews extends Controller {
$selectedCategory = $category->ID;
Components::set(
'reviewCategorySelect',
'<input type="hidden" name="review_category_id" id="review_category_id" value="' . $selectedCategory . '" />'
'<input type="hidden" name="review_category_id" id="review_category_id" value="' . $selectedCategory . '">'
);
}
if ( ! Input::exists('submit') ) {

View File

@ -16,7 +16,7 @@
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.br" value="S_[]"/>
<INPUT type="checkbox" onchange="checkAll(this)" name="check.br" value="S_[]">
</th>
</tr>
</thead>
@ -54,6 +54,6 @@
</table>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
<br />
<br>
<a href="{ROOT_URL}admin/suggestions/clear">clear all</a>
</div>

View File

@ -12,7 +12,7 @@
<th scope="col" style="width: 10%"></th>
<th scope="col" style="width: 10%"></th>
<th scope="col" style="width: 10%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.b" value="P_[]"/>
<INPUT type="checkbox" onchange="checkAll(this)" name="check.b" value="P_[]">
</th>
</tr>
</thead>

View File

@ -5,7 +5,7 @@
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">
<a href="{ROOT_ADDRESS}">
<img src="{ROOT_ADDRESS}images/logoWhite.png" width="37" height="37" alt="{SITENAME}" border="0" style="height: auto;">
<img src="{ROOT_ADDRESS}images/logo180.png" width="37" height="37" alt="{SITENAME}" border="0" style="height: auto;">
</a>
</td>
<td width="37" style="text-align: center; padding: 0 10px 0 10px;">

View File

@ -103,7 +103,7 @@
<div class="b-example-divider"></div>
<!-- Never Browse without it -->
<div class="container px-4 py-5" id="hanging-icons" id="extension">
<div class="container px-4 py-5" id="extension">
<h2 class="pb-2 border-bottom">Never Browse without it</h2>
<div class="row g-4 py-5 row-cols-1 row-cols-lg-3">
<div class="col d-flex align-items-start">
@ -240,14 +240,18 @@
<td><i class="fa fa-fw fa-check"></i></td>
<td><i class="fa fa-fw fa-check"></i></td>
</tr>
</tbody>
<tbody>
<tr>
<th scope="row" class="text-start">Access from any device</th>
<td><i class="fa fa-fw fa-check"></i></td>
<td><i class="fa fa-fw fa-check"></i></td>
<td><i class="fa fa-fw fa-check"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Share bookmarks abd folders</th>
<td><i class="fa fa-fw fa-check"></i></td>
<td><i class="fa fa-fw fa-check"></i></td>
<td><i class="fa fa-fw fa-check"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Import/Export Features</th>
<td></td>
@ -298,6 +302,7 @@
<li>Add / Manage your bookmarks</li>
<li>Extensions for all major browsers</li>
<li>Access from any device</li>
<li>Share access with anyone</li>
</ul>
<a href="/register" class="mt-auto w-100 btn btn-lg btn-outline-primary">
Sign-Up for Free