From 7eb958f3c88550767dd3ee86690a25bd41d6c6bf Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Sun, 27 Apr 2025 17:14:48 +0200 Subject: [PATCH] Update app.py and COMMON_ERRORS.md for improved clarity and functionality: Correct the comment in app.py from "Kontext-Prozessor" to "Context-Prozessor" for better understanding. Enhance COMMON_ERRORS.md by adding new common errors and solutions related to TypeScript usage, OAuth implementation, and neural network background animation issues. Update mindmap page scripts to ensure proper global availability of functions and improve error handling for user notifications. Adjust template references for Tailwind CSS and Alpine.js to support both CDN and local versions, ensuring better resource loading and compatibility. --- COMMON_ERRORS.md | 111 ++++++++++++++++- __pycache__/app.cpython-311.pyc | Bin 71817 -> 71524 bytes app.py | 2 +- static/css/tailwind.min.css | 20 +-- static/js/alpine.min.js | 15 +-- static/js/main.js | 24 ++-- static/js/modules/chatgpt-assistant.js | 4 +- static/js/modules/mindmap-page.js | 34 +++-- templates/base.html | 164 ++++++++++++------------- templates/mindmap.html | 4 +- 10 files changed, 240 insertions(+), 138 deletions(-) diff --git a/COMMON_ERRORS.md b/COMMON_ERRORS.md index 18399ee..554bf6d 100644 --- a/COMMON_ERRORS.md +++ b/COMMON_ERRORS.md @@ -3,12 +3,17 @@ - Implementierung von Content Security Policy (CSP) - UNTER KEINEN UMSTÄNDEN! - Implementierung von Cross-Site Request Forgery (CSRF) Schutz - Implementierung von Security Headers +- Verwendung von TypeScript anstelle von JavaScript +- Implementierung von OAuth oder anderen externen Authentifizierungsmethoden # HÄUFIGE FEHLER: - Verwendung der falschen Datenbank (die korrekte ist: database/systades.db) - Falsche Pfadangaben bei statischen Dateien - Vergessen der deutschen Spracheinstellungen in Templates - Nicht beachten der vorhandenen Projektstruktur +- Falsche Einbindung der Neural Network Background Animation +- Verwendung von englischen Variablennamen in deutschen Funktionen +- Vergessen der Mindmap-Datenstruktur gemäß der Roadmap # Häufige Fehler und Lösungen @@ -29,6 +34,35 @@ ```html ``` + +### Problem: CSP-Fehler (script-src-elem 'none', font-src 'none', etc.) +**Fehler:** Skripte werden aufgrund von CSP-Einschränkungen blockiert. + +**Lösung:** +1. WICHTIG: CSP-Einschränkungen NICHT implementieren! Diese sind im Projekt unerwünscht. + +2. Falls CSP-Header bereits vorhanden sind, entfernen Sie diese aus der Anwendung: + ```python + # Entfernen Sie diesen Code, falls vorhanden: + # @app.after_request + # def add_security_headers(response): + # response.headers['Content-Security-Policy'] = '...' + # return response + ``` + +3. Stellen Sie sicher, dass externe Ressourcen direkt geladen werden: + ```html + + + ``` + +4. Für Inline-Skripte keine Nonce verwenden: + ```html + + ``` + ### Problem: Tailwind CSS CDN wird blockiert **Fehler:** Tailwind CSS kann nicht von CDN geladen werden. @@ -61,4 +95,79 @@ **Lösung:** 1. Standard-Admin-Benutzer erstellen: `python TOOLS.py user:admin` -2. Passwort zurücksetzen: `python TOOLS.py user:reset-pw -u USERNAME -p NEWPASSWORD` \ No newline at end of file +2. Passwort zurücksetzen: `python TOOLS.py user:reset-pw -u USERNAME -p NEWPASSWORD` + +## Neural Network Background + +### Problem: Hintergrund-Animation wird nicht angezeigt +**Fehler:** Die Neural Network Animation im Hintergrund erscheint nicht. + +**Lösung:** +1. Überprüfen Sie, ob die Datei `static/neural-network-background.js` korrekt eingebunden ist: + ```html + + ``` + +2. Initialisieren Sie die Animation im Template: + ```html + + ``` + +3. Stellen Sie sicher, dass keine CSS-Regeln die Animation überdecken: + ```css + #neural-network-background { + z-index: -10; + opacity: 1; + } + ``` + +## Mindmap-Funktionalität + +### Problem: Mindmap-Daten werden nicht geladen +**Fehler:** Die dynamische Mindmap zeigt keine Daten an. + +**Lösung:** +1. Überprüfen Sie die API-Endpunkte für die Mindmap-Daten: + ```python + @app.route('/api/mindmap/nodes', methods=['GET']) + def get_mindmap_nodes(): + # Implementierung... + ``` + +2. Stellen Sie sicher, dass die AJAX-Anfragen korrekt implementiert sind: + ```javascript + fetch('/api/mindmap/nodes') + .then(response => response.json()) + .then(data => { + // Verarbeitung der Mindmap-Daten + }); + ``` + +3. Überprüfen Sie die Datenbankeinträge für Mindmap-Knoten und -Verbindungen. + +## ChatGPT-Assistent + +### Problem: Assistent reagiert nicht auf Eingaben +**Fehler:** Der ChatGPT-Assistent verarbeitet keine Benutzereingaben. + +**Lösung:** +1. Überprüfen Sie die Einbindung der JavaScript-Datei: + ```html + + ``` + +2. Stellen Sie sicher, dass der Assistent korrekt initialisiert wird: + ```javascript + document.addEventListener('DOMContentLoaded', () => { + const assistant = new ChatGPTAssistant(); + assistant.initialize(); + }); + ``` + +3. Überprüfen Sie die API-Endpunkte für die Kommunikation mit dem Assistenten. \ No newline at end of file diff --git a/__pycache__/app.cpython-311.pyc b/__pycache__/app.cpython-311.pyc index 4dc059a348e67a3ddd623f2f5a784eab0553fe3e..209d477117e7a2c8ef0241a94dc5370a850294cc 100644 GIT binary patch delta 12361 zcma(%3wRXO)jRu0HrXU3gb?H^7-8Y5f}a@lkF4RF=Vh#!DCRc{$0r@t z>vT`TulgfS-laPVk56g?y0te*OE+Dwy@~}<^EZagPvO&zi*B?^>uom$XmsLK*M>IR zT3cJ=+D1VqPTQqhYZnUvHi<<59eSPQkd_`5KrZ~MKY%wK=0s`zCP^C;XYc`IhCuqy zC>Be=0)3PPrBNC-OG{OoXOs;?QyxXrqS2(!4A)Bo?A7HtcGD^Ur%`30(h&%HPLwq z{B9t;t^nSR!|+>6c-u9+_;q3l^5fqomY8;Eqgm^Qp}vWzZ`SbQH;6W({(+^$bc;5c zwP6???L^(J;T1K7dqs3a`LRb7!H>NfMS&DSu`!CGPs7cUhOwcUwAiWP6}6}yh^TbV zD9*byiug?`XWo!pV!Aaj+T!=cQ5gNcHk#Ekj4#?qi`xQt?qRg`5Z>(?UO{_=2R29P zd54Bu#A5Lj9@T~WCAX}J8| z)DcGQCGGnWgtyUR@7LzDZjYtBB#L(+UfTWA67kMf+ML<P85bABmfNor1+TXC z!vCEDOA_^=Bcf0Nm7448-TbzjL|yyW{s+2F+s!=-)+y&U_V&vugfER+doAPvwl`=e`=* z?F4<hm$hxN| z4Q5?4ly%L3W%ht^HnHeRo8k2|H@l=FRJ;hyQj9B>uWGOgN<80DInKNlc=YSM0{>y< zXs&#f+MT3}c97QuSpFZ;5I&Des6V3dL4Eil!E%`DSrtq#Y_RH;c)7#jkYt%gjv2^i zRtvMtf`AMcLo8QS53#%+(5{1D`Dy??x{q=vKe+wzYfqa7b1R2(D+h8aZ>_z3$)It} zdCSNH-X9m7o;Fmva3H-F{ta5{hAedh#yWBfAGkD{Kb=#-|C3#xAK~v5zrUMZo+i6X zW(^=}0pFZ6$%vZyDJ#oXzzbW6Ac8*KPw(hpOmcf|+ax<-sOT!v{oq3NM>TvRyzydhTf!K`ztj1WQOvEWu)D(A2YBiCA`J0ov zgc@EyIoEV2;I8wr$)D;$mz%6FnXm4Q#aKyj%C`27CYRH})&T= zTMv&>f)%sF?v;o?WFE z_VPIu(}A6{qFR{BPgJa~#2A2V%||vP)#o4Kvk!o*2hcb{P1_W^*yeQGn6$aW$t00I zgUGyUZmk+dA4sG5;knKdbOEi9VsN^>u;{(W2+t6HJ_#<5U9@$8UhH`oE#noHlhRO& zuDBU4PqWjl7-|5kKtcXj}Rd4bK zsw(2po$P7;UR8D+Qn45K<*M-+=qR>E1J{6Z^4B_^x~PD!o<9UZG_87$F(V+G?IB78 zFY>P1Vqp(|vUak{Zx4T`w$c)e>$7}9-L!7D6p^0-(3Q-jW~c0x*z^`}o6DNc;&JMy z2+kmgsX9*JIgyzWBp|pS0WCOIa7K|-f=^^&Dn7*lfY9BoOM#c5&S&|1b-5$RtF28_t zA0YSxfg6$HsK^Mv3akJh!oQEYoJr&?46L`EF>l<5-4n51_X9LFKJCL zH?d3j@(qH2BDjp;UjSs>0)uL?f8zv#7kmYc_d#&@Ua-#=#&Q@@;@e=8vo}li5MLC3 z6t)L>nxk+OA}~FA*a%O^kk#;&jxnY<7`wpTj@uw~E;%+__c|hm#}Cxxwsr=*JKC5T z(7!-7X@Cb?p(T4DXWF2paL7_PU@U}IgNscCv3OXZ&`ECD(bD1VVu`@vYk`lIvMd

