diff --git a/README.md b/README.md new file mode 100644 index 0000000..7b111b7 --- /dev/null +++ b/README.md @@ -0,0 +1,99 @@ +# 🍸 Saufen - The Fabulous Drink Inventory System 🏳️‍🌈 + +*Because every fabulous party needs a fabulous drink management system!* + +--- + +## ✨ What's This Fabulousness All About? ✨ + +Welcome to **Saufen** (German for "drinking" - because we're fancy like that! 💅), the most fabulous drink inventory management system that ever graced the internet! + +This isn't just any boring inventory system - oh no, honey! This is where **gay excellence meets drink management** in the most spectacular way possible. We're talking about tracking your favorite cocktails, managing your bar stock, and making sure you never run out of the good stuff when the party gets started! 🎉 + +--- + +## 🎭 The Main Characters (What This Bad Bitch Does) 🎭 + +### 🍹 **Drink Type Management** +- Add all your favorite drinks with fabulous names and descriptions +- Set your desired stock levels (because running out of tequila is a CRIME!) +- Track current inventory like the organized queen you are + +### 📋 **Order Management** +- Create fabulous orders when your stock gets low +- Track order status from "new" to "delivered" (the journey of a true icon!) +- Never let your bar run dry again! + +### 🚨 **Low Stock Alerts** +- Get dramatic alerts when your favorite drinks are running low +- Because we all know that empty vodka bottle is a tragedy waiting to happen! + +### 🎨 **Fabulous Fun Facts** +- Learn amazing drink trivia while managing your inventory +- Did you know the Cosmopolitan became popular thanks to 'Sex and the City'? ICONIC! +- Random fabulous facts appear on every page because education is fierce! 💅 + +--- + +## 🌈 Why This Project is Absolutely Everything 🌈 + +This project was born from the simple truth that **every fabulous party needs fabulous organization**. Whether you're running a gay bar, hosting the party of the century, or just want to keep track of your personal drink collection, Saufen has got your back! + +It's built with love, fabulousness, and the understanding that sometimes you need to know exactly how many bottles of champagne you have before the drag show starts! 🎭 + +--- + +## 🎪 The Vibe We're Going For 🎪 + +Imagine if **RuPaul's Drag Race** and **Bar Rescue** had a beautiful baby, and that baby was obsessed with organization and fabulousness. That's Saufen! + +We're talking: +- ✨ Rainbow aesthetics +- 💅 Fabulous drink facts +- 🎭 Dramatic low stock alerts +- 🍸 Comprehensive drink management +- 🏳️‍🌈 LGBTQ+ friendly vibes throughout + +--- + +## 🎊 How to Get This Party Started 🎊 + +1. **Clone this fabulous repository** +2. **Install the dependencies** (because even queens need their tools!) +3. **Set up your database** (where all the magic happens) +4. **Start adding your drinks** (the fun part!) +5. **Let the fabulousness begin!** 🎉 + +--- + +## 🏆 What Makes This Project Special 🏆 + +- **Gay Excellence**: Built with love for the LGBTQ+ community +- **Fabulous Design**: Because boring interfaces are so last season +- **Smart Alerts**: Never run out of your favorite drinks again +- **Fun Facts**: Learn while you manage (education is fierce!) +- **Easy to Use**: So easy, even your straight friends can figure it out! 😘 + +--- + +## 🎭 The Story Behind the Name 🎭 + +"Saufen" is German for "drinking" - because we're international queens who appreciate a good cultural reference! Plus, it sounds fabulous when you say it with the right accent. Try it: "Saufen" - see? Fabulous! + +--- + +## 🌟 Special Thanks 🌟 + +This project was created with love, fabulousness, and the understanding that every good party needs good organization. Shoutout to all the fabulous people who inspired this project and to everyone who believes that drink management can be both functional AND fabulous! + +--- + +## 🎪 Final Thoughts 🎪 + +Remember, darlings: **Life is too short for bad drinks and bad organization**. With Saufen, you get the best of both worlds - fabulous drink management and fabulous vibes! + +Now go forth and slay that inventory management! 💅✨ + +--- + +*Built with love, fabulousness, and the understanding that every queen needs her tools!* 🏳️‍🌈✨ \ No newline at end of file diff --git a/assets/app.js b/assets/app.js index 7aa7252..8ed6e87 100644 --- a/assets/app.js +++ b/assets/app.js @@ -10,11 +10,11 @@ import './styles/modes.css'; import './styles/emoji-footprint.css'; // Import modules -import './theme.js'; -import './emoji-footprint.js'; -import './modes.js'; -import { initNumberInputs } from './numberInputs.js'; -import { initRadioState } from './radioState.js'; +import './javascript/theme.js'; +import './javascript/emoji-footprint.js'; +import './javascript/modes.js'; +import { initNumberInputs } from './javascript/numberInputs.js'; +import { initRadioState } from './javascript/radioState.js'; // Initialize everything when DOM is ready document.addEventListener('DOMContentLoaded', function() { @@ -23,4 +23,4 @@ document.addEventListener('DOMContentLoaded', function() { // Initialize number inputs on page load initNumberInputs(); -}); \ No newline at end of file +}); diff --git a/assets/emoji-footprint.js b/assets/javascript/emoji-footprint.js similarity index 100% rename from assets/emoji-footprint.js rename to assets/javascript/emoji-footprint.js diff --git a/assets/modes.js b/assets/javascript/modes.js similarity index 86% rename from assets/modes.js rename to assets/javascript/modes.js index 909348f..4109019 100644 --- a/assets/modes.js +++ b/assets/javascript/modes.js @@ -1,7 +1,19 @@ // Bonkers mode functionality +function setEmojiLevelClass(mode) { + document.body.classList.remove('emoji-normal', 'emoji-enhanced', 'emoji-bonkers'); + if (mode === 'bonkers') { + document.body.classList.add('emoji-bonkers'); + } else if (mode === 'enhanced') { + document.body.classList.add('emoji-enhanced'); + } else { + document.body.classList.add('emoji-normal'); + } +} + function initBonkersMode() { // Check if we're in bonkers mode const currentMode = document.documentElement.getAttribute('data-website-mode'); + setEmojiLevelClass(currentMode); if (currentMode === 'bonkers') { // Apply bonkers mode immediately @@ -48,7 +60,7 @@ function createExtraSparkles() { // Continue creating extra sparkles while in bonkers mode const newMode = document.documentElement.getAttribute('data-website-mode'); if (newMode === 'bonkers') { - setTimeout(() => createExtraSparkles(), 150); + setTimeout(() => createExtraSparkles(), 75); } } @@ -60,7 +72,8 @@ function createSlayEffects() { // Create floating "SLAY" text effects const slayWords = [ 'SLAY', 'QUEEN', 'FABULOUS', 'ICONIC', 'LEGENDARY', 'STUNNING', 'GORGEOUS', 'FLAWLESS', - 'DAZZLING', 'RADIANT', 'BREATHTAKING', 'EXQUISITE', 'DIVINE' + 'DAZZLING', 'RADIANT', 'BREATHTAKING', 'EXQUISITE', 'DIVINE', 'HOT', 'SEXY', 'SMOOTH', + 'xoxo', ]; const slayElement = document.createElement('div'); slayElement.className = 'slay-text'; @@ -78,7 +91,7 @@ function createSlayEffects() { // Continue creating slay effects while in bonkers mode const newMode = document.documentElement.getAttribute('data-website-mode'); if (newMode === 'bonkers') { - setTimeout(() => createSlayEffects(), 800); + setTimeout(() => createSlayEffects(), 100); } } @@ -92,6 +105,7 @@ function watchModeChanges() { if (newMode === 'bonkers') { document.body.classList.add('bonkers-mode'); + setEmojiLevelClass(newMode); // Start the fabulous effects createExtraSparkles(); @@ -100,6 +114,7 @@ function watchModeChanges() { console.log('🌈✨ Switched to bonkers mode! ✨🌈'); } else { document.body.classList.remove('bonkers-mode'); + setEmojiLevelClass(newMode); console.log(`😴 Switched to ${newMode} mode`); } } diff --git a/assets/numberInputs.js b/assets/javascript/numberInputs.js similarity index 100% rename from assets/numberInputs.js rename to assets/javascript/numberInputs.js diff --git a/assets/radioState.js b/assets/javascript/radioState.js similarity index 100% rename from assets/radioState.js rename to assets/javascript/radioState.js diff --git a/assets/theme.js b/assets/javascript/theme.js similarity index 100% rename from assets/theme.js rename to assets/javascript/theme.js diff --git a/assets/styles/app.css b/assets/styles/app.css index befa7ed..7400735 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -15,7 +15,7 @@ --bs-yellow: #F9F871; /* ⚡ Neon Lemon */ --bs-cyan: #00F5D4; /* 💎 Glitchy Teal */ --bs-blue: #00A9E0; /* 💦 Splash Zone */ - + /* Let's redefine ALL the core colors to match the new energy */ --bs-primary: var(--bs-pink); --bs-secondary: var(--bs-green); @@ -23,7 +23,7 @@ --bs-info: var(--bs-blue); --bs-warning: var(--bs-yellow); --bs-danger: #FF3D3D; /* 🚨 Code Red Rave */ - + /* --- BACKGROUNDS & TEXT --- */ /* No more boring white! */ --bs-body-bg: #FFF5FD; /* A soft, dreamy pink canvas */ @@ -31,16 +31,16 @@ --bs-heading-color: var(--bs-purple); /* Make headings POP */ --bs-secondary-color: rgba(74, 0, 61, 0.75); /* Plum, but softer */ --bs-tertiary-color: rgba(74, 0, 61, 0.5); - + /* Make cards and containers pure white to contrast the pink background */ --bs-tertiary-bg: #FFFFFF; --bs-secondary-bg: #FEF9FE; - + /* --- LINKS & CODE --- */ --bs-link-color: var(--bs-pink); --bs-link-hover-color: var(--bs-purple); --bs-code-color: var(--bs-purple); - + /* --- BORDERS & SHADOWS: LET'S GET QUIRKY --- */ --bs-border-width: 2px; /* Chunky borders! */ --bs-border-color: #FFD6F5; /* Pink-tinted border color */ @@ -49,24 +49,24 @@ --bs-border-radius-sm: 0.5rem; --bs-border-radius-lg: 1.5rem; --bs-border-radius-pill: 50rem; - + /* Say goodbye to black shadows, hello to colored glows! */ --bs-box-shadow: 0 4px 12px rgba(255, 0, 122, 0.2); --bs-box-shadow-sm: 0 2px 4px rgba(255, 0, 122, 0.15); --bs-box-shadow-lg: 0 8px 30px rgba(255, 0, 122, 0.25); --bs-box-shadow-inset: inset 0 1px 4px rgba(74, 0, 61, 0.2); - + /* --- THE GRADIENT: THE SOUL OF THE THEME --- */ --bs-gradient: linear-gradient(75deg, var(--bs-primary), var(--bs-secondary)); - + /* --- Don't forget the RGB values for Bootstrap components! --- */ --bs-primary-rgb: 255, 0, 122; --bs-secondary-rgb: 207, 255, 80; --bs-body-color-rgb: 74, 0, 61; --bs-body-bg-rgb: 255, 245, 253; } - - + + /* * ================================================================================================= * 🌙🦇 CYBER GOTH THEME (DARK) 🦇🌙 @@ -77,31 +77,31 @@ */ [data-bs-theme=dark] { color-scheme: dark; - + /* --- BACKGROUNDS & TEXT --- */ --bs-body-bg: #1D001A; /* Deep, dark space purple */ --bs-body-color: #FFE9FA; /* Light pink text for high contrast */ --bs-heading-color: var(--bs-cyan); /* Glowing cyan headings */ - + --bs-tertiary-bg: #2E0028; /* A slightly lighter container background */ --bs-secondary-bg: #3A0033; --bs-secondary-color: rgba(255, 233, 250, 0.75); --bs-tertiary-color: rgba(255, 233, 250, 0.5); - + /* --- LINKS & CODE --- */ /* Using the Toxic Slime for links gives it that cyber look */ --bs-link-color: var(--bs-green); --bs-link-hover-color: var(--bs-cyan); --bs-code-color: var(--bs-pink); - + /* --- BORDERS & SHADOWS: NEON GLOWS --- */ --bs-border-color: #5C004F; --bs-border-color-translucent: rgba(255, 255, 255, 0.15); - + /* Redefine shadows to be neon glows */ --bs-box-shadow: 0 0 15px rgba(var(--bs-primary-rgb), 0.4); --bs-box-shadow-lg: 0 0 30px rgba(var(--bs-primary-rgb), 0.5); - + /* --- EMPHASIS & SUBTLE BACKGROUNDS --- */ /* These are for alerts, badges, etc. They'll be dark with glowing text. */ --bs-primary-text-emphasis: #FF8AD1; @@ -110,11 +110,70 @@ --bs-info-text-emphasis: #7ADCF5; --bs-warning-text-emphasis: #FAF8A8; --bs-danger-text-emphasis: #FF8A8A; - + --bs-primary-bg-subtle: #3D002B; --bs-secondary-bg-subtle: #415215; --bs-success-bg-subtle: #00332B; --bs-info-bg-subtle: #00313D; --bs-warning-bg-subtle: #3E3D1C; --bs-danger-bg-subtle: #520E0E; - } \ No newline at end of file + } + +/* === EMOJI LEVELS === */ +.emoji-normal .emoji-normal { display: inline; } +.emoji-normal .emoji-enhanced, +.emoji-normal .emoji-bonkers { display: none; } + +.emoji-enhanced .emoji-enhanced { display: inline; } +.emoji-enhanced .emoji-normal, +.emoji-enhanced .emoji-bonkers { display: none; } + +.emoji-bonkers .emoji-bonkers { display: inline; } +.emoji-bonkers .emoji-normal, +.emoji-bonkers .emoji-enhanced { display: none; } + /* + * ================================================================================================= + * 🌈 RAINBOW PRIDE ELEMENTS 🌈 + * + * Fabulous rainbow-themed elements to celebrate diversity and pride! + * ================================================================================================= + */ + .bg-rainbow { + background: linear-gradient( + to right, + #FF5757, /* Red */ + #FFBD59, /* Orange */ + #F9F871, /* Yellow */ + #CFFF50, /* Green */ + #00F5D4, /* Teal */ + #00A9E0, /* Blue */ + #A328D6 /* Purple */ + ); + color: white; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); + font-weight: bold; + border: none; + } + + .fun-fact { + font-size: 1.1rem; + line-height: 1.6; + font-style: italic; + } + + /* Add a subtle rainbow border to the fun facts card */ + .card:has(.fun-fact) { + border-width: 2px; + border-style: solid; + border-image: linear-gradient( + to right, + #FF5757, /* Red */ + #FFBD59, /* Orange */ + #F9F871, /* Yellow */ + #CFFF50, /* Green */ + #00F5D4, /* Teal */ + #00A9E0, /* Blue */ + #A328D6 /* Purple */ + ) 1; + box-shadow: 0 4px 15px rgba(163, 40, 214, 0.2); + } diff --git a/composer.json b/composer.json index 151aac7..9c6d20c 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "symfony/flex": "^2.7.1", "symfony/form": "7.3.*", "symfony/framework-bundle": "7.3.*", + "symfony/monolog-bundle": "^3.10", "symfony/runtime": "7.3.*", "symfony/security-csrf": "7.3.*", "symfony/twig-bundle": "7.3.*", diff --git a/composer.lock b/composer.lock index 32fe8cd..bada032 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1fe9f53b59a2962c86116a6fed3b749e", + "content-hash": "ff70516970cc999b1ffcfbb3ec084ee4", "packages": [ { "name": "composer/semver", @@ -1304,6 +1304,109 @@ }, "time": "2025-01-24T11:45:48+00:00" }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-03-24T10:02:05+00:00" + }, { "name": "psr/cache", "version": "3.0.0", @@ -3432,6 +3535,165 @@ ], "time": "2025-05-29T07:47:32+00:00" }, + { + "name": "symfony/monolog-bridge", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "1b188c8abbbef25b111da878797514b7a8d33990" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/1b188c8abbbef25b111da878797514b7a8d33990", + "reference": "1b188c8abbbef25b111da878797514b7a8d33990", + "shasum": "" + }, + "require": { + "monolog/monolog": "^3", + "php": ">=8.2", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/console": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/security-core": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/mailer": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Monolog\\": "" + }, + "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": "Provides integration for Monolog with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.0" + }, + "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": "2025-03-21T12:17:46+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", + "php": ">=7.2.5", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "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 MonologBundle", + "homepage": "https://symfony.com", + "keywords": [ + "log", + "logging" + ], + "support": { + "issues": "https://github.com/symfony/monolog-bundle/issues", + "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0" + }, + "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": "2023-11-06T17:08:13+00:00" + }, { "name": "symfony/options-resolver", "version": "v7.3.0", diff --git a/config/bundles.php b/config/bundles.php index 1bc42c7..cd115f2 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -9,6 +9,7 @@ use Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle; use Symfony\Bundle\MakerBundle\MakerBundle; use Symfony\Bundle\WebProfilerBundle\WebProfilerBundle; use Twig\Extra\TwigExtraBundle\TwigExtraBundle; +use Symfony\Bundle\MonologBundle\MonologBundle; return [ FrameworkBundle::class => [ @@ -33,4 +34,7 @@ return [ TwigExtraBundle::class => [ 'all' => true, ], + MonologBundle::class => [ + 'all' => true, + ], ]; diff --git a/config/packages/monolog.php b/config/packages/monolog.php new file mode 100644 index 0000000..6ed98ce --- /dev/null +++ b/config/packages/monolog.php @@ -0,0 +1,97 @@ +extension('monolog', [ + 'channels' => [ + 'deprecation', + ], + ]); + if ($containerConfigurator->env() === 'dev') { + $containerConfigurator->extension('monolog', [ + 'handlers' => [ + 'main' => [ + 'type' => 'stream', + 'path' => '%kernel.logs_dir%/%kernel.environment%.log', + 'level' => 'debug', + 'channels' => [ + '!event', + ], + ], + 'console' => [ + 'type' => 'console', + 'process_psr_3_messages' => false, + 'channels' => [ + '!event', + '!doctrine', + '!console', + ], + ], + ], + ]); + } + if ($containerConfigurator->env() === 'test') { + $containerConfigurator->extension('monolog', [ + 'handlers' => [ + 'main' => [ + 'type' => 'fingers_crossed', + 'action_level' => 'error', + 'handler' => 'nested', + 'excluded_http_codes' => [ + 404, + 405, + ], + 'channels' => [ + '!event', + ], + ], + 'nested' => [ + 'type' => 'stream', + 'path' => '%kernel.logs_dir%/%kernel.environment%.log', + 'level' => 'debug', + ], + ], + ]); + } + if ($containerConfigurator->env() === 'prod') { + $containerConfigurator->extension('monolog', [ + 'handlers' => [ + 'main' => [ + 'type' => 'fingers_crossed', + 'action_level' => 'error', + 'handler' => 'nested', + 'excluded_http_codes' => [ + 404, + 405, + ], + 'buffer_size' => 50, + ], + 'nested' => [ + 'type' => 'stream', + 'path' => 'php://stderr', + 'level' => 'debug', + 'formatter' => 'monolog.formatter.json', + ], + 'console' => [ + 'type' => 'console', + 'process_psr_3_messages' => false, + 'channels' => [ + '!event', + '!doctrine', + ], + ], + 'deprecation' => [ + 'type' => 'stream', + 'channels' => [ + 'deprecation', + ], + 'path' => 'php://stderr', + 'formatter' => 'monolog.formatter.json', + ], + ], + ]); + } +}; diff --git a/deploy/systemd/container-saufen-caddy.service b/deploy/systemd/container-saufen-caddy.service index 1d421a1..74111ee 100644 --- a/deploy/systemd/container-saufen-caddy.service +++ b/deploy/systemd/container-saufen-caddy.service @@ -1,9 +1,9 @@ -# container-futtern-caddy.service +# container-saufen-caddy.service # autogenerated by Podman 4.3.1 # Sun Jun 23 05:33:51 UTC 2024 [Unit] -Description=Podman container-futtern-caddy.service +Description=Podman container-saufen-caddy.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target @@ -21,11 +21,11 @@ ExecStart=/usr/bin/podman run \ --cidfile=%t/%n.ctr-id \ --cgroups=no-conmon \ --rm \ - --pod-id-file %t/pod-futtern.pod-id \ + --pod-id-file %t/pod-saufen.pod-id \ --sdnotify=conmon \ --replace \ -d \ - --name futtern-caddy \ + --name saufen-caddy \ --volume %h/saufen/etc/caddy/Caddyfile:/etc/caddy/Caddyfile \ --volume %h/saufen/app:/var/www/html \ --volume caddy_data:/data docker.io/caddy/caddy:alpine diff --git a/deploy/systemd/container-saufen-php.service b/deploy/systemd/container-saufen-php.service index 8701c04..91e0153 100644 --- a/deploy/systemd/container-saufen-php.service +++ b/deploy/systemd/container-saufen-php.service @@ -1,15 +1,15 @@ -# container-futtern-php.service +# container-saufen-php.service # autogenerated by Podman 4.3.1 # Sun Jun 23 05:33:51 UTC 2024 [Unit] -Description=Podman container-futtern-php.service +Description=Podman container-saufen-php.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target RequiresMountsFor=%t/containers -BindsTo=pod-futtern.service -After=pod-futtern.service +BindsTo=pod-saufen.service +After=pod-saufen.service [Service] Environment=PODMAN_SYSTEMD_UNIT=%n @@ -21,14 +21,14 @@ ExecStart=/usr/bin/podman run \ --cidfile=%t/%n.ctr-id \ --cgroups=no-conmon \ --rm \ - --pod-id-file %t/pod-futtern.pod-id \ + --pod-id-file %t/pod-saufen.pod-id \ --sdnotify=conmon \ --replace \ -d \ - --name futtern-php \ - --volume %h/futtern/etc/php84/php-fpm.d/www.conf:/etc/php84/php-fpm.d/www.conf \ - --volume %h/futtern/app:/var/www/html \ - --volume %h/futtern/app/var:/var/www/html/var \ + --name saufen-php \ + --volume %h/saufen/etc/php84/php-fpm.d/www.conf:/etc/php84/php-fpm.d/www.conf \ + --volume %h/saufen/app:/var/www/html \ + --volume %h/saufen/app/var:/var/www/html/var \ --env APP_ENV=prod \ --env APP_SECRET=UwUtHiSisNotSecurePlZcHanGeMe \ git.php.fail/lubiana/container/php:8.4-fpm diff --git a/deploy/systemd/pod-saufen.service b/deploy/systemd/pod-saufen.service index 10a8fb0..713cc03 100644 --- a/deploy/systemd/pod-saufen.service +++ b/deploy/systemd/pod-saufen.service @@ -1,41 +1,41 @@ -# pod-futtern.service +# pod-saufen.service # autogenerated by Podman 4.3.1 # Sun Jun 23 05:33:51 UTC 2024 [Unit] -Description=Podman pod-futtern.service +Description=Podman pod-saufen.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target RequiresMountsFor=/run/user/%U/containers -Wants=container-futtern-caddy.service container-futtern-php.service -Before=container-futtern-caddy.service container-futtern-php.service +Wants=container-saufen-caddy.service container-saufen-php.service +Before=container-saufen-caddy.service container-saufen-php.service [Service] Environment=PODMAN_SYSTEMD_UNIT=%n Restart=on-failure TimeoutStopSec=70 ExecStartPre=/bin/rm \ - -f %t/pod-futtern.pid %t/pod-futtern.pod-id + -f %t/pod-saufen.pid %t/pod-saufen.pod-id ExecStartPre=/usr/bin/podman pod create \ - --infra-conmon-pidfile %t/pod-futtern.pid \ - --pod-id-file %t/pod-futtern.pod-id \ + --infra-conmon-pidfile %t/pod-saufen.pid \ + --pod-id-file %t/pod-saufen.pod-id \ --exit-policy=stop \ --label io.containers.autoupdate=registry \ - --name futtern \ - -p 8087:8087 \ + --name saufen \ + -p 8090:8090 \ --replace ExecStart=/usr/bin/podman pod start \ - --pod-id-file %t/pod-futtern.pod-id + --pod-id-file %t/pod-saufen.pod-id ExecStop=/usr/bin/podman pod stop \ --ignore \ - --pod-id-file %t/pod-futtern.pod-id \ + --pod-id-file %t/pod-saufen.pod-id \ -t 10 ExecStopPost=/usr/bin/podman pod rm \ --ignore \ -f \ - --pod-id-file %t/pod-futtern.pod-id -PIDFile=%t/pod-futtern.pid + --pod-id-file %t/pod-saufen.pod-id +PIDFile=%t/pod-saufen.pid Type=forking [Install] diff --git a/deploy/update.sh b/deploy/update.sh index a03c457..6b97afa 100755 --- a/deploy/update.sh +++ b/deploy/update.sh @@ -5,4 +5,6 @@ systemctl --user start pod-saufen sleep 2 podman exec -it saufen-php /var/www/html/bin/console cache:clear podman exec -it saufen-php /var/www/html/bin/console cache:warmup +podman exec -it saufen-php /var/www/html/bin/console asset-map:compile + echo 'yes' | podman exec -it saufen-php /var/www/html/bin/console doctrine:migrations:migrate diff --git a/importmap.php b/importmap.php index fbddf9e..1dea2bd 100644 --- a/importmap.php +++ b/importmap.php @@ -28,4 +28,13 @@ return [ 'version' => '5.3.6', 'type' => 'css', ], + 'chart.js' => [ + 'version' => '4.5.0', + ], + '@kurkle/color' => [ + 'version' => '0.3.4', + ], + 'chart.js/auto' => [ + 'version' => '4.5.0', + ], ]; diff --git a/symfony.lock b/symfony.lock index 92393f8..6368bfa 100644 --- a/symfony.lock +++ b/symfony.lock @@ -143,6 +143,18 @@ "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" } }, + "symfony/monolog-bundle": { + "version": "3.10", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.7", + "ref": "aff23899c4440dd995907613c1dd709b6f59503f" + }, + "files": [ + "config/packages/monolog.yaml" + ] + }, "symfony/property-info": { "version": "7.3", "recipe": { diff --git a/templates/base.html.twig b/templates/base.html.twig index c0dab35..3af52a6 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -8,7 +8,7 @@ "> - {% block title %}Welcome!{% endblock %} + {% block title %}Welcome! 🥵💦🍆💋👅😈😏🍑💕💖💗💘💝💞💟💌💏💑🍌🥒💦👀😉😌😍🥰😘😚😋😫😩🥺🥴💖💗💕💞💓💗💖💘💝💋💏💑{% endblock %} {% block stylesheets %} {% endblock %} @@ -19,29 +19,63 @@