many fixes and updates

This commit is contained in:
Joey Kimsey
2024-12-20 05:53:57 -05:00
parent e7ec79e727
commit 1496b855db
62 changed files with 1211 additions and 438 deletions

View File

@ -311,7 +311,39 @@ body {
background: linear-gradient(to right, #2c2c2c, #1e1e1e, #1e1e1e);
}
.atb-green {
color: #85bd3e;
}
a.atb-green:hover {
color: #1b947f;
}
.atb-green-outline {
color: #85bd3e;
border-color: #85bd3e;
}
.atb-green-outline-only {
border-color: #85bd3e;
}
a.atb-green-outline:hover {
color: #1b947f;
border-color: #1b947f;
}
.atb-green-bg {
color: #fff;
background-color: #85bd3e;
border-color: #85bd3e;
}
a.atb-green-bg:hover {
background-color: #1b947f;
border-color: #1b947f;
/* background-color: #44a466; */
/* background-color: #3fa269; */
}
.bookmark-card.dragging {
opacity: 0.7;
cursor: move; /* Show a move cursor when dragging */
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

View File

@ -151,67 +151,3 @@ document.addEventListener('DOMContentLoaded', function () {
});
});
});
document.addEventListener('DOMContentLoaded', () => {
// Initialize Masonry
const masonryContainer = document.querySelector('[data-masonry]');
const masonryInstance = new Masonry(masonryContainer, {
// horizontalOrder: false, // Maintains natural order in DOM
columnHeight: '.accordion',
// columnWidth: '.card', // Use the card width as the column reference
percentPosition: true
});
// const sortContainer = document.getElementById('bookmarkSort');
// Sortable.create(masonryContainer, {
// // animation: 150, // Smooth animations
// sort: true,
// ghostClass: 'bg-primary',
// onEnd: () => {
// // Trigger Masonry layout after drag-and-drop
// masonryInstance.layout();
// }
// });
// Function to trigger layout after any accordion change
const updateMasonryLayout = () => masonryInstance.layout();
// Listen for all accordion collapse/expand events
masonryContainer.addEventListener('hidden.bs.collapse', updateMasonryLayout);
masonryContainer.addEventListener('shown.bs.collapse', updateMasonryLayout);
// Observe dynamic content changes (e.g., rows added/removed)
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 });
});
jQuery(function($) {
var panelList = $('#bookmarkSort');
panelList.sortable({
// Only make the .panel-heading child elements support dragging.
// Omit this to make then entire <li>...</li> draggable.
handle: '.card',
update: function() {
console.error( 'update' );
$('.bookmark-card', panelList).each(function(index, elem) {
var $listItem = $(elem),
newIndex = $listItem.index();
masonryInstance.layout();
console.error( $listItem );
console.error( index );
console.error( newIndex );
// Persist the new indices.
});
}
});
});
});

View File

