diff --git a/.gitignore b/.gitignore index 2c74cbb..fb931a2 100755 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,4 @@ vendor/canary/logs/* components/* mailhog.log uploads/* +images/qr-codes/* diff --git a/app/config/constants.php b/app/config/constants.php index 2f1863c..ab609ba 100755 --- a/app/config/constants.php +++ b/app/config/constants.php @@ -39,7 +39,7 @@ if ( ! defined( 'CONFIG_DIRECTORY' ) ) { define( 'CANARY_SECURE_HASH', 'd73ed7591a30f0ca7d686a0e780f0d05' ); # Tempus Project Core define( 'APP_NAME', 'The Tempus Project'); -define( 'TP_DEFAULT_LOGO', 'images/logo.png'); +define( 'TP_DEFAULT_LOGO', 'images/logoWhite.png'); // Check define( 'MINIMUM_PHP_VERSION', 8.1); // Cookies diff --git a/app/controllers/admin/images.php b/app/controllers/admin/images.php index 690cdaf..20ca7b1 100644 --- a/app/controllers/admin/images.php +++ b/app/controllers/admin/images.php @@ -76,25 +76,6 @@ class Images extends AdminController { Views::view( 'admin.images.upload' ); } - - - - - - - - - - - - - - - - - - - private function getFolderObject( $folder, $subdirs = '' ) { $names = explode( DIRECTORY_SEPARATOR, $folder ); $folderName = array_pop( $names ); @@ -155,28 +136,6 @@ class Images extends AdminController { return $dirs; } - - - - - - - - - - - - - - - - - - - - - - public function __construct() { parent::__construct(); self::$title = 'Admin - Images'; @@ -204,25 +163,6 @@ class Images extends AdminController { Debug::error( 'There was an error with your upload.'); Issues::add( 'error', [ 'There was an error with your upload.' => Check::userErrors() ] ); } - - - - - - - - - - // if ( self::$token->create( - // Input::post( 'name' ), - // Input::post( 'notes' ), - // Input::post( 'token_type' ) - // ) ) { - // Session::flash( 'success', 'Token Created' ); - // Redirect::to( 'admin/images' ); - // } - - } Views::view( 'admin.images.create' ); } @@ -261,7 +201,6 @@ class Images extends AdminController { } public function rename() { - if ( ! Input::exists( 'fileLocation' ) ) { Session::flash( 'warning', 'Unknown image.' ); Redirect::to( 'admin/images' ); @@ -274,7 +213,6 @@ class Images extends AdminController { Issues::add( 'error', [ 'There was an error renaming the image.' => Check::userErrors() ] ); } else { $result = $this->renameFile( Input::post( 'filelocation' ), Input::post( 'newname' ) ); - if ( ! empty( $result ) ) { Session::flash( 'success', 'Image has been renamed.' ); Redirect::to( 'admin/images' ); diff --git a/app/css/main-dark.css b/app/css/main-dark.css index f2e8eb0..f6306ae 100755 --- a/app/css/main-dark.css +++ b/app/css/main-dark.css @@ -8,6 +8,14 @@ * @link https://TheTempusProject.com * @license https://opensource.org/licenses/MIT [MIT LICENSE] */ + .context-popover { + background-color: #383838; + color: white; +} + +.context-popover .popover-header { + background-color: #2c2c2c; +} .context-main-border { border-color: #f5f5f5!important; diff --git a/app/css/main.css b/app/css/main.css index 6651339..86cd59f 100755 --- a/app/css/main.css +++ b/app/css/main.css @@ -8,6 +8,40 @@ * @link https://TheTempusProject.com * @license https://opensource.org/licenses/MIT [MIT LICENSE] */ +.facebook { + border-color: #1877F2 !important; /* Facebook Blue */ + color: #1877F2 !important; +} + +.x-black { + border-color: #000000 !important; /* X (formerly Twitter) Black */ + color: #000000 !important; +} + +.reddit { + border-color: #FF4500 !important; /* Reddit Orange */ + color: #FF4500 !important; +} + +.opera { + border-color: #FF1B2D !important; /* Opera Red */ + color: #FF1B2D !important; +} + +.firefox { + border-color: #FF7139 !important; /* Firefox Orange */ + color: #FF7139 !important; +} + +.edge { + border-color: #0078D7 !important; /* Microsoft Edge Blue */ + color: #0078D7 !important; +} + +.safari { + border-color: #0B78E3 !important; /* Safari Blue */ + color: #0B78E3 !important; +} .context-main-border { border-color: #1e1e1e!important; diff --git a/app/js/main.js b/app/js/main.js index c22fc1f..95869a2 100755 --- a/app/js/main.js +++ b/app/js/main.js @@ -8,6 +8,94 @@ * @link https://TheTempusProject.com * @license https://opensource.org/licenses/MIT [MIT LICENSE] */ +/** + * Progressive Web-App + **/ +let deferredPrompt; +const installPrompt = document.getElementById("install-prompt"); +const chromeMessage = document.getElementById("chrome-install-message"); +const iosMessage = document.getElementById("ios-install-message"); +const installButton = document.getElementById("install-button"); +const dismissButton = document.querySelector("#install-prompt .btn-close"); + +// Check if the user previously dismissed the prompt +if ( ! localStorage.getItem("pwaInstallDismissed") ) { + window.addEventListener("beforeinstallprompt", (event) => { + event.preventDefault(); + deferredPrompt = event; + installPrompt.classList.remove("d-none"); + installPrompt.classList.add("d-block"); // Show the alert + chromeMessage.classList.remove("d-none"); + chromeMessage.classList.add("d-block"); // Show the prompt + }); + + if ( isIos() && ! isInStandaloneMode() ) { + installPrompt.classList.remove("d-none"); + installPrompt.classList.add("d-block"); // Show the alert + iosMessage.classList.remove("d-none"); + iosMessage.classList.add("d-block"); // Show the prompt + } +} + +// ios REQUIRES a service worker +if ( 'serviceWorker' in navigator ) { + navigator.serviceWorker.register('app/js/sw.js') + .then(() => console.log('Service Worker Registered')); +} +// self.addEventListener('install', () => self.skipWaiting()); +// self.addEventListener('activate', () => self.clients.claim()); +// self.addEventListener('fetch', () => {}); // No file interception + +// Handle Install Button Click +if ( installButton ) { + installButton.addEventListener("click", async () => { + if ( deferredPrompt ) { + deferredPrompt.prompt(); + const { outcome } = await deferredPrompt.userChoice; + + if (outcome === "dismissed") { + setInstallDismissed(); // Store that the user dismissed the prompt + } + + deferredPrompt = null; // Reset prompt + installPrompt.classList.remove("d-block"); + installPrompt.classList.add("d-none"); + } + }); +} + +// Handle Close Button Click +if ( dismissButton ) { + dismissButton.addEventListener("click", () => { + setInstallDismissed(); // Store that the user dismissed the prompt + }); +} + +// Function to remember user choice for 7 days +function setInstallDismissed() { + localStorage.setItem("pwaInstallDismissed", Date.now() + 7 * 24 * 60 * 60 * 1000); + installPrompt.classList.remove("d-block"); // Hide the prompt + installPrompt.classList.add("d-none"); +} + +// Check if the 7-day period has passed +if (localStorage.getItem("pwaInstallDismissed")) { + const dismissUntil = parseInt(localStorage.getItem("pwaInstallDismissed"), 10); + if (Date.now() < dismissUntil) { + // + } else { + localStorage.removeItem("pwaInstallDismissed"); // Reset after 7 days + } +} + +function isIos() { + return /iphone|ipad|ipod/i.test(navigator.userAgent); +} + +function isInStandaloneMode() { + return window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone; +} + /** * Automatically selects/de-selects all check boxes associated with that field **/ @@ -215,6 +303,8 @@ document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(button => { document.addEventListener("DOMContentLoaded", function () { var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); var popoverList = popoverTriggerList.map(function (popoverTriggerEl) { - return new bootstrap.Popover(popoverTriggerEl); + return new bootstrap.Popover(popoverTriggerEl, { + customClass: 'context-popover', + }); }); }); \ No newline at end of file diff --git a/app/js/sw.js b/app/js/sw.js new file mode 100644 index 0000000..89c3448 --- /dev/null +++ b/app/js/sw.js @@ -0,0 +1 @@ +self.addEventListener('fetch', () => {}); \ No newline at end of file diff --git a/app/models/sessions.php b/app/models/sessions.php index 2070dde..df5f2b2 100755 --- a/app/models/sessions.php +++ b/app/models/sessions.php @@ -59,7 +59,7 @@ class Sessions extends DatabaseModel { public function checkSession( $sessionID ) { $user = new User; // @todo lets put this on some sort of realistic checking regime other than check everything every time - if ( $sessionID == false ) { + if ( empty( $sessionID ) ) { Debug::log( 'sessionID false' ); return false; } diff --git a/app/templates/default/default.inc.php b/app/templates/default/default.inc.php index 95ff8c6..6747556 100755 --- a/app/templates/default/default.inc.php +++ b/app/templates/default/default.inc.php @@ -19,6 +19,15 @@ use TheTempusProject\Houdini\Classes\Components; use TheTempusProject\Bedrock\Classes\Config; use TheTempusProject\Bedrock\Functions\Input; use TheTempusProject\TheTempusProject as App; +use Endroid\QrCode\Builder\Builder; +use Endroid\QrCode\Encoding\Encoding; +use Endroid\QrCode\ErrorCorrectionLevel; +use Endroid\QrCode\Label\LabelAlignment; +use Endroid\QrCode\Label\Font\OpenSans; +use Endroid\QrCode\RoundBlockSizeMode; +use Endroid\QrCode\Writer\PngWriter; +use TheTempusProject\Hermes\Functions\Route as Routes; +use TheTempusProject\Canary\Bin\Canary as Debug; class DefaultLoader extends Loader { private static $loaded = false; @@ -41,12 +50,61 @@ class DefaultLoader extends Loader { } $this->addJs( '' ); Components::setIfNull( 'LOGO', Config::getValue( 'main/logo' ) ?? TP_DEFAULT_LOGO ); + + if ( ! empty( Config::getValue( 'share/enabled' ) ) ) { + $currentUrl = Routes::getAddress() . Input::get( 'url' ); + $folder = IMAGE_DIRECTORY . 'qr-codes' . DIRECTORY_SEPARATOR ; + $filename = md5( $currentUrl ) . '.png'; + + if ( ! file_exists( $folder ) ) { + Debug::Info( 'Creating Directory because it does not exist' ); + mkdir( $folder, 0777, true ); + } + if ( ! empty( Config::getValue( 'share/qr' ) ) ) { + if ( ! file_exists( $folder . $filename ) ) { + Debug::Info( 'Creating qr-image because it does not exist' ); + $builder = new Builder( + writer: new PngWriter(), + writerOptions: [], + validateResult: false, + data: Routes::getAddress() . Input::get( 'url' ), + encoding: new Encoding('UTF-8'), + errorCorrectionLevel: ErrorCorrectionLevel::High, + size: 200, + margin: 10, + roundBlockSizeMode: RoundBlockSizeMode::Margin, + logoPath: APP_ROOT_DIRECTORY . DIRECTORY_SEPARATOR . Config::getValue( 'main/logo' ), + logoResizeToWidth: 30, + logoPunchoutBackground: true, + labelText: Config::getValue( 'main/name' ), + labelFont: new OpenSans(14), + labelAlignment: LabelAlignment::Center + ); + $result = $builder->build(); + $result->saveToFile( $folder . $filename ); + } + Components::set( 'QR_CODE','QR Code' ); + } else { + Components::setIfNull( 'QR_CODE', '' ); + } + Components::setIfNull( 'SHARE_IMAGE', Views::simpleView( 'footer.share' ) ); + } else { + Components::setIfNull( 'SHARE_IMAGE', '' ); + } + + if ( ! empty( Config::getValue( 'main/pwa' ) ) ) { + Components::setIfNull( 'PWA', Views::simpleView( 'pwa') ); + } else { + Components::setIfNull( 'PWA', '' ); + } + Components::setIfNull( 'COPY', Views::simpleView( 'footer.copy') ); Components::setIfNull( 'SOCIAL', Views::simpleView( 'footer.social') ); Components::prepend( 'FOOTER_LEFT', Views::simpleView( 'footer.left', Navigation::getMenuLinks( App::CONTACT_FOOTER_MENU_NAME ) ) ); Components::prepend( 'FOOTER_CENTER', Views::simpleView( 'footer.center', Navigation::getMenuLinks( App::INFO_FOOTER_MENU_NAME ) ) ); Components::prepend( 'FOOTER_RIGHT', Views::simpleView( 'footer.right') ); Components::setIfNull( 'FOOT', Views::simpleView( 'footer.container') ); + /** * Top-Nav */ diff --git a/app/templates/default/default.tpl b/app/templates/default/default.tpl index 2cda303..24e5a02 100755 --- a/app/templates/default/default.tpl +++ b/app/templates/default/default.tpl @@ -28,7 +28,12 @@ {AUTHOR} {ROBOT} + + + + + @@ -91,6 +96,7 @@ {/ISSUES} + {PWA} {CONTENT} diff --git a/app/views/faq.html b/app/views/faq.html index 956f2b6..b914758 100755 --- a/app/views/faq.html +++ b/app/views/faq.html @@ -56,8 +56,8 @@
- {SITENAME} is open source and available free of charge through GitLab and Packagist. - The developer behind the project is Joey Kimsey and he can be contacted through his website for development services. + {SITENAME} is open source and available free of charge through GitLab and Packagist. + The developer behind the project is Joey Kimsey and he can be contacted through his website for development services.
diff --git a/app/views/footer/right.html b/app/views/footer/right.html index 351f1e5..b17317d 100755 --- a/app/views/footer/right.html +++ b/app/views/footer/right.html @@ -1,4 +1,5 @@
+ {SHARE_IMAGE}
Dark Mode
diff --git a/app/views/footer/share.html b/app/views/footer/share.html new file mode 100644 index 0000000..53cb6a6 --- /dev/null +++ b/app/views/footer/share.html @@ -0,0 +1,17 @@ +
+
Share
+
+ + +
+
\ No newline at end of file diff --git a/app/views/index.html b/app/views/index.html index db1b777..c27723b 100755 --- a/app/views/index.html +++ b/app/views/index.html @@ -101,21 +101,21 @@

Subscribe

-

Building your list should always be a part of your application and services and it made as simple as can be with this plugin.

+

Building your list should always be a part of your business. Our subscriptions plugin makes it as simple as can be.

WIP (Work in Progress)

-

A light-weight and simple plugin that allows you to keep a running list of works in progress to share with site visitors..

+

A light-weight and simple plugin that allows you to keep a running list of work in progress to share with site visitors.

Memberships / Payments

-

Our membership plugin integrates with Stripe to allow incredibly simple membership setup and can be easily expanded to sell any of your products.

+

Our membership plugin integrates with Stripe to allow incredibly simple membership setup and can be easily expanded to sell any of your products. We also have a donations integration with stripe to allow you to accept donation right from the app.

diff --git a/app/views/pwa.html b/app/views/pwa.html new file mode 100644 index 0000000..45bfae8 --- /dev/null +++ b/app/views/pwa.html @@ -0,0 +1,18 @@ +
+
+ + + +
+
\ No newline at end of file diff --git a/bin/tempus_project.php b/bin/tempus_project.php index a1c2724..840e5ba 100755 --- a/bin/tempus_project.php +++ b/bin/tempus_project.php @@ -325,7 +325,13 @@ class TheTempusProject extends Bedrock { "pretty" => "Maximum Login session length. (in seconds)", "default" => 604800, // 60 * 60 * 24 * 7 "value" => 604800, // 60 * 60 * 24 * 7 - ] + ], + "pwa" => [ + "type" => "radio", + "pretty" => "Enable PWA banner for installs", + "default" => false, + "value" => false, + ], ], "maintenance" => [ "enabled" => [ @@ -341,6 +347,20 @@ class TheTempusProject extends Bedrock { "value" => "Currently the site is undergoing maintenance. Only administrators will be able to sign in.", ] ], + "share" => [ + "enabled" => [ + "type" => "radio", + "pretty" => "Enables the share popover.", + "default" => false, + "value" => false, + ], + "qr"=> [ + "type" => "radio", + "pretty" => "Enables a custom qr-code in the share popover.", + "default" => false, + "value" => false, + ] + ], "uploads" => [ "images" => [ "type" => "radio", diff --git a/composer.json b/composer.json index a92ab50..8f2d095 100755 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ { "endroid/qr-code": "^6.0", "fortawesome/font-awesome": "4.7", - "thetempusproject/bedrock": "1.1.5", + "thetempusproject/bedrock": "1.1.6", "thetempusproject/canary": "1.0.9", "thetempusproject/houdini": "2.0.5", "twbs/bootstrap": "5.2.3" diff --git a/composer.lock b/composer.lock index c178e1c..8bc84cf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,37 +4,151 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d85438494def4dfe5294034363151ee2", + "content-hash": "10e7ce6b744b46b0c10780dbd7786ecb", "packages": [ { - "name": "components/jquery", - "version": "1.9.1", + "name": "bacon/bacon-qr-code", + "version": "v3.0.1", "source": { "type": "git", - "url": "https://github.com/components/jquery.git", - "reference": "ae5c0c13cf163b3751ce55f9d9e97c1ba7ff796d" + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/components/jquery/zipball/ae5c0c13cf163b3751ce55f9d9e97c1ba7ff796d", - "reference": "ae5c0c13cf163b3751ce55f9d9e97c1ba7ff796d", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f9cc1f52b5a463062251d666761178dbdb6b544f", + "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f", "shasum": "" }, "require": { - "robloach/component-installer": "*" + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^8.1" }, - "type": "component", + "require-dev": { + "phly/keep-a-changelog": "^2.12", + "phpunit/phpunit": "^10.5.11 || 11.0.4", + "spatie/phpunit-snapshot-assertions": "^5.1.5", + "squizlabs/php_codesniffer": "^3.9" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.1" + }, + "time": "2024-10-01T13:55:55+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" + }, + "time": "2024-08-09T14:30:48+00:00" + }, + { + "name": "endroid/qr-code", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/endroid/qr-code.git", + "reference": "bdbb06e767efe9abe3c00461662b4059a6cd0b55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/bdbb06e767efe9abe3c00461662b4059a6cd0b55", + "reference": "bdbb06e767efe9abe3c00461662b4059a6cd0b55", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^3.0", + "php": "^8.2" + }, + "require-dev": { + "endroid/quality": "dev-main", + "ext-gd": "*", + "khanamiryan/qrcode-detector-decoder": "^2.0.2", + "setasign/fpdf": "^1.8.2" + }, + "suggest": { + "ext-gd": "Enables you to write PNG images", + "khanamiryan/qrcode-detector-decoder": "Enables you to use the image validator", + "roave/security-advisories": "Makes sure package versions with known security issues are not installed", + "setasign/fpdf": "Enables you to use the PDF writer" + }, + "type": "library", "extra": { - "component": { - "files": [ - "jquery.min.js", - "jquery-migrate.js", - "jquery-migrate.min.js", - "jquery.min.map" - ], - "scripts": [ - "jquery.js" - ] + "branch-alias": { + "dev-main": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Endroid\\QrCode\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -43,20 +157,30 @@ ], "authors": [ { - "name": "John Resig", - "email": "jeresig@gmail.com" + "name": "Jeroen van den Enden", + "email": "info@endroid.nl" } ], - "description": "jQuery JavaScript Library", - "homepage": "http://jquery.com", + "description": "Endroid QR Code", + "homepage": "https://github.com/endroid/qr-code", + "keywords": [ + "code", + "endroid", + "php", + "qr", + "qrcode" + ], "support": { - "forum": "http://forum.jquery.com", - "irc": "irc://irc.freenode.org/jquery", - "issues": "http://bugs.jquery.com", - "source": "https://github.com/jquery/jquery", - "wiki": "http://docs.jquery.com/" + "issues": "https://github.com/endroid/qr-code/issues", + "source": "https://github.com/endroid/qr-code/tree/6.0.3" }, - "time": "2014-10-11T11:52:45+00:00" + "funding": [ + { + "url": "https://github.com/endroid", + "type": "github" + } + ], + "time": "2024-10-29T19:28:52+00:00" }, { "name": "fortawesome/font-awesome", @@ -110,221 +234,30 @@ }, "time": "2016-10-24T15:52:54+00:00" }, - { - "name": "kriswallsmith/assetic", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/kriswallsmith/assetic.git", - "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", - "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", - "shasum": "" - }, - "require": { - "php": ">=5.3.1", - "symfony/process": "~2.1|~3.0" - }, - "conflict": { - "twig/twig": "<1.27" - }, - "require-dev": { - "leafo/lessphp": "^0.3.7", - "leafo/scssphp": "~0.1", - "meenie/javascript-packer": "^1.1", - "mrclay/minify": "<2.3", - "natxet/cssmin": "3.0.4", - "patchwork/jsqueeze": "~1.0|~2.0", - "phpunit/phpunit": "~4.8 || ^5.6", - "psr/log": "~1.0", - "ptachoire/cssembed": "~1.0", - "symfony/phpunit-bridge": "~2.7|~3.0", - "twig/twig": "~1.23|~2.0", - "yfix/packager": "dev-master" - }, - "suggest": { - "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", - "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", - "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", - "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor", - "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", - "twig/twig": "Assetic provides the integration with the Twig templating engine" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-0": { - "Assetic": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kris Wallsmith", - "email": "kris.wallsmith@gmail.com", - "homepage": "http://kriswallsmith.net/" - } - ], - "description": "Asset Management for PHP", - "homepage": "https://github.com/kriswallsmith/assetic", - "keywords": [ - "assets", - "compression", - "minification" - ], - "support": { - "issues": "https://github.com/kriswallsmith/assetic/issues", - "source": "https://github.com/kriswallsmith/assetic/tree/master" - }, - "time": "2016-11-11T18:43:20+00:00" - }, - { - "name": "robloach/component-installer", - "version": "0.0.12", - "source": { - "type": "git", - "url": "https://github.com/RobLoach/component-installer.git", - "reference": "1864f25db21fc173e02a359f646acd596c1b0460" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/RobLoach/component-installer/zipball/1864f25db21fc173e02a359f646acd596c1b0460", - "reference": "1864f25db21fc173e02a359f646acd596c1b0460", - "shasum": "" - }, - "require": { - "kriswallsmith/assetic": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "composer/composer": "1.*" - }, - "type": "composer-installer", - "extra": { - "class": "ComponentInstaller\\Installer" - }, - "autoload": { - "psr-0": { - "ComponentInstaller": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Loach", - "email": "robloach@gmail.com", - "homepage": "http://robloach.net" - } - ], - "description": "Allows installation of Components via Composer.", - "support": { - "issues": "https://github.com/RobLoach/component-installer/issues", - "source": "https://github.com/RobLoach/component-installer/tree/master" - }, - "abandoned": "oomphinc/composer-installers-extender", - "time": "2013-08-31T23:46:48+00:00" - }, - { - "name": "symfony/process", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b8648cf1d5af12a44a51d07ef9bf980921f15fca", - "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v3.4.47" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T10:57:07+00:00" - }, { "name": "thetempusproject/bedrock", - "version": "1.1.2", + "version": "1.1.6", "source": { "type": "git", "url": "https://git.thetempusproject.com/the-tempus-project/bedrock", - "reference": "394e7520941a706fadc19d0c6606a78306289b74" + "reference": "cfa53c9e7058f78559ee8615431645c7eef972f8" }, "require": { "php": ">=8.1.0", - "thetempusproject/canary": "1.0.7", + "thetempusproject/canary": "1.0.9", "thetempusproject/hermes": "1.0.5", - "thetempusproject/houdini": "2.0.3" + "thetempusproject/houdini": "2.0.5" }, "type": "library", "autoload": { "files": [ - "Config/constants.php", - "Bin/Bedrock.php" + "config/constants.php", + "bin/bedrock.php" ], - "psr-4": { - "TheTempusProject\\Bedroock\\Classes\\": "Classes", - "TheTempusProject\\Bedroock\\Functions\\": "Functions" - } + "classmap": [ + "classes", + "functions" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -346,15 +279,15 @@ "php", "thetempusproject" ], - "time": "2025-02-02T23:42:29+00:00" + "time": "2025-02-06T03:02:46+00:00" }, { "name": "thetempusproject/canary", - "version": "1.0.7", + "version": "1.0.9", "source": { "type": "git", "url": "https://git.thetempusproject.com/the-tempus-project/canary", - "reference": "9c48e66bf54e63ba5ad2d4af90306c87b69f7048" + "reference": "77cef522e9919573836901eb82b59b20f453fb61" }, "require": { "php": ">=8.1.0" @@ -362,12 +295,12 @@ "type": "library", "autoload": { "files": [ - "Config/constants.php", - "Bin/Canary.php" + "config/constants.php", + "bin/canary.php" ], - "psr-4": { - "TheTempusProject\\Canary\\Classes\\": "Classes" - } + "classmap": [ + "classes" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -390,7 +323,7 @@ "thetempusproject", "tools" ], - "time": "2025-02-02T23:02:51+00:00" + "time": "2025-02-04T12:16:29+00:00" }, { "name": "thetempusproject/hermes", @@ -438,15 +371,15 @@ }, { "name": "thetempusproject/houdini", - "version": "2.0.3", + "version": "2.0.5", "source": { "type": "git", "url": "https://git.thetempusproject.com/the-tempus-project/houdini", - "reference": "4c9c9b60233c4dd7a366758c8436560098761eb5" + "reference": "2c7538471ab1f900048ccdb2c71d6bf2bee975e0" }, "require": { "php": ">=8.1.0", - "thetempusproject/canary": "1.0.7", + "thetempusproject/canary": "1.0.9", "thetempusproject/hermes": "1.0.5" }, "type": "library", @@ -478,7 +411,7 @@ "thetempusproject", "tools" ], - "time": "2025-02-02T23:31:11+00:00" + "time": "2025-02-04T12:19:25+00:00" }, { "name": "twbs/bootstrap", @@ -534,10 +467,10 @@ "packages-dev": [], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/images/apple-touch-icon.png b/images/apple-touch-icon.png new file mode 100644 index 0000000..213fa01 Binary files /dev/null and b/images/apple-touch-icon.png differ diff --git a/images/icon-mask-dark.png b/images/icon-mask-dark.png new file mode 100644 index 0000000..bbe9ab7 Binary files /dev/null and b/images/icon-mask-dark.png differ diff --git a/images/icon-mask-white.png b/images/icon-mask-white.png new file mode 100644 index 0000000..d93d196 Binary files /dev/null and b/images/icon-mask-white.png differ diff --git a/images/icon-mask.png b/images/icon-mask.png index d93d196..982ff10 100644 Binary files a/images/icon-mask.png and b/images/icon-mask.png differ diff --git a/images/icon-maskWhite.png b/images/icon-maskWhite.png new file mode 100644 index 0000000..d93d196 Binary files /dev/null and b/images/icon-maskWhite.png differ diff --git a/images/logo192.png b/images/logo192.png new file mode 100644 index 0000000..ff2b534 Binary files /dev/null and b/images/logo192.png differ diff --git a/images/logo512.png b/images/logo512.png new file mode 100644 index 0000000..68b0522 Binary files /dev/null and b/images/logo512.png differ diff --git a/images/share-icon.png b/images/share-icon.png new file mode 100644 index 0000000..a731a1e Binary files /dev/null and b/images/share-icon.png differ diff --git a/manifest.webmanifest b/manifest.webmanifest index 3c82045..7af15a5 100755 --- a/manifest.webmanifest +++ b/manifest.webmanifest @@ -7,8 +7,8 @@ "background_color": "#7d7f83", "theme_color": "#3fa9f5", "icons": [ - { "src": "/images/logo192.png", "type": "image/png", "sizes": "192x192" }, - { "src": "/images/logo512.png", "type": "image/png", "sizes": "512x512" }, + { "src": "/images/logoWhite192.png", "type": "image/png", "sizes": "192x192" }, + { "src": "/images/logoWhite512.png", "type": "image/png", "sizes": "512x512" }, { "src": "/images/icon-mask.png", "type": "image/png", "sizes": "512x512", "purpose": "maskable" } ], "screenshots": [