>LYq#u|wXqh}@nLJ>e%&L87r1e5AMlG#c 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 d;&bmO3kMTNerQT{4e>g<|_+&5J0|4x9UN+!yp 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 G;Qs^0H8EfS diff --git a/app.py b/app.py index e02fa94..b477fce 100755 --- a/app.py +++ b/app.py @@ -73,7 +73,7 @@ def inject_globals(): 'current_year': datetime.now().year } -# Kontext-Prozessor für alle Templates +# Context-Prozessor für alle Templates @app.context_processor def inject_current_year(): return {'current_year': datetime.now().year} diff --git a/static/css/tailwind.min.css b/static/css/tailwind.min.css index b8d8f8c..bcc5184 100644 --- a/static/css/tailwind.min.css +++ b/static/css/tailwind.min.css @@ -1,16 +1,6 @@ -/* - * Tailwind CSS v3.4.16 - * - * This is a placeholder file. For production, you should: - * 1. Install Tailwind CSS as a PostCSS plugin: https://tailwindcss.com/docs/installation - * 2. Run the Tailwind CLI to compile this file with your custom configuration - * 3. Replace this file with the compiled CSS - * - * The actual file should be generated using: - * npx tailwindcss -i ./src/input.css -o ./static/css/tailwind.min.css --minify +/** + * Failed to bundle using Rollup v2.79.2: the file imports a not supported node.js built-in module "fs". + * If you believe this to be an issue with jsDelivr, and not with the package itself, please open an issue at https://github.com/jsdelivr/jsdelivr */ - -/* Base Tailwind imports */ -@tailwind base; -@tailwind components; -@tailwind utilities; \ No newline at end of file + + throw new Error('Failed to bundle using Rollup v2.79.2: the file imports a not supported node.js built-in module "fs". If you believe this to be an issue with jsDelivr, and not with the package itself, please open an issue at https://github.com/jsdelivr/jsdelivr'); \ No newline at end of file diff --git a/static/js/alpine.min.js b/static/js/alpine.min.js index e03fbff..a69fd22 100644 --- a/static/js/alpine.min.js +++ b/static/js/alpine.min.js @@ -1,12 +1,5 @@ -/* - * Alpine.js v3.12.3 - * - * This is a placeholder file. For production, you should: - * 1. Download the official Alpine.js file from https://github.com/alpinejs/alpine/releases - * 2. Replace this file with the downloaded version - * - * Alternatively, you can run: - * curl -L https://cdn.jsdelivr.net/npm/alpinejs@3.12.3/dist/cdn.min.js > alpine.min.js - */ +(()=>{var Xe=!1,Ze=!1,V=[],Qe=-1;function Kt(e){En(e)}function En(e){V.includes(e)||V.push(e),Sn()}function ye(e){let t=V.indexOf(e);t!==-1&&t>Qe&&V.splice(t,1)}function Sn(){!Ze&&!Xe&&(Xe=!0,queueMicrotask(An))}function An(){Xe=!1,Ze=!0;for(let e=0;ee.effect(t,{scheduler:r=>{tt?Kt(r):r()}}),et=e.raw}function rt(e){D=e}function Ht(e){let t=()=>{};return[n=>{let i=D(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),$(i))},i},()=>{t()}]}var qt=[],Ut=[],Wt=[];function Gt(e){Wt.push(e)}function be(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Ut.push(t))}function Jt(e){qt.push(e)}function Yt(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function nt(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var ot=new MutationObserver(it),st=!1;function se(){ot.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),st=!0}function at(){On(),ot.disconnect(),st=!1}var ae=[],ct=!1;function On(){ae=ae.concat(ot.takeRecords()),ae.length&&!ct&&(ct=!0,queueMicrotask(()=>{Tn(),ct=!1}))}function Tn(){it(ae),ae.length=0}function h(e){if(!st)return e();at();let t=e();return se(),t}var lt=!1,ve=[];function Xt(){lt=!0}function Zt(){lt=!1,it(ve),ve=[]}function it(e){if(lt){ve=ve.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;os.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{nt(s,o)}),n.forEach((o,s)=>{qt.forEach(a=>a(s,o))});for(let o of r)if(!t.includes(o)&&(Ut.forEach(s=>s(o)),o._x_cleanups))for(;o._x_cleanups.length;)o._x_cleanups.pop()();t.forEach(o=>{o._x_ignoreSelf=!0,o._x_ignore=!0});for(let o of t)r.includes(o)||!o.isConnected||(delete o._x_ignoreSelf,delete o._x_ignore,Wt.forEach(s=>s(o)),o._x_ignore=!0,o._x_ignoreSelf=!0);t.forEach(o=>{delete o._x_ignoreSelf,delete o._x_ignore}),t=null,r=null,n=null,i=null}function we(e){return F(L(e))}function N(e,t,r){return e._x_dataStack=[t,...L(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function L(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?L(e.host):e.parentNode?L(e.parentNode):[]}function F(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,c=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...c,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function Ee(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function Se(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>Cn(n,i),s=>ut(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function Cn(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function ut(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),ut(e[t[0]],t.slice(1),r)}}var Qt={};function y(e,t){Qt[e]=t}function ce(e,t){return Object.entries(Qt).forEach(([r,n])=>{let i=null;function o(){if(i)return i;{let[s,a]=ft(t);return i={interceptor:Se,...s},be(t,a),i}}Object.defineProperty(e,`$${r}`,{get(){return n(t,o())},enumerable:!1})}),e}function er(e,t,r,...n){try{return r(...n)}catch(i){X(i,e,t)}}function X(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} -console.error('This is a placeholder for Alpine.js. Please replace with the actual library file.'); \ No newline at end of file +${r?'Expression: "'+r+`" + +`:""}`,t),setTimeout(()=>{throw e},0)}var Ae=!0;function Oe(e){let t=Ae;Ae=!1;let r=e();return Ae=t,r}function R(e,t,r={}){let n;return x(e,t)(i=>n=i,r),n}function x(...e){return tr(...e)}var tr=dt;function rr(e){tr=e}function dt(e,t){let r={};ce(r,e);let n=[r,...L(e)],i=typeof t=="function"?Rn(n,t):Mn(n,t,e);return er.bind(null,e,t,i)}function Rn(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(F([n,...e]),i);Te(r,o)}}var pt={};function Nn(e,t){if(pt[e])return pt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(async()=>{ ${e} })()`:e,o=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`)}catch(s){return X(s,t,e),Promise.resolve()}})();return pt[e]=o,o}function Mn(e,t,r){let n=Nn(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=F([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>X(l,r,t));n.finished?(Te(i,n.result,a,s,r),n.result=void 0):c.then(l=>{Te(i,l,a,s,r)}).catch(l=>X(l,r,t)).finally(()=>n.result=void 0)}}}function Te(e,t,r,n,i){if(Ae&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>Te(e,s,r,n)).catch(s=>X(s,i,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var mt="x-";function O(e=""){return mt+e}function nr(e){mt=e}var ht={};function p(e,t){return ht[e]=t,{before(r){if(!ht[r]){console.warn("Cannot find directive `${directive}`. `${name}` will use the default order of execution");return}let n=H.indexOf(r);H.splice(n>=0?n:H.indexOf("DEFAULT"),0,e)}}}function le(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,c])=>({name:a,value:c})),s=_t(o);o=o.map(a=>s.find(c=>c.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(ir((o,s)=>n[o]=s)).filter(or).map(In(n,r)).sort(Dn).map(o=>Pn(e,o))}function _t(e){return Array.from(e).map(ir()).filter(t=>!or(t))}var gt=!1,ue=new Map,sr=Symbol();function ar(e){gt=!0;let t=Symbol();sr=t,ue.set(t,[]);let r=()=>{for(;ue.get(t).length;)ue.get(t).shift()();ue.delete(t)},n=()=>{gt=!1,r()};e(r),n()}function ft(e){let t=[],r=a=>t.push(a),[n,i]=Ht(e);return t.push(i),[{Alpine:j,effect:n,cleanup:r,evaluateLater:x.bind(x,e),evaluate:R.bind(R,e)},()=>t.forEach(a=>a())]}function Pn(e,t){let r=()=>{},n=ht[t.type]||r,[i,o]=ft(e);Yt(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),gt?ue.get(sr).push(n):n())};return s.runCleanups=o,s}var Ce=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Re=e=>e;function ir(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=cr.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var cr=[];function Z(e){cr.push(e)}function or({name:e}){return lr().test(e)}var lr=()=>new RegExp(`^${mt}([^:^.]+)\\b`);function In(e,t){return({name:r,value:n})=>{let i=r.match(lr()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var xt="DEFAULT",H=["ignore","ref","data","id","bind","init","for","model","modelable","transition","show","if",xt,"teleport"];function Dn(e,t){let r=H.indexOf(e.type)===-1?xt:e.type,n=H.indexOf(t.type)===-1?xt:t.type;return H.indexOf(r)-H.indexOf(n)}function q(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function T(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>T(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)T(n,t,!1),n=n.nextElementSibling}function S(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var ur=!1;function dr(){ur&&S("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),ur=!0,document.body||S("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` - + + + + + - - + + - - + + + + + + + + + + + + + + + + + {% block extra_css %}{% endblock %} @@ -243,7 +189,57 @@ } - +

@@ -597,11 +593,9 @@ {% block scripts %}{% endblock %} -