@ -22,25 +22,31 @@ use TheTempusProject\Classes\Controller;
use TheTempusProject\Classes\Forms;
use TheTempusProject\Models\Bookmarks as Bookmark;
use TheTempusProject\Models\Folders;
use TheTempusProject\Models\BookmarkDashboards as Dashboards;
use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Houdini\Classes\Components;
use TheTempusProject\Houdini\Classes\Forms as HoudiniForms;
use TheTempusProject\Houdini\Classes\Navigation;
use TheTempusProject\Houdini\Classes\Template;
use TheTempusProject\Hermes\Functions\Route as Routes;
use TheTempusProject\Models\User;
use TheTempusProject\Classes\Preferences;
use TheTempusProject\Canary\Bin\Canary as Debug;
class Bookmarks extends Controller {
protected static $bookmarks;
protected static $folders;
protected static $dashboards;
public function __construct() {
parent::__construct();
if ( !App::$isLoggedIn ) {
if ( ! App::$isLoggedIn ) {
Session::flash( 'notice', 'You must be logged in to create or manage bookmarks.' );
return Redirect::home();
}
self::$bookmarks = new Bookmark;
self::$folders = new Folders;
self::$dashboards = new Dashboards;
self::$title = 'Bookmarks - {SITENAME}';
self::$pageDescription = 'Add and save url bookmarks here.';
@ -57,14 +63,23 @@ class Bookmarks extends Controller {
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 );
$viewOptions = Views::simpleView( 'bookmarks.nav.viewOptions' );
Components::set( 'VIEW_OPTIONS', $viewOptions );
$dashOptions = Views::simpleView( 'bookmarks.dashboards.dashOptions' );
Components::set( 'DASH_OPTIONS', $dashOptions );
$this->setPrefToggles();
}
public function index() {
$bookmarks = self::$bookmarks->noFolder();
if ( Input::exists('submit') ) {
$prefs = new Preferences;
$user = new User;
$fields = $prefs->convertFormToArray( true );
$out = $user->updatePrefs( $fields, App::$activeUser->ID );
$this->setPrefToggles();
}
$folders = self::$folders->byUser();
$panelArray = [];
if ( !empty( $folders ) ) {
foreach ( $folders as $folder ) {
@ -79,9 +94,7 @@ class Bookmarks extends Controller {
$panelArray[] = $folderObject;
}
}
Components::set( 'foldersList', Views::simpleView( 'bookmarks.folders.list', $folders ) );
Components::set( 'folderPanels', Views::simpleView( 'bookmarks.components.bookmarkListPanel', $panelArray ) );
Components::set( 'bookmarksList', Views::simpleView( 'bookmarks.bookmarks.list', $bookmarks ) );
return Views::view( 'bookmarks.dash' );
}
@ -102,6 +115,11 @@ class Bookmarks extends Controller {
return Views::view( 'bookmarks.bookmarks.view', $bookmark );
}
public function unsorted() {
$bookmarks = self::$bookmarks->noFolder();
Views::view( 'bookmarks.bookmarks.unsorted', $bookmarks );
}
public function bookmarks( $id = null ) {
$folder = self::$folders->findById( $id );
if ( $folder == false ) {
@ -113,8 +131,6 @@ class Bookmarks extends Controller {
return Redirect::to( 'bookmarks/index' );
}
Navigation::setCrumbComponent( 'BookmarkBreadCrumbs', 'bookmarks/bookmarks/' . $id );
$bookmarks = self::$bookmarks->noFolder();
$panelArray = [];
$panel = new \stdClass();
@ -325,6 +341,179 @@ class Bookmarks extends Controller {
Redirect::to( 'bookmarks/folders' );
}
/**
* Dashboards
*/
public function addDash() {
$folders = self::$folders->byUser() ?? [];
if ( !empty( $folders ) ) {
foreach ( $folders as &$folder ) {
$folder->selected = '';
}
}
$linkSelect = Views::simpleView( 'bookmarks.components.linkSelect', $folders );
Components::set( 'LINK_SELECT', $linkSelect );
if ( ! Input::exists( 'submit' ) ) {
return Views::view( 'bookmarks.dashboards.create' );
}
if ( !Forms::check( 'createDashboard' ) ) {
Issues::add( 'error', [ 'There was an error creating your dashboard.' => Check::userErrors() ] );
return Views::view( 'bookmarks.dashboards.create' );
}
if ( is_array( Input::post('link_filter') ) && ! empty( Input::post('link_filter') ) ) {
$filters = implode( ',', Input::post('link_filter') );
} else {
$filters = '';
}
if ( is_array( Input::post('link_order') ) && ! empty( Input::post('link_order') ) ) {
$folders = implode( ',', Input::post('link_order') );
} else {
$folders = '';
}
$result = self::$dashboards->create( Input::post('title'), $filters, $folders, Input::post('description') );
if ( !$result ) {
Issues::add( 'error', [ 'There was an error creating your dashboard.' => Check::userErrors() ] );
return Views::view( 'bookmarks.dashboards.create' );
}
Issues::add( 'success', 'Your dashboard has been created.' );
return $this->dashboards();
}
public function editDash( $id = null ) {
$dash = self::$dashboards->findById( $id );
if ( $dash == false ) {
Issues::add( 'error', 'Unknown Dashboard' );
return $this->dashboards();
}
if ( $dash->createdBy != App::$activeUser->ID ) {
Issues::add( 'error', 'You do not have permission to view this dashboard.' );
return $this->dashboards();
}
$this->setDashToggles( explode( ',', $dash->saved_prefs ) );
$folders = self::$folders->byUser() ?? [];
$selectedFolders = explode( ',', $dash->link_order );
if ( !empty( $folders ) ) {
foreach ( $folders as &$folder ) {
if ( in_array( $folder->ID, $selectedFolders ) ) {
$folder->selected = ' checked';
} else {
$folder->selected = '';
}
}
}
$linkSelect = Views::simpleView( 'bookmarks.components.linkSelect', $folders );
Components::set( 'LINK_SELECT', $linkSelect );
if ( ! Input::exists( 'submit' ) ) {
return Views::view( 'bookmarks.dashboards.edit', $dash );
}
if ( ! Forms::check( 'editDashboard' ) ) {
Issues::add( 'error', [ 'There was an error editing your dashboard.' => Check::userErrors() ] );
return Views::view( 'bookmarks.dashboards.edit', $dash );
}
if ( is_array( Input::post('link_filter') ) && ! empty( Input::post('link_filter') ) ) {
$filters = implode( ',', Input::post('link_filter') );
} else {
$filters = '';
}
if ( is_array( Input::post('link_order') ) && ! empty( Input::post('link_order') ) ) {
$folders = implode( ',', Input::post('link_order') );
} else {
$folders = '';
}
$result = self::$dashboards->update( $id, Input::post('title'), $filters, $folders, Input::post('description') );
if ( !$result ) {
Issues::add( 'error', [ 'There was an error updating your dashboard.' => Check::userErrors() ] );
return Views::view( 'bookmarks.dashboards.edit', $dash );
}
Issues::add( 'success', 'Your dashboard has been updated.' );
return $this->dashboards();
}
public function deleteDash( $id = null ) {
$dash = self::$dashboards->findById( $id );
if ( $dash == false ) {
Issues::add( 'error', 'Unknown Dashboard' );
return $this->dashboards();
}
if ( $dash->createdBy != App::$activeUser->ID ) {
Issues::add( 'error', 'You do not have permission to delete this dash.' );
return $this->dashboards();
}
$result = self::$dashboards->delete( $id );
if ( !$result ) {
Issues::add( 'error', 'There was an error deleting the dashboard(s)' );
} else {
Issues::add( 'success', 'Dashboard deleted' );
}
return $this->dashboards();
}
public function dashboard( $uuid = null ) {
$dash = self::$dashboards->findByUuid( $uuid );
if ( $dash == false ) {
return $this->dashboards();
}
if ( $dash->createdBy != App::$activeUser->ID ) {
Issues::add( 'error', 'You do not have permission to view this dash.' );
return $this->dashboards();
}
$foldersArray = [];
if ( ! empty( $dash->link_order ) ) {
$folders = explode( ',', $dash->link_order );
foreach ( $folders as $key => $id ) {
$folder = self::$folders->findById( $id );
if ( empty( $folder ) ) {
continue;
}
$bookmarks = self::$bookmarks->byFolder( $folder->ID );
if ( empty( $bookmarks ) ) {
continue;
}
$folderObject = new \stdClass();
$folderObject->ID = $folder->ID;
$folderObject->title = $folder->title;
$folderObject->color = $folder->color;
$folderObject->uuid = $folder->uuid;
$folderObject->bookmarkRows = Views::simpleView( 'bookmarks.dashboards.bookmarkRows', $bookmarks );
$foldersArray[] = $folderObject;
}
}
Components::set( 'folderPanels', Views::simpleView( 'bookmarks.dashboards.folderPanels', $foldersArray ) );
if ( ! empty( $dash->saved_prefs ) ) {
$this->setDashToggles( explode( ',', $dash->saved_prefs ) );
}
return Views::view( 'bookmarks.dashboards.view', $dash );
}
public function dashboards() {
$dashboards = self::$dashboards->byUser();
return Views::view( 'bookmarks.dashboards.list', $dashboards );
}
/**
* Functionality
*/
@ -688,4 +877,47 @@ class Bookmarks extends Controller {
$folderSelect = Template::parse( $out );
Components::set( 'folderSelect', $folderSelect );
}
private function setPrefToggles() {
$prefsArray = [
'editModeSwitch',
'showArchivedSwitch',
'showHiddenSwitch',
'archiveButtonSwitch',
'visibilityButtonSwitch',
'privacyButtonSwitch',
'shareButtonSwitch',
'addButtonSwitch'
];
foreach ($prefsArray as $key => $name) {
if ( empty( App::$activeUser->prefs[$name] ) ) {
Components::set( $name . '_IS_CHECKED', '' );
} else {
Components::set( $name . '_IS_CHECKED', ' checked' );
}
}
}
private function setDashToggles( $current = [] ) {
$prefsArray = [
'editModeSwitch',
'showArchivedSwitch',
'showHiddenSwitch',
'archiveButtonSwitch',
'visibilityButtonSwitch',
'privacyButtonSwitch',
'shareButtonSwitch',
'addButtonSwitch'
];
foreach ( $prefsArray as $key => $name ) {
Debug::error( $name );
Debug::error( $current );
if ( ! in_array( $name, $current ) ) {
Components::set( $name . '_IS_CHECKED', '' );
} else {
Debug::error( '_IS_CHECKED' );
Components::set( $name . '_IS_CHECKED', ' checked' );
}
}
}
}

View File

@ -13,40 +13,53 @@ namespace TheTempusProject\Controllers;
use TheTempusProject\Classes\Controller;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\TheTempusProject as App;
class Extensions extends Controller {
public function index() {
self::$title = 'Browser Extensions';
Views::view( 'extensions.index' );
if ( App::$isLoggedIn ) {
Issues::add( 'success', 'We also have a simple solution to using the app from your mobile devices <a href="/extensions/mobile">here</a>.' );
}
Views::view( 'bookmarks.extensions.index' );
}
public function mobile() {
self::$title = 'Mobile Bookmarklet';
if ( App::$isLoggedIn ) {
return Issues::add( 'error', 'Unfortunately you will need to sign in to generate the bookmarklet unique to your account.' );
}
Views::view( 'bookmarks.extensions.bookmarklet' );
}
public function chrome() {
self::$title = 'Chrome Extension';
Views::view( 'extensions.chrome' );
Views::view( 'bookmarks.extensions.chrome' );
}
public function firefox() {
self::$title = 'Firefox Extension';
Views::view( 'extensions.firefox' );
Views::view( 'bookmarks.extensions.firefox' );
}
public function opera() {
self::$title = 'Opera Extension';
Views::view( 'extensions.opera' );
Views::view( 'bookmarks.extensions.opera' );
}
public function edge() {
self::$title = 'Edge Extension';
Views::view( 'extensions.edge' );
Views::view( 'bookmarks.extensions.edge' );
}
public function brave() {
self::$title = 'Brave Extension';
Views::view( 'extensions.brave' );
Views::view( 'bookmarks.extensions.brave' );
}
public function safari() {
self::$title = 'Safari Extension';
Views::view( 'extensions.safari' );
Views::view( 'bookmarks.extensions.safari' );
}
}

View File

@ -27,6 +27,8 @@ class BookmarksForms extends Forms {
self::addHandler( 'editFolder', __CLASS__, 'editFolder' );
self::addHandler( 'importBookmarks', __CLASS__, 'importBookmarks' );
self::addHandler( 'exportBookmarks', __CLASS__, 'exportBookmarks' );
self::addHandler( 'createDashboard', __CLASS__, 'createDashboard' );
self::addHandler( 'editDashboard', __CLASS__, 'editDashboard' );
}
public static function createBookmark() {
@ -168,6 +170,44 @@ class BookmarksForms extends Forms {
// }
return true;
}
public static function createDashboard() {
if ( ! Input::exists( 'submit' ) ) {
return false;
}
if ( ! Input::exists( 'title' ) ) {
Check::addUserError( 'You must include a title.' );
return false;
}
if ( ! Input::exists( 'link_order' ) ) {
Check::addUserError( 'You must include at least 1 link or folder.' );
return false;
}
if ( !self::token() ) {
Check::addUserError( 'There was an issue with your request.' );
return false;
}
return true;
}
public static function editDashboard() {
if ( ! Input::exists( 'submit' ) ) {
return false;
}
if ( ! Input::exists( 'title' ) ) {
Check::addUserError( 'You must include a title.' );
return false;
}
if ( ! Input::exists( 'link_order' ) ) {
Check::addUserError( 'You must include at least 1 link or folder.' );
return false;
}
if ( !self::token() ) {
Check::addUserError( 'There was an issue with your request.' );
return false;
}
return true;
}
}
new BookmarksForms;

View File

@ -34,13 +34,22 @@ document.addEventListener('DOMContentLoaded', () => {
toggleVisibility('privacyButtonSwitch', 'btn-publish');
toggleVisibility('addButtonSwitch', 'btn-addlink');
toggleVisibility('shareButtonSwitch', 'btn-share');
toggleVisibility('dashShowArchivedSwitch', 'link-archived');
toggleVisibility('dashShowHiddenSwitch', 'link-hidden');
toggleVisibility('dashAddButtonSwitch', 'btn-addlink');
toggleVisibility('dashShareButtonSwitch', '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}`);
if ( ! switchElement ) {
return;
}
// Listen for changes to the checkbox
switchElement.addEventListener('change', () => {
if (switchElement.checked) {
@ -59,6 +68,9 @@ function toggleVisibility(switchId, className) {
}
document.addEventListener('DOMContentLoaded', function () {
const bookmarkSort = document.getElementById('bookmarkSort');
if ( ! bookmarkSort ) {
return;
}
let draggingElement = null;
let placeholder = null;
let initialX = 0;
@ -180,7 +192,3 @@ document.addEventListener('DOMContentLoaded', function () {
document.addEventListener('mouseup', handleDragEnd);
bookmarkSort.addEventListener('dragover', handleDrop); // Listen for the drop event to update the order
});

View File

@ -1,8 +1,8 @@
<?php
/**
* app/plugins/bookmarks/models/bookmarkViews.php
* app/plugins/bookmarks/models/bookmark_dashboards.php
*
* This class is used for the manipulation of the bookmark_views database table.
* This class is used for the manipulation of the bookmark_dashboards database table.
*
* @package TP Bookmarks
* @version 3.0
@ -19,26 +19,17 @@ use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Houdini\Classes\Filters;
use TheTempusProject\Canary\Classes\CustomException;
class Bookmarkviews extends DatabaseModel {
public $tableName = 'bookmark_views';
class BookmarkDashboards extends DatabaseModel {
public $tableName = 'bookmark_dashboards';
public $databaseMatrix = [
[ 'title', 'varchar', '256' ],
[ 'saved_prefs', 'text', '' ],
[ 'link_order', 'text', '' ],
[ 'description', 'text', '' ],
[ 'privacy', 'varchar', '48' ],
[ 'createdBy', 'int', '11' ],
[ 'createdAt', 'int', '11' ],
[ 'updatedAt', 'int', '11' ],
[ 'uuid', 'text', '' ],
[ 'uuid', 'char', '36' ],
];
/**
@ -48,7 +39,7 @@ class Bookmarkviews extends DatabaseModel {
parent::__construct();
}
public function create( $title, $description = '', $privacy = 'private' ) {
public function create( $title, $saved_prefs, $link_order, $description = '' ) {
if ( ! Check::dataTitle( $title ) ) {
Debug::info( 'Views: illegal title.' );
return false;
@ -56,7 +47,8 @@ class Bookmarkviews extends DatabaseModel {
$fields = [
'title' => $title,
'description' => $description,
'privacy' => $privacy,
'saved_prefs' => $saved_prefs,
'link_order' => $link_order,
'uuid' => generateUuidV4(),
'createdBy' => App::$activeUser->ID,
'createdAt' => time(),
@ -69,7 +61,7 @@ class Bookmarkviews extends DatabaseModel {
return self::$db->lastId();
}
public function update( $id, $title, $description = '', $privacy = 'private' ) {
public function update( $id, $title, $saved_prefs, $link_order, $description = '' ) {
if ( !Check::id( $id ) ) {
Debug::info( 'Views: illegal ID.' );
return false;
@ -81,11 +73,12 @@ class Bookmarkviews extends DatabaseModel {
$fields = [
'title' => $title,
'description' => $description,
'privacy' => $privacy,
'saved_prefs' => $saved_prefs,
'link_order' => $link_order,
];
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
new CustomException( 'viewUpdate' );
Debug::error( "Views: $id not updated: $fields" );
Debug::error( "Views: $id not updated" );
return false;
}
return true;
@ -147,4 +140,16 @@ class Bookmarkviews extends DatabaseModel {
}
return $out;
}
public function findByUuid( $id ) {
$whereClause = ['uuid', '=', $id];
$dashboards = self::$db->get( $this->tableName, $whereClause );
if ( !$dashboards->count() ) {
Debug::info( 'No Dashboards found.' );
return false;
}
return $this->filter( $dashboards->first() );
}
}

View File

@ -42,7 +42,7 @@ class Bookmarks extends DatabaseModel {
[ 'hiddenAt', 'int', '11' ],
[ 'order', 'int', '11' ],
[ 'linkType', 'varchar', '32' ],
[ 'uuid', 'uuid', '36' ],
[ 'uuid', 'char', '36' ],
];
/**

View File

@ -29,7 +29,7 @@ class Folders extends DatabaseModel {
[ 'folderID', 'int', '11' ],
[ 'createdBy', 'int', '11' ],
[ 'createdAt', 'int', '11' ],
[ 'uuid', 'text', '' ],
[ 'uuid', 'char', '36' ],
];
/**

View File

@ -55,6 +55,90 @@ class Bookmarks extends Plugin {
'default' => true,
],
];
public $preferenceMatrix = [
'editModeSwitch' => [
'pretty' => 'Bookmarks default setting for edit mode',
'type' => 'checkbox',
'default' => 'false',
],
'showArchivedSwitch' => [
'pretty' => 'Bookmarks default setting for showing archived bookmarks',
'type' => 'checkbox',
'default' => 'false',
],
'showHiddenSwitch' => [
'pretty' => 'Bookmarks default setting for showing hidden bookmarks',
'type' => 'checkbox',
'default' => 'false',
],
'archiveButtonSwitch' => [
'pretty' => 'Bookmarks default setting for showing the archive buttons',
'type' => 'checkbox',
'default' => 'false',
],
'visibilityButtonSwitch' => [
'pretty' => 'Bookmarks default setting for showing the visibility buttons',
'type' => 'checkbox',
'default' => 'false',
],
'privacyButtonSwitch' => [
'pretty' => 'Bookmarks default setting for showing the privacy buttons',
'type' => 'checkbox',
'default' => 'true',
],
'shareButtonSwitch' => [
'pretty' => 'Bookmarks default setting for showing the share buttons',
'type' => 'checkbox',
'default' => 'true',
],
'addButtonSwitch' => [
'pretty' => 'Bookmarks default setting for showing the add buttons',
'type' => 'checkbox',
'default' => 'true',
],
];
public $resourceMatrix = [
'routes' => [
[
'original_url' => 'chrome',
'redirect_type' => 'external',
'nickname' => 'Chrome Extension',
'forwarded_url' => 'https://chromewebstore.google.com/detail/allthebookmarks/hcofhopnjoodmakhhmgmoohgpdhfkgii?authuser=0&hl=en',
],
[
'original_url' => 'brave',
'redirect_type' => 'external',
'nickname' => 'Brave Extension',
'forwarded_url' => 'https://chromewebstore.google.com/detail/allthebookmarks/hcofhopnjoodmakhhmgmoohgpdhfkgii?authuser=0&hl=en',
],
[
'original_url' => 'firefox',
'redirect_type' => 'external',
'nickname' => 'Firefox Extension',
'forwarded_url' => 'https://addons.mozilla.org/en-US/firefox/addon/allthebookmarks/',
],
// [
// 'original_url' => 'edge',
// 'redirect_type' => 'external',
// 'nickname' => 'Edge Extension',
// 'forwarded_url' => 'https://www.facebook.com/thetempusproject',
// ],
// [
// 'original_url' => 'opera',
// 'redirect_type' => 'external',
// 'nickname' => 'Opera Extension',
// 'forwarded_url' => 'https://www.facebook.com/thetempusproject',
// ],
]
];
public $bookmarks;
public $folders;

View File

@ -1,5 +1,5 @@
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<div class="my-4">
<div class="offset-md-2 col-8 py-3 context-main-bg">
<legend class="text-center">Add Bookmark</legend>
<hr>
<form method="post" class="container py-4">

View File

@ -1,51 +1,56 @@
<form action="" method="post" class="container py-4">
<h2 class="text-center mb-4">Edit Bookmark</h2>
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
<div class="col-lg-3">
<input type="text" class="form-control" name="title" id="title" value="{title}" required>
</div>
</div>
<div class="my-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Edit Bookmark</legend>
<hr>
<form action="" method="post" class="container py-4">
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
<div class="col-lg-3">
<input type="text" class="form-control" name="title" id="title" value="{title}" required>
</div>
</div>
<div class="mb-3 row">
<label for="url" class="col-lg-5 col-form-label text-end">URL</label>
<div class="col-lg-3">
<input type="text" class="form-control" name="url" id="url" value="{url}" required>
</div>
</div>
<div class="mb-3 row">
<label for="url" class="col-lg-5 col-form-label text-end">URL</label>
<div class="col-lg-3">
<input type="text" class="form-control" name="url" id="url" value="{url}" required>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
<div class="col-lg-3">
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
</div>
</div>
{folderSelect}
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
<div class="col-lg-3">
<select id="privacy" name="privacy" class="form-select" value="{privacy}">
<option value="private">Private</option>
<option value="public">Public</option>
</select>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
<div class="col-lg-3" id="colorContainer">
{colorSelect}
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
<div class="col-lg-3">
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
</div>
</div>
{folderSelect}
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
<div class="col-lg-3">
<select id="privacy" name="privacy" class="form-select" value="{privacy}">
<option value="private">Private</option>
<option value="public">Public</option>
</select>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
<div class="col-lg-3" id="colorContainer">
{colorSelect}
</div>
</div>
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
</div>
</fieldset>
</form>
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
</div>
</fieldset>
</form>
</div>
</div>

View File

@ -1,40 +1,38 @@
<table class="table context-main">
<thead>
<tr>
<th style="width: 75%">Bookmark</th>
<th style="width: 10%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td style="text-align: center;">
<a href="{url}">
{title}
</a>
</td>
<td style="text-align: center;">
{privacy}
</td>
<td><a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-upload"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
</tr>
{/LOOP}
{ALT}
<tr>
<td style="text-align: center;" colspan="6">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<div class="text-center">
<a href="{ROOT_URL}bookmarks/createBookmark" class="btn btn-md btn-primary">Create</a>
</div>
<table class="table table-striped context-main">
<thead>
<tr>
<th style="width: 75%">Bookmark</th>
<th style="width: 10%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td style="text-align: center;">
<a href="{url}">
{title}
</a>
</td>
<td style="text-align: center;">
{privacy}
</td>
<td><a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="btn btn-sm btn-outline-primary"><i class="fa fa-fw fa-upload"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-outline-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-outline-danger"><i class="fa fa-fw fa-trash"></i></a></td>
</tr>
{/LOOP}
{ALT}
<tr>
<td style="text-align: center;" colspan="6">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<div class="text-center">
<a href="{ROOT_URL}bookmarks/createBookmark" class="btn btn-md btn-primary">Create</a>
</div>

View File

@ -0,0 +1,44 @@
<div class="my-4 g-">
<div class="offset-md-2 col-8 mr-2 py-3 context-main-bg p-3">
<legend class="text-center">Unsorted Bookmarks</legend>
<hr>
<table class="table table-striped context-main1">
<thead>
<tr>
<th style="width: 75%">Bookmark</th>
<th style="width: 10%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td style="text-align: center;">
<a href="{url}">
{title}
</a>
</td>
<td style="text-align: center;">
{privacy}
</td>
<td><a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="btn btn-sm btn-outline-primary"><i class="fa fa-fw fa-upload"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-outline-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-outline-danger"><i class="fa fa-fw fa-trash"></i></a></td>
</tr>
{/LOOP}
{ALT}
<tr>
<td style="text-align: center;" colspan="6">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<div class="text-center">
<a href="{ROOT_URL}bookmarks/createBookmark" class="btn btn-md btn-primary">Add</a>
</div>
</div>
</div>

View File

@ -28,7 +28,7 @@
<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">
<ul class="list-group mt-1">
{bookmarkListRows}
</ul>
</div>

View File

@ -1,5 +1,5 @@
{LOOP}
<li class="list-group-item context-main-b bg-{color} {hidden_class} {archived_class}">
<li class="list-group-item context-main-bg bg-{color} {hidden_class} {archived_class} mb-1">
<a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>
<span class="float-end">
@ -29,7 +29,7 @@
</li>
{/LOOP}
{ALT}
<li class="list-group-item context-main context-main-bg">
<p class="list-group text-center">No Bookmarks</p>
<li class="list-group-item context-main context-main-bg mb-1">
<p class="list-group text-center">No Bookmarks</p>
</li>
{/ALT}

View File

@ -0,0 +1,16 @@
<div class="" id="accordionFolders">
<!-- Folder -->
{LOOP}
<div class="">
<!-- Header -->
<h4 class="" id="headingFolder{ID}">
<div class="d-flex align-items-center context-main-bg context-main bg-{color}">
<input type="checkbox" class="form-check-input m-2" name="link_order[]" value="{ID}"{selected}>
<span class="card-header context-main bg-{color}">
{title}
</span>
</div>
</h4>
</div>
{/LOOP}
</div>

View File

@ -1,5 +1,5 @@
{LOOP}
<li class="list-group-item context-main-bg bg-{color}">
<li class="list-group-item context-main-bg bg-{color} mb-1">
<a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>{privacyBadge}
<span class="float-end">

View File

@ -1,17 +1,7 @@
<div class="row mt-4 g-1">
<div class="offset-md-1 col-5 mr-2 py-3 context-main-bg">
<legend class="text-center">Unsorted Bookmarks</legend>
{bookmarksList}
</div>
<div class="col-5 py-3 ml-2 context-main-bg">
<legend class="text-center">Folders List</legend>
{foldersList}
</div>
</div>
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Bookmarks</legend>
<legend class="text-center">MAnage</legend>
<hr>
{VIEW_OPTIONS}
<hr>
<div class="row g-3" data-masonry='{ "percentPosition": false }' id="bookmarkSort">

View File

@ -0,0 +1,30 @@
{LOOP}
<li class="list-group-item context-main-bg bg-{color} {hidden_class} {archived_class} mb-1">
<a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>
<span class="float-end">
<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}
{ALT}
<li class="list-group-item context-main context-main-bg mb-1">
<p class="list-group text-center">No Bookmarks</p>
</li>
{/ALT}

View File

@ -0,0 +1,43 @@
<div class="my-4">
<div class="offset-md-1 col-10 py-3 context-main-bg text-center">
<legend class="">Add Dashboard</legend>
<hr>
<p>Dashboards are groups of folders that usually share a theme. When links are added to folders they will automatically be added to dashboards unless hidden or archived. </p>
<form action="" method="post" class="container py-4">
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Title</label>
<div class="col-lg-4">
<input type="text" class="form-control" name="title" id="title" required>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Description:</label>
<div class="col-lg-4">
<textarea class="form-control" name="description" maxlength="2000" rows="4" id="description"></textarea>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Dashboard Filters:</label>
<div class="col-lg-4">
{DASH_OPTIONS}
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Included Folders:</label>
<div class="col-lg-4">
{LINK_SELECT}
</div>
</div>
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Create</button>
</div>
</fieldset>
</form>
</div>
</div>

View File

@ -0,0 +1,29 @@
<div class="p-2">
<!-- Status Filters -->
<div class="d-flex align-items-center border p-2 rounded mb-3 context-main-bg">
<div class="me-3 fw-bold">Status:</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" value="showArchivedSwitch" id="dashShowArchivedSwitch" name="link_filter[]"{showArchivedSwitch_IS_CHECKED}>
<label class="form-check-label" for="showArchivedSwitch">Show Archived</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" value="showHiddenSwitch" id="dashShowHiddenSwitch" name="link_filter[]"{showHiddenSwitch_IS_CHECKED}>
<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 context-main-bg">
<div class="me-3 fw-bold">Buttons:</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" value="shareButtonSwitch" id="dashShareButtonSwitch" name="link_filter[]"{shareButtonSwitch_IS_CHECKED}>
<label class="form-check-label" for="shareButtonSwitch">Share Button</label>
</div>
<div class="form-check form-switch me-3">
<input class="form-check-input" type="checkbox" value="addButtonSwitch" id="dashAddButtonSwitch" name="link_filter[]"{addButtonSwitch_IS_CHECKED}>
<label class="form-check-label" for="addButtonSwitch">Add Button</label>
</div>
</div>
</div>

View File

@ -0,0 +1,43 @@
<div class="my-4">
<div class="offset-md-1 col-10 py-3 context-main-bg text-center">
<legend class="">Edit Dashboard</legend>
<hr>
<p>Dashboards are groups of folders that usually share a theme. When links are added to folders they will automatically be added to dashboards unless hidden or archived. </p>
<form action="" method="post" class="container py-4">
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Title</label>
<div class="col-lg-4">
<input type="text" class="form-control" name="title" id="title" value="{title}" required>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Description:</label>
<div class="col-lg-4">
<textarea class="form-control" name="description" maxlength="2000" rows="4" id="description">{description}</textarea>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Dashboard Filters:</label>
<div class="col-lg-4">
{DASH_OPTIONS}
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-4 col-form-label text-end">Included Folders:</label>
<div class="col-lg-4">
{LINK_SELECT}
</div>
</div>
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
</div>
</fieldset>
</form>
</div>
</div>

View File

@ -0,0 +1,51 @@
{LOOP}
<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">
<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 mt-1">
{bookmarkRows}
</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 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>
</span>
</div>
</div>
</div>
</div>
</div>
{/LOOP}
{ALT}
<div class="col-12 text-center h4">
<p>No folders found.</p>
</div>
{/ALT}

View File

@ -0,0 +1,44 @@
<div class="my-4">
<div class="offset-2 col-8 p-3 context-main-bg">
<legend class="text-center">Dashboards</legend>
<hr>
<div class="offset-3 col-lg-6 my-4">
<p>From here you can easily create, update, or remove any bookmark dashboards you have created.</p>
<p>Dashboards are a feature that allow you to build customized bookmark pages that you can easily save and open la</p>
</div>
<div class="row g-3 text-center p-2" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
<table class="table context-main">
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td class="">{title}</td>
<td>{description}</td>
<td><a href="{ROOT_URL}bookmarks/dashboard/{uuid}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-upload"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/editDash/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/deleteDash/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
</tr>
{/LOOP}
{ALT}
<tr>
<td class="context-main" colspan="7">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<div class="">
<a href="{ROOT_URL}bookmarks/addDash" class="btn btn-md btn-primary">Create</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,26 @@
<div class="my-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">{title}</legend>
<hr>
<form method="post">
<fieldset>
<div class="row g-3" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
{folderPanels}
</div>
<hr>
<div class="container">
<div class="row">
<div class="col-md-6 offset-2">
{DASH_OPTIONS}
</div>
<div class="col-md-4">
<div class="h-100 d-flex align-items-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg mx-5">Save</button>
</div>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</div>

View File

@ -1,10 +1,10 @@
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<div class="my-4">
<div class="offset-2 col-8 p-3 context-main-bg">
<legend class="text-center">Bookmark Export</legend>
<hr>
<h3 class="text-center text-muted">Select which folders to include in the export.</h3>
<div class="row g-3 col-4 offset-4" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
<form action="" method="post">
<h3 class="text-center text-muted">Select which folders to include in the export</h3>
<form action="" method="post">
<div class="row g-3 col-4 offset-4" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
<table class="table context-main">
<thead>
<tr>

View File

@ -0,0 +1,64 @@
<div class="col-10 offset-md-1 context-main-bg p-4 my-5">
<legend class="text-center">Mobile Bookmarklet</legend>
<hr>
<div class="col-8 offset-2 ">
<div class="h5">
<p>
You can quickly and easily add bookmarks to your AllTheBookmarks account from any mobile device.
Since you can't use extensions on mobile, you can log in from your mobile device and visit this page.
</p>
<p>
Below is a code snippet that you can copy, then create a new bookmark on your mobile device as you would normally.
Before saving the bookmark, change the name to something simple like "ATB Bookmarker" and paste thiis code as the url.
</p>
<p>
Once you have the bookmarklet saved, you can simply go to your mobile bookmarks while on a page and this snippet will grab the info you need and add it to you account.
</p>
</div>
<div class="">
<pre lang="javascript">
javascript:(function() {
const apiKey = localStorage.getItem('notAnAuthToken');
const apiUrl = localStorage.getItem('api_url');
const name = prompt("Enter a name for the bookmark:");
const notes = prompt("Enter any notes (optional):");
const color = prompt("Enter a color (optional):");
const privacy = prompt("Enter privacy level (e.g., public/private):");
const folder = prompt("Enter a folder (optional):");
const url = window.location.href;
if (!apiKey) {
alert("You must sign in to obtain an auth token.");
return;
}
if (!name) {
alert("Name is required.");
return;
}
fetch(apiUrl + 'api/bookmarks/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
},
body: JSON.stringify({ name, url, notes, color, privacy, folder })
})
.then(response => {
if (response.ok) {
alert("Bookmark saved successfully!");
} else {
alert("Failed to save bookmark. Please check your API key.");
}
})
.catch(error => {
console.error(error);
alert("An unknown error occurred while saving the bookmark.");
});
})();
</pre>
</div>
</div>
</div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action -->
<div class="text-center mt-5">
<a href="#" class="btn btn-primary btn-lg">
<a href="/brave" class="btn btn-primary atb-green-bg btn-lg">
<i class="fas fa-download me-2"></i>Get the Addon for Brave
</a>
</div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action -->
<div class="text-center mt-5">
<a href="#" class="btn btn-primary btn-lg">
<a href="/chrome" class="btn btn-primary atb-green-bg btn-lg">
<i class="fas fa-download me-2"></i>Get the Addon for Chrome
</a>
</div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action -->
<div class="text-center mt-5">
<a href="#" class="btn btn-primary btn-lg">
<a href="#" class="btn btn-primary atb-green-bg btn-lg">
<i class="fas fa-download me-2"></i>Get the Addon for Edge
</a>
</div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action -->
<div class="text-center mt-5">
<a href="#" class="btn btn-primary btn-lg">
<a href="/firefox" class="btn btn-primary atb-green-bg btn-lg">
<i class="fas fa-download me-2"></i>Get the Addon for Firefox
</a>
</div>

View File

@ -14,7 +14,7 @@
<i class="fab fa-chrome fa-3x text-primary mb-3"></i>
<h5 class="card-title">Chrome Extension</h5>
<p class="card-text">Enhance your Chrome browser with advanced features and effortless organization.</p>
<a href="/extensions/chrome" class="btn btn-primary btn-sm">Learn More</a>
<a href="/extensions/chrome" class="btn btn-primary atb-green-bg btn-sm">Learn More</a>
</div>
</div>
</div>
@ -26,7 +26,7 @@
<i class="fab fa-firefox fa-3x text-warning mb-3"></i>
<h5 class="card-title">Firefox Extension</h5>
<p class="card-text">Seamlessly integrate with Firefox for a smoother browsing experience.</p>
<a href="/extensions/firefox" class="btn btn-primary btn-sm">Learn More</a>
<a href="/extensions/firefox" class="btn btn-primary atb-green-bg btn-sm">Learn More</a>
</div>
</div>
</div>
@ -38,7 +38,7 @@
<i class="fab fa-opera fa-3x text-danger mb-3"></i>
<h5 class="card-title">Opera Extension</h5>
<p class="card-text">Boost your Opera browser with intuitive features and tools.</p>
<a href="/extensions/opera" class="btn btn-primary btn-sm">Learn More</a>
<a href="/extensions/opera" class="btn btn-primary atb-green-bg btn-sm">Learn More</a>
</div>
</div>
</div>
@ -50,7 +50,7 @@
<i class="fab fa-brave fa-3x text-orange mb-3"></i>
<h5 class="card-title">Brave Extension</h5>
<p class="card-text">Enjoy secure and private browsing with Brave, enhanced by our extension.</p>
<a href="/extensions/brave" class="btn btn-primary btn-sm">Learn More</a>
<a href="/extensions/brave" class="btn btn-primary atb-green-bg btn-sm">Learn More</a>
</div>
</div>
</div>
@ -62,7 +62,7 @@
<i class="fab fa-edge fa-3x text-info mb-3"></i>
<h5 class="card-title">Edge Extension</h5>
<p class="card-text">Maximize productivity on Microsoft Edge with our extension.</p>
<a href="/extensions/edge" class="btn btn-primary btn-sm">Learn More</a>
<a href="/extensions/edge" class="btn btn-primary atb-green-bg btn-sm">Learn More</a>
</div>
</div>
</div>
@ -72,7 +72,7 @@
<div class="text-center mt-5">
<p class="text-muted">
<i class="fas fa-exclamation-circle me-2"></i>
Unfortunately, our extensions are not currently supported on <a href="/extensions/safari">Safari</a>.
Unfortunately, our extensions are not currently supported on <a href="/extensions/safari" class="text-decoration-none atb-green">Safari</a>.
</p>
</div>
</div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action -->
<div class="text-center mt-5">
<a href="#" class="btn btn-primary btn-lg">
<a href="#" class="btn btn-primary atb-green-bg btn-lg">
<i class="fas fa-download me-2"></i>Get the Addon for Opera
</a>
</div>

View File

@ -1,43 +1,46 @@
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Edit Folder</legend>
<hr>
<form action="" method="post" class="container py-4">
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
<div class="col-lg-3">
<input type="text" class="form-control" name="title" id="title" value="{title}" required>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
<div class="col-lg-3">
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
</div>
</div>
{folderSelect}
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
<div class="col-lg-3">
<select id="privacy" name="privacy" class="form-select" value="{privacy}">
<option value="private">Private</option>
<option value="public">Public</option>
</select>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
<div class="col-lg-3">
{colorSelect}
</div>
</div>
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
<form action="" method="post" class="container py-4">
<h2 class="text-center mb-4">Edit Folder</h2>
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
<div class="col-lg-3">
<input type="text" class="form-control" name="title" id="title" value="{title}" required>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
<div class="col-lg-3">
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
</div>
</div>
{folderSelect}
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
<div class="col-lg-3">
<select id="privacy" name="privacy" class="form-select" value="{privacy}">
<option value="private">Private</option>
<option value="public">Public</option>
</select>
</div>
</div>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
<div class="col-lg-3">
{colorSelect}
</div>
</div>
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
</div>
</fieldset>
</form>
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
</div>
</fieldset>
</form>
</div>
</div>

View File

@ -1,35 +1,34 @@
<table class="table context-main">
<thead>
<tr>
<th class="text-center" style="width: 35%">Title</th>
<th class="text-center" style="width: 20%">Privacy</th>
<th class="text-center" style="width: 30%">Description</th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td class="text-center">{prettyTitle}</td>
<td class="text-center">{prettyPrivacy}</td>
<td>{description}</td>
<td><a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<td><a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
</tr>
{/LOOP}
{ALT}
<tr>
<td class="text-center context-main" colspan="7">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<div class="text-center">
<a href="{ROOT_URL}bookmarks/createFolder" class="btn btn-md btn-primary">Create</a>
</div>
<table class="table table-striped context-main text-center">
<thead>
<tr>
<th>Title</th>
<th>Privacy</th>
<th>Description</th>
<th></th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td>{prettyTitle}</td>
<td>{prettyPrivacy}</td>
<td>{description}</td>
<td>
<a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-outline-primary mx-1"><i class="fa fa-fw fa-info-circle"></i></a>
<a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-outline-warning mx-1"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-outline-danger mx-1"><i class="fa fa-fw fa-trash"></i></a>
</td>
</tr>
{/LOOP}
{ALT}
<tr>
<td colspan="4">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<div class="text-center">
<a href="{ROOT_URL}bookmarks/createFolder" class="btn btn-md btn-primary">Create</a>
</div>

View File

@ -1,6 +1,5 @@
<div class="offset-md-2 col-8 py-3 context-main-bg mt-4">
<div class="text-center">
<legend class="">Folders List</legend>
</div>
<div class="offset-2 col-8 p-3 context-main-bg my-4">
<legend class="text-center">Folders List</legend>
<hr>
{foldersList}
</div>

View File

@ -1,15 +1,15 @@
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<div class="my-4">
<div class="offset-2 col-8 p-3 context-main-bg">
<legend class="text-center">Import Bookmarks</legend>
<hr>
<div class="offset-3 col-lg-6 my-4">
<form action="" method="post" enctype="multipart/form-data" class="text-center">
<form method="post" enctype="multipart/form-data">
<div class="offset-3 col-lg-6 my-4 text-center">
<label for="bookmark_file" class="col-lg-3 control-label">Import file (.html):</label>
<input type="file" name="bookmark_file" id="bookmark_file" accept=".html">
</form>
</div>
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg center-block">Import</button>
</div>
</div>
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg center-block">Import</button>
</div>
</form>
</div>
</div>

View File

@ -1,8 +1,10 @@
<ul class="nav nav-tabs justify-content-center mt-4" role="tablist">
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/index/" class="nav-link">Dashboard</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/folders/" class="nav-link">Folders</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/import/" class="nav-link">Import</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/export/" class="nav-link">Export</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/share/" class="nav-link">Share</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/index/" class="nav-link context-main">Manage</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/unsorted/" class="nav-link context-main">Unsorted</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/dashboards/" class="nav-link context-main">Dashboards</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/folders/" class="nav-link context-main">Folders</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/share/" class="nav-link context-main">Share</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/import/" class="nav-link context-main">Import</a></li>
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/export/" class="nav-link context-main">Export</a></li>
</ul>
{userFolderTabs}

View File

@ -1,59 +1,66 @@
<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>
<div class="m-3">
<div class="card w-100">
<div class="card-header text-center context-main-bg">
<a class="btn btn-link text-decoration-none" data-bs-toggle="collapse" href="#filterOptions" role="button" aria-expanded="false" aria-controls="filterOptions">
<strong class="h3 context-main"><i class="fa-solid fa-fw fa-gears"></i></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>
<form method="post">
<div class="card-body context-second-bg">
<fieldset>
<!-- Edit Mode -->
<div class="d-flex align-items-center border p-2 rounded mb-3 context-main-bg">
<div class="me-3 fw-bold">Edit Mode:</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="editModeSwitch" name="editModeSwitch"{editModeSwitch_IS_CHECKED}>
<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>
<!-- Status Filters -->
<div class="d-flex align-items-center border p-2 rounded mb-3 context-main-bg">
<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" name="showArchivedSwitch"{showArchivedSwitch_IS_CHECKED}>
<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" name="showHiddenSwitch"{showHiddenSwitch_IS_CHECKED}>
<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>
<!-- Buttons Filters -->
<div class="d-flex align-items-center border p-2 rounded context-main-bg">
<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" name="archiveButtonSwitch"{archiveButtonSwitch_IS_CHECKED}>
<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" name="visibilityButtonSwitch"{visibilityButtonSwitch_IS_CHECKED}>
<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" name="privacyButtonSwitch"{privacyButtonSwitch_IS_CHECKED}>
<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" name="shareButtonSwitch"{shareButtonSwitch_IS_CHECKED}>
<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" name="addButtonSwitch"{addButtonSwitch_IS_CHECKED}>
<label class="form-check-label" for="addButtonSwitch">Add Button</label>
</div>
</div>
</fieldset>
</div>
</div>
<div class="card-footer d-flex justify-content-center align-items-center context-main-bg">
<button type="submit" name="submit" value="submit" class="btn btn-md btn-outline-primary my-2">Save as Default</button>
</div>
</form>
</div>
</div>
</div>

View File

@ -7,7 +7,7 @@
</div>
<div class="row g-3" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
{LOOP}
{panel}
{panel}
{/LOOP}
{ALT}
<div class="col-12">

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,7 +64,7 @@
<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="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>

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

@ -1,11 +1,11 @@
<div class="col-md-5 offset-md-1 mb-3">
<h5>Subscribe to our newsletter</h5>
<div class="d-flex flex-column flex-sm-row w-100 gap-2">
<form action="{ROOT_URL}subscribe/home" method="post" class="form-horizontal"></form>
<label for="newsletter1" class="visually-hidden">Email address</label>
<input name="email" id="email" type="email" class="form-control" placeholder="Email address" autocomplete="email">
<div class="col-md-5 offset-md-1 mb-3 text-center">
<h5>Subscribe</h5>
<div class="d-flex flex-column flex-sm-row gap-2 justify-content-center mx-auto">
<form action="{ROOT_URL}subscribe/home" method="post" class="form-horizontal">
<label for="email" class="visually-hidden">Email address</label>
<input name="email" id="email" type="email" class="form-control my-2" placeholder="Email address" autocomplete="email">
<input type="hidden" name="token" value="{TOKEN}">
<button class="btn btn-primary" name="submit" value="submit" type="submit">Subscribe</button>
<button class="btn btn-primary my-2 w-100 atb-green-bg" name="submit" value="submit" type="submit">Subscribe</button>
</form>
</div>
</div>

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>

View File

@ -11,11 +11,16 @@
</p>
</div>
</div>
<div class="col-6 offset-3 my-2">
<hr>
</div>
{/LOOP}
{ALT}
<div class="blog-post">
<p class="blog-post-meta py-3 text-center">No Suggestions Found.</p>
</div>
{/ALT}
<a href="{ROOT_URL}suggestions/create" class="btn btn-sm btn-primary" role="button">Make a Suggestion</a>
<div class="text-center">
<a href="{ROOT_URL}suggestions/create" class="btn btn-lg btn-primary" role="button">Make a Suggestion</a>
</div>
</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

@ -1,5 +1,5 @@
<div class="col-6 col-md-2 mb-3">
<h5>More Info</h5>
<h5 class="atb-green">More Info</h5>
<ul class="nav flex-column">
{LOOP}
<li class="nav-item mb-2"><a href="{url}" class="nav-link p-0 text-muted">{text}</a></li>

View File

@ -1 +1 @@
<span>© 2024 AllTheBookmarks, Powered by <a href="https://thetempusproject.com" class="text-decoration-none">The Tempus Project</a>.</span>
<span>© 2024 AllTheBookmarks, Powered by <a href="https://thetempusproject.com" class="text-decoration-none atb-green">The Tempus Project</a>.</span>

View File

@ -1,5 +1,5 @@
<div class="col-6 col-md-2 mb-3">
<h5>Contact Us</h5>
<h5 class="atb-green">Contact Us</h5>
<ul class="nav flex-column">
{LOOP}
<li class="nav-item mb-2"><a href="{url}" class="nav-link p-0 text-muted">{text}</a></li>

View File

@ -1,5 +1,5 @@
<div class="col-6 col-md-2 mb-3">
<h5>Dark Mode</h5>
<h5 class="atb-green">Dark Mode</h5>
<div class="material-switch px-4">
<input name="dark-mode-toggle" type="checkbox" id="dark-mode-toggle" class="form-check-input">
<label for="dark-mode-toggle" class="label-default"></label>

View File

@ -4,17 +4,17 @@
<div class="col-lg-6 mx-auto">
<p class="lead mb-4">Quickly add and manage an internet worth of bookmarks with AllTheBookmarks, my personal favorite app for keeping track of dead memes long after they outlive their hilarity.</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center mb-5">
<a href="#pricing" class="btn btn-primary btn-lg px-4 me-sm-3">
<a href="#pricing" class="btn btn-primary atb-green-bg btn-lg px-4 me-sm-3">
Buy Now (Too Fast)
</a>
<a href="#features" class="btn btn-outline-secondary btn-lg px-4">
<a href="#features" class="btn btn-outline-secondary btn-lg px-4 atb-green-outline">
Learn More
</a>
</div>
</div>
<div class="overflow-hidden" style="max-height: 30vh;">
<div class="container px-5">
<img src="{ROOT_URL}app/images/in-one-place.png" class="img-fluid border rounded-3 shadow-lg mb-4" alt="Example image" width="700" height="500" loading="lazy">
<img src="{ROOT_URL}images/manage.png" class="img-fluid border rounded-3 shadow-lg mb-4" alt="Example image" width="700" height="500" loading="lazy">
</div>
</div>
</div>
@ -23,7 +23,7 @@
<!-- All the stuff you need -->
<div class="container px-4 py-5" id="features">
<h2 class="pb-2 border-bottom">All the stuff you need, none of the stuff you don't!</h2>
<h2 class="pb-2 border-bottom atb-green">All the stuff you need, none of the stuff you don't!</h2>
<div class="row row-cols-1 row-cols-md-2 align-items-md-center g-5 py-5">
<div class="d-flex flex-column align-items-start gap-2">
<h3 class="fw-bold">I just wanted something cross-browser for storing bookmarks.</h3>
@ -31,28 +31,28 @@
</div>
<div class="row row-cols-1 row-cols-sm-2 g-4">
<div class="d-flex flex-column gap-2">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center atb-green-bg fs-4 rounded-3">
<i class="fa fa-fw fa-add"></i>
</div>
<h4 class="fw-semibold mb-0">Add</h4>
<p class="text-muted">Whether its through the web-interface or supported browser extensions, you can add bookmarks from (almost) anywhere.</p>
</div>
<div class="d-flex flex-column gap-2">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center atb-green-bg fs-4 rounded-3">
<i class="fa fa-fw fa-solid fa-list-check"></i>
</div>
<h4 class="fw-semibold mb-0">Manage</h4>
<p class="text-muted">Create folders, tag links, keep notes and create custom dashboards.</p>
</div>
<div class="d-flex flex-column gap-2">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center atb-green-bg fs-4 rounded-3">
<i class="fa fa-fw fa-share"></i>
</div>
<h4 class="fw-semibold mb-0">Share</h4>
<p class="text-muted">All links are kept private by default but if you need to share with a friend or co-worker you can change this setting individually or for entire folders.</p>
</div>
<div class="d-flex flex-column gap-2">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3">
<div class="feature-icon-small d-inline-flex align-items-center justify-content-center atb-green-bg fs-4 rounded-3">
<i class="fa-solid fa-arrow-right-arrow-left"></i>
</div>
<h4 class="fw-semibold mb-0">Import / Export</h4>
@ -68,16 +68,16 @@
<div class="container col-xxl-8 px-4 py-5">
<div class="row flex-lg-row-reverse align-items-center g-5 py-5">
<div class="col-10 col-sm-8 col-lg-6">
<img src="{ROOT_URL}app/images/keep-track.png" class="d-block mx-lg-auto img-fluid" alt="Bootstrap Themes" width="700" height="500" loading="lazy">
<img src="{ROOT_URL}images/folders.png" class="d-block mx-lg-auto img-fluid" alt="Bootstrap Themes" width="700" height="500" loading="lazy">
</div>
<div class="col-lg-6">
<h1 class="display-5 fw-bold lh-1 mb-3">It can be difficult to keep track of... all of the internet</h1>
<p class="lead">With a million and one devices from all three companies, it can be a lot to manage. From work links, to Instagram stories, ticktocks for cooking, to Pinterest for Halloween; we consume a thousand different sources in a hundred different ways. Keep it all centralized with a new forth company!</p>
<div class="d-grid gap-2 d-md-flex justify-content-md-start">
<a href="#pricing" class="btn btn-primary btn-lg px-4 me-md-2">
<a href="#pricing" class="btn btn-primary atb-green-bg btn-lg px-4 me-md-2">
Buy Now (Still too fast)
</a>
<a href="#darkmode" class="btn btn-outline-secondary btn-lg px-4">
<a href="#darkmode" class="btn btn-outline-secondary btn-lg px-4 atb-green-outline">
Keep Learning?
</a>
</div>
@ -104,7 +104,7 @@
<!-- Never Browse without it -->
<div class="container px-4 py-5" id="extension">
<h2 class="pb-2 border-bottom">Never Browse without it</h2>
<h2 class="pb-2 border-bottom atb-green">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">
<div class="icon-square text-bg-light d-inline-flex align-items-center justify-content-center fs-4 flex-shrink-0 me-3">
@ -113,7 +113,7 @@
<div>
<h3 class="fs-2">Chrome Extension</h3>
<p>Quickly add new bookmarks to your "2017 Taxes" folder with ease! Keep them private or share it with the other haberdashers from any page.</p>
<a href="/extensions/chrome" class="btn btn-primary">
<a href="/extensions/chrome" class="btn btn-primary atb-green-bg">
Download Now
</a>
</div>
@ -125,7 +125,7 @@
<div>
<h3 class="fs-2">Firefox Extension</h3>
<p>Funny enough, Firefox is basically just chrome now.</p>
<a href="/extensions/firefox" class="btn btn-primary">
<a href="/extensions/firefox" class="btn btn-primary atb-green-bg">
Download Now
</a>
</div>
@ -137,7 +137,7 @@
<div>
<h3 class="fs-2">Opera Extension</h3>
<p>This is also Chrome.</p>
<a href="/extensions/opera" class="btn btn-primary">
<a href="/extensions/opera" class="btn btn-primary atb-green-bg">
Download Now
</a>
</div>
@ -154,7 +154,7 @@
<h1 class="display-4 fw-normal">Pricing</h1>
<p class="fs-5 text-muted">The pricing is very straight-forward: free, monthly, yearly.</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
<a href="#compare" class="btn btn-outline-secondary btn-lg px-4">
<a href="#compare" class="btn btn-outline-secondary btn-lg px-4 atb-green-outline">
Compare
</a>
</div>
@ -166,19 +166,19 @@
<div class="container my-5">
<div class="row p-4 pb-0 pe-lg-0 pt-lg-5 align-items-center rounded-3 border shadow-lg context-main-bg">
<div class="col-lg-7 p-3 p-lg-5 pt-lg-3">
<h1 class="display-4 fw-bold lh-1">Clean, Simple, Direct</h1>
<h1 class="display-4 fw-bold lh-1 atb-green">Clean, Simple, Direct</h1>
<p class="lead">An intuitive app with a sleep, modern design is the goal. There is no need for hundreds of bells in whistles, no bluetooth, no AII to tell you what your best bookmark is, just a simple app to make life easier.</p>
<div class="d-grid gap-2 d-md-flex justify-content-md-start mb-4 mb-lg-3">
<a href="#pricing" class="btn btn-primary btn-lg px-4 me-md-2 fw-bold">
<a href="#pricing" class="btn btn-primary btn-lg px-4 me-md-2 fw-bold atb-green-bg">
Buy Now
</a>
<a href="/register" class="btn btn-outline-secondary btn-lg px-4">
<a href="/register" class="btn btn-outline-secondary btn-lg px-4 atb-green-outline">
Sign-Up for Free
</a>
</div>
</div>
<div class="col-lg-4 offset-lg-1 p-0 overflow-hidden shadow-lg">
<img class="rounded-lg-3" src="{ROOT_URL}app/images/clean-simple.png" alt="" width="720">
<img class="rounded-lg-3" src="{ROOT_URL}images/dashboard.png" alt="" width="720">
</div>
</div>
</div>
@ -190,21 +190,21 @@
<h2 class="pb-2 border-bottom">Built to.... work</h2>
<div class="row g-4 py-5 row-cols-1 row-cols-lg-3">
<div class="feature col">
<div class="feature-icon d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-2 mb-3">
<div class="feature-icon d-inline-flex align-items-center justify-content-center atb-green-bg fs-2 mb-3">
<i class="fa-solid fa-bolt"></i>
</div>
<h3 class="fs-2">Versatile</h3>
<p>Built to be a responsive application, AllTheBookmarks can be easily accessed and used from any web-enabled device.</p>
</div>
<div class="feature col">
<div class="feature-icon d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-2 mb-3">
<div class="feature-icon d-inline-flex align-items-center justify-content-center atb-green-bg fs-2 mb-3">
<i class="fa-solid fa-star"></i>
</div>
<h3 class="fs-2">Simple</h3>
<p>At the end of the day, you are managing a giant list of websites, lets not complicate that too much eh?</p>
</div>
<div class="feature col">
<div class="feature-icon d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-2 mb-3">
<div class="feature-icon d-inline-flex align-items-center justify-content-center atb-green-bg fs-2 mb-3">
<i class="fa-solid fa-wand-magic-sparkles"></i>
</div>
<h3 class="fs-2">Robust</h3>
@ -231,56 +231,56 @@
<tr>
<th scope="row" class="text-start">Add and Manage Bookmarks</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>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Extensions for all major browsers</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>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr>
<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>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></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>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Import/Export Features</th>
<td></td>
<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 atb-green"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Customizable Dashboards / Pages</th>
<td></td>
<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 atb-green"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Request/Influence Development</th>
<td></td>
<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 atb-green"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Early Access</th>
<td></td>
<td><i class="fa fa-fw fa-check"></i></td>
<td><i class="fa-solid fa-check"></i></td>
<td><i class="fa fa-fw fa-check atb-green"></i></td>
<td><i class="fa-solid fa-check atb-green"></i></td>
</tr>
<tr>
<th scope="row" class="text-start">Cheaper</th>
<td></td>
<td></td>
<td><i class="fa-solid fa-check"></i></td>
<td><i class="fa-solid fa-check atb-green"></i></td>
</tr>
</tbody>
</table>
@ -304,7 +304,7 @@
<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">
<a href="/register" class="mt-auto w-100 btn btn-lg atb-green-outline">
Sign-Up for Free
</a>
</div>
@ -324,15 +324,15 @@
<li>Direct control of Feature Development</li>
<li>Early Access to new features</li>
</ul>
<a href="/member/signup/monthly" class="mt-auto w-100 btn btn-lg btn-primary">
<a href="/member/signup/monthly" class="mt-auto w-100 btn btn-lg atb-green-bg">
Get started
</a>
</div>
</div>
</div>
<div class="col">
<div class="card mb-4 rounded-3 shadow-sm border-primary h-100 context-main-bg">
<div class="card-header py-3 text-bg-primary border-primary">
<div class="card mb-4 rounded-3 shadow-sm atb-green-outline-only h-100 context-main-bg">
<div class="card-header py-3 atb-green-bg">
<h4 class="my-0 fw-normal">Yearly</h4>
</div>
<div class="card-body d-flex flex-column">
@ -340,7 +340,7 @@
<ul class="list-unstyled mt-3 mb-4">
<li>Its cheaper if you like the product</li>
</ul>
<a href="/member/signup/yearly" class="mt-auto w-100 btn btn-lg btn-primary">
<a href="/member/signup/yearly" class="mt-auto w-100 btn btn-lg atb-green-bg">
Get started
</a>
</div>
@ -350,5 +350,5 @@
</div>
<div class="text-center py-3">
<a href="#top" class="btn btn-outline-primary">Back to Top</a>
<a href="#top" class="btn atb-green-outline">Back to Top</a>
</div>

View File

@ -1,5 +1,5 @@
<ul class="nav col-12 col-lg-auto mb-2 justify-content-center mb-md-0 mx-auto">
{LOOP}
<li><a href="{url}" class="nav-link px-2 text-white">{text}</a></li>
<li><a href="{url}" class="nav-link px-2 atb-green">{text}</a></li>
{/LOOP}
</ul>