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

@ -129,3 +129,28 @@ See the [LICENSE](LICENSE) file for licensing information as it pertains to file
- [ ] Implement uniformity in terms of error reporting, exceptions, logging. - [ ] Implement uniformity in terms of error reporting, exceptions, logging.
- [ ] I want to make an api that allows you to download and install new plugins from a centralized repository - [ ] I want to make an api that allows you to download and install new plugins from a centralized repository
- [ ] i want plugin instalation to be compatible with composer for easier management of added plugins. - [ ] i want plugin instalation to be compatible with composer for easier management of added plugins.
e-corp backup
jfk tapes
ruby ridge shooter confession
obamas kenyan birth certificate
trumps taxes
buiilding 7 charge placement map
moon landing script
Real Twitter users (Page 1 of 1)
binders full of women
gelaines panel
Illumiinati Training - year 6
Error 404 Page - The link
Contacts - B. Footy
11,778 votes
Patent Filing - Approved - iSuck
the remote
a clue
Out of stock - Nevel's Novelties
Google Maps - 33°24'55.8"N 43°18'33.3"E - WMD
Youtube - Unlisted Video PP Tape

View File

@ -311,6 +311,38 @@ body {
background: linear-gradient(to right, #2c2c2c, #1e1e1e, #1e1e1e); 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 { .bookmark-card.dragging {
opacity: 0.7; opacity: 0.7;
cursor: move; /* Show a move cursor when dragging */ 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\Classes\Forms;
use TheTempusProject\Models\Bookmarks as Bookmark; use TheTempusProject\Models\Bookmarks as Bookmark;
use TheTempusProject\Models\Folders; use TheTempusProject\Models\Folders;
use TheTempusProject\Models\BookmarkDashboards as Dashboards;
use TheTempusProject\TheTempusProject as App; use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Houdini\Classes\Components; use TheTempusProject\Houdini\Classes\Components;
use TheTempusProject\Houdini\Classes\Forms as HoudiniForms; use TheTempusProject\Houdini\Classes\Forms as HoudiniForms;
use TheTempusProject\Houdini\Classes\Navigation; use TheTempusProject\Houdini\Classes\Navigation;
use TheTempusProject\Houdini\Classes\Template; use TheTempusProject\Houdini\Classes\Template;
use TheTempusProject\Hermes\Functions\Route as Routes; 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 { class Bookmarks extends Controller {
protected static $bookmarks; protected static $bookmarks;
protected static $folders; protected static $folders;
protected static $dashboards;
public function __construct() { public function __construct() {
parent::__construct(); parent::__construct();
if ( !App::$isLoggedIn ) { if ( ! App::$isLoggedIn ) {
Session::flash( 'notice', 'You must be logged in to create or manage bookmarks.' ); Session::flash( 'notice', 'You must be logged in to create or manage bookmarks.' );
return Redirect::home(); return Redirect::home();
} }
self::$bookmarks = new Bookmark; self::$bookmarks = new Bookmark;
self::$folders = new Folders; self::$folders = new Folders;
self::$dashboards = new Dashboards;
self::$title = 'Bookmarks - {SITENAME}'; self::$title = 'Bookmarks - {SITENAME}';
self::$pageDescription = 'Add and save url bookmarks here.'; self::$pageDescription = 'Add and save url bookmarks here.';
@ -57,14 +63,23 @@ class Bookmarks extends Controller {
Components::set( 'SITE_URL', Routes::getAddress() ); Components::set( 'SITE_URL', Routes::getAddress() );
Views::raw( $tabsView ); 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>' ) ); 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' ); $viewOptions = Views::simpleView( 'bookmarks.nav.viewOptions' );
Components::set( 'VIEW_OPTIONS', $options ); Components::set( 'VIEW_OPTIONS', $viewOptions );
$dashOptions = Views::simpleView( 'bookmarks.dashboards.dashOptions' );
Components::set( 'DASH_OPTIONS', $dashOptions );
$this->setPrefToggles();
} }
public function index() { public function index() {
$bookmarks = self::$bookmarks->noFolder(); if ( Input::exists('submit') ) {
$folders = self::$folders->byUser(); $prefs = new Preferences;
$user = new User;
$fields = $prefs->convertFormToArray( true );
$out = $user->updatePrefs( $fields, App::$activeUser->ID );
$this->setPrefToggles();
}
$folders = self::$folders->byUser();
$panelArray = []; $panelArray = [];
if ( !empty( $folders ) ) { if ( !empty( $folders ) ) {
foreach ( $folders as $folder ) { foreach ( $folders as $folder ) {
@ -79,9 +94,7 @@ class Bookmarks extends Controller {
$panelArray[] = $folderObject; $panelArray[] = $folderObject;
} }
} }
Components::set( 'foldersList', Views::simpleView( 'bookmarks.folders.list', $folders ) );
Components::set( 'folderPanels', Views::simpleView( 'bookmarks.components.bookmarkListPanel', $panelArray ) ); Components::set( 'folderPanels', Views::simpleView( 'bookmarks.components.bookmarkListPanel', $panelArray ) );
Components::set( 'bookmarksList', Views::simpleView( 'bookmarks.bookmarks.list', $bookmarks ) );
return Views::view( 'bookmarks.dash' ); return Views::view( 'bookmarks.dash' );
} }
@ -102,6 +115,11 @@ class Bookmarks extends Controller {
return Views::view( 'bookmarks.bookmarks.view', $bookmark ); 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 ) { public function bookmarks( $id = null ) {
$folder = self::$folders->findById( $id ); $folder = self::$folders->findById( $id );
if ( $folder == false ) { if ( $folder == false ) {
@ -114,8 +132,6 @@ class Bookmarks extends Controller {
} }
Navigation::setCrumbComponent( 'BookmarkBreadCrumbs', 'bookmarks/bookmarks/' . $id ); Navigation::setCrumbComponent( 'BookmarkBreadCrumbs', 'bookmarks/bookmarks/' . $id );
$bookmarks = self::$bookmarks->noFolder();
$panelArray = []; $panelArray = [];
$panel = new \stdClass(); $panel = new \stdClass();
$folderObject = new \stdClass(); $folderObject = new \stdClass();
@ -325,6 +341,179 @@ class Bookmarks extends Controller {
Redirect::to( 'bookmarks/folders' ); 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 * Functionality
*/ */
@ -688,4 +877,47 @@ class Bookmarks extends Controller {
$folderSelect = Template::parse( $out ); $folderSelect = Template::parse( $out );
Components::set( 'folderSelect', $folderSelect ); 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\Classes\Controller;
use TheTempusProject\Houdini\Classes\Views; use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\TheTempusProject as App;
class Extensions extends Controller { class Extensions extends Controller {
public function index() { public function index() {
self::$title = 'Browser Extensions'; 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() { public function chrome() {
self::$title = 'Chrome Extension'; self::$title = 'Chrome Extension';
Views::view( 'extensions.chrome' ); Views::view( 'bookmarks.extensions.chrome' );
} }
public function firefox() { public function firefox() {
self::$title = 'Firefox Extension'; self::$title = 'Firefox Extension';
Views::view( 'extensions.firefox' ); Views::view( 'bookmarks.extensions.firefox' );
} }
public function opera() { public function opera() {
self::$title = 'Opera Extension'; self::$title = 'Opera Extension';
Views::view( 'extensions.opera' ); Views::view( 'bookmarks.extensions.opera' );
} }
public function edge() { public function edge() {
self::$title = 'Edge Extension'; self::$title = 'Edge Extension';
Views::view( 'extensions.edge' ); Views::view( 'bookmarks.extensions.edge' );
} }
public function brave() { public function brave() {
self::$title = 'Brave Extension'; self::$title = 'Brave Extension';
Views::view( 'extensions.brave' ); Views::view( 'bookmarks.extensions.brave' );
} }
public function safari() { public function safari() {
self::$title = 'Safari Extension'; 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( 'editFolder', __CLASS__, 'editFolder' );
self::addHandler( 'importBookmarks', __CLASS__, 'importBookmarks' ); self::addHandler( 'importBookmarks', __CLASS__, 'importBookmarks' );
self::addHandler( 'exportBookmarks', __CLASS__, 'exportBookmarks' ); self::addHandler( 'exportBookmarks', __CLASS__, 'exportBookmarks' );
self::addHandler( 'createDashboard', __CLASS__, 'createDashboard' );
self::addHandler( 'editDashboard', __CLASS__, 'editDashboard' );
} }
public static function createBookmark() { public static function createBookmark() {
@ -168,6 +170,44 @@ class BookmarksForms extends Forms {
// } // }
return true; 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; new BookmarksForms;

View File

@ -34,6 +34,11 @@ document.addEventListener('DOMContentLoaded', () => {
toggleVisibility('privacyButtonSwitch', 'btn-publish'); toggleVisibility('privacyButtonSwitch', 'btn-publish');
toggleVisibility('addButtonSwitch', 'btn-addlink'); toggleVisibility('addButtonSwitch', 'btn-addlink');
toggleVisibility('shareButtonSwitch', 'btn-share'); 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 to handle showing or hiding elements based on the checkbox state
@ -41,6 +46,10 @@ function toggleVisibility(switchId, className) {
const switchElement = document.getElementById(switchId); const switchElement = document.getElementById(switchId);
const elementsToToggle = document.querySelectorAll(`.${className}`); const elementsToToggle = document.querySelectorAll(`.${className}`);
if ( ! switchElement ) {
return;
}
// Listen for changes to the checkbox // Listen for changes to the checkbox
switchElement.addEventListener('change', () => { switchElement.addEventListener('change', () => {
if (switchElement.checked) { if (switchElement.checked) {
@ -59,6 +68,9 @@ function toggleVisibility(switchId, className) {
} }
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
const bookmarkSort = document.getElementById('bookmarkSort'); const bookmarkSort = document.getElementById('bookmarkSort');
if ( ! bookmarkSort ) {
return;
}
let draggingElement = null; let draggingElement = null;
let placeholder = null; let placeholder = null;
let initialX = 0; let initialX = 0;
@ -180,7 +192,3 @@ document.addEventListener('DOMContentLoaded', function () {
document.addEventListener('mouseup', handleDragEnd); document.addEventListener('mouseup', handleDragEnd);
bookmarkSort.addEventListener('dragover', handleDrop); // Listen for the drop event to update the order bookmarkSort.addEventListener('dragover', handleDrop); // Listen for the drop event to update the order
}); });

View File

@ -1,8 +1,8 @@
<?php <?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 * @package TP Bookmarks
* @version 3.0 * @version 3.0
@ -19,26 +19,17 @@ use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Houdini\Classes\Filters; use TheTempusProject\Houdini\Classes\Filters;
use TheTempusProject\Canary\Classes\CustomException; use TheTempusProject\Canary\Classes\CustomException;
class Bookmarkviews extends DatabaseModel { class BookmarkDashboards extends DatabaseModel {
public $tableName = 'bookmark_views'; public $tableName = 'bookmark_dashboards';
public $databaseMatrix = [ public $databaseMatrix = [
[ 'title', 'varchar', '256' ], [ 'title', 'varchar', '256' ],
[ 'saved_prefs', 'text', '' ],
[ 'link_order', 'text', '' ],
[ 'description', 'text', '' ], [ 'description', 'text', '' ],
[ 'privacy', 'varchar', '48' ],
[ 'createdBy', 'int', '11' ], [ 'createdBy', 'int', '11' ],
[ 'createdAt', 'int', '11' ], [ 'createdAt', 'int', '11' ],
[ 'updatedAt', 'int', '11' ], [ 'updatedAt', 'int', '11' ],
[ 'uuid', 'text', '' ], [ 'uuid', 'char', '36' ],
]; ];
/** /**
@ -48,7 +39,7 @@ class Bookmarkviews extends DatabaseModel {
parent::__construct(); parent::__construct();
} }
public function create( $title, $description = '', $privacy = 'private' ) { public function create( $title, $saved_prefs, $link_order, $description = '' ) {
if ( ! Check::dataTitle( $title ) ) { if ( ! Check::dataTitle( $title ) ) {
Debug::info( 'Views: illegal title.' ); Debug::info( 'Views: illegal title.' );
return false; return false;
@ -56,7 +47,8 @@ class Bookmarkviews extends DatabaseModel {
$fields = [ $fields = [
'title' => $title, 'title' => $title,
'description' => $description, 'description' => $description,
'privacy' => $privacy, 'saved_prefs' => $saved_prefs,
'link_order' => $link_order,
'uuid' => generateUuidV4(), 'uuid' => generateUuidV4(),
'createdBy' => App::$activeUser->ID, 'createdBy' => App::$activeUser->ID,
'createdAt' => time(), 'createdAt' => time(),
@ -69,7 +61,7 @@ class Bookmarkviews extends DatabaseModel {
return self::$db->lastId(); 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 ) ) { if ( !Check::id( $id ) ) {
Debug::info( 'Views: illegal ID.' ); Debug::info( 'Views: illegal ID.' );
return false; return false;
@ -81,11 +73,12 @@ class Bookmarkviews extends DatabaseModel {
$fields = [ $fields = [
'title' => $title, 'title' => $title,
'description' => $description, 'description' => $description,
'privacy' => $privacy, 'saved_prefs' => $saved_prefs,
'link_order' => $link_order,
]; ];
if ( !self::$db->update( $this->tableName, $id, $fields ) ) { if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
new CustomException( 'viewUpdate' ); new CustomException( 'viewUpdate' );
Debug::error( "Views: $id not updated: $fields" ); Debug::error( "Views: $id not updated" );
return false; return false;
} }
return true; return true;
@ -147,4 +140,16 @@ class Bookmarkviews extends DatabaseModel {
} }
return $out; 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' ], [ 'hiddenAt', 'int', '11' ],
[ 'order', 'int', '11' ], [ 'order', 'int', '11' ],
[ 'linkType', 'varchar', '32' ], [ 'linkType', 'varchar', '32' ],
[ 'uuid', 'uuid', '36' ], [ 'uuid', 'char', '36' ],
]; ];
/** /**

View File

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

View File

@ -55,6 +55,90 @@ class Bookmarks extends Plugin {
'default' => true, '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 $bookmarks;
public $folders; public $folders;

View File

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

View File

@ -1,5 +1,8 @@
<form action="" method="post" class="container py-4"> <div class="my-4">
<h2 class="text-center mb-4">Edit Bookmark</h2> <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> <fieldset>
<div class="mb-3 row"> <div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label> <label for="title" class="col-lg-5 col-form-label text-end">Title</label>
@ -48,4 +51,6 @@
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button> <button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
</div> </div>
</fieldset> </fieldset>
</form> </form>
</div>
</div>

View File

@ -1,5 +1,4 @@
<table class="table table-striped context-main">
<table class="table context-main">
<thead> <thead>
<tr> <tr>
<th style="width: 75%">Bookmark</th> <th style="width: 75%">Bookmark</th>
@ -20,9 +19,9 @@
<td style="text-align: center;"> <td style="text-align: center;">
{privacy} {privacy}
</td> </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/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-warning"><i class="fa fa-fw fa-pencil"></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-danger"><i class="fa fa-fw fa-trash"></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> </tr>
{/LOOP} {/LOOP}
{ALT} {ALT}
@ -33,8 +32,7 @@
</tr> </tr>
{/ALT} {/ALT}
</tbody> </tbody>
</table> </table>
<div class="text-center">
<div class="text-center">
<a href="{ROOT_URL}bookmarks/createBookmark" class="btn btn-md btn-primary">Create</a> <a href="{ROOT_URL}bookmarks/createBookmark" class="btn btn-md btn-primary">Create</a>
</div> </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 id="Collapse{ID}" class="accordion-collapse collapse w-100 position-relative show">
<div class="card-body accordion-body p-2 context-second-bg"> <div class="card-body accordion-body p-2 context-second-bg">
<ul class="list-group"> <ul class="list-group mt-1">
{bookmarkListRows} {bookmarkListRows}
</ul> </ul>
</div> </div>

View File

@ -1,5 +1,5 @@
{LOOP} {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="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a> <a href="{url}"> {title}</a>
<span class="float-end"> <span class="float-end">
@ -29,7 +29,7 @@
</li> </li>
{/LOOP} {/LOOP}
{ALT} {ALT}
<li class="list-group-item context-main context-main-bg"> <li class="list-group-item context-main context-main-bg mb-1">
<p class="list-group text-center">No Bookmarks</p> <p class="list-group text-center">No Bookmarks</p>
</li> </li>
{/ALT} {/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} {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="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>{privacyBadge} <a href="{url}"> {title}</a>{privacyBadge}
<span class="float-end"> <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="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg"> <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} {VIEW_OPTIONS}
<hr> <hr>
<div class="row g-3" data-masonry='{ "percentPosition": false }' id="bookmarkSort"> <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="my-4">
<div class="offset-md-1 col-10 py-3 context-main-bg"> <div class="offset-2 col-8 p-3 context-main-bg">
<legend class="text-center">Bookmark Export</legend> <legend class="text-center">Bookmark Export</legend>
<hr> <hr>
<h3 class="text-center text-muted">Select which folders to include in the export.</h3> <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"> <form action="" method="post">
<div class="row g-3 col-4 offset-4" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
<table class="table context-main"> <table class="table context-main">
<thead> <thead>
<tr> <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 --> <!-- Call to Action -->
<div class="text-center mt-5"> <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 <i class="fas fa-download me-2"></i>Get the Addon for Brave
</a> </a>
</div> </div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action --> <!-- Call to Action -->
<div class="text-center mt-5"> <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 <i class="fas fa-download me-2"></i>Get the Addon for Chrome
</a> </a>
</div> </div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action --> <!-- Call to Action -->
<div class="text-center mt-5"> <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 <i class="fas fa-download me-2"></i>Get the Addon for Edge
</a> </a>
</div> </div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action --> <!-- Call to Action -->
<div class="text-center mt-5"> <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 <i class="fas fa-download me-2"></i>Get the Addon for Firefox
</a> </a>
</div> </div>

View File

@ -14,7 +14,7 @@
<i class="fab fa-chrome fa-3x text-primary mb-3"></i> <i class="fab fa-chrome fa-3x text-primary mb-3"></i>
<h5 class="card-title">Chrome Extension</h5> <h5 class="card-title">Chrome Extension</h5>
<p class="card-text">Enhance your Chrome browser with advanced features and effortless organization.</p> <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> </div>
</div> </div>
@ -26,7 +26,7 @@
<i class="fab fa-firefox fa-3x text-warning mb-3"></i> <i class="fab fa-firefox fa-3x text-warning mb-3"></i>
<h5 class="card-title">Firefox Extension</h5> <h5 class="card-title">Firefox Extension</h5>
<p class="card-text">Seamlessly integrate with Firefox for a smoother browsing experience.</p> <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> </div>
</div> </div>
@ -38,7 +38,7 @@
<i class="fab fa-opera fa-3x text-danger mb-3"></i> <i class="fab fa-opera fa-3x text-danger mb-3"></i>
<h5 class="card-title">Opera Extension</h5> <h5 class="card-title">Opera Extension</h5>
<p class="card-text">Boost your Opera browser with intuitive features and tools.</p> <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> </div>
</div> </div>
@ -50,7 +50,7 @@
<i class="fab fa-brave fa-3x text-orange mb-3"></i> <i class="fab fa-brave fa-3x text-orange mb-3"></i>
<h5 class="card-title">Brave Extension</h5> <h5 class="card-title">Brave Extension</h5>
<p class="card-text">Enjoy secure and private browsing with Brave, enhanced by our extension.</p> <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> </div>
</div> </div>
@ -62,7 +62,7 @@
<i class="fab fa-edge fa-3x text-info mb-3"></i> <i class="fab fa-edge fa-3x text-info mb-3"></i>
<h5 class="card-title">Edge Extension</h5> <h5 class="card-title">Edge Extension</h5>
<p class="card-text">Maximize productivity on Microsoft Edge with our extension.</p> <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> </div>
</div> </div>
@ -72,7 +72,7 @@
<div class="text-center mt-5"> <div class="text-center mt-5">
<p class="text-muted"> <p class="text-muted">
<i class="fas fa-exclamation-circle me-2"></i> <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> </p>
</div> </div>
</div> </div>

View File

@ -55,7 +55,7 @@
<!-- Call to Action --> <!-- Call to Action -->
<div class="text-center mt-5"> <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 <i class="fas fa-download me-2"></i>Get the Addon for Opera
</a> </a>
</div> </div>

View File

@ -1,7 +1,8 @@
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<form action="" method="post" class="container py-4"> <legend class="text-center">Edit Folder</legend>
<h2 class="text-center mb-4">Edit Folder</h2> <hr>
<form action="" method="post" class="container py-4">
<fieldset> <fieldset>
<div class="mb-3 row"> <div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label> <label for="title" class="col-lg-5 col-form-label text-end">Title</label>
@ -40,4 +41,6 @@
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button> <button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
</div> </div>
</fieldset> </fieldset>
</form> </form>
</div>
</div>

View File

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

View File

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

View File

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

View File

@ -1,8 +1,10 @@
<ul class="nav nav-tabs justify-content-center mt-4" role="tablist"> <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/index/" class="nav-link context-main">Manage</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/unsorted/" class="nav-link context-main">Unsorted</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/dashboards/" class="nav-link context-main">Dashboards</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/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">Share</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> </ul>
{userFolderTabs} {userFolderTabs}

View File

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

View File

@ -14,7 +14,7 @@
<th style="width: 5%"></th> <th style="width: 5%"></th>
<th style="width: 5%"></th> <th style="width: 5%"></th>
<th style="width: 5%"> <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> </th>
</tr> </tr>
</thead> </thead>

View File

@ -64,7 +64,7 @@
<div class="card-footer text-center"> <div class="card-footer text-center">
{ADMIN} {ADMIN}
<form action="{ROOT_URL}admin/feedback/delete" method="post"> <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}"> <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> <button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form> </form>

View File

@ -13,7 +13,7 @@
<th style="width: 5%"></th> <th style="width: 5%"></th>
<th style="width: 5%"></th> <th style="width: 5%"></th>
<th style="width: 5%"> <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> </th>
</tr> </tr>
</thead> </thead>

View File

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

View File

@ -16,7 +16,7 @@
<th style="width: 5%"></th> <th style="width: 5%"></th>
<th style="width: 5%"></th> <th style="width: 5%"></th>
<th style="width: 5%"> <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> </th>
</tr> </tr>
</thead> </thead>

View File

@ -11,11 +11,16 @@
</p> </p>
</div> </div>
</div> </div>
<div class="col-6 offset-3 my-2">
<hr>
</div>
{/LOOP} {/LOOP}
{ALT} {ALT}
<div class="blog-post"> <div class="blog-post">
<p class="blog-post-meta py-3 text-center">No Suggestions Found.</p> <p class="blog-post-meta py-3 text-center">No Suggestions Found.</p>
</div> </div>
{/ALT} {/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> </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%"></th> <th scope="col" style="width: 10%"></th>
<th scope="col" style="width: 10%"> <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> </th>
</tr> </tr>
</thead> </thead>

View File

@ -1,5 +1,5 @@
<div class="col-6 col-md-2 mb-3"> <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"> <ul class="nav flex-column">
{LOOP} {LOOP}
<li class="nav-item mb-2"><a href="{url}" class="nav-link p-0 text-muted">{text}</a></li> <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"> <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"> <ul class="nav flex-column">
{LOOP} {LOOP}
<li class="nav-item mb-2"><a href="{url}" class="nav-link p-0 text-muted">{text}</a></li> <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"> <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"> <div class="material-switch px-4">
<input name="dark-mode-toggle" type="checkbox" id="dark-mode-toggle" class="form-check-input"> <input name="dark-mode-toggle" type="checkbox" id="dark-mode-toggle" class="form-check-input">
<label for="dark-mode-toggle" class="label-default"></label> <label for="dark-mode-toggle" class="label-default"></label>

View File

@ -4,17 +4,17 @@
<div class="col-lg-6 mx-auto"> <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> <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"> <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) Buy Now (Too Fast)
</a> </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 Learn More
</a> </a>
</div> </div>
</div> </div>
<div class="overflow-hidden" style="max-height: 30vh;"> <div class="overflow-hidden" style="max-height: 30vh;">
<div class="container px-5"> <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> </div>
</div> </div>
@ -23,7 +23,7 @@
<!-- All the stuff you need --> <!-- All the stuff you need -->
<div class="container px-4 py-5" id="features"> <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="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"> <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> <h3 class="fw-bold">I just wanted something cross-browser for storing bookmarks.</h3>
@ -31,28 +31,28 @@
</div> </div>
<div class="row row-cols-1 row-cols-sm-2 g-4"> <div class="row row-cols-1 row-cols-sm-2 g-4">
<div class="d-flex flex-column gap-2"> <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> <i class="fa fa-fw fa-add"></i>
</div> </div>
<h4 class="fw-semibold mb-0">Add</h4> <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> <p class="text-muted">Whether its through the web-interface or supported browser extensions, you can add bookmarks from (almost) anywhere.</p>
</div> </div>
<div class="d-flex flex-column gap-2"> <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> <i class="fa fa-fw fa-solid fa-list-check"></i>
</div> </div>
<h4 class="fw-semibold mb-0">Manage</h4> <h4 class="fw-semibold mb-0">Manage</h4>
<p class="text-muted">Create folders, tag links, keep notes and create custom dashboards.</p> <p class="text-muted">Create folders, tag links, keep notes and create custom dashboards.</p>
</div> </div>
<div class="d-flex flex-column gap-2"> <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> <i class="fa fa-fw fa-share"></i>
</div> </div>
<h4 class="fw-semibold mb-0">Share</h4> <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> <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>
<div class="d-flex flex-column gap-2"> <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> <i class="fa-solid fa-arrow-right-arrow-left"></i>
</div> </div>
<h4 class="fw-semibold mb-0">Import / Export</h4> <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="container col-xxl-8 px-4 py-5">
<div class="row flex-lg-row-reverse align-items-center g-5 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"> <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>
<div class="col-lg-6"> <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> <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> <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"> <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) Buy Now (Still too fast)
</a> </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? Keep Learning?
</a> </a>
</div> </div>
@ -104,7 +104,7 @@
<!-- Never Browse without it --> <!-- Never Browse without it -->
<div class="container px-4 py-5" id="extension"> <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="row g-4 py-5 row-cols-1 row-cols-lg-3">
<div class="col d-flex align-items-start"> <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"> <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> <div>
<h3 class="fs-2">Chrome Extension</h3> <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> <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 Download Now
</a> </a>
</div> </div>
@ -125,7 +125,7 @@
<div> <div>
<h3 class="fs-2">Firefox Extension</h3> <h3 class="fs-2">Firefox Extension</h3>
<p>Funny enough, Firefox is basically just chrome now.</p> <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 Download Now
</a> </a>
</div> </div>
@ -137,7 +137,7 @@
<div> <div>
<h3 class="fs-2">Opera Extension</h3> <h3 class="fs-2">Opera Extension</h3>
<p>This is also Chrome.</p> <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 Download Now
</a> </a>
</div> </div>
@ -154,7 +154,7 @@
<h1 class="display-4 fw-normal">Pricing</h1> <h1 class="display-4 fw-normal">Pricing</h1>
<p class="fs-5 text-muted">The pricing is very straight-forward: free, monthly, yearly.</p> <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"> <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 Compare
</a> </a>
</div> </div>
@ -166,19 +166,19 @@
<div class="container my-5"> <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="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"> <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> <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"> <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 Buy Now
</a> </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 Sign-Up for Free
</a> </a>
</div> </div>
</div> </div>
<div class="col-lg-4 offset-lg-1 p-0 overflow-hidden shadow-lg"> <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> </div>
</div> </div>
@ -190,21 +190,21 @@
<h2 class="pb-2 border-bottom">Built to.... work</h2> <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="row g-4 py-5 row-cols-1 row-cols-lg-3">
<div class="feature col"> <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> <i class="fa-solid fa-bolt"></i>
</div> </div>
<h3 class="fs-2">Versatile</h3> <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> <p>Built to be a responsive application, AllTheBookmarks can be easily accessed and used from any web-enabled device.</p>
</div> </div>
<div class="feature col"> <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> <i class="fa-solid fa-star"></i>
</div> </div>
<h3 class="fs-2">Simple</h3> <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> <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>
<div class="feature col"> <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> <i class="fa-solid fa-wand-magic-sparkles"></i>
</div> </div>
<h3 class="fs-2">Robust</h3> <h3 class="fs-2">Robust</h3>
@ -231,56 +231,56 @@
<tr> <tr>
<th scope="row" class="text-start">Add and Manage Bookmarks</th> <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"></i></td> <td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Extensions for all major browsers</th> <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"></i></td> <td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Access from any device</th> <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"></i></td> <td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Share bookmarks abd folders</th> <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"></i></td> <td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Import/Export Features</th> <th scope="row" class="text-start">Import/Export Features</th>
<td></td> <td></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"></i></td> <td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Customizable Dashboards / Pages</th> <th scope="row" class="text-start">Customizable Dashboards / Pages</th>
<td></td> <td></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"></i></td> <td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Request/Influence Development</th> <th scope="row" class="text-start">Request/Influence Development</th>
<td></td> <td></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"></i></td> <td><i class="fa fa-fw fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Early Access</th> <th scope="row" class="text-start">Early Access</th>
<td></td> <td></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-solid fa-check"></i></td> <td><i class="fa-solid fa-check atb-green"></i></td>
</tr> </tr>
<tr> <tr>
<th scope="row" class="text-start">Cheaper</th> <th scope="row" class="text-start">Cheaper</th>
<td></td> <td></td>
<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> </tr>
</tbody> </tbody>
</table> </table>
@ -304,7 +304,7 @@
<li>Access from any device</li> <li>Access from any device</li>
<li>Share access with anyone</li> <li>Share access with anyone</li>
</ul> </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 Sign-Up for Free
</a> </a>
</div> </div>
@ -324,15 +324,15 @@
<li>Direct control of Feature Development</li> <li>Direct control of Feature Development</li>
<li>Early Access to new features</li> <li>Early Access to new features</li>
</ul> </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 Get started
</a> </a>
</div> </div>
</div> </div>
</div> </div>
<div class="col"> <div class="col">
<div class="card mb-4 rounded-3 shadow-sm border-primary h-100 context-main-bg"> <div class="card mb-4 rounded-3 shadow-sm atb-green-outline-only h-100 context-main-bg">
<div class="card-header py-3 text-bg-primary border-primary"> <div class="card-header py-3 atb-green-bg">
<h4 class="my-0 fw-normal">Yearly</h4> <h4 class="my-0 fw-normal">Yearly</h4>
</div> </div>
<div class="card-body d-flex flex-column"> <div class="card-body d-flex flex-column">
@ -340,7 +340,7 @@
<ul class="list-unstyled mt-3 mb-4"> <ul class="list-unstyled mt-3 mb-4">
<li>Its cheaper if you like the product</li> <li>Its cheaper if you like the product</li>
</ul> </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 Get started
</a> </a>
</div> </div>
@ -350,5 +350,5 @@
</div> </div>
<div class="text-center py-3"> <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> </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"> <ul class="nav col-12 col-lg-auto mb-2 justify-content-center mb-md-0 mx-auto">
{LOOP} {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} {/LOOP}
</ul> </ul>

BIN
images/dashboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
images/folders.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
images/manage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB