diff --git a/.gitignore b/.gitignore index a1a1f05..fc6822e 100644 --- a/.gitignore +++ b/.gitignore @@ -26,8 +26,3 @@ ###> phpstan/phpstan ### phpstan.neon ###< phpstan/phpstan ### - -###> symfony/asset-mapper ### -/public/assets/ -/assets/vendor/ -###< symfony/asset-mapper ### diff --git a/assets/app.js b/assets/app.js deleted file mode 100644 index 0194a77..0000000 --- a/assets/app.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Welcome to your app's main JavaScript file! - * - * This file will be included onto the page via the importmap() Twig function, - * which should already be in your base.html.twig. - */ -import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/app.css'; -import './styles/modes.css'; -import './styles/emoji-footprint.css'; - -// Import modules -import './javascript/theme.js'; -import './javascript/emoji-footprint.js'; -import './javascript/modes.js'; -import './javascript/htmx.js'; -import emojiButtonListener from './javascript/emoji-button.js'; -import 'bootstrap'; -import { initRadioState } from './javascript/radioState.js'; - -document.addEventListener('DOMContentLoaded', () => { - initRadioState(); - emojiButtonListener(); -}); \ No newline at end of file diff --git a/assets/javascript/emoji-button.js b/assets/javascript/emoji-button.js deleted file mode 100644 index 8fc3825..0000000 --- a/assets/javascript/emoji-button.js +++ /dev/null @@ -1,14 +0,0 @@ -const emojiButtonListener = function () { - const buttons = document.querySelectorAll('.emoji-buttons .btn.btn-primary'); - - buttons.forEach(button => { - button.addEventListener('click', function() { - const emojiField = document.querySelector('#food_vendor_emojis'); - if (emojiField) { - emojiField.value += this.textContent; - } - }); - }); -} - -export default emojiButtonListener; \ No newline at end of file diff --git a/assets/javascript/emoji-footprint.js b/assets/javascript/emoji-footprint.js deleted file mode 100644 index 238377b..0000000 --- a/assets/javascript/emoji-footprint.js +++ /dev/null @@ -1,19 +0,0 @@ -// Sparkle effect on mouse move -document.addEventListener('mousemove', function (e) { - const emojis = ['โจ', '๐', '๐', '๐ ', '๐ฆ', '๐', '๐']; - const sparkle = document.createElement('div'); - sparkle.className = 'emoji-footprint'; - sparkle.textContent = emojis[Math.floor(Math.random() * emojis.length)]; - sparkle.style.left = e.pageX + 'px'; - sparkle.style.top = e.pageY + 'px'; - document.body.appendChild(sparkle); - - setTimeout(() => { - sparkle.remove(); - }, 1000); -}); - -export function initEmojiFootprint() { - // The sparkle effect is already initialized when this module is imported - // This function can be used if we need to control when the effect starts -} \ No newline at end of file diff --git a/assets/javascript/htmx.js b/assets/javascript/htmx.js deleted file mode 100644 index e4731a7..0000000 --- a/assets/javascript/htmx.js +++ /dev/null @@ -1,3 +0,0 @@ -import htmx from 'htmx.org'; - -window.htmx = htmx; \ No newline at end of file diff --git a/assets/javascript/modes.js b/assets/javascript/modes.js deleted file mode 100644 index a288f32..0000000 --- a/assets/javascript/modes.js +++ /dev/null @@ -1,136 +0,0 @@ -// 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 - document.body.classList.add('bonkers-mode'); - - // Start the fabulous effects - createExtraSparkles(); - createSlayEffects(); - - console.log('๐โจ Bonkers mode activated! โจ๐'); - } else { - // Remove bonkers mode if it was active - document.body.classList.remove('bonkers-mode'); - } -} - -// Function to create extra sparkles during bonkers mode -function createExtraSparkles() { - const currentMode = document.documentElement.getAttribute('data-website-mode'); - if (currentMode !== 'bonkers') return; - - const extraEmojis = [ - '๐', '๐บ', - '๐', '๐ฆ', '๐', '๐', '๐ ', '๐', '๐ฅต', '๐ณ', '๐คค', '๐', '๐ฅด', - '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', - '๐', '๐ฅ', '๐', '๐ฆ', '๐', '๐', '๐', '๐', '๐ฅฐ', '๐', - '๐', '๐', '๐', '๐ซ', '๐ฉ', '๐ฅบ', '๐ฅต', '๐ฅด', - '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', - '๐', '๐', '๐' - ]; - const sparkle = document.createElement('div'); - sparkle.className = 'emoji-footprint'; - sparkle.textContent = extraEmojis[Math.floor(Math.random() * extraEmojis.length)]; - sparkle.style.left = Math.random() * window.innerWidth + 'px'; - sparkle.style.top = Math.random() * window.innerHeight + 'px'; - document.body.appendChild(sparkle); - - setTimeout(() => { - if (sparkle.parentNode) { - sparkle.remove(); - } - }, 3000); - - // Continue creating extra sparkles while in bonkers mode - const newMode = document.documentElement.getAttribute('data-website-mode'); - if (newMode === 'bonkers') { - setTimeout(() => createExtraSparkles(), 150); - } -} - -// Function to create slay effects -function createSlayEffects() { - const currentMode = document.documentElement.getAttribute('data-website-mode'); - if (currentMode !== 'bonkers') return; - - // Create floating "SLAY" text effects - const slayWords = [ - 'SLAY', 'QUEEN', 'FABULOUS', 'ICONIC', 'LEGENDARY', 'STUNNING', 'GORGEOUS', 'FLAWLESS', - 'DAZZLING', 'RADIANT', 'BREATHTAKING', 'EXQUISITE', 'DIVINE' - ]; - const slayElement = document.createElement('div'); - slayElement.className = 'slay-text'; - slayElement.textContent = slayWords[Math.floor(Math.random() * slayWords.length)]; - slayElement.style.left = Math.random() * window.innerWidth + 'px'; - slayElement.style.top = Math.random() * window.innerHeight + 'px'; - document.body.appendChild(slayElement); - - setTimeout(() => { - if (slayElement.parentNode) { - slayElement.remove(); - } - }, 3000); - - // Continue creating slay effects while in bonkers mode - const newMode = document.documentElement.getAttribute('data-website-mode'); - if (newMode === 'bonkers') { - setTimeout(() => createSlayEffects(), 800); - } -} - -// Watch for mode changes -function watchModeChanges() { - // Create a MutationObserver to watch for changes to the data-website-mode attribute - const observer = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.type === 'attributes' && mutation.attributeName === 'data-website-mode') { - const newMode = document.documentElement.getAttribute('data-website-mode'); - - if (newMode === 'bonkers') { - document.body.classList.add('bonkers-mode'); - setEmojiLevelClass(newMode); - - // Start the fabulous effects - createExtraSparkles(); - createSlayEffects(); - - console.log('๐โจ Switched to bonkers mode! โจ๐'); - } else { - document.body.classList.remove('bonkers-mode'); - setEmojiLevelClass(newMode); - console.log(`๐ด Switched to ${newMode} mode`); - } - } - }); - }); - - // Start observing - observer.observe(document.documentElement, { - attributes: true, - attributeFilter: ['data-website-mode'] - }); -} - -// Initialize when DOM is loaded -document.addEventListener('DOMContentLoaded', function() { - initBonkersMode(); - watchModeChanges(); -}); - -export { initBonkersMode, watchModeChanges }; diff --git a/assets/javascript/numberInputs.js b/assets/javascript/numberInputs.js deleted file mode 100644 index a4a8dc1..0000000 --- a/assets/javascript/numberInputs.js +++ /dev/null @@ -1,55 +0,0 @@ -// Function to initialize number input buttons -function initNumberInputs(container = document) { - container.querySelectorAll('.number-input-wrapper').forEach(function(wrapper) { - const input = wrapper.querySelector('input[type="number"]'); - const decreaseBtn = wrapper.querySelector('[data-action="decrease"]'); - const increaseBtn = wrapper.querySelector('[data-action="increase"]'); - - if (!input || !decreaseBtn || !increaseBtn) return; - - // Skip if already initialized - if (decreaseBtn.hasAttribute('data-initialized')) return; - - const step = parseFloat(input.getAttribute('step')) || 1; - const min = 0; - const max = input.getAttribute('max') ? parseFloat(input.getAttribute('max')) : null; - - decreaseBtn.addEventListener('click', function() { - const currentValue = parseFloat(input.value) || 0; - const newValue = currentValue - step; - - if (min === null || newValue >= min) { - input.value = newValue; - input.dispatchEvent(new Event('change', { bubbles: true })); - } - }); - - increaseBtn.addEventListener('click', function() { - const currentValue = parseFloat(input.value) || 0; - const newValue = currentValue + step; - - if (max === null || newValue <= max) { - input.value = newValue; - input.dispatchEvent(new Event('change', { bubbles: true })); - } - }); - - // Validate input on change - input.addEventListener('input', function() { - const value = parseFloat(this.value); - - if (min !== null && value < min) { - this.value = min; - } - if (max !== null && value > max) { - this.value = max; - } - }); - - // Mark as initialized - decreaseBtn.setAttribute('data-initialized', 'true'); - increaseBtn.setAttribute('data-initialized', 'true'); - }); -} - -export { initNumberInputs }; \ No newline at end of file diff --git a/assets/javascript/radioState.js b/assets/javascript/radioState.js deleted file mode 100644 index a30d311..0000000 --- a/assets/javascript/radioState.js +++ /dev/null @@ -1,35 +0,0 @@ -// Radio button state management with localStorage -function initRadioState() { - // Store and retrieve radio button state - const radioButtons = document.querySelectorAll('input[name="mode"]'); - - // Load saved state on page load - const savedMode = localStorage.getItem('selectedMode'); - if (savedMode) { - const radioToCheck = document.getElementById(savedMode); - if (radioToCheck) { - radioToCheck.checked = true; - // Set the data attribute to match the saved mode - document.documentElement.setAttribute('data-website-mode', savedMode); - } - } else { - // If no saved state, set to the currently checked radio button - const checkedRadio = document.querySelector('input[name="mode"]:checked'); - if (checkedRadio) { - document.documentElement.setAttribute('data-website-mode', checkedRadio.id); - } - } - - // Save state when radio button changes - radioButtons.forEach(radio => { - radio.addEventListener('change', function() { - if (this.checked) { - localStorage.setItem('selectedMode', this.id); - // Update the data attribute when mode changes - document.documentElement.setAttribute('data-website-mode', this.id); - } - }); - }); -} - -export { initRadioState }; \ No newline at end of file diff --git a/assets/javascript/theme.js b/assets/javascript/theme.js deleted file mode 100644 index 8acf738..0000000 --- a/assets/javascript/theme.js +++ /dev/null @@ -1,18 +0,0 @@ -// Theme detection and switching -const getPreferredTheme = () => { - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' -} - -const setTheme = theme => { - document.documentElement.setAttribute('data-bs-theme', theme) -} - -// Set initial theme -setTheme(getPreferredTheme()) - -// Listen for changes in user's preferred color scheme -window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { - setTheme(getPreferredTheme()) -}) - -export { getPreferredTheme, setTheme }; \ No newline at end of file diff --git a/assets/styles/app.css b/assets/styles/app.css deleted file mode 100644 index 7400735..0000000 --- a/assets/styles/app.css +++ /dev/null @@ -1,179 +0,0 @@ -/* - * ================================================================================================= - * ๐ BUBBLEGUM PUNK THEME (LIGHT) ๐ - * - * This isn't just a theme. It's a statement. - * Unapologetically loud, pink, and quirky. - * ================================================================================================= - */ - :root, - [data-bs-theme=light] { - /* --- CORE VIBE --- */ - --bs-pink: #FF007A; /* ๐ Hyper Pink (Our Queen) */ - --bs-green: #CFFF50; /* ๐งช Toxic Slime */ - --bs-purple: #A328D6; /* ๐พ Graffiti Purple */ - --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); - --bs-success: var(--bs-cyan); - --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 */ - --bs-body-color: #4A003D; /* Dark Plum (instead of black) for text */ - --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 */ - --bs-border-color-translucent: rgba(74, 0, 61, 0.2); - --bs-border-radius: 1rem; /* Super bubbly and round */ - --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) ๐ฆ๐ - * - * The lights are out, the neon is ON. - * A dark, moody theme with vibrant, glowing accents. - * ================================================================================================= - */ - [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; - --bs-secondary-text-emphasis: #E2FF8A; - --bs-success-text-emphasis: #8AFFEB; - --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; - } - -/* === 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/assets/styles/emoji-footprint.css b/assets/styles/emoji-footprint.css deleted file mode 100644 index b076361..0000000 --- a/assets/styles/emoji-footprint.css +++ /dev/null @@ -1,30 +0,0 @@ - -/* Emoji Footprint Animation */ -.emoji-footprint { - position: absolute; - font-size: 1.6rem; - pointer-events: none; - animation: emojiFade 1s ease-out forwards; - transform: translate(-50%, -50%) scale(1); - opacity: 1; - z-index: 9999; - text-shadow: - 0 0 4px #ff00bf, - 0 0 8px #ff80df, - 0 0 12px #ffccff; -} - -@keyframes emojiFade { - 0% { - transform: translate(-50%, -50%) scale(1); - opacity: 1; - } - 50% { - transform: translate(-50%, -50%) scale(1.5); - opacity: 0.7; - } - 100% { - transform: translate(-50%, -50%) scale(2); - opacity: 0; - } -} \ No newline at end of file diff --git a/assets/styles/modes.css b/assets/styles/modes.css deleted file mode 100644 index 39dd41e..0000000 --- a/assets/styles/modes.css +++ /dev/null @@ -1,568 +0,0 @@ -/* ๐โจ BONKERS MODE ANIMATIONS โจ๐ */ -@keyframes rainbowGradient { - 0% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } - 100% { background-position: 0% 50%; } -} - -@keyframes discoFlash { - 0%, 100% { - background-color: var(--bs-pink); - box-shadow: 0 0 20px var(--bs-pink), 0 0 40px var(--bs-pink); - } - 16.66% { - background-color: var(--bs-purple); - box-shadow: 0 0 20px var(--bs-purple), 0 0 40px var(--bs-purple); - } - 33.33% { - background-color: var(--bs-cyan); - box-shadow: 0 0 20px var(--bs-cyan), 0 0 40px var(--bs-cyan); - } - 50% { - background-color: var(--bs-yellow); - box-shadow: 0 0 20px var(--bs-yellow), 0 0 40px var(--bs-yellow); - } - 66.66% { - background-color: var(--bs-green); - box-shadow: 0 0 20px var(--bs-green), 0 0 40px var(--bs-green); - } - 83.33% { - background-color: var(--bs-orange); - box-shadow: 0 0 20px var(--bs-orange), 0 0 40px var(--bs-orange); - } -} - -@keyframes wiggle { - 0%, 100% { transform: rotate(0deg); } - 25% { transform: rotate(-2deg); } - 75% { transform: rotate(2deg); } -} - -@keyframes pulse { - 0%, 100% { transform: scale(1); } - 50% { transform: scale(1.05); } -} - -@keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -@keyframes rainbowText { - 0% { color: var(--bs-red); } - 14.28% { color: var(--bs-orange); } - 28.57% { color: var(--bs-yellow); } - 42.85% { color: var(--bs-green); } - 57.14% { color: var(--bs-cyan); } - 71.42% { color: var(--bs-purple); } - 85.71% { color: var(--bs-pink); } - 100% { color: var(--bs-red); } -} - -@keyframes shine { - 0% { left: -100%; } - 50% { left: 100%; } - 100% { left: 100%; } -} - -@keyframes slayFloat { - 0% { - transform: translateY(0) scale(0.5); - opacity: 0; - } - 20% { - transform: translateY(-20px) scale(1); - opacity: 1; - } - 80% { - transform: translateY(-60px) scale(1.2); - opacity: 0.8; - } - 100% { - transform: translateY(-100px) scale(1.5); - opacity: 0; - } -} - -/* ๐ญ BONKERS MODE CLASSES ๐ญ */ -.bonkers-mode { - background: linear-gradient(270deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red), var(--bs-pink)); - background-size: 1600% 1600%; - animation: rainbowGradient 10s ease infinite; - transition: all 0.3s ease-in-out; -} - -.bonkers-mode .btn { - animation: discoFlash 0.3s infinite, wiggle 0.2s infinite; - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 400% 400%; - animation: discoFlash 0.3s infinite, wiggle 0.2s infinite, rainbowGradient 1s ease infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; - transition: all 0.2s ease; -} - -.bonkers-mode .btn:hover { - animation: discoFlash 0.2s infinite, wiggle 0.1s infinite, rainbowGradient 0.5s ease infinite; - box-shadow: 0 0 30px var(--bs-pink), 0 0 60px var(--bs-purple); -} - -.bonkers-mode .btn::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.5), transparent); - transform: rotate(45deg); - animation: spin 0.5s linear infinite; -} - -.bonkers-mode .navbar { - background: linear-gradient(90deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 200% 200%; - animation: rainbowGradient 2s ease infinite; - box-shadow: 0 0 50px rgba(255, 105, 180, 0.9); - height: auto !important; - min-height: 56px; -} - -.bonkers-mode .navbar-brand { - animation: rainbowText 0.8s infinite, wiggle 0.4s infinite; - font-size: 1.8em; - text-shadow: 3px 3px 6px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; -} - -.bonkers-mode .navbar-brand::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); - transform: rotate(45deg); - animation: spin 2s linear infinite; -} - -.bonkers-mode .navbar-nav .nav-link { - animation: rainbowText 1.2s infinite, wiggle 0.3s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid transparent; - border-radius: 8px; - padding: 8px 16px; - margin: 0 4px; - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -.bonkers-mode .navbar-nav .nav-link::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); - animation: shine 1.5s ease-in-out infinite; -} - -.bonkers-mode .navbar-nav .nav-link:hover { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - border-color: var(--bs-white); - box-shadow: 0 0 20px var(--bs-pink); - animation: discoFlash 0.5s infinite, wiggle 0.2s infinite; -} - -.bonkers-mode .navbar-nav .nav-link.active { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - border-color: var(--bs-white); - box-shadow: 0 0 25px var(--bs-yellow); - animation: discoFlash 0.8s infinite, wiggle 0.3s infinite; -} - -.bonkers-mode .navbar-text { - animation: rainbowText 1.5s infinite, wiggle 0.5s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid var(--bs-white); - border-radius: 8px; - padding: 6px 12px; - background: linear-gradient(45deg, var(--bs-cyan), var(--bs-blue)); - box-shadow: 0 0 15px var(--bs-cyan); -} - -.bonkers-mode .navbar-toggler { - border: 3px solid var(--bs-white); - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - animation: discoFlash 0.6s infinite, wiggle 0.4s infinite; - box-shadow: 0 0 20px var(--bs-pink); -} - -.bonkers-mode .navbar-toggler:focus { - box-shadow: 0 0 30px var(--bs-pink), 0 0 0 0.2rem rgba(255, 105, 180, 0.5); -} - -.bonkers-mode .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 1)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); - animation: spin 1s linear infinite; -} - -.bonkers-mode .dropdown-menu { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 3px solid var(--bs-white); - box-shadow: 0 0 30px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -.bonkers-mode .dropdown-item { - animation: rainbowText 1.8s infinite, wiggle 0.6s infinite; - font-weight: bold; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - border-bottom: 1px solid rgba(255,255,255,0.3); - transition: all 0.3s ease; -} - -.bonkers-mode .dropdown-item:hover { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - color: var(--bs-white); - box-shadow: 0 0 15px var(--bs-yellow); - animation: discoFlash 0.5s infinite, wiggle 0.3s infinite; -} - -.bonkers-mode .navbar-collapse { - background: linear-gradient(135deg, rgba(255,105,180,0.1), rgba(138,43,226,0.1)); - border-radius: 8px; - margin-top: 8px; - padding: 8px; - border: 2px solid var(--bs-pink); -} - -.bonkers-mode h1, .bonkers-mode h2, .bonkers-mode h3 { - animation: rainbowText 1.5s infinite; - text-shadow: 2px 2px 4px rgba(0,0,0,0.3); -} - -.bonkers-mode .table { - background: linear-gradient(135deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2), rgba(0,255,255,0.2)); - animation: rainbowGradient 3s ease infinite; - border: 3px solid var(--bs-pink); - box-shadow: 0 0 30px rgba(255,105,180,0.5); -} - -.bonkers-mode .table th { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - color: var(--bs-white); - animation: discoFlash 0.8s infinite; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - font-size: 1.1em; -} - -.bonkers-mode .form-control { - border: 3px solid var(--bs-pink); - box-shadow: 0 0 15px var(--bs-pink); - animation: pulse 0.6s infinite; -} - -.bonkers-mode .alert { - animation: discoFlash 0.6s infinite, wiggle 0.3s infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - font-size: 1.1em; -} - -.bonkers-mode .card { - background: linear-gradient(45deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2)); - border: 3px solid var(--bs-purple); - box-shadow: 0 0 35px rgba(138,43,226,0.6); - animation: pulse 1s infinite; -} - -.bonkers-mode .modal-content { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 4px solid var(--bs-white); - box-shadow: 0 0 50px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -.bonkers-mode .modal-header { - background: linear-gradient(90deg, var(--bs-yellow), var(--bs-orange)); - animation: discoFlash 0.8s infinite; - font-size: 1.2em; -} - -.bonkers-mode .number-input-wrapper { - animation: wiggle 0.4s infinite; -} - -.bonkers-mode .number-input-wrapper .btn { - animation: discoFlash 0.3s infinite, wiggle 0.2s infinite; -} - -/* Enhanced mode styles (for future use) */ -[data-website-mode="enhanced"] .btn { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 400% 400%; - animation: rainbowGradient 1s ease infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; - transition: all 0.2s ease; -} - -[data-website-mode="enhanced"] .btn:hover { - animation: rainbowGradient 0.5s ease infinite; - box-shadow: 0 0 30px var(--bs-pink), 0 0 60px var(--bs-purple); -} - -[data-website-mode="enhanced"] .btn::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.5), transparent); - transform: rotate(45deg); - animation: spin 0.5s linear infinite; -} - -[data-website-mode="enhanced"] .navbar { - background: linear-gradient(90deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 200% 200%; - animation: rainbowGradient 2s ease infinite; - box-shadow: 0 0 50px rgba(255, 105, 180, 0.9); - height: auto !important; - min-height: 56px; -} - -[data-website-mode="enhanced"] .navbar-brand { - animation: rainbowText 0.8s infinite; - font-size: 1.8em; - text-shadow: 3px 3px 6px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; -} - -[data-website-mode="enhanced"] .navbar-brand::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); - transform: rotate(45deg); - animation: spin 2s linear infinite; -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link { - animation: rainbowText 1.2s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid transparent; - border-radius: 8px; - padding: 8px 16px; - margin: 0 4px; - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); - animation: shine 1.5s ease-in-out infinite; -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link:hover { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - border-color: var(--bs-white); - box-shadow: 0 0 20px var(--bs-pink); -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link.active { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - border-color: var(--bs-white); - box-shadow: 0 0 25px var(--bs-yellow); -} - -[data-website-mode="enhanced"] .navbar-text { - animation: rainbowText 1.5s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid var(--bs-white); - border-radius: 8px; - padding: 6px 12px; - background: linear-gradient(45deg, var(--bs-cyan), var(--bs-blue)); - box-shadow: 0 0 15px var(--bs-cyan); -} - -[data-website-mode="enhanced"] .navbar-toggler { - border: 3px solid var(--bs-white); - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - animation: rainbowGradient 0.6s ease infinite; - box-shadow: 0 0 20px var(--bs-pink); -} - -[data-website-mode="enhanced"] .navbar-toggler:focus { - box-shadow: 0 0 30px var(--bs-pink), 0 0 0 0.2rem rgba(255, 105, 180, 0.5); -} - -[data-website-mode="enhanced"] .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 1)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); - animation: spin 1s linear infinite; -} - -[data-website-mode="enhanced"] .dropdown-menu { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 3px solid var(--bs-white); - box-shadow: 0 0 30px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -[data-website-mode="enhanced"] .dropdown-item { - animation: rainbowText 1.8s infinite; - font-weight: bold; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - border-bottom: 1px solid rgba(255,255,255,0.3); - transition: all 0.3s ease; -} - -[data-website-mode="enhanced"] .dropdown-item:hover { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - color: var(--bs-white); - box-shadow: 0 0 15px var(--bs-yellow); -} - -[data-website-mode="enhanced"] .navbar-collapse { - background: linear-gradient(135deg, rgba(255,105,180,0.1), rgba(138,43,226,0.1)); - border-radius: 8px; - margin-top: 8px; - padding: 8px; - border: 2px solid var(--bs-pink); -} - -[data-website-mode="enhanced"] h1, [data-website-mode="enhanced"] h2, [data-website-mode="enhanced"] h3 { - animation: rainbowText 1.5s infinite; - text-shadow: 2px 2px 4px rgba(0,0,0,0.3); -} - -[data-website-mode="enhanced"] .table { - background: linear-gradient(135deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2), rgba(0,255,255,0.2)); - animation: rainbowGradient 3s ease infinite; - border: 3px solid var(--bs-pink); - box-shadow: 0 0 30px rgba(255,105,180,0.5); -} - -[data-website-mode="enhanced"] .table th { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - color: var(--bs-white); - animation: rainbowGradient 0.8s ease infinite; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - font-size: 1.1em; -} - -[data-website-mode="enhanced"] .form-control { - border: 3px solid var(--bs-pink); - box-shadow: 0 0 15px var(--bs-pink); -} - -[data-website-mode="enhanced"] .alert { - animation: rainbowGradient 0.6s ease infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - font-size: 1.1em; -} - -[data-website-mode="enhanced"] .card { - background: linear-gradient(45deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2)); - border: 3px solid var(--bs-purple); - box-shadow: 0 0 35px rgba(138,43,226,0.6); -} - -[data-website-mode="enhanced"] .modal-content { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 4px solid var(--bs-white); - box-shadow: 0 0 50px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -[data-website-mode="enhanced"] .modal-header { - background: linear-gradient(90deg, var(--bs-yellow), var(--bs-orange)); - animation: rainbowGradient 0.8s ease infinite; - font-size: 1.2em; -} - -[data-website-mode="enhanced"] .number-input-wrapper { -} - -[data-website-mode="enhanced"] .number-input-wrapper .btn { - animation: rainbowGradient 0.3s ease infinite; -} - -/* Emoji Footprint Animation */ -.emoji-footprint { - position: absolute; - font-size: 1.6rem; - pointer-events: none; - animation: emojiFade 1s ease-out forwards; - transform: translate(-50%, -50%) scale(1); - opacity: 1; - z-index: 9999; - text-shadow: - 0 0 4px #ff00bf, - 0 0 8px #ff80df, - 0 0 12px #ffccff; -} - -@keyframes emojiFade { - 0% { - transform: translate(-50%, -50%) scale(1); - opacity: 1; - } - 50% { - transform: translate(-50%, -50%) scale(1.5); - opacity: 0.7; - } - 100% { - transform: translate(-50%, -50%) scale(2); - opacity: 0; - } -} - -/* ๐ SLAY TEXT EFFECTS ๐ */ -.slay-text { - position: fixed; - font-size: 2rem; - font-weight: bold; - pointer-events: none; - z-index: 10000; - animation: slayFloat 3s ease-out forwards; - text-shadow: - 0 0 10px #ff00bf, - 0 0 20px #ff80df, - 0 0 30px #ffccff, - 2px 2px 4px rgba(0,0,0,0.5); - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow)); - background-size: 400% 400%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - animation: slayFloat 3s ease-out forwards, rainbowGradient 1s ease infinite; -} diff --git a/composer.json b/composer.json index 186955e..43c32cd 100644 --- a/composer.json +++ b/composer.json @@ -18,14 +18,12 @@ "phpstan/phpdoc-parser": "^1.33", "psr/clock": "^1.0", "symfony/asset": "7.3.*", - "symfony/asset-mapper": "7.3.*", "symfony/console": "7.3.*", "symfony/dotenv": "7.3.*", "symfony/expression-language": "7.3.*", "symfony/flex": "^2.7.1", "symfony/form": "7.3.*", "symfony/framework-bundle": "7.3.*", - "symfony/monolog-bundle": "^3.10", "symfony/property-access": "7.3.*", "symfony/property-info": "7.3.*", "symfony/runtime": "7.3.*", @@ -35,9 +33,7 @@ "symfony/twig-bundle": "7.3.*", "symfony/uid": "7.3.*", "symfony/validator": "7.3.*", - "symfony/yaml": "7.3.*", - "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" + "symfony/yaml": "7.3.*" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^4.1", @@ -90,8 +86,7 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd", - "importmap:install": "symfony-cmd" + "assets:install %PUBLIC_DIR%": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" diff --git a/composer.lock b/composer.lock index 46aa9a3..9c27807 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": "923bae46e3b7f783b6c25f8f68f97991", + "content-hash": "c21233664fb5c4d25afb8a8cdc29213a", "packages": [ { "name": "api-platform/core", @@ -222,87 +222,6 @@ }, "time": "2025-06-13T13:00:13+00:00" }, - { - "name": "composer/semver", - "version": "3.4.3", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-09-19T14:15:21+00:00" - }, { "name": "doctrine/collections", "version": "2.3.0", @@ -1422,109 +1341,6 @@ }, "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": "nelmio/cors-bundle", "version": "2.5.0", @@ -2184,86 +2000,6 @@ ], "time": "2025-03-05T10:15:41+00:00" }, - { - "name": "symfony/asset-mapper", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/asset-mapper.git", - "reference": "6516f38868b75c4902ea72a9fa44967628375ae7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/6516f38868b75c4902ea72a9fa44967628375ae7", - "reference": "6516f38868b75c4902ea72a9fa44967628375ae7", - "shasum": "" - }, - "require": { - "composer/semver": "^3.0", - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^7.1", - "symfony/http-client": "^6.4|^7.0" - }, - "conflict": { - "symfony/framework-bundle": "<6.4" - }, - "require-dev": { - "symfony/asset": "^6.4|^7.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/event-dispatcher-contracts": "^3.0", - "symfony/finder": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\AssetMapper\\": "" - }, - "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": "Maps directories of assets & makes them available in a public directory with versioned filenames.", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/asset-mapper/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-05-24T14:05:12+00:00" - }, { "name": "symfony/cache", "version": "v7.3.0", @@ -3757,179 +3493,6 @@ ], "time": "2025-05-28T06:56:42+00:00" }, - { - "name": "symfony/http-client", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/57e4fb86314015a695a750ace358d07a7e37b8a9", - "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.4|^3.5.2", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "amphp/amp": "<2.5", - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.4" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "3.0" - }, - "require-dev": { - "amphp/http-client": "^4.2.1|^5.0", - "amphp/http-tunnel": "^1.0|^2.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4|^2.0", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/amphp-http-client-meta": "^1.0|^2.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", - "keywords": [ - "http" - ], - "support": { - "source": "https://github.com/symfony/http-client/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-05-02T08:23:16+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "75d7043853a42837e68111812f4d964b01e5101c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", - "reference": "75d7043853a42837e68111812f4d964b01e5101c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.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-04-29T11:18:49+00:00" - }, { "name": "symfony/http-foundation", "version": "v7.3.0", @@ -4123,165 +3686,6 @@ ], "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", @@ -6667,80 +6071,6 @@ ], "time": "2025-04-04T10:10:33+00:00" }, - { - "name": "twig/extra-bundle", - "version": "v3.21.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896", - "shasum": "" - }, - "require": { - "php": ">=8.1.0", - "symfony/framework-bundle": "^5.4|^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.4|^7.0", - "twig/twig": "^3.2|^4.0" - }, - "require-dev": { - "league/commonmark": "^1.0|^2.0", - "symfony/phpunit-bridge": "^6.4|^7.0", - "twig/cache-extra": "^3.0", - "twig/cssinliner-extra": "^3.0", - "twig/html-extra": "^3.0", - "twig/inky-extra": "^3.0", - "twig/intl-extra": "^3.0", - "twig/markdown-extra": "^3.0", - "twig/string-extra": "^3.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Twig\\Extra\\TwigExtraBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Symfony bundle for extra Twig extensions", - "homepage": "https://twig.symfony.com", - "keywords": [ - "bundle", - "extra", - "twig" - ], - "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2025-02-19T14:29:33+00:00" - }, { "name": "twig/twig", "version": "v3.21.1", @@ -10328,6 +9658,179 @@ ], "time": "2025-03-05T10:15:41+00:00" }, + { + "name": "symfony/http-client", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/57e4fb86314015a695a750ace358d07a7e37b8a9", + "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/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-05-02T08:23:16+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.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-04-29T11:18:49+00:00" + }, { "name": "symfony/maker-bundle", "version": "v1.63.0", @@ -10781,7 +10284,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": { @@ -10789,7 +10292,7 @@ "ext-ctype": "*", "ext-iconv": "*" }, - "platform-dev": {}, + "platform-dev": [], "platform-overrides": { "php": "8.4" }, diff --git a/config/bundles.php b/config/bundles.php index 2c6ab01..020f7cf 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -8,11 +8,9 @@ use Liip\TestFixturesBundle\LiipTestFixturesBundle; use Nelmio\CorsBundle\NelmioCorsBundle; use Symfony\Bundle\FrameworkBundle\FrameworkBundle; use Symfony\Bundle\MakerBundle\MakerBundle; -use Symfony\Bundle\MonologBundle\MonologBundle; use Symfony\Bundle\SecurityBundle\SecurityBundle; use Symfony\Bundle\TwigBundle\TwigBundle; use Symfony\Bundle\WebProfilerBundle\WebProfilerBundle; -use Twig\Extra\TwigExtraBundle\TwigExtraBundle; return [ FrameworkBundle::class => [ @@ -51,10 +49,4 @@ return [ ApiPlatformBundle::class => [ 'all' => true, ], - TwigExtraBundle::class => [ - 'all' => true, - ], - MonologBundle::class => [ - 'all' => true, - ], ]; diff --git a/config/packages/asset_mapper.php b/config/packages/asset_mapper.php deleted file mode 100644 index 3a3cc5f..0000000 --- a/config/packages/asset_mapper.php +++ /dev/null @@ -1,21 +0,0 @@ -extension('framework', [ - 'asset_mapper' => [ - 'paths' => [ - 'assets/', - ], - 'missing_import_mode' => 'strict', - ], - ]); - if ($containerConfigurator->env() === 'prod') { - $containerConfigurator->extension('framework', [ - 'asset_mapper' => [ - 'missing_import_mode' => 'warn', - ], - ]); - } -}; diff --git a/config/packages/monolog.php b/config/packages/monolog.php deleted file mode 100644 index a4075ba..0000000 --- a/config/packages/monolog.php +++ /dev/null @@ -1,95 +0,0 @@ -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/config/packages/twig.php b/config/packages/twig.php index 06be512..d08fe3f 100644 --- a/config/packages/twig.php +++ b/config/packages/twig.php @@ -1,16 +1,17 @@ extension('twig', [ + 'file_name_pattern' => '*.twig', + 'globals' => [ + 'favicon' => '@App\Service\Favicon', + ], + ]); if ($containerConfigurator->env() === 'test') { - $twig->strictVariables(true); + $containerConfigurator->extension('twig', [ + 'strict_variables' => true, + ]); } - $twig->formThemes(['bootstrap_5_layout.html.twig']); - $twig->fileNamePattern('*.twig'); - $twig->global('favicon', '@App\Service\Favicon'); }; diff --git a/deploy/prepare-deploy.sh b/deploy/prepare-deploy.sh index b57c20c..40af730 100755 --- a/deploy/prepare-deploy.sh +++ b/deploy/prepare-deploy.sh @@ -8,7 +8,7 @@ fi mkdir $TARGETDIR cd $TARGETDIR || return -pathsToCopy="assets public bin config migrations src templates composer.json composer.lock symfony.lock .env importmap.php" +pathsToCopy="public bin config migrations src templates composer.json composer.lock symfony.lock .env" for path in $pathsToCopy do diff --git a/deploy/update.sh b/deploy/update.sh index 59ea373..4d7548a 100755 --- a/deploy/update.sh +++ b/deploy/update.sh @@ -5,7 +5,4 @@ systemctl --user start pod-futtern sleep 2 podman exec -it futtern-php /var/www/html/bin/console cache:clear podman exec -it futtern-php /var/www/html/bin/console cache:warmup -podman exec -it futtern-php /var/www/html/bin/console asset-map:compile - - echo 'yes' | podman exec -it futtern-php /var/www/html/bin/console doctrine:migrations:migrate diff --git a/importmap.php b/importmap.php deleted file mode 100644 index 3f89e51..0000000 --- a/importmap.php +++ /dev/null @@ -1,32 +0,0 @@ - [ - 'path' => './assets/app.js', - 'entrypoint' => true, - ], - 'bootstrap' => [ - 'version' => '5.3.7', - ], - '@popperjs/core' => [ - 'version' => '2.11.8', - ], - 'bootstrap/dist/css/bootstrap.min.css' => [ - 'version' => '5.3.7', - 'type' => 'css', - ], - 'htmx.org' => [ - 'version' => '2.0.5', - ], -]; diff --git a/migrations/Version20250621131822.php b/migrations/Version20250621131822.php deleted file mode 100644 index 735b90d..0000000 --- a/migrations/Version20250621131822.php +++ /dev/null @@ -1,47 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE food_vendor ADD COLUMN emojis VARCHAR(30) DEFAULT NULL - SQL); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql(<<<'SQL' - CREATE TEMPORARY TABLE __temp__food_vendor AS SELECT name, phone, menu_link, id FROM food_vendor - SQL); - $this->addSql(<<<'SQL' - DROP TABLE food_vendor - SQL); - $this->addSql(<<<'SQL' - CREATE TABLE food_vendor (name VARCHAR(50) NOT NULL, phone VARCHAR(50) DEFAULT '', menu_link VARCHAR(255) DEFAULT NULL, id BLOB NOT NULL, PRIMARY KEY(id)) - SQL); - $this->addSql(<<<'SQL' - INSERT INTO food_vendor (name, phone, menu_link, id) SELECT name, phone, menu_link, id FROM __temp__food_vendor - SQL); - $this->addSql(<<<'SQL' - DROP TABLE __temp__food_vendor - SQL); - } -} diff --git a/public/static/css/fieber.css b/public/static/css/fieber.css new file mode 100644 index 0000000..d15789b --- /dev/null +++ b/public/static/css/fieber.css @@ -0,0 +1,965 @@ +/* SPDX-License-Identifier: MIT + SPDX-FileCopyrightText: Copyright (c) 2022-2025 zichy +*/ + +/* Custom properties +======================================== +*/ + +:root { + --f-sans: ui-sans-serif, sans-serif; + + --f-body: ui-serif; + --f-heading: var(--f-sans); + --f-form: var(--f-sans); + --f-code: ui-monospace; + + --f-size: clamp(1.6rem, 1.75vw, 2rem); + --f-size-small: 0.85em; + --f-size-large: 1.25em; + --f-line: 1.5; + + --c-gray: #666; + --c-red: #b30; + --c-yellow: #fe9; + + --i-triangle: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"%3E%3Cpolygon fill="black" points="5 10 10 0 0 0"/%3E%3C/svg%3E'); + + --w-body: 80ch; +} + +/* Dark theme */ + +@media (prefers-color-scheme: dark) { + :root { + --c-gray: #999; + --c-red: #f99; + --c-yellow: #ff9; + + --i-triangle: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"%3E%3Cpolygon fill="white" points="5 10 10 0 0 0"/%3E%3C/svg%3E'); + } +} + + +/* Globals +======================================== +*/ + +/* Box sizing */ + +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* Text rendering */ + +* { + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +/* Interaction */ + +::selection { + background: Highlight; + color: HighlightText; + text-shadow: none; +} + +*:focus { + outline: 2px solid LinkText; + outline-offset: 0.25rem; +} + +/* Font size & Scrolling */ + +html { + font-size: 62.5%; + scroll-behavior: smooth; + scroll-padding-top: 2rem; +} + +/* Backdrop */ + +::backdrop { + background-color: rgba(255, 255, 255, 0.6); +} + +@media (prefers-color-scheme: dark) { + ::backdrop { + background-color: rgba(0, 0, 0, 0.6); + } +} + +/* Hidden elements */ + +[hidden] { + display: none; +} + +/* Print spacing */ + +@page { + margin: 15mm 20mm; +} + + +/* Body +======================================== +*/ + +/* Colors & Typography */ + +body { + background-color: Canvas; + color: CanvasText; + font-size: var(--f-size); + font-family: var(--f-body); + line-height: var(--f-line); +} + +/* Body sizing */ + +@media screen { + body { + max-width: var(--w-body, 100%); + min-width: 320px; + padding: 2rem; + margin: 0 auto; + overflow-x: hidden; + overflow-y: scroll; + } +} + +/* Print colors */ + +@media print { + body { + background-color: white; + color: black; + } +} + + +/* Links +======================================== +*/ + +a:any-link { + color: LinkText; + text-decoration: underline; + text-decoration-thickness: 0.125em; +} + +a:any-link:hover { + background-color: LinkText; + color: Canvas; + text-decoration-line: none; +} + +@media print { + a[href^="http"]::after { + content: ' ('attr(href)')'; + font-size: var(--f-size-small); + word-break: break-all; + } +} + + +/* Media +======================================== +*/ + +/* Reset */ + +:where(iframe, img, svg, canvas, audio, video) { + display: block; + max-width: 100%; +} + +@media print { + :where(audio, video) { + display: none; + } +} + +figure { + margin-inline: 0; + break-inside: avoid; +} + +/* Image */ + +img { + height: auto; + position: relative; +} + +img::before { + content: ''; + background-color: Highlight; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; +} + +@media screen { + picture img { + width: 100%; + } +} + +/* Video */ + +video { + width: 100%; + height: auto; +} + +/* Iframe */ + +iframe { + border-style: none; +} + + +/* Headings +======================================== +*/ + +:where(h1, h2, h3, h4, h5, h6) { + font-family: var(--f-heading); + line-height: calc(var(--f-line) / 1.25); + hyphens: auto; +} + +:where(h3, h5) { + color: var(--c-gray); +} + +:where(h4, h5, h6) { + text-transform: uppercase; +} + +:where(h2, h3, h4, h5, h6):target { + background-color: var(--c-yellow); + color: MarkText; +} + + +/* Lists +======================================== +*/ + +:where(ul, ol) { + padding-inline-start: 1em; +} + +ul { + list-style-type: disc; +} + +li::marker { + color: var(--c-gray); +} + +li p { + margin: 0; +} + +/* Description */ + +dt { + font-style: italic; +} + +/* Navigation */ + +nav ul { + display: flex; + flex-wrap: wrap; + gap: 0.5rem 2rem; + list-style-type: none; + padding: 0; +} + +@media print { + nav { + display: none; + } +} + + +/* Inline elements +======================================== +*/ + +/* Bold text */ + +:where(b, strong) { + font-weight: bolder; +} + +/* Small text */ + +small { + font-size: var(--f-size-small); +} + +/* Mark */ + +mark { + background-color: var(--c-yellow); +} + +/* Abbreviation */ + +abbr[title] { + text-decoration-line: underline; + text-decoration-style: dotted; + cursor: help; +} + +a abbr[title] { + text-decoration: none; +} + +/* Subscript & Superscript */ + +:where(sub, sup) { + line-height: 0; +} + +/* Quote */ + +q { + font-style: italic; + quotes: none; +} + +/* Keyboard input */ + +kbd { + background: linear-gradient(0deg, Canvas 0%, ButtonFace 100%); + font-size: var(--f-size-small); + font-family: var(--f-sans); + font-weight: bold; + padding: 0.2em 0.4em; + border-radius: 0.5rem; + box-shadow: 1px 1px 1px 0px var(--c-gray); +} + + +/* Ruby annotation +======================================== +*/ + +rt { + color: var(--c-gray); + font-family: var(--f-sans); + letter-spacing: -0.05em; + padding: 0 0.25em; +} + + +/* Horizontal rule +======================================== +*/ + +hr { + height: 0; + margin: 2em 0; + border: 0; + border-top: 2px solid var(--c-gray); +} + + +/* Blockquote +======================================== +*/ + +blockquote { + font-size: var(--f-size-large); + font-style: italic; + line-height: calc(var(--f-line) / 1.25); + margin: 0; +} + +blockquote > *:first-child { + margin-block-start: 0; +} + +blockquote > *:last-child { + margin-block-end: 0; +} + + +/* Captions +======================================== +*/ + +:where(caption, figcaption) { + color: var(--c-gray); + font-family: var(--f-heading); + font-size: var(--f-size-small); + font-style: italic; + margin-block-start: 0.5rem; +} + +caption { + text-align: left; + caption-side: bottom; +} + +[dir='rtl' i] caption { + text-align: right; +} + + +/* Code +======================================== +*/ + +:where(pre, code, samp, var) { + background-color: ButtonFace; +} + +:where(code, samp, var) { + font-size: var(--f-size-small); + font-family: var(--f-code); + padding: 0.2em 0.4em; +} + +pre { + font-size: var(--f-size-small); + padding: 2rem; +} + +@media screen { + pre { + overflow-x: scroll; + } +} + +pre code { + background-color: transparent; + display: block; + white-space: pre-wrap; + padding: 0; +} + + +/* Details +======================================== +*/ + +details { + background-color: ButtonFace; + padding: 2rem; + margin: 1em 0; + border-radius: 0.5rem; +} + +details > *:nth-child(2) { + margin-block-start: 0; +} + +details > *:last-child { + margin-block-end: 0; +} + +summary { + color: LinkText; + font-family: var(--f-heading); + font-weight: bold; + cursor: pointer; +} + +summary:hover { + text-decoration: underline; +} + +details[open] summary { + margin-block-end: 2rem; +} + + +/* Aside +======================================== +*/ + +aside { + color: var(--c-gray); +} + +@media (min-width: 769px) { + aside { + font-size: var(--f-size-small); + float: right; + width: calc(var(--w-body) / 2.5); + padding-block-end: 2rem; + padding-inline-start: 4rem; + } + + aside > *:first-child { + margin-block-start: 0; + } + + aside > *:last-child { + margin-block-end: 0; + } +} + + +/* Table +======================================== +*/ + +table { + width: 100%; + margin: 1em 0; + border-collapse: collapse; + border-spacing: 0; + break-inside: avoid; +} + +@media screen and (max-width: 768px) { + table { + display: block; + overflow-x: auto; + overflow-y: hidden; + } +} + +thead { + border-bottom: 2px solid var(--c-gray); +} + +tbody tr:nth-child(odd) { + background-color: ButtonFace; +} + +tfoot { + border-top: 2px solid var(--c-gray); +} + +:where(th, td) { + padding: 0.5rem 1rem; +} + +@media (max-width: 768px) { + :where(th, td) { + min-width: 10rem; + } +} + +th { + font-family: var(--f-heading); + text-align: left; + vertical-align: bottom; +} + +[dir='rtl' i] th { + text-align: right; +} + + +/* Forms & Inputs +======================================== +*/ + +/* Reset */ + +:where(input, textarea, select, button, progress) { + -webkit-appearance: none; + background-color: transparent; + break-inside: avoid; +} + +:where(input, textarea, select, button) { + font-family: var(--f-form); + font-size: 1em; + border-radius: 0.5rem; +} + +:where(input:not([type='button' i]):not([type='submit' i]):not([type='reset' i]):not([type='checkbox' i]):not([type='radio' i]):not([type='image' i]), textarea, select) { + color: CanvasText; + font-size: var(--f-size-small); + display: block; + width: 100%; + padding: 0.75rem 1rem; + border: 2px solid LinkText; +} + +/* Placeholder */ + +::placeholder { + color: var(--c-gray); +} + +/* Fieldset */ + +fieldset { + padding: 2rem; + border: 2px solid LinkText; + border-radius: 0.5rem; + break-inside: avoid; +} + +/* Label & Legend */ + +:where(legend, label) { + font-family: var(--f-form); + font-weight: bold; + display: block; +} + +legend { + padding: 0 1rem; +} + +:where(legend, label) small { + color: var(--c-gray); + font-weight: normal; +} + +/* Textarea */ + +textarea { + resize: vertical; +} + +/* Checkbox & Radio input */ + +label:has([type='checkbox' i], [type='radio' i]) { + font-family: var(--f-form); + font-size: var(--f-size-small); + font-weight: normal; + display: grid; + grid-template-columns: 1.25em 1fr; + column-gap: 0.5em; + padding-block-end: 0; +} + +label:has([type='checkbox' i][disabled], [type='radio' i][disabled]) { + color: var(--c-gray); +} + +:where([type='checkbox' i], [type='radio' i]) { + width: 1.25em; + height: 1.25em; + position: relative; + margin: 0.2rem 0 0; + border: 2px solid LinkText; + cursor: pointer; +} + +[type='radio' i] { + border-radius: 50%; +} + +:where([type='checkbox' i], [type='radio' i]):checked { + background-color: LinkText; +} + +[type='checkbox' i]:checked::after { + content: '\2713'; + color: Canvas; + font-family: var(--f-form); + font-weight: bold; + line-height: 1; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +/* Color input */ + +[type='color' i] { + height: 4rem; + padding: 0.5rem; + cursor: pointer; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::-webkit-color-swatch { + border: 0; +} + +::-moz-color-swatch { + border: 0; +} + +/* Range input */ + +[type='range' i] { + margin: 1.25rem 0 0; + padding: 0; + border: 0; +} + +[type='range' i]:focus { + outline: none; +} + +::-webkit-slider-runnable-track { + background-color: LinkText; + height: 4px; + border-radius: 0.5rem; +} + +[disabled]::-webkit-slider-runnable-track { + background-color: var(--c-gray); +} + +::-moz-range-track { + background-color: LinkText; + height: 4px; + border-radius: 0.5rem; +} + +[disabled]::-moz-range-track { + background-color: var(--c-gray); +} + +::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + background-color: Canvas; + height: 2rem; + width: 2rem; + margin-block-start: calc(-1rem + 2px); + border: 2px solid LinkText; + border-radius: 50%; + cursor: ew-resize; +} + +[disabled]::-webkit-slider-thumb { + border-color: var(--c-gray); +} + +[type='range' i]:focus::-webkit-slider-thumb { + outline: 2px solid LinkText; + outline-offset: 0.25rem; +} + +::-moz-range-thumb { + appearance: none; + background-color: Canvas; + height: 2rem; + width: 2rem; + margin-block-start: calc(-1rem + 2px); + border: 2px solid LinkText; + border-radius: 50%; + cursor: ew-resize; +} + +[disabled]::-moz-range-thumb { + border-color: var(--c-gray); +} + +[type='range' i]:focus::-moz-range-thumb { + outline: 2px solid LinkText; + outline-offset: 0.25rem; +} + +/* Select */ + +select { + background: Canvas var(--i-triangle) no-repeat calc(100% - 1rem) center / 1.5rem; + text-overflow: ellipsis; + white-space: nowrap; + padding-inline-end: 3.5rem; + overflow: hidden; + cursor: pointer; +} + +[dir='rtl' i] select { + background-position: 1rem center; + padding-inline: 3.5rem 1rem; +} + +select[multiple] { + background-image: none; + padding-inline-end: 1rem; +} + +/* Buttons */ + +:where(button, [type='button' i], [type='submit' i], [type='reset' i]) { + font-size: var(--f-size-small); + font-weight: bold; + text-align: center; + text-decoration: none; + line-height: 1; + display: inline-block; + min-width: 5rem; + padding: 0.2em 0.4em; + border: 2px solid LinkText; + -webkit-user-select: text; + user-select: text; + cursor: pointer; + touch-action: manipulation; +} + +:where(button:not([disabled]), [type='button' i]:not([disabled]), [type='submit' i]:not([disabled]), [type='reset' i]:not([disabled])):hover { + text-decoration: underline; +} + +@media screen { + :where(button, [type='button' i], [type='submit' i], [type='reset' i]) { + background-color: LinkText; + color: Canvas; + } + + :where(button[disabled], [type='button' i][disabled], [type='submit' i][disabled], [type='reset' i][disabled]) { + background-color: var(--c-gray); + color: currentColor; + } +} + +form :where(button, [type='button' i], [type='submit' i], [type='reset' i]) { + padding: 1rem 1.5rem; +} + +/* Meter & Progress */ + +:where(meter, progress) { + width: 100%; + height: 3rem; + border: 2px solid var(--c-gray); +} + +label + :where(meter, progress) { + margin-block-start: 0.5rem; +} + +meter { + background: transparent; + display: block; + margin-block-end: 1em; + border: 2px solid var(--c-gray); +} + +::-webkit-meter-bar { + background: Canvas; + height: 3rem; + border: 2px solid var(--c-gray); + border-radius: 0; +} + +::-webkit-progress-bar { + background-color: Canvas; +} + +::-moz-progress-bar { + background-color: var(--c-gray); +} + +::-webkit-progress-value { + background-color: var(--c-gray); +} + +/* Disabled state */ + +[disabled] { + border-color: var(--c-gray); + cursor: not-allowed; +} + +/* Error state */ + +[aria-invalid] { + border-color: var(--c-red) !important; +} + +[aria-invalid]:focus { + outline-color: var(--c-red); +} + +[aria-invalid] + p[id] { + color: var(--c-red); +} + +/* Form spacing */ + +form label:not(:first-of-type) { + margin-block-start: 3rem; +} + +form label + :where(input, textarea, select) { + margin-block-start: 0.5rem; +} + +form fieldset { + margin: 3rem 0; +} + +fieldset label:not(:first-of-type) { + margin-block-start: 2rem; +} + +form p[id] { + margin-block-start: 0.5rem; +} + + +/* Dialog +======================================== +*/ + +dialog[open] { + background-color: Canvas; + color: currentColor; + display: block; + max-width: var(--w-body, 100%); + min-width: calc(var(--w-body) / 2); + padding: 2rem; + border: 2px solid var(--c-gray); + border-radius: 0.5rem; +} + +body:has(dialog[open]) { + overflow: hidden; +} + +dialog:not([open]) { + display: none; +} + +dialog > *:first-child { + margin-block-start: 0; +} + +dialog > *:last-child { + margin-block-end: 0; +} + + +/* Opinionated layout +======================================== +*/ + +@media screen { + body > header { + margin-block-end: 4em; + } + + main > :where(section, article), + body > footer { + margin-block-start: 4em; + clear: both; + } + + body > footer { + margin-block-start: 4em; + } +} diff --git a/public/static/css/new.min.css b/public/static/css/new.min.css new file mode 100644 index 0000000..6375ff5 --- /dev/null +++ b/public/static/css/new.min.css @@ -0,0 +1 @@ +blockquote,header{background:var(--nc-bg-2)}dt,summary,table caption{font-weight:700}img,pre,textarea{max-width:100%}:root{--nc-font-sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--nc-font-mono:Consolas,monaco,'Ubuntu Mono','Liberation Mono','Courier New',Courier,monospace;--nc-tx-1:#000000;--nc-tx-2:#1A1A1A;--nc-bg-1:#FFFFFF;--nc-bg-2:#F6F8FA;--nc-bg-3:#E5E7EB;--nc-lk-1:#0070F3;--nc-lk-2:#0366D6;--nc-lk-tx:#FFFFFF;--nc-ac-1:#79FFE1;--nc-ac-tx:#0C4047;--nc-d-tx-1:#ffffff;--nc-d-tx-2:#eeeeee;--nc-d-bg-1:#000000;--nc-d-bg-2:#111111;--nc-d-bg-3:#222222;--nc-d-lk-1:#3291FF;--nc-d-lk-2:#0070F3;--nc-d-lk-tx:#FFFFFF;--nc-d-ac-1:#7928CA;--nc-d-ac-tx:#FFFFFF}@media (prefers-color-scheme:dark){:root{--nc-tx-1:var(--nc-d-tx-1);--nc-tx-2:var(--nc-d-tx-2);--nc-bg-1:var(--nc-d-bg-1);--nc-bg-2:var(--nc-d-bg-2);--nc-bg-3:var(--nc-d-bg-3);--nc-lk-1:var(--nc-d-lk-1);--nc-lk-2:var(--nc-d-lk-2);--nc-lk-tx:var(--nc--dlk-tx);--nc-ac-1:var(--nc-d-ac-1);--nc-ac-tx:var(--nc--dac-tx)}}*{margin:0;padding:0}address,area,article,aside,audio,blockquote,datalist,details,dl,fieldset,figure,form,iframe,img,input,meter,nav,ol,optgroup,option,output,p,pre,progress,ruby,section,table,textarea,ul,video{margin-bottom:1rem}button,html,input,select{font-family:var(--nc-font-sans)}body{margin:0 auto;max-width:750px;padding:2rem;border-radius:6px;overflow-x:hidden;word-break:break-word;overflow-wrap:break-word;background:var(--nc-bg-1);color:var(--nc-tx-2);font-size:1.03rem;line-height:1.5}::selection{background:var(--nc-ac-1);color:var(--nc-ac-tx)}h1,h2,h3,h4,h5,h6{line-height:1;color:var(--nc-tx-1);padding-top:.875rem}h1,h2,h3{color:var(--nc-tx-1);padding-bottom:2px;margin-bottom:8px;border-bottom:1px solid var(--nc-bg-2)}h4,h5,h6{margin-bottom:.3rem}h1{font-size:2.25rem}h2{font-size:1.85rem}h3{font-size:1.55rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:.875rem}a{color:var(--nc-lk-1)}a:hover{color:var(--nc-lk-2)}abbr,abbr:hover{cursor:help}blockquote{padding:1.5rem;border-left:5px solid var(--nc-bg-3)}blockquote :last-child{padding-bottom:0;margin-bottom:0}header{border-bottom:1px solid var(--nc-bg-3);padding:2rem 1.5rem;margin:-2rem calc(50% - 50vw) 2rem;padding-left:calc(50vw - 50%);padding-right:calc(50vw - 50%)}header h1,header h2,header h3{padding-bottom:0;border-bottom:0}header>:first-child{margin-top:0;padding-top:0}a img,details[open]>:last-child,header>:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}a button,button,input[type=button],input[type=reset],input[type=submit]{font-size:1rem;display:inline-block;padding:6px 12px;text-align:center;text-decoration:none;white-space:nowrap;background:var(--nc-lk-1);color:var(--nc-lk-tx);border:0;border-radius:4px;box-sizing:border-box;cursor:pointer;color:var(--nc-lk-tx)}a button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{opacity:.5;cursor:not-allowed}.button:enabled:hover,.button:focus,button:enabled:hover,button:focus,input[type=button]:enabled:hover,input[type=button]:focus,input[type=reset]:enabled:hover,input[type=reset]:focus,input[type=submit]:enabled:hover,input[type=submit]:focus{background:var(--nc-lk-2)}code,details,input,kbd,pre,samp,select,textarea,th,tr:nth-child(2n){background:var(--nc-bg-2)}code,kbd,pre,samp{font-family:var(--nc-font-mono);border:1px solid var(--nc-bg-3);border-radius:4px;padding:3px 6px;font-size:.9em}code pre,pre code{background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}details,fieldset{border:1px solid var(--nc-bg-3)}kbd{border-bottom:3px solid var(--nc-bg-3)}pre{padding:1rem 1.4rem;overflow:auto}code pre{display:inline}details{padding:.6rem 1rem;border-radius:4px}summary{cursor:pointer}details[open]{padding-bottom:.75rem}details[open] summary{margin-bottom:6px}dd::before{content:'โ '}hr{border:0;border-bottom:1px solid var(--nc-bg-3);margin:1rem auto}fieldset{margin-top:1rem;padding:2rem;border-radius:4px}input,select,td,textarea,th{border:1px solid var(--nc-bg-3)}legend{padding:auto .5rem}table{border-collapse:collapse;width:100%}td,th{text-align:left;padding:.5rem}table caption{margin-bottom:.5rem}ol,ul{padding-left:2rem}li{margin-top:.4rem}mark{padding:3px 6px;background:var(--nc-ac-1);color:var(--nc-ac-tx)}input,select,textarea{padding:6px 12px;margin-bottom:.5rem;color:var(--nc-tx-2);border-radius:4px;box-shadow:none;box-sizing:border-box} \ No newline at end of file diff --git a/public/static/css/simple.min.css b/public/static/css/simple.min.css new file mode 100644 index 0000000..9db8fe6 --- /dev/null +++ b/public/static/css/simple.min.css @@ -0,0 +1 @@ +:root,::backdrop{--sans-font:-apple-system,BlinkMacSystemFont,"Avenir Next",Avenir,"Nimbus Sans L",Roboto,"Noto Sans","Segoe UI",Arial,Helvetica,"Helvetica Neue",sans-serif;--mono-font:Consolas,Menlo,Monaco,"Andale Mono","Ubuntu Mono",monospace;--standard-border-radius:5px;--bg:#fff;--accent-bg:#f5f7ff;--text:#212121;--text-light:#585858;--border:#898ea4;--accent:#0d47a1;--accent-hover:#1266e2;--accent-text:var(--bg);--code:#d81b60;--preformatted:#444;--marked:#fd3;--disabled:#efefef}@media (prefers-color-scheme:dark){:root,::backdrop{color-scheme:dark;--bg:#212121;--accent-bg:#2b2b2b;--text:#dcdcdc;--text-light:#ababab;--accent:#ffb300;--accent-hover:#ffe099;--accent-text:var(--bg);--code:#f06292;--preformatted:#ccc;--disabled:#111}img,video{opacity:.8}}*,:before,:after{box-sizing:border-box}textarea,select,input,progress{-webkit-appearance:none;-moz-appearance:none;appearance:none}html{font-family:var(--sans-font);scroll-behavior:smooth}body{color:var(--text);background-color:var(--bg);grid-template-columns:1fr min(45rem,90%) 1fr;margin:0;font-size:1.15rem;line-height:1.5;display:grid}body>*{grid-column:2}body>header{background-color:var(--accent-bg);border-bottom:1px solid var(--border);text-align:center;grid-column:1/-1;padding:0 .5rem 2rem}body>header>:only-child{margin-block-start:2rem}body>header h1{max-width:1200px;margin:1rem auto}body>header p{max-width:40rem;margin:1rem auto}main{padding-top:1.5rem}body>footer{color:var(--text-light);text-align:center;border-top:1px solid var(--border);margin-top:4rem;padding:2rem 1rem 1.5rem;font-size:.9rem}h1{font-size:3rem}h2{margin-top:3rem;font-size:2.6rem}h3{margin-top:3rem;font-size:2rem}h4{font-size:1.44rem}h5{font-size:1.15rem}h6{font-size:.96rem}p{margin:1.5rem 0}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}h1,h2,h3{line-height:1.1}@media only screen and (width<=720px){h1{font-size:2.5rem}h2{font-size:2.1rem}h3{font-size:1.75rem}h4{font-size:1.25rem}}a,a:visited{color:var(--accent)}a:hover{text-decoration:none}button,.button,a.button,input[type=submit],input[type=reset],input[type=button],label[type=button]{border:1px solid var(--accent);background-color:var(--accent);color:var(--accent-text);padding:.5rem .9rem;line-height:normal;text-decoration:none}.button[aria-disabled=true],input:disabled,textarea:disabled,select:disabled,button[disabled]{cursor:not-allowed;background-color:var(--disabled);border-color:var(--disabled);color:var(--text-light)}input[type=range]{padding:0}abbr[title]{cursor:help;text-decoration-line:underline;text-decoration-style:dotted}button:enabled:hover,.button:not([aria-disabled=true]):hover,input[type=submit]:enabled:hover,input[type=reset]:enabled:hover,input[type=button]:enabled:hover,label[type=button]:hover{background-color:var(--accent-hover);border-color:var(--accent-hover);cursor:pointer}.button:focus-visible,button:focus-visible:where(:enabled),input:enabled:focus-visible:where([type=submit],[type=reset],[type=button]){outline:2px solid var(--accent);outline-offset:1px}header>nav{padding:1rem 0 0;font-size:1rem;line-height:2}header>nav ul,header>nav ol{flex-flow:wrap;place-content:space-around center;align-items:center;margin:0;padding:0;list-style-type:none;display:flex}header>nav ul li,header>nav ol li{display:inline-block}header>nav a,header>nav a:visited{border:1px solid var(--border);border-radius:var(--standard-border-radius);color:var(--text);margin:0 .5rem 1rem;padding:.1rem 1rem;text-decoration:none;display:inline-block}header>nav a:hover,header>nav a.current,header>nav a[aria-current=page]{border-color:var(--accent);color:var(--accent);cursor:pointer}@media only screen and (width<=720px){header>nav a{border:none;padding:0;line-height:1;text-decoration:underline}}aside,details,pre,progress{background-color:var(--accent-bg);border:1px solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem}aside{float:right;width:30%;margin-inline-start:15px;padding:0 15px;font-size:1rem}[dir=rtl] aside{float:left}@media only screen and (width<=720px){aside{float:none;width:100%;margin-inline-start:0}}article,fieldset,dialog{border:1px solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem;padding:1rem}article h2:first-child,section h2:first-child,article h3:first-child,section h3:first-child{margin-top:1rem}section{border-top:1px solid var(--border);border-bottom:1px solid var(--border);margin:3rem 0;padding:2rem 1rem}section+section,section:first-child{border-top:0;padding-top:0}section+section{margin-top:0}section:last-child{border-bottom:0;padding-bottom:0}details{padding:.7rem 1rem}summary{cursor:pointer;word-break:break-all;margin:-.7rem -1rem;padding:.7rem 1rem;font-weight:700}details[open]>summary+*{margin-top:0}details[open]>summary{margin-bottom:.5rem}details[open]>:last-child{margin-bottom:0}table{border-collapse:collapse;margin:1.5rem 0}figure>table{width:max-content;margin:0}td,th{border:1px solid var(--border);text-align:start;padding:.5rem}th{background-color:var(--accent-bg);font-weight:700}tr:nth-child(2n){background-color:var(--accent-bg)}table caption{margin-bottom:.5rem;font-weight:700}textarea,select,input,button,.button{font-size:inherit;border-radius:var(--standard-border-radius);box-shadow:none;max-width:100%;margin-bottom:.5rem;padding:.5rem;font-family:inherit;display:inline-block}textarea,select,input{color:var(--text);background-color:var(--bg);border:1px solid var(--border)}label{display:block}textarea:not([cols]){width:100%}select:not([multiple]){background-image:linear-gradient(45deg,transparent 49%,var(--text)51%),linear-gradient(135deg,var(--text)51%,transparent 49%);background-position:calc(100% - 15px),calc(100% - 10px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-inline-end:25px}[dir=rtl] select:not([multiple]){background-position:10px,15px}input[type=checkbox],input[type=radio]{vertical-align:middle;width:min-content;position:relative}input[type=checkbox]+label,input[type=radio]+label{display:inline-block}input[type=radio]{border-radius:100%}input[type=checkbox]:checked,input[type=radio]:checked{background-color:var(--accent)}input[type=checkbox]:checked:after{content:" ";border-right:solid var(--bg).08em;border-bottom:solid var(--bg).08em;background-color:#0000;border-radius:0;width:.18em;height:.32em;font-size:1.8em;position:absolute;top:.05em;left:.17em;transform:rotate(45deg)}input[type=radio]:checked:after{content:" ";background-color:var(--bg);border-radius:100%;width:.25em;height:.25em;font-size:32px;position:absolute;top:.125em;left:.125em}@media only screen and (width<=720px){textarea,select,input{width:100%}}input[type=color]{height:2.5rem;padding:.2rem}input[type=file]{border:0}hr{background:var(--border);border:none;height:1px;margin:1rem auto}mark{border-radius:var(--standard-border-radius);background-color:var(--marked);color:#000;padding:2px 5px}mark a{color:#0d47a1}img,video{border-radius:var(--standard-border-radius);max-width:100%;height:auto}figure{margin:0;display:block;overflow-x:auto}figure>img,figure>picture>img{margin-inline:auto;display:block}figcaption{text-align:center;color:var(--text-light);margin-block:1rem;font-size:.9rem}blockquote{border-inline-start:.35rem solid var(--accent);color:var(--text-light);margin-block:2rem;margin-inline:2rem 0;padding:.4rem .8rem;font-style:italic}cite{color:var(--text-light);font-size:.9rem;font-style:normal}dt{color:var(--text-light)}code,pre,pre span,kbd,samp{font-family:var(--mono-font);color:var(--code)}kbd{color:var(--preformatted);border:1px solid var(--preformatted);border-bottom:3px solid var(--preformatted);border-radius:var(--standard-border-radius);padding:.1rem .4rem}pre{color:var(--preformatted);max-width:100%;padding:1rem 1.4rem;overflow:auto}pre code{color:var(--preformatted);background:0 0;margin:0;padding:0}progress{width:100%}progress:indeterminate{background-color:var(--accent-bg)}progress::-webkit-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent-bg)}progress::-webkit-progress-value{border-radius:var(--standard-border-radius);background-color:var(--accent)}progress::-moz-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent);transition-property:width;transition-duration:.3s}progress:indeterminate::-moz-progress-bar{background-color:var(--accent-bg)}dialog{max-width:40rem;margin:auto}dialog::backdrop{background-color:var(--bg);opacity:.8}@media only screen and (width<=720px){dialog{max-width:100%;margin:auto 1em}}sup,sub{vertical-align:baseline;position:relative}sup{top:-.4em}sub{top:.3em}.notice{background:var(--accent-bg);border:2px solid var(--border);border-radius:var(--standard-border-radius);margin:2rem 0;padding:1.5rem} \ No newline at end of file diff --git a/public/static/css/water.min.css b/public/static/css/water.min.css new file mode 100644 index 0000000..6a9b7f7 --- /dev/null +++ b/public/static/css/water.min.css @@ -0,0 +1 @@ +:root{--background-body:#fff;--background:#efefef;--background-alt:#f7f7f7;--selection:#9e9e9e;--text-main:#363636;--text-bright:#000;--text-muted:#70777f;--links:#0076d1;--focus:rgba(0,150,191,0.67);--border:#dbdbdb;--code:#000;--animation-duration:0.1s;--button-base:#d0cfcf;--button-hover:#9b9b9b;--scrollbar-thumb:#aaa;--scrollbar-thumb-hover:var(--button-hover);--form-placeholder:#949494;--form-text:#1d1d1d;--variable:#39a33c;--highlight:#ff0;--select-arrow:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23161f27'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E")}@media (prefers-color-scheme:dark){:root{--background-body:#202b38;--background:#161f27;--background-alt:#1a242f;--selection:#1c76c5;--text-main:#dbdbdb;--text-bright:#fff;--text-muted:#a9b1ba;--links:#41adff;--focus:rgba(0,150,191,0.67);--border:#526980;--code:#ffbe85;--animation-duration:0.1s;--button-base:#0c151c;--button-hover:#040a0f;--scrollbar-thumb:var(--button-hover);--scrollbar-thumb-hover:#000;--form-placeholder:#a9a9a9;--form-text:#fff;--variable:#d941e2;--highlight:#efdb43;--select-arrow:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23efefef'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E")}}html{scrollbar-color:#aaa #fff;scrollbar-color:var(--scrollbar-thumb) var(--background-body);scrollbar-width:thin}@media (prefers-color-scheme:dark){html{scrollbar-color:#040a0f #202b38;scrollbar-color:var(--scrollbar-thumb) var(--background-body)}}body{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Segoe UI Emoji,Apple Color Emoji,Noto Color Emoji,sans-serif;line-height:1.4;max-width:800px;margin:20px auto;padding:0 10px;word-wrap:break-word;color:#363636;color:var(--text-main);background:#fff;background:var(--background-body);text-rendering:optimizeLegibility}@media (prefers-color-scheme:dark){body{background:#202b38;background:var(--background-body);color:#dbdbdb;color:var(--text-main)}}button{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}@media (prefers-color-scheme:dark){button{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}}input{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}@media (prefers-color-scheme:dark){input{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}}textarea{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}@media (prefers-color-scheme:dark){textarea{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}}h1{font-size:2.2em;margin-top:0}h1,h2,h3,h4,h5,h6{margin-bottom:12px;margin-top:24px}h1{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h1{color:#fff;color:var(--text-bright)}}h2{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h2{color:#fff;color:var(--text-bright)}}h3{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h3{color:#fff;color:var(--text-bright)}}h4{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h4{color:#fff;color:var(--text-bright)}}h5{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h5{color:#fff;color:var(--text-bright)}}h6{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h6{color:#fff;color:var(--text-bright)}}strong{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){strong{color:#fff;color:var(--text-bright)}}b,h1,h2,h3,h4,h5,h6,strong,th{font-weight:600}q:after,q:before{content:none}blockquote{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus);margin:1.5em 0;padding:.5em 1em;font-style:italic}@media (prefers-color-scheme:dark){blockquote{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus)}}q{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus);margin:1.5em 0;padding:.5em 1em;font-style:italic}@media (prefers-color-scheme:dark){q{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus)}}blockquote>footer{font-style:normal;border:0}address,blockquote cite{font-style:normal}a[href^=mailto\:]:before{content:"๐ง "}a[href^=tel\:]:before{content:"๐ "}a[href^=sms\:]:before{content:"๐ฌ "}mark{background-color:#ff0;background-color:var(--highlight);border-radius:2px;padding:0 2px;color:#000}@media (prefers-color-scheme:dark){mark{background-color:#efdb43;background-color:var(--highlight)}}a>code,a>strong{color:inherit}button,input[type=button],input[type=checkbox],input[type=radio],input[type=range],input[type=reset],input[type=submit],select{cursor:pointer}input,select{display:block}[type=checkbox],[type=radio]{display:initial}input{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){input{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}button{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){button{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}textarea{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){textarea{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}select{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){select{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}button{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){button{background-color:#0c151c;background-color:var(--button-base)}}input[type=submit]{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){input[type=submit]{background-color:#0c151c;background-color:var(--button-base)}}input[type=reset]{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){input[type=reset]{background-color:#0c151c;background-color:var(--button-base)}}input[type=button]{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){input[type=button]{background-color:#0c151c;background-color:var(--button-base)}}button:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){button:hover{background:#040a0f;background:var(--button-hover)}}input[type=submit]:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){input[type=submit]:hover{background:#040a0f;background:var(--button-hover)}}input[type=reset]:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){input[type=reset]:hover{background:#040a0f;background:var(--button-hover)}}input[type=button]:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){input[type=button]:hover{background:#040a0f;background:var(--button-hover)}}input[type=color]{min-height:2rem;padding:8px;cursor:pointer}input[type=checkbox],input[type=radio]{height:1em;width:1em}input[type=radio]{border-radius:100%}input{vertical-align:top}label{vertical-align:middle;margin-bottom:4px;display:inline-block}button,input:not([type=checkbox]):not([type=radio]),input[type=range],select,textarea{-webkit-appearance:none}textarea{display:block;margin-right:0;box-sizing:border-box;resize:vertical}textarea:not([cols]){width:100%}textarea:not([rows]){min-height:40px;height:140px}select{background:#efefef url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23161f27'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E") calc(100% - 12px) 50%/12px no-repeat;background:var(--background) var(--select-arrow) calc(100% - 12px) 50%/12px no-repeat;padding-right:35px}@media (prefers-color-scheme:dark){select{background:#161f27 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23efefef'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E") calc(100% - 12px) 50%/12px no-repeat;background:var(--background) var(--select-arrow) calc(100% - 12px) 50%/12px no-repeat}}select::-ms-expand{display:none}select[multiple]{padding-right:10px;background-image:none;overflow-y:auto}input:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){input:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}select:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){select:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}button:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){button:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}textarea:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){textarea:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}button:active,input[type=button]:active,input[type=checkbox]:active,input[type=radio]:active,input[type=range]:active,input[type=reset]:active,input[type=submit]:active{transform:translateY(2px)}button:disabled,input:disabled,select:disabled,textarea:disabled{cursor:not-allowed;opacity:.5}::-moz-placeholder{color:#949494;color:var(--form-placeholder)}:-ms-input-placeholder{color:#949494;color:var(--form-placeholder)}::-ms-input-placeholder{color:#949494;color:var(--form-placeholder)}::placeholder{color:#949494;color:var(--form-placeholder)}@media (prefers-color-scheme:dark){::-moz-placeholder{color:#a9a9a9;color:var(--form-placeholder)}:-ms-input-placeholder{color:#a9a9a9;color:var(--form-placeholder)}::-ms-input-placeholder{color:#a9a9a9;color:var(--form-placeholder)}::placeholder{color:#a9a9a9;color:var(--form-placeholder)}}fieldset{border:1px solid rgba(0,150,191,.67);border:1px solid var(--focus);border-radius:6px;margin:0 0 12px;padding:10px}@media (prefers-color-scheme:dark){fieldset{border:1px solid rgba(0,150,191,.67);border:1px solid var(--focus)}}legend{font-size:.9em;font-weight:600}input[type=range]{margin:10px 0;padding:10px 0;background:transparent}input[type=range]:focus{outline:none}input[type=range]::-webkit-slider-runnable-track{width:100%;height:9.5px;-webkit-transition:.2s;transition:.2s;background:#efefef;background:var(--background);border-radius:3px}@media (prefers-color-scheme:dark){input[type=range]::-webkit-slider-runnable-track{background:#161f27;background:var(--background)}}input[type=range]::-webkit-slider-thumb{box-shadow:0 1px 1px #000,0 0 1px #0d0d0d;height:20px;width:20px;border-radius:50%;background:#dbdbdb;background:var(--border);-webkit-appearance:none;margin-top:-7px}@media (prefers-color-scheme:dark){input[type=range]::-webkit-slider-thumb{background:#526980;background:var(--border)}}input[type=range]:focus::-webkit-slider-runnable-track{background:#efefef;background:var(--background)}@media (prefers-color-scheme:dark){input[type=range]:focus::-webkit-slider-runnable-track{background:#161f27;background:var(--background)}}input[type=range]::-moz-range-track{width:100%;height:9.5px;-moz-transition:.2s;transition:.2s;background:#efefef;background:var(--background);border-radius:3px}@media (prefers-color-scheme:dark){input[type=range]::-moz-range-track{background:#161f27;background:var(--background)}}input[type=range]::-moz-range-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;height:20px;width:20px;border-radius:50%;background:#dbdbdb;background:var(--border)}@media (prefers-color-scheme:dark){input[type=range]::-moz-range-thumb{background:#526980;background:var(--border)}}input[type=range]::-ms-track{width:100%;height:9.5px;background:transparent;border-color:transparent;border-width:16px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#efefef;background:var(--background);border:.2px solid #010101;border-radius:3px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}@media (prefers-color-scheme:dark){input[type=range]::-ms-fill-lower{background:#161f27;background:var(--background)}}input[type=range]::-ms-fill-upper{background:#efefef;background:var(--background);border:.2px solid #010101;border-radius:3px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}@media (prefers-color-scheme:dark){input[type=range]::-ms-fill-upper{background:#161f27;background:var(--background)}}input[type=range]::-ms-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;border:1px solid #000;height:20px;width:20px;border-radius:50%;background:#dbdbdb;background:var(--border)}@media (prefers-color-scheme:dark){input[type=range]::-ms-thumb{background:#526980;background:var(--border)}}input[type=range]:focus::-ms-fill-lower{background:#efefef;background:var(--background)}@media (prefers-color-scheme:dark){input[type=range]:focus::-ms-fill-lower{background:#161f27;background:var(--background)}}input[type=range]:focus::-ms-fill-upper{background:#efefef;background:var(--background)}@media (prefers-color-scheme:dark){input[type=range]:focus::-ms-fill-upper{background:#161f27;background:var(--background)}}a{text-decoration:none;color:#0076d1;color:var(--links)}@media (prefers-color-scheme:dark){a{color:#41adff;color:var(--links)}}a:hover{text-decoration:underline}code{background:#efefef;background:var(--background);color:#000;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}@media (prefers-color-scheme:dark){code{color:#ffbe85;color:var(--code);background:#161f27;background:var(--background)}}samp{background:#efefef;background:var(--background);color:#000;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}@media (prefers-color-scheme:dark){samp{color:#ffbe85;color:var(--code);background:#161f27;background:var(--background)}}time{background:#efefef;background:var(--background);color:#000;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}@media (prefers-color-scheme:dark){time{color:#ffbe85;color:var(--code);background:#161f27;background:var(--background)}}pre>code{padding:10px;display:block;overflow-x:auto}var{color:#39a33c;color:var(--variable);font-style:normal;font-family:monospace}@media (prefers-color-scheme:dark){var{color:#d941e2;color:var(--variable)}}kbd{background:#efefef;background:var(--background);border:1px solid #dbdbdb;border:1px solid var(--border);border-radius:2px;color:#363636;color:var(--text-main);padding:2px 4px}@media (prefers-color-scheme:dark){kbd{color:#dbdbdb;color:var(--text-main);border:1px solid #526980;border:1px solid var(--border);background:#161f27;background:var(--background)}}img,video{max-width:100%;height:auto}hr{border:none;border-top:1px solid #dbdbdb;border-top:1px solid var(--border)}@media (prefers-color-scheme:dark){hr{border-top:1px solid #526980;border-top:1px solid var(--border)}}table{border-collapse:collapse;margin-bottom:10px;width:100%;table-layout:fixed}table caption,td,th{text-align:left}td,th{padding:6px;vertical-align:top;word-wrap:break-word}thead{border-bottom:1px solid #dbdbdb;border-bottom:1px solid var(--border)}@media (prefers-color-scheme:dark){thead{border-bottom:1px solid #526980;border-bottom:1px solid var(--border)}}tfoot{border-top:1px solid #dbdbdb;border-top:1px solid var(--border)}@media (prefers-color-scheme:dark){tfoot{border-top:1px solid #526980;border-top:1px solid var(--border)}}tbody tr:nth-child(2n){background-color:#efefef;background-color:var(--background)}@media (prefers-color-scheme:dark){tbody tr:nth-child(2n){background-color:#161f27;background-color:var(--background)}}tbody tr:nth-child(2n) button{background-color:#f7f7f7;background-color:var(--background-alt)}@media (prefers-color-scheme:dark){tbody tr:nth-child(2n) button{background-color:#1a242f;background-color:var(--background-alt)}}tbody tr:nth-child(2n) button:hover{background-color:#fff;background-color:var(--background-body)}@media (prefers-color-scheme:dark){tbody tr:nth-child(2n) button:hover{background-color:#202b38;background-color:var(--background-body)}}::-webkit-scrollbar{height:10px;width:10px}::-webkit-scrollbar-track{background:#efefef;background:var(--background);border-radius:6px}@media (prefers-color-scheme:dark){::-webkit-scrollbar-track{background:#161f27;background:var(--background)}}::-webkit-scrollbar-thumb{background:#aaa;background:var(--scrollbar-thumb);border-radius:6px}@media (prefers-color-scheme:dark){::-webkit-scrollbar-thumb{background:#040a0f;background:var(--scrollbar-thumb)}}::-webkit-scrollbar-thumb:hover{background:#9b9b9b;background:var(--scrollbar-thumb-hover)}@media (prefers-color-scheme:dark){::-webkit-scrollbar-thumb:hover{background:#000;background:var(--scrollbar-thumb-hover)}}::-moz-selection{background-color:#9e9e9e;background-color:var(--selection);color:#000;color:var(--text-bright)}::selection{background-color:#9e9e9e;background-color:var(--selection);color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){::-moz-selection{color:#fff;color:var(--text-bright)}::selection{color:#fff;color:var(--text-bright)}}@media (prefers-color-scheme:dark){::-moz-selection{background-color:#1c76c5;background-color:var(--selection)}::selection{background-color:#1c76c5;background-color:var(--selection)}}details{display:flex;flex-direction:column;align-items:flex-start;background-color:#f7f7f7;background-color:var(--background-alt);padding:10px 10px 0;margin:1em 0;border-radius:6px;overflow:hidden}@media (prefers-color-scheme:dark){details{background-color:#1a242f;background-color:var(--background-alt)}}details[open]{padding:10px}details>:last-child{margin-bottom:0}details[open] summary{margin-bottom:10px}summary{display:list-item;background-color:#efefef;background-color:var(--background);padding:10px;margin:-10px -10px 0;cursor:pointer;outline:none}@media (prefers-color-scheme:dark){summary{background-color:#161f27;background-color:var(--background)}}summary:focus,summary:hover{text-decoration:underline}details>:not(summary){margin-top:0}summary::-webkit-details-marker{color:#363636;color:var(--text-main)}@media (prefers-color-scheme:dark){summary::-webkit-details-marker{color:#dbdbdb;color:var(--text-main)}}dialog{background-color:#f7f7f7;background-color:var(--background-alt);color:#363636;color:var(--text-main);border-radius:6px;border:#dbdbdb;border-color:var(--border);padding:10px 30px}@media (prefers-color-scheme:dark){dialog{border-color:#526980;border-color:var(--border);color:#dbdbdb;color:var(--text-main);background-color:#1a242f;background-color:var(--background-alt)}}dialog>header:first-child{background-color:#efefef;background-color:var(--background);border-radius:6px 6px 0 0;margin:-10px -30px 10px;padding:10px;text-align:center}@media (prefers-color-scheme:dark){dialog>header:first-child{background-color:#161f27;background-color:var(--background)}}dialog::-webkit-backdrop{background:rgba(0,0,0,.61);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}dialog::backdrop{background:rgba(0,0,0,.61);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}footer{border-top:1px solid #dbdbdb;border-top:1px solid var(--border);padding-top:10px;color:#70777f;color:var(--text-muted)}@media (prefers-color-scheme:dark){footer{color:#a9b1ba;color:var(--text-muted);border-top:1px solid #526980;border-top:1px solid var(--border)}}body>footer{margin-top:40px}@media print{body,button,code,details,input,pre,summary,textarea{background-color:#fff}button,input,textarea{border:1px solid #000}body,button,code,footer,h1,h2,h3,h4,h5,h6,input,pre,strong,summary,textarea{color:#000}summary::marker{color:#000}summary::-webkit-details-marker{color:#000}tbody tr:nth-child(2n){background-color:#f2f2f2}a{color:#00f;text-decoration:underline}} \ No newline at end of file diff --git a/public/static/js/htmx.min.js b/public/static/js/htmx.min.js new file mode 100644 index 0000000..de5f0f1 --- /dev/null +++ b/public/static/js/htmx.min.js @@ -0,0 +1 @@ +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.12"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t){return new RegExp("<"+e+"(\\s[^>]*>|>)([\\s\\S]*?)<\\/"+e+">",!!t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function A(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function s(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function N(e){return/
"+n+"",0);var a=i.querySelector("template").content;if(Q.config.allowScriptTags){oe(a.querySelectorAll("script"),function(e){if(Q.config.inlineScriptNonce){e.nonce=Q.config.inlineScriptNonce}e.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1})}else{oe(a.querySelectorAll("script"),function(e){_(e)})}return a}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s("