diff --git a/backend/database/seeders/DatabaseSeeder.php b/backend/database/seeders/DatabaseSeeder.php index b95f98f..c590ac1 100644 --- a/backend/database/seeders/DatabaseSeeder.php +++ b/backend/database/seeders/DatabaseSeeder.php @@ -21,11 +21,11 @@ class DatabaseSeeder extends Seeder // Create admin user with specified credentials User::updateOrCreate( - ['email' => 'admin@fietservice.nl'], + ['email' => 'bennY@fiet-service.nl'], [ - 'name' => 'admin', - 'email' => 'admin@fietservice.nl', - 'password' => Hash::make('Admin174'), + 'name' => 'Marijke & Benny', + 'email' => 'Admin@fiet-service.nl', + 'password' => Hash::make('B3nny4B1k'), ] ); } diff --git a/backend/public/assets/index-_eFKiDPi.js b/backend/public/assets/index-CTOGI7pY.js similarity index 97% rename from backend/public/assets/index-_eFKiDPi.js rename to backend/public/assets/index-CTOGI7pY.js index cc85058..6a73c48 100644 --- a/backend/public/assets/index-_eFKiDPi.js +++ b/backend/public/assets/index-CTOGI7pY.js @@ -22,4 +22,4 @@ * vue-router v4.5.1 * (c) 2025 Eduardo San Martin Morote * @license MIT - */const Lt=typeof document<"u";function gi(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function cc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&gi(e.default)}const ie=Object.assign;function ms(e,t){const s={};for(const n in t){const o=t[n];s[n]=Qe(o)?o.map(e):e(o)}return s}const fn=()=>{},Qe=Array.isArray,vi=/#/g,uc=/&/g,fc=/\//g,dc=/=/g,hc=/\?/g,_i=/\+/g,pc=/%5B/g,mc=/%5D/g,bi=/%5E/g,gc=/%60/g,yi=/%7B/g,vc=/%7C/g,wi=/%7D/g,_c=/%20/g;function Xs(e){return encodeURI(""+e).replace(vc,"|").replace(pc,"[").replace(mc,"]")}function bc(e){return Xs(e).replace(yi,"{").replace(wi,"}").replace(bi,"^")}function Ts(e){return Xs(e).replace(_i,"%2B").replace(_c,"+").replace(vi,"%23").replace(uc,"%26").replace(gc,"`").replace(yi,"{").replace(wi,"}").replace(bi,"^")}function yc(e){return Ts(e).replace(dc,"%3D")}function wc(e){return Xs(e).replace(vi,"%23").replace(hc,"%3F")}function Sc(e){return e==null?"":wc(e).replace(fc,"%2F")}function bn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const kc=/\/$/,Cc=e=>e.replace(kc,"");function gs(e,t,s="/"){let n,o={},r="",i="";const a=t.indexOf("#");let u=t.indexOf("?");return a=0&&(u=-1),u>-1&&(n=t.slice(0,u),r=t.slice(u+1,a>-1?a:t.length),o=e(r)),a>-1&&(n=n||t.slice(0,a),i=t.slice(a,t.length)),n=Rc(n??t,s),{fullPath:n+(r&&"?")+r+i,path:n,query:o,hash:bn(i)}}function xc(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function Lo(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Ec(e,t,s){const n=t.matched.length-1,o=s.matched.length-1;return n>-1&&n===o&&Gt(t.matched[n],s.matched[o])&&Si(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function Gt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Si(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const s in e)if(!Pc(e[s],t[s]))return!1;return!0}function Pc(e,t){return Qe(e)?No(e,t):Qe(t)?No(t,e):e===t}function No(e,t){return Qe(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function Rc(e,t){if(e.startsWith("/"))return e;if(!e)return t;const s=t.split("/"),n=e.split("/"),o=n[n.length-1];(o===".."||o===".")&&n.push("");let r=s.length-1,i,a;for(i=0;i1&&r--;else break;return s.slice(0,r).join("/")+"/"+n.slice(i).join("/")}const vt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var yn;(function(e){e.pop="pop",e.push="push"})(yn||(yn={}));var dn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(dn||(dn={}));function Ac(e){if(!e)if(Lt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Cc(e)}const Tc=/^[^#]+#/;function Oc(e,t){return e.replace(Tc,"#")+t}function Mc(e,t){const s=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-s.left-(t.left||0),top:n.top-s.top-(t.top||0)}}const ns=()=>({left:window.scrollX,top:window.scrollY});function Ic(e){let t;if("el"in e){const s=e.el,n=typeof s=="string"&&s.startsWith("#"),o=typeof s=="string"?n?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!o)return;t=Mc(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ho(e,t){return(history.state?history.state.position-t:-1)+e}const Os=new Map;function Dc(e,t){Os.set(e,t)}function jc(e){const t=Os.get(e);return Os.delete(e),t}let Vc=()=>location.protocol+"//"+location.host;function ki(e,t){const{pathname:s,search:n,hash:o}=t,r=e.indexOf("#");if(r>-1){let a=o.includes(e.slice(r))?e.slice(r).length:1,u=o.slice(a);return u[0]!=="/"&&(u="/"+u),Lo(u,"")}return Lo(s,e)+n+o}function Fc(e,t,s,n){let o=[],r=[],i=null;const a=({state:g})=>{const v=ki(e,location),P=s.value,O=t.value;let G=0;if(g){if(s.value=v,t.value=g,i&&i===P){i=null;return}G=O?g.position-O.position:0}else n(v);o.forEach(R=>{R(s.value,P,{delta:G,type:yn.pop,direction:G?G>0?dn.forward:dn.back:dn.unknown})})};function u(){i=s.value}function p(g){o.push(g);const v=()=>{const P=o.indexOf(g);P>-1&&o.splice(P,1)};return r.push(v),v}function l(){const{history:g}=window;g.state&&g.replaceState(ie({},g.state,{scroll:ns()}),"")}function h(){for(const g of r)g();r=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",l)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",l,{passive:!0}),{pauseListeners:u,listen:p,destroy:h}}function qo(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?ns():null}}function Bc(e){const{history:t,location:s}=window,n={value:ki(e,s)},o={value:t.state};o.value||r(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(u,p,l){const h=e.indexOf("#"),g=h>-1?(s.host&&document.querySelector("base")?e:e.slice(h))+u:Vc()+e+u;try{t[l?"replaceState":"pushState"](p,"",g),o.value=p}catch(v){console.error(v),s[l?"replace":"assign"](g)}}function i(u,p){const l=ie({},t.state,qo(o.value.back,u,o.value.forward,!0),p,{position:o.value.position});r(u,l,!0),n.value=u}function a(u,p){const l=ie({},o.value,t.state,{forward:u,scroll:ns()});r(l.current,l,!0);const h=ie({},qo(n.value,u,null),{position:l.position+1},p);r(u,h,!1),n.value=u}return{location:n,state:o,push:a,replace:i}}function Lc(e){e=Ac(e);const t=Bc(e),s=Fc(e,t.state,t.location,t.replace);function n(r,i=!0){i||s.pauseListeners(),history.go(r)}const o=ie({location:"",base:e,go:n,createHref:Oc.bind(null,e)},t,s);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Nc(e){return typeof e=="string"||e&&typeof e=="object"}function Ci(e){return typeof e=="string"||typeof e=="symbol"}const xi=Symbol("");var Uo;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Uo||(Uo={}));function zt(e,t){return ie(new Error,{type:e,[xi]:!0},t)}function it(e,t){return e instanceof Error&&xi in e&&(t==null||!!(e.type&t))}const Ko="[^/]+?",Hc={sensitive:!1,strict:!1,start:!0,end:!0},qc=/[.+*?^${}()[\]/\\]/g;function Uc(e,t){const s=ie({},Hc,t),n=[];let o=s.start?"^":"";const r=[];for(const p of e){const l=p.length?[]:[90];s.strict&&!p.length&&(o+="/");for(let h=0;ht.length?t.length===1&&t[0]===80?1:-1:0}function Ei(e,t){let s=0;const n=e.score,o=t.score;for(;s0&&t[t.length-1]<0}const Wc={type:0,value:""},Gc=/[a-zA-Z0-9_]/;function zc(e){if(!e)return[[]];if(e==="/")return[[Wc]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(v){throw new Error(`ERR (${s})/"${p}": ${v}`)}let s=0,n=s;const o=[];let r;function i(){r&&o.push(r),r=[]}let a=0,u,p="",l="";function h(){p&&(s===0?r.push({type:0,value:p}):s===1||s===2||s===3?(r.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${p}) must be alone in its segment. eg: '/:ids+.`),r.push({type:1,value:p,regexp:l,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),p="")}function g(){p+=u}for(;a{i(V)}:fn}function i(h){if(Ci(h)){const g=n.get(h);g&&(n.delete(h),s.splice(s.indexOf(g),1),g.children.forEach(i),g.alias.forEach(i))}else{const g=s.indexOf(h);g>-1&&(s.splice(g,1),h.record.name&&n.delete(h.record.name),h.children.forEach(i),h.alias.forEach(i))}}function a(){return s}function u(h){const g=Xc(h,s);s.splice(g,0,h),h.record.name&&!Jo(h)&&n.set(h.record.name,h)}function p(h,g){let v,P={},O,G;if("name"in h&&h.name){if(v=n.get(h.name),!v)throw zt(1,{location:h});G=v.record.name,P=ie(Go(g.params,v.keys.filter(V=>!V.optional).concat(v.parent?v.parent.keys.filter(V=>V.optional):[]).map(V=>V.name)),h.params&&Go(h.params,v.keys.map(V=>V.name))),O=v.stringify(P)}else if(h.path!=null)O=h.path,v=s.find(V=>V.re.test(O)),v&&(P=v.parse(O),G=v.record.name);else{if(v=g.name?n.get(g.name):s.find(V=>V.re.test(g.path)),!v)throw zt(1,{location:h,currentLocation:g});G=v.record.name,P=ie({},g.params,h.params),O=v.stringify(P)}const R=[];let I=v;for(;I;)R.unshift(I.record),I=I.parent;return{name:G,path:O,params:P,matched:R,meta:Zc(R)}}e.forEach(h=>r(h));function l(){s.length=0,n.clear()}return{addRoute:r,resolve:p,removeRoute:i,clearRoutes:l,getRoutes:a,getRecordMatcher:o}}function Go(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function zo(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Qc(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Qc(e){const t={},s=e.props||!1;if("component"in e)t.default=s;else for(const n in e.components)t[n]=typeof s=="object"?s[n]:s;return t}function Jo(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Zc(e){return e.reduce((t,s)=>ie(t,s.meta),{})}function Yo(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}function Xc(e,t){let s=0,n=t.length;for(;s!==n;){const r=s+n>>1;Ei(e,t[r])<0?n=r:s=r+1}const o=$c(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function $c(e){let t=e;for(;t=t.parent;)if(Pi(t)&&Ei(e,t)===0)return t}function Pi({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function eu(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;or&&Ts(r)):[n&&Ts(n)]).forEach(r=>{r!==void 0&&(t+=(t.length?"&":"")+s,r!=null&&(t+="="+r))})}return t}function tu(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=Qe(n)?n.map(o=>o==null?null:""+o):n==null?n:""+n)}return t}const nu=Symbol(""),Zo=Symbol(""),ss=Symbol(""),Ri=Symbol(""),Ms=Symbol("");function $t(){let e=[];function t(n){return e.push(n),()=>{const o=e.indexOf(n);o>-1&&e.splice(o,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function wt(e,t,s,n,o,r=i=>i()){const i=n&&(n.enterCallbacks[o]=n.enterCallbacks[o]||[]);return()=>new Promise((a,u)=>{const p=g=>{g===!1?u(zt(4,{from:s,to:t})):g instanceof Error?u(g):Nc(g)?u(zt(2,{from:t,to:g})):(i&&n.enterCallbacks[o]===i&&typeof g=="function"&&i.push(g),a())},l=r(()=>e.call(n&&n.instances[o],t,s,p));let h=Promise.resolve(l);e.length<3&&(h=h.then(p)),h.catch(g=>u(g))})}function vs(e,t,s,n,o=r=>r()){const r=[];for(const i of e)for(const a in i.components){let u=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(gi(u)){const l=(u.__vccOpts||u)[t];l&&r.push(wt(l,s,n,i,a,o))}else{let p=u();r.push(()=>p.then(l=>{if(!l)throw new Error(`Couldn't resolve component "${a}" at "${i.path}"`);const h=cc(l)?l.default:l;i.mods[a]=l,i.components[a]=h;const v=(h.__vccOpts||h)[t];return v&&wt(v,s,n,i,a,o)()}))}}return r}function Xo(e){const t=Ye(ss),s=Ye(Ri),n=xe(()=>{const u=qt(e.to);return t.resolve(u)}),o=xe(()=>{const{matched:u}=n.value,{length:p}=u,l=u[p-1],h=s.matched;if(!l||!h.length)return-1;const g=h.findIndex(Gt.bind(null,l));if(g>-1)return g;const v=$o(u[p-2]);return p>1&&$o(l)===v&&h[h.length-1].path!==v?h.findIndex(Gt.bind(null,u[p-2])):g}),r=xe(()=>o.value>-1&&lu(s.params,n.value.params)),i=xe(()=>o.value>-1&&o.value===s.matched.length-1&&Si(s.params,n.value.params));function a(u={}){if(iu(u)){const p=t[qt(e.replace)?"replace":"push"](qt(e.to)).catch(fn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>p),p}return Promise.resolve()}return{route:n,href:xe(()=>n.value.href),isActive:r,isExactActive:i,navigate:a}}function su(e){return e.length===1?e[0]:e}const ou=Vr({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Xo,setup(e,{slots:t}){const s=kn(Xo(e)),{options:n}=Ye(ss),o=xe(()=>({[er(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[er(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const r=t.default&&su(t.default(s));return e.custom?r:ci("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},r)}}}),ru=ou;function iu(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function lu(e,t){for(const s in t){const n=t[s],o=e[s];if(typeof n=="string"){if(n!==o)return!1}else if(!Qe(o)||o.length!==n.length||n.some((r,i)=>r!==o[i]))return!1}return!0}function $o(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const er=(e,t,s)=>e??t??s,au=Vr({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=Ye(Ms),o=xe(()=>e.route||n.value),r=Ye(Zo,0),i=xe(()=>{let p=qt(r);const{matched:l}=o.value;let h;for(;(h=l[p])&&!h.components;)p++;return p}),a=xe(()=>o.value.matched[i.value]);Tn(Zo,xe(()=>i.value+1)),Tn(nu,a),Tn(Ms,o);const u=Z();return an(()=>[u.value,a.value,e.name],([p,l,h],[g,v,P])=>{l&&(l.instances[h]=p,v&&v!==l&&p&&p===g&&(l.leaveGuards.size||(l.leaveGuards=v.leaveGuards),l.updateGuards.size||(l.updateGuards=v.updateGuards))),p&&l&&(!v||!Gt(l,v)||!g)&&(l.enterCallbacks[h]||[]).forEach(O=>O(p))},{flush:"post"}),()=>{const p=o.value,l=e.name,h=a.value,g=h&&h.components[l];if(!g)return tr(s.default,{Component:g,route:p});const v=h.props[l],P=v?v===!0?p.params:typeof v=="function"?v(p):v:null,G=ci(g,ie({},P,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(h.instances[l]=null)},ref:u}));return tr(s.default,{Component:G,route:p})||G}}});function tr(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const cu=au;function uu(e){const t=Yc(e.routes,e),s=e.parseQuery||eu,n=e.stringifyQuery||Qo,o=e.history,r=$t(),i=$t(),a=$t(),u=al(vt);let p=vt;Lt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const l=ms.bind(null,y=>""+y),h=ms.bind(null,Sc),g=ms.bind(null,bn);function v(y,D){let A,B;return Ci(y)?(A=t.getRecordMatcher(y),B=D):B=y,t.addRoute(B,A)}function P(y){const D=t.getRecordMatcher(y);D&&t.removeRoute(D)}function O(){return t.getRoutes().map(y=>y.record)}function G(y){return!!t.getRecordMatcher(y)}function R(y,D){if(D=ie({},D||u.value),typeof y=="string"){const m=gs(s,y,D.path),w=t.resolve({path:m.path},D),S=o.createHref(m.fullPath);return ie(m,w,{params:g(w.params),hash:bn(m.hash),redirectedFrom:void 0,href:S})}let A;if(y.path!=null)A=ie({},y,{path:gs(s,y.path,D.path).path});else{const m=ie({},y.params);for(const w in m)m[w]==null&&delete m[w];A=ie({},y,{params:h(m)}),D.params=h(D.params)}const B=t.resolve(A,D),ce=y.hash||"";B.params=l(g(B.params));const f=xc(n,ie({},y,{hash:bc(ce),path:B.path})),d=o.createHref(f);return ie({fullPath:f,hash:ce,query:n===Qo?tu(y.query):y.query||{}},B,{redirectedFrom:void 0,href:d})}function I(y){return typeof y=="string"?gs(s,y,u.value.path):ie({},y)}function V(y,D){if(p!==y)return zt(8,{from:D,to:y})}function j(y){return z(y)}function x(y){return j(ie(I(y),{replace:!0}))}function ne(y){const D=y.matched[y.matched.length-1];if(D&&D.redirect){const{redirect:A}=D;let B=typeof A=="function"?A(y):A;return typeof B=="string"&&(B=B.includes("?")||B.includes("#")?B=I(B):{path:B},B.params={}),ie({query:y.query,hash:y.hash,params:B.path!=null?{}:y.params},B)}}function z(y,D){const A=p=R(y),B=u.value,ce=y.state,f=y.force,d=y.replace===!0,m=ne(A);if(m)return z(ie(I(m),{state:typeof m=="object"?ie({},ce,m.state):ce,force:f,replace:d}),D||A);const w=A;w.redirectedFrom=D;let S;return!f&&Ec(n,B,A)&&(S=zt(16,{to:w,from:B}),qe(B,B,!0,!1)),(S?Promise.resolve(S):oe(w,B)).catch(b=>it(b)?it(b,2)?b:He(b):te(b,w,B)).then(b=>{if(b){if(it(b,2))return z(ie({replace:d},I(b.to),{state:typeof b.to=="object"?ie({},ce,b.to.state):ce,force:f}),D||w)}else b=ae(w,B,!0,d,ce);return me(w,B,b),b})}function Q(y,D){const A=V(y,D);return A?Promise.reject(A):Promise.resolve()}function Y(y){const D=gt.values().next().value;return D&&typeof D.runWithContext=="function"?D.runWithContext(y):y()}function oe(y,D){let A;const[B,ce,f]=fu(y,D);A=vs(B.reverse(),"beforeRouteLeave",y,D);for(const m of B)m.leaveGuards.forEach(w=>{A.push(wt(w,y,D))});const d=Q.bind(null,y,D);return A.push(d),Ie(A).then(()=>{A=[];for(const m of r.list())A.push(wt(m,y,D));return A.push(d),Ie(A)}).then(()=>{A=vs(ce,"beforeRouteUpdate",y,D);for(const m of ce)m.updateGuards.forEach(w=>{A.push(wt(w,y,D))});return A.push(d),Ie(A)}).then(()=>{A=[];for(const m of f)if(m.beforeEnter)if(Qe(m.beforeEnter))for(const w of m.beforeEnter)A.push(wt(w,y,D));else A.push(wt(m.beforeEnter,y,D));return A.push(d),Ie(A)}).then(()=>(y.matched.forEach(m=>m.enterCallbacks={}),A=vs(f,"beforeRouteEnter",y,D,Y),A.push(d),Ie(A))).then(()=>{A=[];for(const m of i.list())A.push(wt(m,y,D));return A.push(d),Ie(A)}).catch(m=>it(m,8)?m:Promise.reject(m))}function me(y,D,A){a.list().forEach(B=>Y(()=>B(y,D,A)))}function ae(y,D,A,B,ce){const f=V(y,D);if(f)return f;const d=D===vt,m=Lt?history.state:{};A&&(B||d?o.replace(y.fullPath,ie({scroll:d&&m&&m.scroll},ce)):o.push(y.fullPath,ce)),u.value=y,qe(y,D,A,d),He()}let ge;function We(){ge||(ge=o.listen((y,D,A)=>{if(!Rt.listening)return;const B=R(y),ce=ne(B);if(ce){z(ie(ce,{replace:!0,force:!0}),B).catch(fn);return}p=B;const f=u.value;Lt&&Dc(Ho(f.fullPath,A.delta),ns()),oe(B,f).catch(d=>it(d,12)?d:it(d,2)?(z(ie(I(d.to),{force:!0}),B).then(m=>{it(m,20)&&!A.delta&&A.type===yn.pop&&o.go(-1,!1)}).catch(fn),Promise.reject()):(A.delta&&o.go(-A.delta,!1),te(d,B,f))).then(d=>{d=d||ae(B,f,!1),d&&(A.delta&&!it(d,8)?o.go(-A.delta,!1):A.type===yn.pop&&it(d,20)&&o.go(-1,!1)),me(B,f,d)}).catch(fn)}))}let Ge=$t(),de=$t(),K;function te(y,D,A){He(y);const B=de.list();return B.length?B.forEach(ce=>ce(y,D,A)):console.error(y),Promise.reject(y)}function ze(){return K&&u.value!==vt?Promise.resolve():new Promise((y,D)=>{Ge.add([y,D])})}function He(y){return K||(K=!y,We(),Ge.list().forEach(([D,A])=>y?A(y):D()),Ge.reset()),y}function qe(y,D,A,B){const{scrollBehavior:ce}=e;if(!Lt||!ce)return Promise.resolve();const f=!A&&jc(Ho(y.fullPath,0))||(B||!A)&&history.state&&history.state.scroll||null;return Qn().then(()=>ce(y,D,f)).then(d=>d&&Ic(d)).catch(d=>te(d,y,D))}const Ee=y=>o.go(y);let mt;const gt=new Set,Rt={currentRoute:u,listening:!0,addRoute:v,removeRoute:P,clearRoutes:t.clearRoutes,hasRoute:G,getRoutes:O,resolve:R,options:e,push:j,replace:x,go:Ee,back:()=>Ee(-1),forward:()=>Ee(1),beforeEach:r.add,beforeResolve:i.add,afterEach:a.add,onError:de.add,isReady:ze,install(y){const D=this;y.component("RouterLink",ru),y.component("RouterView",cu),y.config.globalProperties.$router=D,Object.defineProperty(y.config.globalProperties,"$route",{enumerable:!0,get:()=>qt(u)}),Lt&&!mt&&u.value===vt&&(mt=!0,j(o.location).catch(ce=>{}));const A={};for(const ce in vt)Object.defineProperty(A,ce,{get:()=>u.value[ce],enumerable:!0});y.provide(ss,D),y.provide(Ri,Pr(A)),y.provide(Ms,u);const B=y.unmount;gt.add(y),y.unmount=function(){gt.delete(y),gt.size<1&&(p=vt,ge&&ge(),ge=null,u.value=vt,mt=!1,K=!1),B()}}};function Ie(y){return y.reduce((D,A)=>D.then(()=>Y(A)),Promise.resolve())}return Rt}function fu(e,t){const s=[],n=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;iGt(p,a))?n.push(a):s.push(a));const u=e.matched[i];u&&(t.matched.find(p=>Gt(p,u))||o.push(u))}return[s,n,o]}function Ai(){return Ye(ss)}const os=ac("auth",()=>{const e=Z(null),t=Z(null),s=Z(!1),n=(a,u)=>{e.value=a,t.value=u,s.value=!0,localStorage.setItem("auth_token",u),localStorage.setItem("user",JSON.stringify(a))},o=()=>{e.value=null,t.value=null,s.value=!1,localStorage.removeItem("auth_token"),localStorage.removeItem("user")};return{user:e,token:t,isAuthenticated:s,login:n,logout:o,checkAuth:()=>{const a=localStorage.getItem("auth_token"),u=localStorage.getItem("user");a&&u?(t.value=a,e.value=JSON.parse(u),s.value=!0):o()},getAuthHeaders:()=>t.value?{"Content-Type":"application/json",Authorization:`Bearer ${t.value}`}:{}}}),Qt=(e,t)=>{const s=e.__vccOpts||e;for(const[n,o]of t)s[n]=o;return s},du={name:"Home",setup(){const e=Z({}),t=async()=>{try{const s=await fetch("/api/public/page-content");s.ok&&(e.value=await s.json())}catch(s){console.error("Failed to fetch page content:",s)}};return Yt(()=>{t()}),{content:e}}},hu={class:"home"},pu={class:"hero"},mu={class:"features"},gu={class:"feature-card"},vu={class:"feature-card"},_u={class:"feature-card"},bu={class:"feature-card"},yu={class:"cta"},wu={class:"cta-buttons"};function Su(e,t,s,n,o,r){const i=Nn("router-link");return q(),W("div",hu,[c("div",pu,[c("h1",null,F(n.content.home_hero_title||"Welkom bij Fiets Service Centrum"),1),c("p",null,F(n.content.home_hero_subtitle||"Professionele fietsreparatie en onderhoudsdiensten"),1)]),c("div",mu,[c("div",gu,[c("h3",null,F(n.content.home_feature_1_title||"🔧 Deskundige Reparaties"),1),c("p",null,F(n.content.home_feature_1_text||"Professionele fietsmonteurs met jarenlange ervaring"),1)]),c("div",vu,[c("h3",null,F(n.content.home_feature_2_title||"⚡ Snelle Service"),1),c("p",null,F(n.content.home_feature_2_text||"Snelle doorlooptijden voor de meeste reparaties"),1)]),c("div",_u,[c("h3",null,F(n.content.home_feature_3_title||"💰 Eerlijke Prijzen"),1),c("p",null,F(n.content.home_feature_3_text||"Concurrerende tarieven zonder verborgen kosten"),1)]),c("div",bu,[c("h3",null,F(n.content.home_feature_4_title||"📅 Eenvoudig Boeken"),1),c("p",null,F(n.content.home_feature_4_text||"Eenvoudig online boekingssysteem"),1)])]),c("div",yu,[c("h2",null,F(n.content.home_cta_title||"Klaar om je fiets te laten repareren?"),1),c("p",null,F(n.content.home_cta_subtitle||"Boek je afspraak online en krijg je fiets weer in topconditie."),1),c("div",wu,[be(i,{to:"/booking",class:"cta-button"},{default:tt(()=>[Se(F(n.content.home_cta_button_1_text||"Nu Service Boeken"),1)]),_:1}),be(i,{to:"/pricelist",class:"cta-button secondary"},{default:tt(()=>[Se(F(n.content.home_cta_button_2_text||"💰 Prijslijst Bekijken"),1)]),_:1})])])])}const ku=Qt(du,[["render",Su],["__scopeId","data-v-677cbdbe"]]),Cu={name:"Booking",setup(){const e=Z({name:"",address:"",place:"",email:"",phone:"",repair_description:"",requested_date:"",requested_time:""}),t=Z(!1),s=Z(""),n=Z(!1),o=Z(null),r=Z({}),i=Z(new Date),a=Z([]),u=["Zo","Ma","Di","Wo","Do","Vr","Za"],p=xe(()=>{const x=new Date;return x.setDate(x.getDate()+1),x.toISOString().split("T")[0]}),l=xe(()=>i.value.toLocaleDateString("nl-NL",{month:"long",year:"numeric"})),h=xe(()=>{const x=i.value.getFullYear(),ne=i.value.getMonth(),z=new Date(x,ne,1),Q=new Date(x,ne+1,0),Y=z.getDay(),oe=Q.getDay(),me=[];for(let ae=Y-1;ae>=0;ae--){const ge=new Date(x,ne,-ae);me.push(g(ge,!1))}for(let ae=1;ae<=Q.getDate();ae++){const ge=new Date(x,ne,ae);me.push(g(ge,!0))}for(let ae=1;ae<=6-oe;ae++){const ge=new Date(x,ne+1,ae);me.push(g(ge,!1))}return me}),g=(x,ne)=>{const z=x.toISOString().split("T")[0],Q=new Date,Y=new Date;Y.setDate(Y.getDate()+1);const oe=z===Q.toISOString().split("T")[0],me=znew Date(We.date).toISOString().split("T")[0]===z),ge=z===e.value.requested_date;return{date:z,day:x.getDate(),key:z,isCurrentMonth:ne,isToday:oe,isDisabled:me,isBlocked:ae,isSelected:ge}},v=async()=>{try{const x=await fetch("/api/public/blocked-dates");x.ok&&(a.value=await x.json())}catch(x){console.error("Failed to fetch blocked dates:",x)}},P=async()=>{try{const x=await fetch("/api/public/page-content");x.ok&&(r.value=await x.json())}catch(x){console.error("Failed to fetch page content:",x)}},O=()=>{i.value=new Date(i.value.getFullYear(),i.value.getMonth()-1,1)},G=()=>{i.value=new Date(i.value.getFullYear(),i.value.getMonth()+1,1)},R=x=>{x.isDisabled||x.isBlocked||(e.value.requested_date=x.date)},I=()=>!e.value.email&&!e.value.phone?(s.value="Geef alstublieft een e-mailadres of telefoonnummer op",!1):(s.value="",!0),V=async()=>{if(I()){t.value=!0,s.value="";try{const x=await fetch("/api/public/service-requests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e.value)});if(!x.ok){const z=await x.json();throw new Error(z.message||"Aanvraag versturen mislukt")}const ne=await x.json();o.value=ne,n.value=!0,Object.keys(e.value).forEach(z=>{e.value[z]=""})}catch(x){s.value=x.message}finally{t.value=!1}}},j=()=>{n.value=!1,o.value=null};return Yt(()=>{const x=new Date;x.setDate(x.getDate()+1),e.value.requested_date=x.toISOString().split("T")[0],v(),P()}),{form:e,loading:t,formError:s,showSuccessModal:n,submittedRequest:o,content:r,minDate:p,submitForm:V,closeSuccessModal:j,currentDate:i,blockedDates:a,weekdays:u,calendarDates:h,currentMonthYear:l,previousMonth:O,nextMonth:G,selectDate:R}}},xu={class:"booking"},Eu={class:"booking-header"},Pu={class:"booking-form-container"},Ru={class:"form-row"},Au={class:"form-group"},Tu={class:"form-row"},Ou={class:"form-group"},Mu={class:"form-row"},Iu={class:"form-group"},Du={class:"form-row"},ju={class:"form-group"},Vu={class:"form-group"},Fu={class:"form-row"},Bu={class:"form-group full-width"},Lu={class:"form-row"},Nu={class:"form-group"},Hu={class:"custom-date-picker"},qu={class:"date-picker-header"},Uu={class:"current-month"},Ku={class:"date-picker-grid"},Wu=["onClick"],Gu={class:"form-group"},zu={key:0,class:"form-error"},Ju={class:"form-actions"},Yu=["disabled"],Qu={class:"modal-body"},Zu={class:"modal-footer"};function Xu(e,t,s,n,o,r){return q(),W("div",xu,[c("div",Eu,[c("h1",null,F(n.content.booking_header_title||"🚲 Boek Je Fiets Service"),1),c("p",null,F(n.content.booking_header_subtitle||"Vul het onderstaande formulier in om je fietsreparatie of onderhoud in te plannen"),1)]),c("div",Pu,[c("form",{onSubmit:t[10]||(t[10]=at((...i)=>n.submitForm&&n.submitForm(...i),["prevent"])),class:"booking-form"},[c("div",Ru,[c("div",Au,[t[14]||(t[14]=c("label",{for:"name"},"Volledige Naam *",-1)),ve(c("input",{type:"text",id:"name","onUpdate:modelValue":t[0]||(t[0]=i=>n.form.name=i),required:"",placeholder:"Voer je volledige naam in"},null,512),[[_e,n.form.name]])])]),c("div",Tu,[c("div",Ou,[t[15]||(t[15]=c("label",{for:"address"},"Adres *",-1)),ve(c("textarea",{id:"address","onUpdate:modelValue":t[1]||(t[1]=i=>n.form.address=i),required:"",placeholder:"Voer je volledige adres in",rows:"3"},null,512),[[_e,n.form.address]])])]),c("div",Mu,[c("div",Iu,[t[16]||(t[16]=c("label",{for:"place"},"Plaats *",-1)),ve(c("input",{type:"text",id:"place","onUpdate:modelValue":t[2]||(t[2]=i=>n.form.place=i),required:"",placeholder:"Voer je plaats in"},null,512),[[_e,n.form.place]])])]),c("div",Du,[c("div",ju,[t[17]||(t[17]=c("label",{for:"email"},"E-mail",-1)),ve(c("input",{type:"email",id:"email","onUpdate:modelValue":t[3]||(t[3]=i=>n.form.email=i),placeholder:"Voer je e-mailadres in"},null,512),[[_e,n.form.email]])]),c("div",Vu,[t[18]||(t[18]=c("label",{for:"phone"},"Telefoon",-1)),ve(c("input",{type:"tel",id:"phone","onUpdate:modelValue":t[4]||(t[4]=i=>n.form.phone=i),placeholder:"Voer je telefoonnummer in"},null,512),[[_e,n.form.phone]])])]),c("div",Fu,[c("div",Bu,[t[19]||(t[19]=c("label",{for:"repair_description"},"Wat moet er gerepareerd worden? *",-1)),ve(c("textarea",{id:"repair_description","onUpdate:modelValue":t[5]||(t[5]=i=>n.form.repair_description=i),required:"",placeholder:"Beschrijf het probleem met je fiets of welke service je nodig hebt",rows:"4"},null,512),[[_e,n.form.repair_description]])])]),c("div",Lu,[c("div",Nu,[t[20]||(t[20]=c("label",{for:"requested_date"},"Gewenste Datum *",-1)),c("div",Hu,[c("div",qu,[c("button",{type:"button",onClick:t[6]||(t[6]=(...i)=>n.previousMonth&&n.previousMonth(...i)),class:"nav-btn"},"‹"),c("span",Uu,F(n.currentMonthYear),1),c("button",{type:"button",onClick:t[7]||(t[7]=(...i)=>n.nextMonth&&n.nextMonth(...i)),class:"nav-btn"},"›")]),c("div",Ku,[(q(!0),W(Ce,null,St(n.weekdays,i=>(q(),W("div",{class:"weekday-header",key:i},F(i),1))),128)),(q(!0),W(Ce,null,St(n.calendarDates,i=>(q(),W("div",{key:i.key,class:Mt(["calendar-date",{"other-month":!i.isCurrentMonth,disabled:i.isDisabled,blocked:i.isBlocked,selected:i.isSelected,today:i.isToday}]),onClick:a=>n.selectDate(i)},F(i.day),11,Wu))),128))]),ve(c("input",{type:"hidden",id:"requested_date","onUpdate:modelValue":t[8]||(t[8]=i=>n.form.requested_date=i),required:""},null,512),[[_e,n.form.requested_date]])])]),c("div",Gu,[t[21]||(t[21]=c("label",{for:"requested_time"},"Gewenste Tijd *",-1)),ve(c("input",{type:"time",id:"requested_time","onUpdate:modelValue":t[9]||(t[9]=i=>n.form.requested_time=i),required:"",min:"08:00",max:"18:00"},null,512),[[_e,n.form.requested_time]])])]),n.formError?(q(),W("div",zu,F(n.formError),1)):Re("",!0),c("div",Ju,[c("button",{type:"submit",class:"submit-btn",disabled:n.loading},F(n.loading?"Versturen...":"Service Aanvraag Versturen"),9,Yu)])],32)]),n.showSuccessModal?(q(),W("div",{key:0,class:"modal-overlay",onClick:t[13]||(t[13]=(...i)=>n.closeSuccessModal&&n.closeSuccessModal(...i))},[c("div",{class:"modal-content",onClick:t[12]||(t[12]=at(()=>{},["stop"]))},[t[24]||(t[24]=c("div",{class:"modal-header"},[c("h3",null,"✅ Service Aanvraag Verzonden!")],-1)),c("div",Qu,[t[23]||(t[23]=c("p",null,"Bedankt voor je service aanvraag. We nemen binnenkort contact met je op om je afspraak te bevestigen.",-1)),c("p",null,[t[22]||(t[22]=c("strong",null,"Aanvraag ID:",-1)),Se(" "+F(n.submittedRequest.id),1)])]),c("div",Zu,[c("button",{onClick:t[11]||(t[11]=(...i)=>n.closeSuccessModal&&n.closeSuccessModal(...i)),class:"btn-primary"},"Sluiten")])])])):Re("",!0)])}const $u=Qt(Cu,[["render",Xu],["__scopeId","data-v-3d2c946f"]]),ef={name:"Admin",setup(){const e=Ai(),t=os(),s=Z("requests"),n=Z(!1),o=Z([]),r=Z([]),i=Z({}),a=Z([]),u=Z([]),p=Z(!1),l=Z(!1),h=Z(!1),g=Z(!1),v=Z(!1),P=Z(!1),O=Z(!1),G=Z(!1),R=Z(null),I=Z(null),V=Z(null),j=Z({date:"",reason:""}),x=Z({title:"",description:"",price:"",sort_order:0,is_active:!0}),ne=Z({message:""}),z=Z({message:""}),Q=Z([]),Y=Z(!1),oe=Z(!1),me=[{id:"requests",label:"Service Aanvragen"},{id:"blocked",label:"Geblokkeerde Data"},{id:"pricelist",label:"Prijslijst"},{id:"content",label:"Pagina Teksten"},{id:"settings",label:"Instellingen"}],ae=xe(()=>{const _=new Date;return _.setDate(_.getDate()+1),_.toISOString().split("T")[0]}),ge=_=>({pending:"In afwachting",confirmed:"Bevestigd",completed:"Voltooid",cancelled:"Geannuleerd"})[_]||_,We=_=>({email:"E-MAIL",sms:"SMS"})[_]||_.toUpperCase(),Ge=_=>({admin_to_customer:"Naar Klant",customer_to_admin:"Van Klant"})[_]||_,de=async()=>{try{await fetch("/api/logout",{method:"POST",headers:t.getAuthHeaders()})}catch(_){console.error("Logout error:",_)}finally{t.logout(),e.push("/login")}},K=async()=>{try{const _=await fetch("/api/service-requests",{headers:t.getAuthHeaders()});_.ok&&(o.value=await _.json())}catch(_){console.error("Failed to fetch requests:",_)}},te=async()=>{try{const _=await fetch("/api/blocked-dates",{headers:t.getAuthHeaders()});_.ok&&(r.value=await _.json())}catch(_){console.error("Failed to fetch blocked dates:",_)}},ze=async()=>{try{const _=await fetch("/api/settings",{headers:t.getAuthHeaders()});_.ok&&(await _.json()).forEach(X=>{i.value[X.key]=X.value})}catch(_){console.error("Failed to fetch settings:",_)}},He=async()=>{try{const _=await fetch("/api/admin/pricelist",{headers:t.getAuthHeaders()});_.ok&&(a.value=await _.json())}catch(_){console.error("Failed to fetch pricelist:",_)}},qe=async()=>{try{const _=await fetch("/api/page-content",{headers:t.getAuthHeaders()});_.ok&&(u.value=await _.json())}catch(_){console.error("Failed to fetch page content:",_)}},Ee=async()=>{n.value=!0,await K(),n.value=!1},mt=async _=>{O.value=!0,p.value=!0;try{const L=await fetch(`/api/service-requests/${_.id}`,{headers:t.getAuthHeaders()});if(L.ok){const X=await L.json();R.value={...X}}else{const X=o.value.find(Ve=>Ve.id===_.id);R.value=X?{...X}:{..._}}}catch(L){console.error("Failed to fetch latest request data:",L);const X=o.value.find(Ve=>Ve.id===_.id);R.value=X?{...X}:{..._}}finally{O.value=!1}},gt=()=>{p.value=!1,R.value=null},Rt=()=>{l.value=!1,I.value=null,j.value={date:"",reason:""}},Ie=()=>{h.value=!1,ne.value.message=""},y=()=>{g.value=!1,z.value.message=""},D=()=>{v.value=!1,Q.value=[]},A=()=>{P.value=!1,V.value=null,x.value={title:"",description:"",price:"",sort_order:0,is_active:!0}},B=_=>{R.value=_,h.value=!0},ce=_=>{R.value=_,g.value=!0},f=async _=>{R.value=_;try{const L=await fetch(`/api/service-requests/${_.id}/communications`,{headers:t.getAuthHeaders()});L.ok&&(Q.value=await L.json())}catch(L){console.error("Failed to fetch communications:",L)}v.value=!0},d=async()=>{if(ne.value.message.trim()){Y.value=!0;try{(await fetch(`/api/service-requests/${R.value.id}/send-email`,{method:"POST",headers:t.getAuthHeaders(),body:JSON.stringify({message:ne.value.message})})).ok&&(Ie(),await K())}catch(_){console.error("Failed to send email:",_)}finally{Y.value=!1}}},m=async()=>{if(z.value.message.trim()){oe.value=!0;try{(await fetch(`/api/service-requests/${R.value.id}/send-sms`,{method:"POST",headers:t.getAuthHeaders(),body:JSON.stringify({message:z.value.message})})).ok&&(y(),await K())}catch(_){console.error("Failed to send SMS:",_)}finally{oe.value=!1}}},w=_=>{I.value=_,j.value={date:_.date,reason:_.reason||""},l.value=!0},S=async()=>{try{const _=I.value?`/api/blocked-dates/${I.value.id}`:"/api/blocked-dates",L=I.value?"PUT":"POST";(await fetch(_,{method:L,headers:t.getAuthHeaders(),body:JSON.stringify(j.value)})).ok&&(Rt(),await te())}catch(_){console.error("Failed to save blocked date:",_)}},b=async _=>{if(confirm("Weet je zeker dat je deze geblokkeerde datum wilt verwijderen?"))try{(await fetch(`/api/blocked-dates/${_}`,{method:"DELETE",headers:t.getAuthHeaders()})).ok&&await te()}catch(L){console.error("Failed to delete blocked date:",L)}},T=async(_,L)=>{try{(await fetch(`/api/settings/key/${_}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({value:L,description:""})})).ok&&console.log(`Setting ${_} updated successfully`)}catch(X){console.error("Failed to update setting:",X)}},E=async()=>{try{if((await fetch(`/api/service-requests/${R.value.id}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({status:R.value.status})})).ok){const L=o.value.findIndex(X=>X.id===R.value.id);L!==-1&&(o.value[L].status=R.value.status),await K()}}catch(_){console.error("Failed to update request status:",_)}},C=async()=>{try{if((await fetch(`/api/service-requests/${R.value.id}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({actual_repair_date:R.value.actual_repair_date})})).ok){const L=o.value.findIndex(X=>X.id===R.value.id);L!==-1&&(o.value[L].actual_repair_date=R.value.actual_repair_date),await K()}}catch(_){console.error("Failed to update request date:",_)}},k=async()=>{try{if((await fetch(`/api/service-requests/${R.value.id}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({actual_repair_date:R.value.actual_repair_date,actual_repair_time:R.value.actual_repair_time})})).ok){const L=o.value.findIndex(X=>X.id===R.value.id);L!==-1&&(o.value[L].actual_repair_date=R.value.actual_repair_date,o.value[L].actual_repair_time=R.value.actual_repair_time),await K()}}catch(_){console.error("Failed to update request time:",_)}},H=_=>{V.value=_,x.value={..._},P.value=!0},M=async()=>{try{const _=V.value?`/api/pricelist/${V.value.id}`:"/api/pricelist",L=V.value?"PUT":"POST";(await fetch(_,{method:L,headers:t.getAuthHeaders(),body:JSON.stringify(x.value)})).ok&&(A(),await He())}catch(_){console.error("Failed to save pricelist item:",_)}},N=async _=>{if(confirm("Weet je zeker dat je dit prijslijst item wilt verwijderen?"))try{(await fetch(`/api/pricelist/${_}`,{method:"DELETE",headers:t.getAuthHeaders()})).ok&&await He()}catch(L){console.error("Failed to delete pricelist item:",L)}},J=_=>{const L=u.value.find(X=>X.key===_);return L?L.value:""},ee=(_,L)=>{const X=u.value.find(Ve=>Ve.key===_);X&&(X.value=L)},ue=async _=>{const L=u.value.find(X=>X.key===_);if(L)try{(await fetch(`/api/page-content/key/${_}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({value:L.value,description:L.description})})).ok&&console.log(`Content ${_} updated successfully`)}catch(X){console.error("Failed to update page content:",X)}},re=(_,L)=>{if(!_)return"N/A";const Ve=new Date(_).toLocaleDateString("nl-NL");return L?`${Ve} ${L}`:Ve},Pe=_=>new Date(_).toISOString().split("T")[0];return Yt(()=>{t.checkAuth(),K(),te(),He(),qe(),ze()}),{activeTab:s,tabs:me,loading:n,requests:o,blockedDates:r,settings:i,pricelist:a,pageContent:u,user:xe(()=>t.user),showRequestModal:p,showAddBlockedDate:l,showEmailModal:h,showSmsModal:g,showCommunicationsModal:v,showAddPricelistItem:P,requestModalLoading:O,pricelistLoading:G,selectedRequest:R,editingBlockedDate:I,editingPricelistItem:V,blockedDateForm:j,pricelistForm:x,emailForm:ne,smsForm:z,communications:Q,emailLoading:Y,smsLoading:oe,minDate:ae,getStatusText:ge,getCommTypeText:We,getCommDirectionText:Ge,handleLogout:de,refreshRequests:Ee,viewRequest:mt,closeRequestModal:gt,closeBlockedDateModal:Rt,closePricelistModal:A,closeEmailModal:Ie,closeSmsModal:y,closeCommunicationsModal:D,sendEmail:B,sendSms:ce,viewCommunications:f,submitEmail:d,submitSms:m,editBlockedDate:w,saveBlockedDate:S,deleteBlockedDate:b,editPricelistItem:H,savePricelistItem:M,deletePricelistItem:N,updateSetting:T,updateRequestStatus:E,updateRequestDate:C,updateRequestTime:k,getContentValue:J,updateContentValue:ee,savePageContent:ue,formatDateTime:re,formatDate:Pe}}},tf={class:"admin"},nf={class:"admin-header"},sf={class:"admin-user-info"},of={class:"admin-tabs"},rf=["onClick"],lf={key:0,class:"tab-content"},af={class:"section-header"},cf=["disabled","title"],uf={class:"requests-table"},ff={key:0,class:"loading-row"},df={key:1,class:"empty-row"},hf={class:"cell"},pf={class:"cell"},mf={class:"cell"},gf={class:"cell"},vf={class:"cell actions"},_f=["onClick"],bf=["onClick","disabled"],yf=["onClick","disabled"],wf=["onClick"],Sf={key:1,class:"tab-content"},kf={class:"section-header"},Cf={class:"blocked-dates-list"},xf={class:"date-info"},Ef={class:"date"},Pf={key:0,class:"reason"},Rf={class:"date-actions"},Af=["onClick"],Tf=["onClick"],Of={key:2,class:"tab-content"},Mf={class:"section-header"},If={class:"pricelist-table"},Df={key:0,class:"loading-row"},jf={key:1,class:"empty-row"},Vf={class:"cell"},Ff={class:"cell"},Bf={class:"cell"},Lf={class:"cell"},Nf={class:"cell"},Hf={class:"cell actions"},qf=["onClick"],Uf=["onClick"],Kf={key:3,class:"tab-content"},Wf={class:"content-sections"},Gf={class:"content-section"},zf={class:"content-form"},Jf={class:"form-group"},Yf=["value"],Qf={class:"form-group"},Zf=["value"],Xf={class:"content-section"},$f={class:"content-form"},ed={class:"feature-group"},td={class:"form-group"},nd=["value"],sd={class:"form-group"},od=["value"],rd={class:"feature-group"},id={class:"form-group"},ld=["value"],ad={class:"form-group"},cd=["value"],ud={class:"feature-group"},fd={class:"form-group"},dd=["value"],hd={class:"form-group"},pd=["value"],md={class:"feature-group"},gd={class:"form-group"},vd=["value"],_d={class:"form-group"},bd=["value"],yd={class:"content-section"},wd={class:"content-form"},Sd={class:"form-group"},kd=["value"],Cd={class:"form-group"},xd=["value"],Ed={class:"form-group"},Pd=["value"],Rd={class:"form-group"},Ad=["value"],Td={class:"content-section"},Od={class:"content-form"},Md={class:"form-group"},Id=["value"],Dd={class:"form-group"},jd=["value"],Vd={key:4,class:"tab-content"},Fd={class:"settings-form"},Bd={class:"setting-group"},Ld={class:"setting-group"},Nd={class:"modal-header"},Hd={key:0,class:"modal-body"},qd={key:0,class:"loading-state"},Ud={key:1,class:"request-details"},Kd={class:"detail-row"},Wd={class:"detail-row"},Gd={class:"detail-row"},zd={class:"detail-row"},Jd={class:"detail-row"},Yd={class:"detail-row"},Qd={class:"detail-row"},Zd={class:"detail-row"},Xd={class:"detail-row"},$d={class:"detail-row"},eh={class:"modal-footer"},th={class:"modal-header"},nh={class:"modal-body"},sh={class:"form-group"},oh=["min"],rh={class:"form-group"},ih={class:"modal-footer"},lh={class:"modal-header"},ah={class:"modal-body"},ch={class:"form-group"},uh={class:"modal-footer"},fh=["disabled"],dh={class:"modal-header"},hh={class:"modal-body"},ph={class:"form-group"},mh={class:"modal-footer"},gh=["disabled"],vh={class:"modal-header"},_h={class:"modal-body"},bh={key:0,class:"no-communications"},yh={key:1,class:"communications-list"},wh={class:"comm-header"},Sh={class:"comm-type"},kh={class:"comm-direction"},Ch={class:"comm-date"},xh={class:"comm-message"},Eh={class:"modal-footer"},Ph={class:"modal-header"},Rh={class:"modal-body"},Ah={class:"form-group"},Th={class:"form-group"},Oh={class:"form-group"},Mh={class:"form-group"},Ih={class:"form-group"},Dh={class:"modal-footer"};function jh(e,t,s,n,o,r){var i,a,u,p;return q(),W("div",tf,[c("div",nf,[t[83]||(t[83]=c("h1",null,"🔧 Beheer Dashboard",-1)),t[84]||(t[84]=c("p",null,"Beheer fiets service aanvragen, geblokkeerde data en instellingen",-1)),c("div",sf,[c("span",null,"Ingelogd als: "+F((i=n.user)==null?void 0:i.name),1),c("button",{onClick:t[0]||(t[0]=(...l)=>n.handleLogout&&n.handleLogout(...l)),class:"logout-btn"},"Uitloggen")])]),c("div",of,[(q(!0),W(Ce,null,St(n.tabs,l=>(q(),W("button",{key:l.id,onClick:h=>n.activeTab=l.id,class:Mt(["tab-button",{active:n.activeTab===l.id}])},F(l.label),11,rf))),128))]),n.activeTab==="requests"?(q(),W("div",lf,[c("div",af,[t[85]||(t[85]=c("h2",null,"Service Aanvragen",-1)),c("button",{onClick:t[1]||(t[1]=(...l)=>n.refreshRequests&&n.refreshRequests(...l)),class:"refresh-btn",disabled:n.loading,title:n.loading?"Verversen...":"Verversen"},F((n.loading,"🔄")),9,cf)]),c("div",uf,[t[88]||(t[88]=bo('
ID
Naam
Datum/Tijd
Status
Acties
',1)),n.loading?(q(),W("div",ff,[...t[86]||(t[86]=[c("div",{class:"loading-text"},"Aanvragen laden...",-1)])])):n.requests.length===0?(q(),W("div",df,[...t[87]||(t[87]=[c("div",{class:"empty-text"},"Geen service aanvragen gevonden",-1)])])):(q(!0),W(Ce,{key:2},St(n.requests,l=>(q(),W("div",{class:"table-row",key:l.id},[c("div",hf,F(l.id),1),c("div",pf,F(l.name),1),c("div",mf,F(n.formatDateTime(l.requested_date,l.requested_time)),1),c("div",gf,[c("span",{class:Mt(["status-badge",l.status])},F(n.getStatusText(l.status)),3)]),c("div",vf,[c("button",{onClick:h=>n.viewRequest(l),class:"action-btn view",title:"Bekijken"}," 👁️ ",8,_f),c("button",{onClick:h=>n.sendEmail(l),class:"action-btn email",disabled:!l.email,title:"E-mail versturen"}," 📧 ",8,bf),c("button",{onClick:h=>n.sendSms(l),class:"action-btn sms",disabled:!l.phone,title:"SMS versturen"}," 📱 ",8,yf),c("button",{onClick:h=>n.viewCommunications(l),class:"action-btn comm",title:"Communicatie bekijken"}," 💬 ",8,wf)])]))),128))])])):Re("",!0),n.activeTab==="blocked"?(q(),W("div",Sf,[c("div",kf,[t[89]||(t[89]=c("h2",null,"Geblokkeerde Data",-1)),c("button",{onClick:t[2]||(t[2]=l=>n.showAddBlockedDate=!0),class:"add-btn",title:"Geblokkeerde Datum Toevoegen"},"➕")]),c("div",Cf,[(q(!0),W(Ce,null,St(n.blockedDates,l=>(q(),W("div",{key:l.id,class:"blocked-date-item"},[c("div",xf,[c("span",Ef,F(n.formatDate(l.date)),1),l.reason?(q(),W("span",Pf,F(l.reason),1)):Re("",!0)]),c("div",Rf,[c("button",{onClick:h=>n.editBlockedDate(l),class:"edit-btn",title:"Bewerken"},"✏️",8,Af),c("button",{onClick:h=>n.deleteBlockedDate(l.id),class:"delete-btn",title:"Verwijderen"},"🗑️",8,Tf)])]))),128))])])):Re("",!0),n.activeTab==="pricelist"?(q(),W("div",Of,[c("div",Mf,[t[90]||(t[90]=c("h2",null,"Prijslijst Beheer",-1)),c("button",{onClick:t[3]||(t[3]=l=>n.showAddPricelistItem=!0),class:"add-btn",title:"Prijslijst Item Toevoegen"},"➕")]),c("div",If,[t[93]||(t[93]=bo('
Titel
Beschrijving
Prijs
Volgorde
Status
Acties
',1)),n.pricelistLoading?(q(),W("div",Df,[...t[91]||(t[91]=[c("div",{class:"loading-text"},"Prijslijst laden...",-1)])])):n.pricelist.length===0?(q(),W("div",jf,[...t[92]||(t[92]=[c("div",{class:"empty-text"},"Geen prijslijst items gevonden",-1)])])):(q(!0),W(Ce,{key:2},St(n.pricelist,l=>(q(),W("div",{class:"table-row",key:l.id},[c("div",Vf,F(l.title),1),c("div",Ff,F(l.description),1),c("div",Bf,"€"+F(l.price),1),c("div",Lf,F(l.sort_order),1),c("div",Nf,[c("span",{class:Mt(["status-badge",l.is_active?"active":"inactive"])},F(l.is_active?"Actief":"Inactief"),3)]),c("div",Hf,[c("button",{onClick:h=>n.editPricelistItem(l),class:"action-btn edit",title:"Bewerken"},"✏️",8,qf),c("button",{onClick:h=>n.deletePricelistItem(l.id),class:"action-btn delete",title:"Verwijderen"},"🗑️",8,Uf)])]))),128))])])):Re("",!0),n.activeTab==="content"?(q(),W("div",Kf,[t[118]||(t[118]=c("div",{class:"section-header"},[c("h2",null,"Pagina Teksten Beheer")],-1)),c("div",Wf,[c("div",Gf,[t[96]||(t[96]=c("h3",null,"Openingspagina - Hero Sectie",-1)),c("div",zf,[c("div",Jf,[t[94]||(t[94]=c("label",null,"Hoofdtekst (Header)",-1)),c("input",{type:"text",value:n.getContentValue("home_hero_title"),onInput:t[4]||(t[4]=l=>n.updateContentValue("home_hero_title",l.target.value)),onBlur:t[5]||(t[5]=l=>n.savePageContent("home_hero_title"))},null,40,Yf)]),c("div",Qf,[t[95]||(t[95]=c("label",null,"Subtekst (Subheader)",-1)),c("input",{type:"text",value:n.getContentValue("home_hero_subtitle"),onInput:t[6]||(t[6]=l=>n.updateContentValue("home_hero_subtitle",l.target.value)),onBlur:t[7]||(t[7]=l=>n.savePageContent("home_hero_subtitle"))},null,40,Zf)])])]),c("div",Xf,[t[109]||(t[109]=c("h3",null,"Openingspagina - Panelen",-1)),c("div",$f,[c("div",ed,[t[99]||(t[99]=c("h4",null,"Paneel 1",-1)),c("div",td,[t[97]||(t[97]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_1_title"),onInput:t[8]||(t[8]=l=>n.updateContentValue("home_feature_1_title",l.target.value)),onBlur:t[9]||(t[9]=l=>n.savePageContent("home_feature_1_title"))},null,40,nd)]),c("div",sd,[t[98]||(t[98]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_1_text"),onInput:t[10]||(t[10]=l=>n.updateContentValue("home_feature_1_text",l.target.value)),onBlur:t[11]||(t[11]=l=>n.savePageContent("home_feature_1_text")),rows:"2"},null,40,od)])]),c("div",rd,[t[102]||(t[102]=c("h4",null,"Paneel 2",-1)),c("div",id,[t[100]||(t[100]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_2_title"),onInput:t[12]||(t[12]=l=>n.updateContentValue("home_feature_2_title",l.target.value)),onBlur:t[13]||(t[13]=l=>n.savePageContent("home_feature_2_title"))},null,40,ld)]),c("div",ad,[t[101]||(t[101]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_2_text"),onInput:t[14]||(t[14]=l=>n.updateContentValue("home_feature_2_text",l.target.value)),onBlur:t[15]||(t[15]=l=>n.savePageContent("home_feature_2_text")),rows:"2"},null,40,cd)])]),c("div",ud,[t[105]||(t[105]=c("h4",null,"Paneel 3",-1)),c("div",fd,[t[103]||(t[103]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_3_title"),onInput:t[16]||(t[16]=l=>n.updateContentValue("home_feature_3_title",l.target.value)),onBlur:t[17]||(t[17]=l=>n.savePageContent("home_feature_3_title"))},null,40,dd)]),c("div",hd,[t[104]||(t[104]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_3_text"),onInput:t[18]||(t[18]=l=>n.updateContentValue("home_feature_3_text",l.target.value)),onBlur:t[19]||(t[19]=l=>n.savePageContent("home_feature_3_text")),rows:"2"},null,40,pd)])]),c("div",md,[t[108]||(t[108]=c("h4",null,"Paneel 4",-1)),c("div",gd,[t[106]||(t[106]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_4_title"),onInput:t[20]||(t[20]=l=>n.updateContentValue("home_feature_4_title",l.target.value)),onBlur:t[21]||(t[21]=l=>n.savePageContent("home_feature_4_title"))},null,40,vd)]),c("div",_d,[t[107]||(t[107]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_4_text"),onInput:t[22]||(t[22]=l=>n.updateContentValue("home_feature_4_text",l.target.value)),onBlur:t[23]||(t[23]=l=>n.savePageContent("home_feature_4_text")),rows:"2"},null,40,bd)])])])]),c("div",yd,[t[114]||(t[114]=c("h3",null,"Openingspagina - Knoppen Container",-1)),c("div",wd,[c("div",Sd,[t[110]||(t[110]=c("label",null,"Hoofdtekst",-1)),c("input",{type:"text",value:n.getContentValue("home_cta_title"),onInput:t[24]||(t[24]=l=>n.updateContentValue("home_cta_title",l.target.value)),onBlur:t[25]||(t[25]=l=>n.savePageContent("home_cta_title"))},null,40,kd)]),c("div",Cd,[t[111]||(t[111]=c("label",null,"Subtekst",-1)),c("textarea",{value:n.getContentValue("home_cta_subtitle"),onInput:t[26]||(t[26]=l=>n.updateContentValue("home_cta_subtitle",l.target.value)),onBlur:t[27]||(t[27]=l=>n.savePageContent("home_cta_subtitle")),rows:"2"},null,40,xd)]),c("div",Ed,[t[112]||(t[112]=c("label",null,"Knop 1 Tekst",-1)),c("input",{type:"text",value:n.getContentValue("home_cta_button_1_text"),onInput:t[28]||(t[28]=l=>n.updateContentValue("home_cta_button_1_text",l.target.value)),onBlur:t[29]||(t[29]=l=>n.savePageContent("home_cta_button_1_text"))},null,40,Pd)]),c("div",Rd,[t[113]||(t[113]=c("label",null,"Knop 2 Tekst",-1)),c("input",{type:"text",value:n.getContentValue("home_cta_button_2_text"),onInput:t[30]||(t[30]=l=>n.updateContentValue("home_cta_button_2_text",l.target.value)),onBlur:t[31]||(t[31]=l=>n.savePageContent("home_cta_button_2_text"))},null,40,Ad)])])]),c("div",Td,[t[117]||(t[117]=c("h3",null,"Boekingspagina - Header",-1)),c("div",Od,[c("div",Md,[t[115]||(t[115]=c("label",null,"Hoofdtekst (Header)",-1)),c("input",{type:"text",value:n.getContentValue("booking_header_title"),onInput:t[32]||(t[32]=l=>n.updateContentValue("booking_header_title",l.target.value)),onBlur:t[33]||(t[33]=l=>n.savePageContent("booking_header_title"))},null,40,Id)]),c("div",Dd,[t[116]||(t[116]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("booking_header_subtitle"),onInput:t[34]||(t[34]=l=>n.updateContentValue("booking_header_subtitle",l.target.value)),onBlur:t[35]||(t[35]=l=>n.savePageContent("booking_header_subtitle")),rows:"2"},null,40,jd)])])])])])):Re("",!0),n.activeTab==="settings"?(q(),W("div",Vd,[t[121]||(t[121]=c("div",{class:"section-header"},[c("h2",null,"Applicatie Instellingen")],-1)),c("div",Fd,[c("div",Bd,[t[119]||(t[119]=c("label",{for:"admin_email"},"Beheer Notificatie E-mail",-1)),ve(c("input",{type:"email",id:"admin_email","onUpdate:modelValue":t[36]||(t[36]=l=>n.settings.admin_notification_email=l),placeholder:"admin@voorbeeld.com"},null,512),[[_e,n.settings.admin_notification_email]]),c("button",{onClick:t[37]||(t[37]=l=>n.updateSetting("admin_notification_email",n.settings.admin_notification_email)),class:"save-btn",title:"Opslaan"}," 💾 ")]),c("div",Ld,[t[120]||(t[120]=c("label",{for:"business_name"},"Bedrijfsnaam",-1)),ve(c("input",{type:"text",id:"business_name","onUpdate:modelValue":t[38]||(t[38]=l=>n.settings.business_name=l),placeholder:"Fiets Service Centrum"},null,512),[[_e,n.settings.business_name]]),c("button",{onClick:t[39]||(t[39]=l=>n.updateSetting("business_name",n.settings.business_name)),class:"save-btn",title:"Opslaan"}," 💾 ")])])])):Re("",!0),n.showRequestModal?(q(),W("div",{key:5,class:"modal-overlay",onClick:t[49]||(t[49]=(...l)=>n.closeRequestModal&&n.closeRequestModal(...l))},[c("div",{class:"modal-content large",onClick:t[48]||(t[48]=at(()=>{},["stop"]))},[c("div",Nd,[t[122]||(t[122]=c("h3",null,"Service Aanvraag Details",-1)),c("button",{onClick:t[40]||(t[40]=(...l)=>n.closeRequestModal&&n.closeRequestModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),n.selectedRequest?(q(),W("div",Hd,[n.requestModalLoading?(q(),W("div",qd,[...t[123]||(t[123]=[c("div",{class:"loading-spinner"},null,-1),c("p",null,"Gegevens laden...",-1)])])):(q(),W("div",Ud,[c("div",Kd,[t[124]||(t[124]=c("strong",null,"Naam:",-1)),Se(" "+F(n.selectedRequest.name),1)]),c("div",Wd,[t[125]||(t[125]=c("strong",null,"Adres:",-1)),Se(" "+F(n.selectedRequest.address),1)]),c("div",Gd,[t[126]||(t[126]=c("strong",null,"Plaats:",-1)),Se(" "+F(n.selectedRequest.place),1)]),c("div",zd,[t[127]||(t[127]=c("strong",null,"E-mail:",-1)),Se(" "+F(n.selectedRequest.email||"Niet opgegeven"),1)]),c("div",Jd,[t[128]||(t[128]=c("strong",null,"Telefoon:",-1)),Se(" "+F(n.selectedRequest.phone||"Niet opgegeven"),1)]),c("div",Yd,[t[129]||(t[129]=c("strong",null,"Reparatie Beschrijving:",-1)),Se(" "+F(n.selectedRequest.repair_description),1)]),c("div",Qd,[t[130]||(t[130]=c("strong",null,"Gewenste Datum/Tijd:",-1)),Se(" "+F(n.formatDateTime(n.selectedRequest.requested_date,n.selectedRequest.requested_time)),1)]),c("div",Zd,[t[132]||(t[132]=c("strong",null,"Status:",-1)),ve(c("select",{"onUpdate:modelValue":t[41]||(t[41]=l=>n.selectedRequest.status=l),onChange:t[42]||(t[42]=(...l)=>n.updateRequestStatus&&n.updateRequestStatus(...l))},[...t[131]||(t[131]=[c("option",{value:"pending"},"In afwachting",-1),c("option",{value:"confirmed"},"Bevestigd",-1),c("option",{value:"completed"},"Voltooid",-1),c("option",{value:"cancelled"},"Geannuleerd",-1)])],544),[[Ja,n.selectedRequest.status]])]),c("div",Xd,[t[133]||(t[133]=c("strong",null,"Werkelijke Reparatie Datum:",-1)),ve(c("input",{type:"date","onUpdate:modelValue":t[43]||(t[43]=l=>n.selectedRequest.actual_repair_date=l),onChange:t[44]||(t[44]=(...l)=>n.updateRequestDate&&n.updateRequestDate(...l))},null,544),[[_e,n.selectedRequest.actual_repair_date]])]),c("div",$d,[t[134]||(t[134]=c("strong",null,"Werkelijke Reparatie Tijd:",-1)),ve(c("input",{type:"time","onUpdate:modelValue":t[45]||(t[45]=l=>n.selectedRequest.actual_repair_time=l),onChange:t[46]||(t[46]=(...l)=>n.updateRequestTime&&n.updateRequestTime(...l))},null,544),[[_e,n.selectedRequest.actual_repair_time]])])]))])):Re("",!0),c("div",eh,[c("button",{onClick:t[47]||(t[47]=(...l)=>n.closeRequestModal&&n.closeRequestModal(...l)),class:"btn-primary"},"Sluiten")])])])):Re("",!0),n.showAddBlockedDate?(q(),W("div",{key:6,class:"modal-overlay",onClick:t[56]||(t[56]=(...l)=>n.closeBlockedDateModal&&n.closeBlockedDateModal(...l))},[c("div",{class:"modal-content",onClick:t[55]||(t[55]=at(()=>{},["stop"]))},[c("div",th,[c("h3",null,F(n.editingBlockedDate?"Bewerken":"Toevoegen")+" Geblokkeerde Datum",1),c("button",{onClick:t[50]||(t[50]=(...l)=>n.closeBlockedDateModal&&n.closeBlockedDateModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",nh,[c("div",sh,[t[135]||(t[135]=c("label",{for:"blocked_date"},"Datum",-1)),ve(c("input",{type:"date",id:"blocked_date","onUpdate:modelValue":t[51]||(t[51]=l=>n.blockedDateForm.date=l),min:n.minDate},null,8,oh),[[_e,n.blockedDateForm.date]])]),c("div",rh,[t[136]||(t[136]=c("label",{for:"blocked_reason"},"Reden (Optioneel)",-1)),ve(c("textarea",{id:"blocked_reason","onUpdate:modelValue":t[52]||(t[52]=l=>n.blockedDateForm.reason=l),rows:"3"},null,512),[[_e,n.blockedDateForm.reason]])])]),c("div",ih,[c("button",{onClick:t[53]||(t[53]=(...l)=>n.saveBlockedDate&&n.saveBlockedDate(...l)),class:"btn-primary"},"Opslaan"),c("button",{onClick:t[54]||(t[54]=(...l)=>n.closeBlockedDateModal&&n.closeBlockedDateModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0),n.showEmailModal?(q(),W("div",{key:7,class:"modal-overlay",onClick:t[62]||(t[62]=(...l)=>n.closeEmailModal&&n.closeEmailModal(...l))},[c("div",{class:"modal-content",onClick:t[61]||(t[61]=at(()=>{},["stop"]))},[c("div",lh,[c("h3",null,"E-mail Versturen naar "+F((a=n.selectedRequest)==null?void 0:a.name),1),c("button",{onClick:t[57]||(t[57]=(...l)=>n.closeEmailModal&&n.closeEmailModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",ah,[c("div",ch,[t[137]||(t[137]=c("label",{for:"email_message"},"Bericht",-1)),ve(c("textarea",{id:"email_message","onUpdate:modelValue":t[58]||(t[58]=l=>n.emailForm.message=l),rows:"6",placeholder:"Voer je bericht in..."},null,512),[[_e,n.emailForm.message]])])]),c("div",uh,[c("button",{onClick:t[59]||(t[59]=(...l)=>n.submitEmail&&n.submitEmail(...l)),class:"btn-primary",disabled:n.emailLoading},F(n.emailLoading?"Versturen...":"E-mail Versturen"),9,fh),c("button",{onClick:t[60]||(t[60]=(...l)=>n.closeEmailModal&&n.closeEmailModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0),n.showSmsModal?(q(),W("div",{key:8,class:"modal-overlay",onClick:t[68]||(t[68]=(...l)=>n.closeSmsModal&&n.closeSmsModal(...l))},[c("div",{class:"modal-content",onClick:t[67]||(t[67]=at(()=>{},["stop"]))},[c("div",dh,[c("h3",null,"SMS Versturen naar "+F((u=n.selectedRequest)==null?void 0:u.name),1),c("button",{onClick:t[63]||(t[63]=(...l)=>n.closeSmsModal&&n.closeSmsModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",hh,[c("div",ph,[t[138]||(t[138]=c("label",{for:"sms_message"},"Bericht",-1)),ve(c("textarea",{id:"sms_message","onUpdate:modelValue":t[64]||(t[64]=l=>n.smsForm.message=l),rows:"6",placeholder:"Voer je bericht in..."},null,512),[[_e,n.smsForm.message]])])]),c("div",mh,[c("button",{onClick:t[65]||(t[65]=(...l)=>n.submitSms&&n.submitSms(...l)),class:"btn-primary",disabled:n.smsLoading},F(n.smsLoading?"Versturen...":"SMS Versturen"),9,gh),c("button",{onClick:t[66]||(t[66]=(...l)=>n.closeSmsModal&&n.closeSmsModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0),n.showCommunicationsModal?(q(),W("div",{key:9,class:"modal-overlay",onClick:t[72]||(t[72]=(...l)=>n.closeCommunicationsModal&&n.closeCommunicationsModal(...l))},[c("div",{class:"modal-content large",onClick:t[71]||(t[71]=at(()=>{},["stop"]))},[c("div",vh,[c("h3",null,"Communicatie Geschiedenis - "+F((p=n.selectedRequest)==null?void 0:p.name),1),c("button",{onClick:t[69]||(t[69]=(...l)=>n.closeCommunicationsModal&&n.closeCommunicationsModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",_h,[n.communications.length===0?(q(),W("div",bh," Geen communicatie gevonden voor deze aanvraag. ")):(q(),W("div",yh,[(q(!0),W(Ce,null,St(n.communications,l=>(q(),W("div",{key:l.id,class:"communication-item"},[c("div",wh,[c("span",Sh,F(n.getCommTypeText(l.type)),1),c("span",kh,F(n.getCommDirectionText(l.direction)),1),c("span",Ch,F(n.formatDateTime(l.created_at)),1)]),c("div",xh,F(l.message),1)]))),128))]))]),c("div",Eh,[c("button",{onClick:t[70]||(t[70]=(...l)=>n.closeCommunicationsModal&&n.closeCommunicationsModal(...l)),class:"btn-primary"},"Sluiten")])])])):Re("",!0),n.showAddPricelistItem?(q(),W("div",{key:10,class:"modal-overlay",onClick:t[82]||(t[82]=(...l)=>n.closePricelistModal&&n.closePricelistModal(...l))},[c("div",{class:"modal-content",onClick:t[81]||(t[81]=at(()=>{},["stop"]))},[c("div",Ph,[c("h3",null,F(n.editingPricelistItem?"Bewerken":"Toevoegen")+" Prijslijst Item",1),c("button",{onClick:t[73]||(t[73]=(...l)=>n.closePricelistModal&&n.closePricelistModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",Rh,[c("div",Ah,[t[139]||(t[139]=c("label",{for:"pricelist_title"},"Titel",-1)),ve(c("input",{type:"text",id:"pricelist_title","onUpdate:modelValue":t[74]||(t[74]=l=>n.pricelistForm.title=l),placeholder:"Bijv. Banden vervangen"},null,512),[[_e,n.pricelistForm.title]])]),c("div",Th,[t[140]||(t[140]=c("label",{for:"pricelist_description"},"Beschrijving",-1)),ve(c("textarea",{id:"pricelist_description","onUpdate:modelValue":t[75]||(t[75]=l=>n.pricelistForm.description=l),rows:"3",placeholder:"Beschrijving van de service"},null,512),[[_e,n.pricelistForm.description]])]),c("div",Oh,[t[141]||(t[141]=c("label",{for:"pricelist_price"},"Prijs (€)",-1)),ve(c("input",{type:"number",id:"pricelist_price","onUpdate:modelValue":t[76]||(t[76]=l=>n.pricelistForm.price=l),step:"0.01",min:"0",placeholder:"25.00"},null,512),[[_e,n.pricelistForm.price]])]),c("div",Mh,[t[142]||(t[142]=c("label",{for:"pricelist_sort_order"},"Volgorde",-1)),ve(c("input",{type:"number",id:"pricelist_sort_order","onUpdate:modelValue":t[77]||(t[77]=l=>n.pricelistForm.sort_order=l),min:"0",placeholder:"1"},null,512),[[_e,n.pricelistForm.sort_order]])]),c("div",Ih,[c("label",null,[ve(c("input",{type:"checkbox","onUpdate:modelValue":t[78]||(t[78]=l=>n.pricelistForm.is_active=l)},null,512),[[za,n.pricelistForm.is_active]]),t[143]||(t[143]=Se(" Actief ",-1))])])]),c("div",Dh,[c("button",{onClick:t[79]||(t[79]=(...l)=>n.savePricelistItem&&n.savePricelistItem(...l)),class:"btn-primary"},"Opslaan"),c("button",{onClick:t[80]||(t[80]=(...l)=>n.closePricelistModal&&n.closePricelistModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0)])}const Vh=Qt(ef,[["render",jh],["__scopeId","data-v-c28c01c6"]]),Fh={name:"Login",setup(){const e=Ai(),t=os(),s=Z({email:"",password:""}),n=Z(!1),o=Z("");return{form:s,loading:n,error:o,handleLogin:async()=>{n.value=!0,o.value="";try{const i=await fetch("/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s.value)});if(!i.ok){const u=await i.json();throw new Error(u.message||"Inloggen mislukt")}const a=await i.json();t.login(a.user,a.token),e.push("/admin")}catch(i){o.value=i.message}finally{n.value=!1}}}}},Bh={class:"login"},Lh={class:"login-container"},Nh={class:"form-group"},Hh=["disabled"],qh={class:"form-group"},Uh=["disabled"],Kh={key:0,class:"form-error"},Wh=["disabled"];function Gh(e,t,s,n,o,r){return q(),W("div",Bh,[c("div",Lh,[t[5]||(t[5]=c("div",{class:"login-header"},[c("h1",null,"🔐 Beheerder Login"),c("p",null,"Log in om toegang te krijgen tot het beheerpaneel")],-1)),c("form",{onSubmit:t[2]||(t[2]=at((...i)=>n.handleLogin&&n.handleLogin(...i),["prevent"])),class:"login-form"},[c("div",Nh,[t[3]||(t[3]=c("label",{for:"email"},"E-mail",-1)),ve(c("input",{type:"email",id:"email","onUpdate:modelValue":t[0]||(t[0]=i=>n.form.email=i),required:"",placeholder:"admin@fietservice.nl",disabled:n.loading},null,8,Hh),[[_e,n.form.email]])]),c("div",qh,[t[4]||(t[4]=c("label",{for:"password"},"Wachtwoord",-1)),ve(c("input",{type:"password",id:"password","onUpdate:modelValue":t[1]||(t[1]=i=>n.form.password=i),required:"",placeholder:"Voer je wachtwoord in",disabled:n.loading},null,8,Uh),[[_e,n.form.password]])]),n.error?(q(),W("div",Kh,F(n.error),1)):Re("",!0),c("button",{type:"submit",class:"login-btn",disabled:n.loading},F(n.loading?"Inloggen...":"Inloggen"),9,Wh)],32),t[6]||(t[6]=c("div",{class:"login-info"},[c("p",null,[c("strong",null,"Demo gegevens:")]),c("p",null,"E-mail: admin@fietservice.nl"),c("p",null,"Wachtwoord: Admin174")],-1))])])}const zh=Qt(Fh,[["render",Gh],["__scopeId","data-v-2c23c0dd"]]),Jh={name:"Pricelist",setup(){const e=Z([]),t=Z(!0),s=async()=>{try{const n=await fetch("/api/pricelist");n.ok&&(e.value=await n.json())}catch(n){console.error("Failed to fetch pricelist:",n)}finally{t.value=!1}};return Yt(()=>{s()}),{pricelist:e,loading:t}}},Yh={class:"pricelist"},Qh={class:"pricelist-header"},Zh={key:0,class:"loading-state"},Xh={key:1,class:"empty-state"},$h={key:2,class:"pricelist-grid"},ep={class:"price-header"},tp={class:"price"},np={class:"description"},sp={class:"cta-section"};function op(e,t,s,n,o,r){const i=Nn("router-link");return q(),W("div",Yh,[c("div",Qh,[t[1]||(t[1]=c("h1",null,"💰 Prijslijst",-1)),t[2]||(t[2]=c("p",null,"Transparante prijzen voor al onze fiets service diensten",-1)),be(i,{to:"/",class:"back-btn"},{default:tt(()=>[...t[0]||(t[0]=[Se("← Terug naar Home",-1)])]),_:1})]),n.loading?(q(),W("div",Zh,[...t[3]||(t[3]=[c("div",{class:"loading-spinner"},null,-1),c("p",null,"Prijzen laden...",-1)])])):n.pricelist.length===0?(q(),W("div",Xh,[...t[4]||(t[4]=[c("p",null,"Geen prijzen beschikbaar op dit moment.",-1)])])):(q(),W("div",$h,[(q(!0),W(Ce,null,St(n.pricelist,a=>(q(),W("div",{key:a.id,class:"price-card"},[c("div",ep,[c("h3",null,F(a.title),1),c("div",tp,"€"+F(a.price),1)]),c("p",np,F(a.description),1)]))),128))])),c("div",sp,[t[6]||(t[6]=c("h2",null,"Klaar om je afspraak te boeken?",-1)),t[7]||(t[7]=c("p",null,"Boek nu je service afspraak online!",-1)),be(i,{to:"/booking",class:"cta-button"},{default:tt(()=>[...t[5]||(t[5]=[Se("Nu Boeken",-1)])]),_:1})])])}const rp=Qt(Jh,[["render",op],["__scopeId","data-v-5946fc5a"]]),ip=[{path:"/",name:"Home",component:ku},{path:"/pricelist",name:"Pricelist",component:rp},{path:"/booking",name:"Booking",component:$u},{path:"/login",name:"Login",component:zh},{path:"/admin",name:"Admin",component:Vh,meta:{requiresAuth:!0}}],Ti=uu({history:Lc(),routes:ip});Ti.beforeEach((e,t,s)=>{if(e.meta.requiresAuth&&!os().isAuthenticated){s("/login");return}s()});const lp="/images/bikeservice_logo_navbar.svg",ap={name:"App",setup(){const e=os();return Yt(()=>{e.checkAuth()}),{isAuthenticated:e.isAuthenticated}}},cp={id:"app"},up={class:"navbar"},fp={class:"nav-container"},dp={class:"nav-menu"},hp={class:"main-content"};function pp(e,t,s,n,o,r){const i=Nn("router-link"),a=Nn("router-view");return q(),W("div",cp,[c("nav",up,[c("div",fp,[be(i,{to:"/",class:"nav-logo"},{default:tt(()=>[...t[0]||(t[0]=[c("img",{src:lp,alt:"Bike Service Logo",class:"logo-image"},null,-1)])]),_:1}),c("div",dp,[be(i,{to:"/",class:"nav-link"},{default:tt(()=>[...t[1]||(t[1]=[Se("Home",-1)])]),_:1}),be(i,{to:"/booking",class:"nav-link"},{default:tt(()=>[...t[2]||(t[2]=[Se("Service Boeken",-1)])]),_:1}),n.isAuthenticated?(q(),xs(i,{key:0,to:"/admin",class:"nav-link"},{default:tt(()=>[...t[3]||(t[3]=[Se("Beheer",-1)])]),_:1})):(q(),xs(i,{key:1,to:"/login",class:"nav-link"},{default:tt(()=>[...t[4]||(t[4]=[Se("Beheer Login",-1)])]),_:1}))])])]),c("main",hp,[be(a)])])}const mp=Qt(ap,[["render",pp]]),$s=$a(mp),gp=nc();$s.use(gp);$s.use(Ti);$s.mount("#app"); + */const Lt=typeof document<"u";function gi(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function cc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&gi(e.default)}const ie=Object.assign;function ms(e,t){const s={};for(const n in t){const o=t[n];s[n]=Qe(o)?o.map(e):e(o)}return s}const fn=()=>{},Qe=Array.isArray,vi=/#/g,uc=/&/g,fc=/\//g,dc=/=/g,hc=/\?/g,_i=/\+/g,pc=/%5B/g,mc=/%5D/g,bi=/%5E/g,gc=/%60/g,yi=/%7B/g,vc=/%7C/g,wi=/%7D/g,_c=/%20/g;function Xs(e){return encodeURI(""+e).replace(vc,"|").replace(pc,"[").replace(mc,"]")}function bc(e){return Xs(e).replace(yi,"{").replace(wi,"}").replace(bi,"^")}function Ts(e){return Xs(e).replace(_i,"%2B").replace(_c,"+").replace(vi,"%23").replace(uc,"%26").replace(gc,"`").replace(yi,"{").replace(wi,"}").replace(bi,"^")}function yc(e){return Ts(e).replace(dc,"%3D")}function wc(e){return Xs(e).replace(vi,"%23").replace(hc,"%3F")}function Sc(e){return e==null?"":wc(e).replace(fc,"%2F")}function bn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const kc=/\/$/,Cc=e=>e.replace(kc,"");function gs(e,t,s="/"){let n,o={},r="",i="";const a=t.indexOf("#");let u=t.indexOf("?");return a=0&&(u=-1),u>-1&&(n=t.slice(0,u),r=t.slice(u+1,a>-1?a:t.length),o=e(r)),a>-1&&(n=n||t.slice(0,a),i=t.slice(a,t.length)),n=Rc(n??t,s),{fullPath:n+(r&&"?")+r+i,path:n,query:o,hash:bn(i)}}function xc(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function Lo(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Ec(e,t,s){const n=t.matched.length-1,o=s.matched.length-1;return n>-1&&n===o&&Gt(t.matched[n],s.matched[o])&&Si(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function Gt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Si(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const s in e)if(!Pc(e[s],t[s]))return!1;return!0}function Pc(e,t){return Qe(e)?No(e,t):Qe(t)?No(t,e):e===t}function No(e,t){return Qe(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function Rc(e,t){if(e.startsWith("/"))return e;if(!e)return t;const s=t.split("/"),n=e.split("/"),o=n[n.length-1];(o===".."||o===".")&&n.push("");let r=s.length-1,i,a;for(i=0;i1&&r--;else break;return s.slice(0,r).join("/")+"/"+n.slice(i).join("/")}const vt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var yn;(function(e){e.pop="pop",e.push="push"})(yn||(yn={}));var dn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(dn||(dn={}));function Ac(e){if(!e)if(Lt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Cc(e)}const Tc=/^[^#]+#/;function Oc(e,t){return e.replace(Tc,"#")+t}function Mc(e,t){const s=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-s.left-(t.left||0),top:n.top-s.top-(t.top||0)}}const ns=()=>({left:window.scrollX,top:window.scrollY});function Ic(e){let t;if("el"in e){const s=e.el,n=typeof s=="string"&&s.startsWith("#"),o=typeof s=="string"?n?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!o)return;t=Mc(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ho(e,t){return(history.state?history.state.position-t:-1)+e}const Os=new Map;function Dc(e,t){Os.set(e,t)}function jc(e){const t=Os.get(e);return Os.delete(e),t}let Vc=()=>location.protocol+"//"+location.host;function ki(e,t){const{pathname:s,search:n,hash:o}=t,r=e.indexOf("#");if(r>-1){let a=o.includes(e.slice(r))?e.slice(r).length:1,u=o.slice(a);return u[0]!=="/"&&(u="/"+u),Lo(u,"")}return Lo(s,e)+n+o}function Fc(e,t,s,n){let o=[],r=[],i=null;const a=({state:g})=>{const v=ki(e,location),P=s.value,O=t.value;let G=0;if(g){if(s.value=v,t.value=g,i&&i===P){i=null;return}G=O?g.position-O.position:0}else n(v);o.forEach(R=>{R(s.value,P,{delta:G,type:yn.pop,direction:G?G>0?dn.forward:dn.back:dn.unknown})})};function u(){i=s.value}function p(g){o.push(g);const v=()=>{const P=o.indexOf(g);P>-1&&o.splice(P,1)};return r.push(v),v}function l(){const{history:g}=window;g.state&&g.replaceState(ie({},g.state,{scroll:ns()}),"")}function h(){for(const g of r)g();r=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",l)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",l,{passive:!0}),{pauseListeners:u,listen:p,destroy:h}}function qo(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?ns():null}}function Bc(e){const{history:t,location:s}=window,n={value:ki(e,s)},o={value:t.state};o.value||r(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(u,p,l){const h=e.indexOf("#"),g=h>-1?(s.host&&document.querySelector("base")?e:e.slice(h))+u:Vc()+e+u;try{t[l?"replaceState":"pushState"](p,"",g),o.value=p}catch(v){console.error(v),s[l?"replace":"assign"](g)}}function i(u,p){const l=ie({},t.state,qo(o.value.back,u,o.value.forward,!0),p,{position:o.value.position});r(u,l,!0),n.value=u}function a(u,p){const l=ie({},o.value,t.state,{forward:u,scroll:ns()});r(l.current,l,!0);const h=ie({},qo(n.value,u,null),{position:l.position+1},p);r(u,h,!1),n.value=u}return{location:n,state:o,push:a,replace:i}}function Lc(e){e=Ac(e);const t=Bc(e),s=Fc(e,t.state,t.location,t.replace);function n(r,i=!0){i||s.pauseListeners(),history.go(r)}const o=ie({location:"",base:e,go:n,createHref:Oc.bind(null,e)},t,s);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Nc(e){return typeof e=="string"||e&&typeof e=="object"}function Ci(e){return typeof e=="string"||typeof e=="symbol"}const xi=Symbol("");var Uo;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Uo||(Uo={}));function zt(e,t){return ie(new Error,{type:e,[xi]:!0},t)}function it(e,t){return e instanceof Error&&xi in e&&(t==null||!!(e.type&t))}const Ko="[^/]+?",Hc={sensitive:!1,strict:!1,start:!0,end:!0},qc=/[.+*?^${}()[\]/\\]/g;function Uc(e,t){const s=ie({},Hc,t),n=[];let o=s.start?"^":"";const r=[];for(const p of e){const l=p.length?[]:[90];s.strict&&!p.length&&(o+="/");for(let h=0;ht.length?t.length===1&&t[0]===80?1:-1:0}function Ei(e,t){let s=0;const n=e.score,o=t.score;for(;s0&&t[t.length-1]<0}const Wc={type:0,value:""},Gc=/[a-zA-Z0-9_]/;function zc(e){if(!e)return[[]];if(e==="/")return[[Wc]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(v){throw new Error(`ERR (${s})/"${p}": ${v}`)}let s=0,n=s;const o=[];let r;function i(){r&&o.push(r),r=[]}let a=0,u,p="",l="";function h(){p&&(s===0?r.push({type:0,value:p}):s===1||s===2||s===3?(r.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${p}) must be alone in its segment. eg: '/:ids+.`),r.push({type:1,value:p,regexp:l,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),p="")}function g(){p+=u}for(;a{i(V)}:fn}function i(h){if(Ci(h)){const g=n.get(h);g&&(n.delete(h),s.splice(s.indexOf(g),1),g.children.forEach(i),g.alias.forEach(i))}else{const g=s.indexOf(h);g>-1&&(s.splice(g,1),h.record.name&&n.delete(h.record.name),h.children.forEach(i),h.alias.forEach(i))}}function a(){return s}function u(h){const g=Xc(h,s);s.splice(g,0,h),h.record.name&&!Jo(h)&&n.set(h.record.name,h)}function p(h,g){let v,P={},O,G;if("name"in h&&h.name){if(v=n.get(h.name),!v)throw zt(1,{location:h});G=v.record.name,P=ie(Go(g.params,v.keys.filter(V=>!V.optional).concat(v.parent?v.parent.keys.filter(V=>V.optional):[]).map(V=>V.name)),h.params&&Go(h.params,v.keys.map(V=>V.name))),O=v.stringify(P)}else if(h.path!=null)O=h.path,v=s.find(V=>V.re.test(O)),v&&(P=v.parse(O),G=v.record.name);else{if(v=g.name?n.get(g.name):s.find(V=>V.re.test(g.path)),!v)throw zt(1,{location:h,currentLocation:g});G=v.record.name,P=ie({},g.params,h.params),O=v.stringify(P)}const R=[];let I=v;for(;I;)R.unshift(I.record),I=I.parent;return{name:G,path:O,params:P,matched:R,meta:Zc(R)}}e.forEach(h=>r(h));function l(){s.length=0,n.clear()}return{addRoute:r,resolve:p,removeRoute:i,clearRoutes:l,getRoutes:a,getRecordMatcher:o}}function Go(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function zo(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Qc(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Qc(e){const t={},s=e.props||!1;if("component"in e)t.default=s;else for(const n in e.components)t[n]=typeof s=="object"?s[n]:s;return t}function Jo(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Zc(e){return e.reduce((t,s)=>ie(t,s.meta),{})}function Yo(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}function Xc(e,t){let s=0,n=t.length;for(;s!==n;){const r=s+n>>1;Ei(e,t[r])<0?n=r:s=r+1}const o=$c(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function $c(e){let t=e;for(;t=t.parent;)if(Pi(t)&&Ei(e,t)===0)return t}function Pi({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function eu(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;or&&Ts(r)):[n&&Ts(n)]).forEach(r=>{r!==void 0&&(t+=(t.length?"&":"")+s,r!=null&&(t+="="+r))})}return t}function tu(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=Qe(n)?n.map(o=>o==null?null:""+o):n==null?n:""+n)}return t}const nu=Symbol(""),Zo=Symbol(""),ss=Symbol(""),Ri=Symbol(""),Ms=Symbol("");function $t(){let e=[];function t(n){return e.push(n),()=>{const o=e.indexOf(n);o>-1&&e.splice(o,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function wt(e,t,s,n,o,r=i=>i()){const i=n&&(n.enterCallbacks[o]=n.enterCallbacks[o]||[]);return()=>new Promise((a,u)=>{const p=g=>{g===!1?u(zt(4,{from:s,to:t})):g instanceof Error?u(g):Nc(g)?u(zt(2,{from:t,to:g})):(i&&n.enterCallbacks[o]===i&&typeof g=="function"&&i.push(g),a())},l=r(()=>e.call(n&&n.instances[o],t,s,p));let h=Promise.resolve(l);e.length<3&&(h=h.then(p)),h.catch(g=>u(g))})}function vs(e,t,s,n,o=r=>r()){const r=[];for(const i of e)for(const a in i.components){let u=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(gi(u)){const l=(u.__vccOpts||u)[t];l&&r.push(wt(l,s,n,i,a,o))}else{let p=u();r.push(()=>p.then(l=>{if(!l)throw new Error(`Couldn't resolve component "${a}" at "${i.path}"`);const h=cc(l)?l.default:l;i.mods[a]=l,i.components[a]=h;const v=(h.__vccOpts||h)[t];return v&&wt(v,s,n,i,a,o)()}))}}return r}function Xo(e){const t=Ye(ss),s=Ye(Ri),n=xe(()=>{const u=qt(e.to);return t.resolve(u)}),o=xe(()=>{const{matched:u}=n.value,{length:p}=u,l=u[p-1],h=s.matched;if(!l||!h.length)return-1;const g=h.findIndex(Gt.bind(null,l));if(g>-1)return g;const v=$o(u[p-2]);return p>1&&$o(l)===v&&h[h.length-1].path!==v?h.findIndex(Gt.bind(null,u[p-2])):g}),r=xe(()=>o.value>-1&&lu(s.params,n.value.params)),i=xe(()=>o.value>-1&&o.value===s.matched.length-1&&Si(s.params,n.value.params));function a(u={}){if(iu(u)){const p=t[qt(e.replace)?"replace":"push"](qt(e.to)).catch(fn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>p),p}return Promise.resolve()}return{route:n,href:xe(()=>n.value.href),isActive:r,isExactActive:i,navigate:a}}function su(e){return e.length===1?e[0]:e}const ou=Vr({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Xo,setup(e,{slots:t}){const s=kn(Xo(e)),{options:n}=Ye(ss),o=xe(()=>({[er(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[er(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const r=t.default&&su(t.default(s));return e.custom?r:ci("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},r)}}}),ru=ou;function iu(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function lu(e,t){for(const s in t){const n=t[s],o=e[s];if(typeof n=="string"){if(n!==o)return!1}else if(!Qe(o)||o.length!==n.length||n.some((r,i)=>r!==o[i]))return!1}return!0}function $o(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const er=(e,t,s)=>e??t??s,au=Vr({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=Ye(Ms),o=xe(()=>e.route||n.value),r=Ye(Zo,0),i=xe(()=>{let p=qt(r);const{matched:l}=o.value;let h;for(;(h=l[p])&&!h.components;)p++;return p}),a=xe(()=>o.value.matched[i.value]);Tn(Zo,xe(()=>i.value+1)),Tn(nu,a),Tn(Ms,o);const u=Z();return an(()=>[u.value,a.value,e.name],([p,l,h],[g,v,P])=>{l&&(l.instances[h]=p,v&&v!==l&&p&&p===g&&(l.leaveGuards.size||(l.leaveGuards=v.leaveGuards),l.updateGuards.size||(l.updateGuards=v.updateGuards))),p&&l&&(!v||!Gt(l,v)||!g)&&(l.enterCallbacks[h]||[]).forEach(O=>O(p))},{flush:"post"}),()=>{const p=o.value,l=e.name,h=a.value,g=h&&h.components[l];if(!g)return tr(s.default,{Component:g,route:p});const v=h.props[l],P=v?v===!0?p.params:typeof v=="function"?v(p):v:null,G=ci(g,ie({},P,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(h.instances[l]=null)},ref:u}));return tr(s.default,{Component:G,route:p})||G}}});function tr(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const cu=au;function uu(e){const t=Yc(e.routes,e),s=e.parseQuery||eu,n=e.stringifyQuery||Qo,o=e.history,r=$t(),i=$t(),a=$t(),u=al(vt);let p=vt;Lt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const l=ms.bind(null,y=>""+y),h=ms.bind(null,Sc),g=ms.bind(null,bn);function v(y,D){let A,B;return Ci(y)?(A=t.getRecordMatcher(y),B=D):B=y,t.addRoute(B,A)}function P(y){const D=t.getRecordMatcher(y);D&&t.removeRoute(D)}function O(){return t.getRoutes().map(y=>y.record)}function G(y){return!!t.getRecordMatcher(y)}function R(y,D){if(D=ie({},D||u.value),typeof y=="string"){const m=gs(s,y,D.path),w=t.resolve({path:m.path},D),S=o.createHref(m.fullPath);return ie(m,w,{params:g(w.params),hash:bn(m.hash),redirectedFrom:void 0,href:S})}let A;if(y.path!=null)A=ie({},y,{path:gs(s,y.path,D.path).path});else{const m=ie({},y.params);for(const w in m)m[w]==null&&delete m[w];A=ie({},y,{params:h(m)}),D.params=h(D.params)}const B=t.resolve(A,D),ce=y.hash||"";B.params=l(g(B.params));const f=xc(n,ie({},y,{hash:bc(ce),path:B.path})),d=o.createHref(f);return ie({fullPath:f,hash:ce,query:n===Qo?tu(y.query):y.query||{}},B,{redirectedFrom:void 0,href:d})}function I(y){return typeof y=="string"?gs(s,y,u.value.path):ie({},y)}function V(y,D){if(p!==y)return zt(8,{from:D,to:y})}function j(y){return z(y)}function x(y){return j(ie(I(y),{replace:!0}))}function ne(y){const D=y.matched[y.matched.length-1];if(D&&D.redirect){const{redirect:A}=D;let B=typeof A=="function"?A(y):A;return typeof B=="string"&&(B=B.includes("?")||B.includes("#")?B=I(B):{path:B},B.params={}),ie({query:y.query,hash:y.hash,params:B.path!=null?{}:y.params},B)}}function z(y,D){const A=p=R(y),B=u.value,ce=y.state,f=y.force,d=y.replace===!0,m=ne(A);if(m)return z(ie(I(m),{state:typeof m=="object"?ie({},ce,m.state):ce,force:f,replace:d}),D||A);const w=A;w.redirectedFrom=D;let S;return!f&&Ec(n,B,A)&&(S=zt(16,{to:w,from:B}),qe(B,B,!0,!1)),(S?Promise.resolve(S):oe(w,B)).catch(b=>it(b)?it(b,2)?b:He(b):te(b,w,B)).then(b=>{if(b){if(it(b,2))return z(ie({replace:d},I(b.to),{state:typeof b.to=="object"?ie({},ce,b.to.state):ce,force:f}),D||w)}else b=ae(w,B,!0,d,ce);return me(w,B,b),b})}function Q(y,D){const A=V(y,D);return A?Promise.reject(A):Promise.resolve()}function Y(y){const D=gt.values().next().value;return D&&typeof D.runWithContext=="function"?D.runWithContext(y):y()}function oe(y,D){let A;const[B,ce,f]=fu(y,D);A=vs(B.reverse(),"beforeRouteLeave",y,D);for(const m of B)m.leaveGuards.forEach(w=>{A.push(wt(w,y,D))});const d=Q.bind(null,y,D);return A.push(d),Ie(A).then(()=>{A=[];for(const m of r.list())A.push(wt(m,y,D));return A.push(d),Ie(A)}).then(()=>{A=vs(ce,"beforeRouteUpdate",y,D);for(const m of ce)m.updateGuards.forEach(w=>{A.push(wt(w,y,D))});return A.push(d),Ie(A)}).then(()=>{A=[];for(const m of f)if(m.beforeEnter)if(Qe(m.beforeEnter))for(const w of m.beforeEnter)A.push(wt(w,y,D));else A.push(wt(m.beforeEnter,y,D));return A.push(d),Ie(A)}).then(()=>(y.matched.forEach(m=>m.enterCallbacks={}),A=vs(f,"beforeRouteEnter",y,D,Y),A.push(d),Ie(A))).then(()=>{A=[];for(const m of i.list())A.push(wt(m,y,D));return A.push(d),Ie(A)}).catch(m=>it(m,8)?m:Promise.reject(m))}function me(y,D,A){a.list().forEach(B=>Y(()=>B(y,D,A)))}function ae(y,D,A,B,ce){const f=V(y,D);if(f)return f;const d=D===vt,m=Lt?history.state:{};A&&(B||d?o.replace(y.fullPath,ie({scroll:d&&m&&m.scroll},ce)):o.push(y.fullPath,ce)),u.value=y,qe(y,D,A,d),He()}let ge;function We(){ge||(ge=o.listen((y,D,A)=>{if(!Rt.listening)return;const B=R(y),ce=ne(B);if(ce){z(ie(ce,{replace:!0,force:!0}),B).catch(fn);return}p=B;const f=u.value;Lt&&Dc(Ho(f.fullPath,A.delta),ns()),oe(B,f).catch(d=>it(d,12)?d:it(d,2)?(z(ie(I(d.to),{force:!0}),B).then(m=>{it(m,20)&&!A.delta&&A.type===yn.pop&&o.go(-1,!1)}).catch(fn),Promise.reject()):(A.delta&&o.go(-A.delta,!1),te(d,B,f))).then(d=>{d=d||ae(B,f,!1),d&&(A.delta&&!it(d,8)?o.go(-A.delta,!1):A.type===yn.pop&&it(d,20)&&o.go(-1,!1)),me(B,f,d)}).catch(fn)}))}let Ge=$t(),de=$t(),K;function te(y,D,A){He(y);const B=de.list();return B.length?B.forEach(ce=>ce(y,D,A)):console.error(y),Promise.reject(y)}function ze(){return K&&u.value!==vt?Promise.resolve():new Promise((y,D)=>{Ge.add([y,D])})}function He(y){return K||(K=!y,We(),Ge.list().forEach(([D,A])=>y?A(y):D()),Ge.reset()),y}function qe(y,D,A,B){const{scrollBehavior:ce}=e;if(!Lt||!ce)return Promise.resolve();const f=!A&&jc(Ho(y.fullPath,0))||(B||!A)&&history.state&&history.state.scroll||null;return Qn().then(()=>ce(y,D,f)).then(d=>d&&Ic(d)).catch(d=>te(d,y,D))}const Ee=y=>o.go(y);let mt;const gt=new Set,Rt={currentRoute:u,listening:!0,addRoute:v,removeRoute:P,clearRoutes:t.clearRoutes,hasRoute:G,getRoutes:O,resolve:R,options:e,push:j,replace:x,go:Ee,back:()=>Ee(-1),forward:()=>Ee(1),beforeEach:r.add,beforeResolve:i.add,afterEach:a.add,onError:de.add,isReady:ze,install(y){const D=this;y.component("RouterLink",ru),y.component("RouterView",cu),y.config.globalProperties.$router=D,Object.defineProperty(y.config.globalProperties,"$route",{enumerable:!0,get:()=>qt(u)}),Lt&&!mt&&u.value===vt&&(mt=!0,j(o.location).catch(ce=>{}));const A={};for(const ce in vt)Object.defineProperty(A,ce,{get:()=>u.value[ce],enumerable:!0});y.provide(ss,D),y.provide(Ri,Pr(A)),y.provide(Ms,u);const B=y.unmount;gt.add(y),y.unmount=function(){gt.delete(y),gt.size<1&&(p=vt,ge&&ge(),ge=null,u.value=vt,mt=!1,K=!1),B()}}};function Ie(y){return y.reduce((D,A)=>D.then(()=>Y(A)),Promise.resolve())}return Rt}function fu(e,t){const s=[],n=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let i=0;iGt(p,a))?n.push(a):s.push(a));const u=e.matched[i];u&&(t.matched.find(p=>Gt(p,u))||o.push(u))}return[s,n,o]}function Ai(){return Ye(ss)}const os=ac("auth",()=>{const e=Z(null),t=Z(null),s=Z(!1),n=(a,u)=>{e.value=a,t.value=u,s.value=!0,localStorage.setItem("auth_token",u),localStorage.setItem("user",JSON.stringify(a))},o=()=>{e.value=null,t.value=null,s.value=!1,localStorage.removeItem("auth_token"),localStorage.removeItem("user")};return{user:e,token:t,isAuthenticated:s,login:n,logout:o,checkAuth:()=>{const a=localStorage.getItem("auth_token"),u=localStorage.getItem("user");a&&u?(t.value=a,e.value=JSON.parse(u),s.value=!0):o()},getAuthHeaders:()=>t.value?{"Content-Type":"application/json",Authorization:`Bearer ${t.value}`}:{}}}),Qt=(e,t)=>{const s=e.__vccOpts||e;for(const[n,o]of t)s[n]=o;return s},du={name:"Home",setup(){const e=Z({}),t=async()=>{try{const s=await fetch("/api/public/page-content");s.ok&&(e.value=await s.json())}catch(s){console.error("Failed to fetch page content:",s)}};return Yt(()=>{t()}),{content:e}}},hu={class:"home"},pu={class:"hero"},mu={class:"features"},gu={class:"feature-card"},vu={class:"feature-card"},_u={class:"feature-card"},bu={class:"feature-card"},yu={class:"cta"},wu={class:"cta-buttons"};function Su(e,t,s,n,o,r){const i=Nn("router-link");return q(),W("div",hu,[c("div",pu,[c("h1",null,F(n.content.home_hero_title||"Welkom bij Fiets Service Centrum"),1),c("p",null,F(n.content.home_hero_subtitle||"Professionele fietsreparatie en onderhoudsdiensten"),1)]),c("div",mu,[c("div",gu,[c("h3",null,F(n.content.home_feature_1_title||"🔧 Deskundige Reparaties"),1),c("p",null,F(n.content.home_feature_1_text||"Professionele fietsmonteurs met jarenlange ervaring"),1)]),c("div",vu,[c("h3",null,F(n.content.home_feature_2_title||"⚡ Snelle Service"),1),c("p",null,F(n.content.home_feature_2_text||"Snelle doorlooptijden voor de meeste reparaties"),1)]),c("div",_u,[c("h3",null,F(n.content.home_feature_3_title||"💰 Eerlijke Prijzen"),1),c("p",null,F(n.content.home_feature_3_text||"Concurrerende tarieven zonder verborgen kosten"),1)]),c("div",bu,[c("h3",null,F(n.content.home_feature_4_title||"📅 Eenvoudig Boeken"),1),c("p",null,F(n.content.home_feature_4_text||"Eenvoudig online boekingssysteem"),1)])]),c("div",yu,[c("h2",null,F(n.content.home_cta_title||"Klaar om je fiets te laten repareren?"),1),c("p",null,F(n.content.home_cta_subtitle||"Boek je afspraak online en krijg je fiets weer in topconditie."),1),c("div",wu,[be(i,{to:"/booking",class:"cta-button"},{default:tt(()=>[Se(F(n.content.home_cta_button_1_text||"Nu Service Boeken"),1)]),_:1}),be(i,{to:"/pricelist",class:"cta-button secondary"},{default:tt(()=>[Se(F(n.content.home_cta_button_2_text||"💰 Prijslijst Bekijken"),1)]),_:1})])])])}const ku=Qt(du,[["render",Su],["__scopeId","data-v-677cbdbe"]]),Cu={name:"Booking",setup(){const e=Z({name:"",address:"",place:"",email:"",phone:"",repair_description:"",requested_date:"",requested_time:""}),t=Z(!1),s=Z(""),n=Z(!1),o=Z(null),r=Z({}),i=Z(new Date),a=Z([]),u=["Zo","Ma","Di","Wo","Do","Vr","Za"],p=xe(()=>{const x=new Date;return x.setDate(x.getDate()+1),x.toISOString().split("T")[0]}),l=xe(()=>i.value.toLocaleDateString("nl-NL",{month:"long",year:"numeric"})),h=xe(()=>{const x=i.value.getFullYear(),ne=i.value.getMonth(),z=new Date(x,ne,1),Q=new Date(x,ne+1,0),Y=z.getDay(),oe=Q.getDay(),me=[];for(let ae=Y-1;ae>=0;ae--){const ge=new Date(x,ne,-ae);me.push(g(ge,!1))}for(let ae=1;ae<=Q.getDate();ae++){const ge=new Date(x,ne,ae);me.push(g(ge,!0))}for(let ae=1;ae<=6-oe;ae++){const ge=new Date(x,ne+1,ae);me.push(g(ge,!1))}return me}),g=(x,ne)=>{const z=x.toISOString().split("T")[0],Q=new Date,Y=new Date;Y.setDate(Y.getDate()+1);const oe=z===Q.toISOString().split("T")[0],me=znew Date(We.date).toISOString().split("T")[0]===z),ge=z===e.value.requested_date;return{date:z,day:x.getDate(),key:z,isCurrentMonth:ne,isToday:oe,isDisabled:me,isBlocked:ae,isSelected:ge}},v=async()=>{try{const x=await fetch("/api/public/blocked-dates");x.ok&&(a.value=await x.json())}catch(x){console.error("Failed to fetch blocked dates:",x)}},P=async()=>{try{const x=await fetch("/api/public/page-content");x.ok&&(r.value=await x.json())}catch(x){console.error("Failed to fetch page content:",x)}},O=()=>{i.value=new Date(i.value.getFullYear(),i.value.getMonth()-1,1)},G=()=>{i.value=new Date(i.value.getFullYear(),i.value.getMonth()+1,1)},R=x=>{x.isDisabled||x.isBlocked||(e.value.requested_date=x.date)},I=()=>!e.value.email&&!e.value.phone?(s.value="Geef alstublieft een e-mailadres of telefoonnummer op",!1):(s.value="",!0),V=async()=>{if(I()){t.value=!0,s.value="";try{const x=await fetch("/api/public/service-requests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e.value)});if(!x.ok){const z=await x.json();throw new Error(z.message||"Aanvraag versturen mislukt")}const ne=await x.json();o.value=ne,n.value=!0,Object.keys(e.value).forEach(z=>{e.value[z]=""})}catch(x){s.value=x.message}finally{t.value=!1}}},j=()=>{n.value=!1,o.value=null};return Yt(()=>{const x=new Date;x.setDate(x.getDate()+1),e.value.requested_date=x.toISOString().split("T")[0],v(),P()}),{form:e,loading:t,formError:s,showSuccessModal:n,submittedRequest:o,content:r,minDate:p,submitForm:V,closeSuccessModal:j,currentDate:i,blockedDates:a,weekdays:u,calendarDates:h,currentMonthYear:l,previousMonth:O,nextMonth:G,selectDate:R}}},xu={class:"booking"},Eu={class:"booking-header"},Pu={class:"booking-form-container"},Ru={class:"form-row"},Au={class:"form-group"},Tu={class:"form-row"},Ou={class:"form-group"},Mu={class:"form-row"},Iu={class:"form-group"},Du={class:"form-row"},ju={class:"form-group"},Vu={class:"form-group"},Fu={class:"form-row"},Bu={class:"form-group full-width"},Lu={class:"form-row"},Nu={class:"form-group"},Hu={class:"custom-date-picker"},qu={class:"date-picker-header"},Uu={class:"current-month"},Ku={class:"date-picker-grid"},Wu=["onClick"],Gu={class:"form-group"},zu={key:0,class:"form-error"},Ju={class:"form-actions"},Yu=["disabled"],Qu={class:"modal-body"},Zu={class:"modal-footer"};function Xu(e,t,s,n,o,r){return q(),W("div",xu,[c("div",Eu,[c("h1",null,F(n.content.booking_header_title||"🚲 Boek Je Fiets Service"),1),c("p",null,F(n.content.booking_header_subtitle||"Vul het onderstaande formulier in om je fietsreparatie of onderhoud in te plannen"),1)]),c("div",Pu,[c("form",{onSubmit:t[10]||(t[10]=at((...i)=>n.submitForm&&n.submitForm(...i),["prevent"])),class:"booking-form"},[c("div",Ru,[c("div",Au,[t[14]||(t[14]=c("label",{for:"name"},"Volledige Naam *",-1)),ve(c("input",{type:"text",id:"name","onUpdate:modelValue":t[0]||(t[0]=i=>n.form.name=i),required:"",placeholder:"Voer je volledige naam in"},null,512),[[_e,n.form.name]])])]),c("div",Tu,[c("div",Ou,[t[15]||(t[15]=c("label",{for:"address"},"Adres *",-1)),ve(c("textarea",{id:"address","onUpdate:modelValue":t[1]||(t[1]=i=>n.form.address=i),required:"",placeholder:"Voer je volledige adres in",rows:"3"},null,512),[[_e,n.form.address]])])]),c("div",Mu,[c("div",Iu,[t[16]||(t[16]=c("label",{for:"place"},"Plaats *",-1)),ve(c("input",{type:"text",id:"place","onUpdate:modelValue":t[2]||(t[2]=i=>n.form.place=i),required:"",placeholder:"Voer je plaats in"},null,512),[[_e,n.form.place]])])]),c("div",Du,[c("div",ju,[t[17]||(t[17]=c("label",{for:"email"},"E-mail",-1)),ve(c("input",{type:"email",id:"email","onUpdate:modelValue":t[3]||(t[3]=i=>n.form.email=i),placeholder:"Voer je e-mailadres in"},null,512),[[_e,n.form.email]])]),c("div",Vu,[t[18]||(t[18]=c("label",{for:"phone"},"Telefoon",-1)),ve(c("input",{type:"tel",id:"phone","onUpdate:modelValue":t[4]||(t[4]=i=>n.form.phone=i),placeholder:"Voer je telefoonnummer in"},null,512),[[_e,n.form.phone]])])]),c("div",Fu,[c("div",Bu,[t[19]||(t[19]=c("label",{for:"repair_description"},"Wat moet er gerepareerd worden? *",-1)),ve(c("textarea",{id:"repair_description","onUpdate:modelValue":t[5]||(t[5]=i=>n.form.repair_description=i),required:"",placeholder:"Beschrijf het probleem met je fiets of welke service je nodig hebt",rows:"4"},null,512),[[_e,n.form.repair_description]])])]),c("div",Lu,[c("div",Nu,[t[20]||(t[20]=c("label",{for:"requested_date"},"Gewenste Datum *",-1)),c("div",Hu,[c("div",qu,[c("button",{type:"button",onClick:t[6]||(t[6]=(...i)=>n.previousMonth&&n.previousMonth(...i)),class:"nav-btn"},"‹"),c("span",Uu,F(n.currentMonthYear),1),c("button",{type:"button",onClick:t[7]||(t[7]=(...i)=>n.nextMonth&&n.nextMonth(...i)),class:"nav-btn"},"›")]),c("div",Ku,[(q(!0),W(Ce,null,St(n.weekdays,i=>(q(),W("div",{class:"weekday-header",key:i},F(i),1))),128)),(q(!0),W(Ce,null,St(n.calendarDates,i=>(q(),W("div",{key:i.key,class:Mt(["calendar-date",{"other-month":!i.isCurrentMonth,disabled:i.isDisabled,blocked:i.isBlocked,selected:i.isSelected,today:i.isToday}]),onClick:a=>n.selectDate(i)},F(i.day),11,Wu))),128))]),ve(c("input",{type:"hidden",id:"requested_date","onUpdate:modelValue":t[8]||(t[8]=i=>n.form.requested_date=i),required:""},null,512),[[_e,n.form.requested_date]])])]),c("div",Gu,[t[21]||(t[21]=c("label",{for:"requested_time"},"Gewenste Tijd *",-1)),ve(c("input",{type:"time",id:"requested_time","onUpdate:modelValue":t[9]||(t[9]=i=>n.form.requested_time=i),required:"",min:"08:00",max:"18:00"},null,512),[[_e,n.form.requested_time]])])]),n.formError?(q(),W("div",zu,F(n.formError),1)):Re("",!0),c("div",Ju,[c("button",{type:"submit",class:"submit-btn",disabled:n.loading},F(n.loading?"Versturen...":"Service Aanvraag Versturen"),9,Yu)])],32)]),n.showSuccessModal?(q(),W("div",{key:0,class:"modal-overlay",onClick:t[13]||(t[13]=(...i)=>n.closeSuccessModal&&n.closeSuccessModal(...i))},[c("div",{class:"modal-content",onClick:t[12]||(t[12]=at(()=>{},["stop"]))},[t[24]||(t[24]=c("div",{class:"modal-header"},[c("h3",null,"✅ Service Aanvraag Verzonden!")],-1)),c("div",Qu,[t[23]||(t[23]=c("p",null,"Bedankt voor je service aanvraag. We nemen binnenkort contact met je op om je afspraak te bevestigen.",-1)),c("p",null,[t[22]||(t[22]=c("strong",null,"Aanvraag ID:",-1)),Se(" "+F(n.submittedRequest.id),1)])]),c("div",Zu,[c("button",{onClick:t[11]||(t[11]=(...i)=>n.closeSuccessModal&&n.closeSuccessModal(...i)),class:"btn-primary"},"Sluiten")])])])):Re("",!0)])}const $u=Qt(Cu,[["render",Xu],["__scopeId","data-v-3d2c946f"]]),ef={name:"Admin",setup(){const e=Ai(),t=os(),s=Z("requests"),n=Z(!1),o=Z([]),r=Z([]),i=Z({}),a=Z([]),u=Z([]),p=Z(!1),l=Z(!1),h=Z(!1),g=Z(!1),v=Z(!1),P=Z(!1),O=Z(!1),G=Z(!1),R=Z(null),I=Z(null),V=Z(null),j=Z({date:"",reason:""}),x=Z({title:"",description:"",price:"",sort_order:0,is_active:!0}),ne=Z({message:""}),z=Z({message:""}),Q=Z([]),Y=Z(!1),oe=Z(!1),me=[{id:"requests",label:"Service Aanvragen"},{id:"blocked",label:"Geblokkeerde Data"},{id:"pricelist",label:"Prijslijst"},{id:"content",label:"Pagina Teksten"},{id:"settings",label:"Instellingen"}],ae=xe(()=>{const _=new Date;return _.setDate(_.getDate()+1),_.toISOString().split("T")[0]}),ge=_=>({pending:"In afwachting",confirmed:"Bevestigd",completed:"Voltooid",cancelled:"Geannuleerd"})[_]||_,We=_=>({email:"E-MAIL",sms:"SMS"})[_]||_.toUpperCase(),Ge=_=>({admin_to_customer:"Naar Klant",customer_to_admin:"Van Klant"})[_]||_,de=async()=>{try{await fetch("/api/logout",{method:"POST",headers:t.getAuthHeaders()})}catch(_){console.error("Logout error:",_)}finally{t.logout(),e.push("/login")}},K=async()=>{try{const _=await fetch("/api/service-requests",{headers:t.getAuthHeaders()});_.ok&&(o.value=await _.json())}catch(_){console.error("Failed to fetch requests:",_)}},te=async()=>{try{const _=await fetch("/api/blocked-dates",{headers:t.getAuthHeaders()});_.ok&&(r.value=await _.json())}catch(_){console.error("Failed to fetch blocked dates:",_)}},ze=async()=>{try{const _=await fetch("/api/settings",{headers:t.getAuthHeaders()});_.ok&&(await _.json()).forEach(X=>{i.value[X.key]=X.value})}catch(_){console.error("Failed to fetch settings:",_)}},He=async()=>{try{const _=await fetch("/api/admin/pricelist",{headers:t.getAuthHeaders()});_.ok&&(a.value=await _.json())}catch(_){console.error("Failed to fetch pricelist:",_)}},qe=async()=>{try{const _=await fetch("/api/page-content",{headers:t.getAuthHeaders()});_.ok&&(u.value=await _.json())}catch(_){console.error("Failed to fetch page content:",_)}},Ee=async()=>{n.value=!0,await K(),n.value=!1},mt=async _=>{O.value=!0,p.value=!0;try{const L=await fetch(`/api/service-requests/${_.id}`,{headers:t.getAuthHeaders()});if(L.ok){const X=await L.json();R.value={...X}}else{const X=o.value.find(Ve=>Ve.id===_.id);R.value=X?{...X}:{..._}}}catch(L){console.error("Failed to fetch latest request data:",L);const X=o.value.find(Ve=>Ve.id===_.id);R.value=X?{...X}:{..._}}finally{O.value=!1}},gt=()=>{p.value=!1,R.value=null},Rt=()=>{l.value=!1,I.value=null,j.value={date:"",reason:""}},Ie=()=>{h.value=!1,ne.value.message=""},y=()=>{g.value=!1,z.value.message=""},D=()=>{v.value=!1,Q.value=[]},A=()=>{P.value=!1,V.value=null,x.value={title:"",description:"",price:"",sort_order:0,is_active:!0}},B=_=>{R.value=_,h.value=!0},ce=_=>{R.value=_,g.value=!0},f=async _=>{R.value=_;try{const L=await fetch(`/api/service-requests/${_.id}/communications`,{headers:t.getAuthHeaders()});L.ok&&(Q.value=await L.json())}catch(L){console.error("Failed to fetch communications:",L)}v.value=!0},d=async()=>{if(ne.value.message.trim()){Y.value=!0;try{(await fetch(`/api/service-requests/${R.value.id}/send-email`,{method:"POST",headers:t.getAuthHeaders(),body:JSON.stringify({message:ne.value.message})})).ok&&(Ie(),await K())}catch(_){console.error("Failed to send email:",_)}finally{Y.value=!1}}},m=async()=>{if(z.value.message.trim()){oe.value=!0;try{(await fetch(`/api/service-requests/${R.value.id}/send-sms`,{method:"POST",headers:t.getAuthHeaders(),body:JSON.stringify({message:z.value.message})})).ok&&(y(),await K())}catch(_){console.error("Failed to send SMS:",_)}finally{oe.value=!1}}},w=_=>{I.value=_,j.value={date:_.date,reason:_.reason||""},l.value=!0},S=async()=>{try{const _=I.value?`/api/blocked-dates/${I.value.id}`:"/api/blocked-dates",L=I.value?"PUT":"POST";(await fetch(_,{method:L,headers:t.getAuthHeaders(),body:JSON.stringify(j.value)})).ok&&(Rt(),await te())}catch(_){console.error("Failed to save blocked date:",_)}},b=async _=>{if(confirm("Weet je zeker dat je deze geblokkeerde datum wilt verwijderen?"))try{(await fetch(`/api/blocked-dates/${_}`,{method:"DELETE",headers:t.getAuthHeaders()})).ok&&await te()}catch(L){console.error("Failed to delete blocked date:",L)}},T=async(_,L)=>{try{(await fetch(`/api/settings/key/${_}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({value:L,description:""})})).ok&&console.log(`Setting ${_} updated successfully`)}catch(X){console.error("Failed to update setting:",X)}},E=async()=>{try{if((await fetch(`/api/service-requests/${R.value.id}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({status:R.value.status})})).ok){const L=o.value.findIndex(X=>X.id===R.value.id);L!==-1&&(o.value[L].status=R.value.status),await K()}}catch(_){console.error("Failed to update request status:",_)}},C=async()=>{try{if((await fetch(`/api/service-requests/${R.value.id}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({actual_repair_date:R.value.actual_repair_date})})).ok){const L=o.value.findIndex(X=>X.id===R.value.id);L!==-1&&(o.value[L].actual_repair_date=R.value.actual_repair_date),await K()}}catch(_){console.error("Failed to update request date:",_)}},k=async()=>{try{if((await fetch(`/api/service-requests/${R.value.id}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({actual_repair_date:R.value.actual_repair_date,actual_repair_time:R.value.actual_repair_time})})).ok){const L=o.value.findIndex(X=>X.id===R.value.id);L!==-1&&(o.value[L].actual_repair_date=R.value.actual_repair_date,o.value[L].actual_repair_time=R.value.actual_repair_time),await K()}}catch(_){console.error("Failed to update request time:",_)}},H=_=>{V.value=_,x.value={..._},P.value=!0},M=async()=>{try{const _=V.value?`/api/pricelist/${V.value.id}`:"/api/pricelist",L=V.value?"PUT":"POST";(await fetch(_,{method:L,headers:t.getAuthHeaders(),body:JSON.stringify(x.value)})).ok&&(A(),await He())}catch(_){console.error("Failed to save pricelist item:",_)}},N=async _=>{if(confirm("Weet je zeker dat je dit prijslijst item wilt verwijderen?"))try{(await fetch(`/api/pricelist/${_}`,{method:"DELETE",headers:t.getAuthHeaders()})).ok&&await He()}catch(L){console.error("Failed to delete pricelist item:",L)}},J=_=>{const L=u.value.find(X=>X.key===_);return L?L.value:""},ee=(_,L)=>{const X=u.value.find(Ve=>Ve.key===_);X&&(X.value=L)},ue=async _=>{const L=u.value.find(X=>X.key===_);if(L)try{(await fetch(`/api/page-content/key/${_}`,{method:"PUT",headers:t.getAuthHeaders(),body:JSON.stringify({value:L.value,description:L.description})})).ok&&console.log(`Content ${_} updated successfully`)}catch(X){console.error("Failed to update page content:",X)}},re=(_,L)=>{if(!_)return"N/A";const Ve=new Date(_).toLocaleDateString("nl-NL");return L?`${Ve} ${L}`:Ve},Pe=_=>new Date(_).toISOString().split("T")[0];return Yt(()=>{t.checkAuth(),K(),te(),He(),qe(),ze()}),{activeTab:s,tabs:me,loading:n,requests:o,blockedDates:r,settings:i,pricelist:a,pageContent:u,user:xe(()=>t.user),showRequestModal:p,showAddBlockedDate:l,showEmailModal:h,showSmsModal:g,showCommunicationsModal:v,showAddPricelistItem:P,requestModalLoading:O,pricelistLoading:G,selectedRequest:R,editingBlockedDate:I,editingPricelistItem:V,blockedDateForm:j,pricelistForm:x,emailForm:ne,smsForm:z,communications:Q,emailLoading:Y,smsLoading:oe,minDate:ae,getStatusText:ge,getCommTypeText:We,getCommDirectionText:Ge,handleLogout:de,refreshRequests:Ee,viewRequest:mt,closeRequestModal:gt,closeBlockedDateModal:Rt,closePricelistModal:A,closeEmailModal:Ie,closeSmsModal:y,closeCommunicationsModal:D,sendEmail:B,sendSms:ce,viewCommunications:f,submitEmail:d,submitSms:m,editBlockedDate:w,saveBlockedDate:S,deleteBlockedDate:b,editPricelistItem:H,savePricelistItem:M,deletePricelistItem:N,updateSetting:T,updateRequestStatus:E,updateRequestDate:C,updateRequestTime:k,getContentValue:J,updateContentValue:ee,savePageContent:ue,formatDateTime:re,formatDate:Pe}}},tf={class:"admin"},nf={class:"admin-header"},sf={class:"admin-user-info"},of={class:"admin-tabs"},rf=["onClick"],lf={key:0,class:"tab-content"},af={class:"section-header"},cf=["disabled","title"],uf={class:"requests-table"},ff={key:0,class:"loading-row"},df={key:1,class:"empty-row"},hf={class:"cell"},pf={class:"cell"},mf={class:"cell"},gf={class:"cell"},vf={class:"cell actions"},_f=["onClick"],bf=["onClick","disabled"],yf=["onClick","disabled"],wf=["onClick"],Sf={key:1,class:"tab-content"},kf={class:"section-header"},Cf={class:"blocked-dates-list"},xf={class:"date-info"},Ef={class:"date"},Pf={key:0,class:"reason"},Rf={class:"date-actions"},Af=["onClick"],Tf=["onClick"],Of={key:2,class:"tab-content"},Mf={class:"section-header"},If={class:"pricelist-table"},Df={key:0,class:"loading-row"},jf={key:1,class:"empty-row"},Vf={class:"cell"},Ff={class:"cell"},Bf={class:"cell"},Lf={class:"cell"},Nf={class:"cell"},Hf={class:"cell actions"},qf=["onClick"],Uf=["onClick"],Kf={key:3,class:"tab-content"},Wf={class:"content-sections"},Gf={class:"content-section"},zf={class:"content-form"},Jf={class:"form-group"},Yf=["value"],Qf={class:"form-group"},Zf=["value"],Xf={class:"content-section"},$f={class:"content-form"},ed={class:"feature-group"},td={class:"form-group"},nd=["value"],sd={class:"form-group"},od=["value"],rd={class:"feature-group"},id={class:"form-group"},ld=["value"],ad={class:"form-group"},cd=["value"],ud={class:"feature-group"},fd={class:"form-group"},dd=["value"],hd={class:"form-group"},pd=["value"],md={class:"feature-group"},gd={class:"form-group"},vd=["value"],_d={class:"form-group"},bd=["value"],yd={class:"content-section"},wd={class:"content-form"},Sd={class:"form-group"},kd=["value"],Cd={class:"form-group"},xd=["value"],Ed={class:"form-group"},Pd=["value"],Rd={class:"form-group"},Ad=["value"],Td={class:"content-section"},Od={class:"content-form"},Md={class:"form-group"},Id=["value"],Dd={class:"form-group"},jd=["value"],Vd={key:4,class:"tab-content"},Fd={class:"settings-form"},Bd={class:"setting-group"},Ld={class:"setting-group"},Nd={class:"modal-header"},Hd={key:0,class:"modal-body"},qd={key:0,class:"loading-state"},Ud={key:1,class:"request-details"},Kd={class:"detail-row"},Wd={class:"detail-row"},Gd={class:"detail-row"},zd={class:"detail-row"},Jd={class:"detail-row"},Yd={class:"detail-row"},Qd={class:"detail-row"},Zd={class:"detail-row"},Xd={class:"detail-row"},$d={class:"detail-row"},eh={class:"modal-footer"},th={class:"modal-header"},nh={class:"modal-body"},sh={class:"form-group"},oh=["min"],rh={class:"form-group"},ih={class:"modal-footer"},lh={class:"modal-header"},ah={class:"modal-body"},ch={class:"form-group"},uh={class:"modal-footer"},fh=["disabled"],dh={class:"modal-header"},hh={class:"modal-body"},ph={class:"form-group"},mh={class:"modal-footer"},gh=["disabled"],vh={class:"modal-header"},_h={class:"modal-body"},bh={key:0,class:"no-communications"},yh={key:1,class:"communications-list"},wh={class:"comm-header"},Sh={class:"comm-type"},kh={class:"comm-direction"},Ch={class:"comm-date"},xh={class:"comm-message"},Eh={class:"modal-footer"},Ph={class:"modal-header"},Rh={class:"modal-body"},Ah={class:"form-group"},Th={class:"form-group"},Oh={class:"form-group"},Mh={class:"form-group"},Ih={class:"form-group"},Dh={class:"modal-footer"};function jh(e,t,s,n,o,r){var i,a,u,p;return q(),W("div",tf,[c("div",nf,[t[83]||(t[83]=c("h1",null,"🔧 Beheer Dashboard",-1)),t[84]||(t[84]=c("p",null,"Beheer fiets service aanvragen, geblokkeerde data en instellingen",-1)),c("div",sf,[c("span",null,"Ingelogd als: "+F((i=n.user)==null?void 0:i.name),1),c("button",{onClick:t[0]||(t[0]=(...l)=>n.handleLogout&&n.handleLogout(...l)),class:"logout-btn"},"Uitloggen")])]),c("div",of,[(q(!0),W(Ce,null,St(n.tabs,l=>(q(),W("button",{key:l.id,onClick:h=>n.activeTab=l.id,class:Mt(["tab-button",{active:n.activeTab===l.id}])},F(l.label),11,rf))),128))]),n.activeTab==="requests"?(q(),W("div",lf,[c("div",af,[t[85]||(t[85]=c("h2",null,"Service Aanvragen",-1)),c("button",{onClick:t[1]||(t[1]=(...l)=>n.refreshRequests&&n.refreshRequests(...l)),class:"refresh-btn",disabled:n.loading,title:n.loading?"Verversen...":"Verversen"},F((n.loading,"🔄")),9,cf)]),c("div",uf,[t[88]||(t[88]=bo('
ID
Naam
Datum/Tijd
Status
Acties
',1)),n.loading?(q(),W("div",ff,[...t[86]||(t[86]=[c("div",{class:"loading-text"},"Aanvragen laden...",-1)])])):n.requests.length===0?(q(),W("div",df,[...t[87]||(t[87]=[c("div",{class:"empty-text"},"Geen service aanvragen gevonden",-1)])])):(q(!0),W(Ce,{key:2},St(n.requests,l=>(q(),W("div",{class:"table-row",key:l.id},[c("div",hf,F(l.id),1),c("div",pf,F(l.name),1),c("div",mf,F(n.formatDateTime(l.requested_date,l.requested_time)),1),c("div",gf,[c("span",{class:Mt(["status-badge",l.status])},F(n.getStatusText(l.status)),3)]),c("div",vf,[c("button",{onClick:h=>n.viewRequest(l),class:"action-btn view",title:"Bekijken"}," 👁️ ",8,_f),c("button",{onClick:h=>n.sendEmail(l),class:"action-btn email",disabled:!l.email,title:"E-mail versturen"}," 📧 ",8,bf),c("button",{onClick:h=>n.sendSms(l),class:"action-btn sms",disabled:!l.phone,title:"SMS versturen"}," 📱 ",8,yf),c("button",{onClick:h=>n.viewCommunications(l),class:"action-btn comm",title:"Communicatie bekijken"}," 💬 ",8,wf)])]))),128))])])):Re("",!0),n.activeTab==="blocked"?(q(),W("div",Sf,[c("div",kf,[t[89]||(t[89]=c("h2",null,"Geblokkeerde Data",-1)),c("button",{onClick:t[2]||(t[2]=l=>n.showAddBlockedDate=!0),class:"add-btn",title:"Geblokkeerde Datum Toevoegen"},"➕")]),c("div",Cf,[(q(!0),W(Ce,null,St(n.blockedDates,l=>(q(),W("div",{key:l.id,class:"blocked-date-item"},[c("div",xf,[c("span",Ef,F(n.formatDate(l.date)),1),l.reason?(q(),W("span",Pf,F(l.reason),1)):Re("",!0)]),c("div",Rf,[c("button",{onClick:h=>n.editBlockedDate(l),class:"edit-btn",title:"Bewerken"},"✏️",8,Af),c("button",{onClick:h=>n.deleteBlockedDate(l.id),class:"delete-btn",title:"Verwijderen"},"🗑️",8,Tf)])]))),128))])])):Re("",!0),n.activeTab==="pricelist"?(q(),W("div",Of,[c("div",Mf,[t[90]||(t[90]=c("h2",null,"Prijslijst Beheer",-1)),c("button",{onClick:t[3]||(t[3]=l=>n.showAddPricelistItem=!0),class:"add-btn",title:"Prijslijst Item Toevoegen"},"➕")]),c("div",If,[t[93]||(t[93]=bo('
Titel
Beschrijving
Prijs
Volgorde
Status
Acties
',1)),n.pricelistLoading?(q(),W("div",Df,[...t[91]||(t[91]=[c("div",{class:"loading-text"},"Prijslijst laden...",-1)])])):n.pricelist.length===0?(q(),W("div",jf,[...t[92]||(t[92]=[c("div",{class:"empty-text"},"Geen prijslijst items gevonden",-1)])])):(q(!0),W(Ce,{key:2},St(n.pricelist,l=>(q(),W("div",{class:"table-row",key:l.id},[c("div",Vf,F(l.title),1),c("div",Ff,F(l.description),1),c("div",Bf,"€"+F(l.price),1),c("div",Lf,F(l.sort_order),1),c("div",Nf,[c("span",{class:Mt(["status-badge",l.is_active?"active":"inactive"])},F(l.is_active?"Actief":"Inactief"),3)]),c("div",Hf,[c("button",{onClick:h=>n.editPricelistItem(l),class:"action-btn edit",title:"Bewerken"},"✏️",8,qf),c("button",{onClick:h=>n.deletePricelistItem(l.id),class:"action-btn delete",title:"Verwijderen"},"🗑️",8,Uf)])]))),128))])])):Re("",!0),n.activeTab==="content"?(q(),W("div",Kf,[t[118]||(t[118]=c("div",{class:"section-header"},[c("h2",null,"Pagina Teksten Beheer")],-1)),c("div",Wf,[c("div",Gf,[t[96]||(t[96]=c("h3",null,"Openingspagina - Hero Sectie",-1)),c("div",zf,[c("div",Jf,[t[94]||(t[94]=c("label",null,"Hoofdtekst (Header)",-1)),c("input",{type:"text",value:n.getContentValue("home_hero_title"),onInput:t[4]||(t[4]=l=>n.updateContentValue("home_hero_title",l.target.value)),onBlur:t[5]||(t[5]=l=>n.savePageContent("home_hero_title"))},null,40,Yf)]),c("div",Qf,[t[95]||(t[95]=c("label",null,"Subtekst (Subheader)",-1)),c("input",{type:"text",value:n.getContentValue("home_hero_subtitle"),onInput:t[6]||(t[6]=l=>n.updateContentValue("home_hero_subtitle",l.target.value)),onBlur:t[7]||(t[7]=l=>n.savePageContent("home_hero_subtitle"))},null,40,Zf)])])]),c("div",Xf,[t[109]||(t[109]=c("h3",null,"Openingspagina - Panelen",-1)),c("div",$f,[c("div",ed,[t[99]||(t[99]=c("h4",null,"Paneel 1",-1)),c("div",td,[t[97]||(t[97]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_1_title"),onInput:t[8]||(t[8]=l=>n.updateContentValue("home_feature_1_title",l.target.value)),onBlur:t[9]||(t[9]=l=>n.savePageContent("home_feature_1_title"))},null,40,nd)]),c("div",sd,[t[98]||(t[98]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_1_text"),onInput:t[10]||(t[10]=l=>n.updateContentValue("home_feature_1_text",l.target.value)),onBlur:t[11]||(t[11]=l=>n.savePageContent("home_feature_1_text")),rows:"2"},null,40,od)])]),c("div",rd,[t[102]||(t[102]=c("h4",null,"Paneel 2",-1)),c("div",id,[t[100]||(t[100]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_2_title"),onInput:t[12]||(t[12]=l=>n.updateContentValue("home_feature_2_title",l.target.value)),onBlur:t[13]||(t[13]=l=>n.savePageContent("home_feature_2_title"))},null,40,ld)]),c("div",ad,[t[101]||(t[101]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_2_text"),onInput:t[14]||(t[14]=l=>n.updateContentValue("home_feature_2_text",l.target.value)),onBlur:t[15]||(t[15]=l=>n.savePageContent("home_feature_2_text")),rows:"2"},null,40,cd)])]),c("div",ud,[t[105]||(t[105]=c("h4",null,"Paneel 3",-1)),c("div",fd,[t[103]||(t[103]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_3_title"),onInput:t[16]||(t[16]=l=>n.updateContentValue("home_feature_3_title",l.target.value)),onBlur:t[17]||(t[17]=l=>n.savePageContent("home_feature_3_title"))},null,40,dd)]),c("div",hd,[t[104]||(t[104]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_3_text"),onInput:t[18]||(t[18]=l=>n.updateContentValue("home_feature_3_text",l.target.value)),onBlur:t[19]||(t[19]=l=>n.savePageContent("home_feature_3_text")),rows:"2"},null,40,pd)])]),c("div",md,[t[108]||(t[108]=c("h4",null,"Paneel 4",-1)),c("div",gd,[t[106]||(t[106]=c("label",null,"Koptekst",-1)),c("input",{type:"text",value:n.getContentValue("home_feature_4_title"),onInput:t[20]||(t[20]=l=>n.updateContentValue("home_feature_4_title",l.target.value)),onBlur:t[21]||(t[21]=l=>n.savePageContent("home_feature_4_title"))},null,40,vd)]),c("div",_d,[t[107]||(t[107]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("home_feature_4_text"),onInput:t[22]||(t[22]=l=>n.updateContentValue("home_feature_4_text",l.target.value)),onBlur:t[23]||(t[23]=l=>n.savePageContent("home_feature_4_text")),rows:"2"},null,40,bd)])])])]),c("div",yd,[t[114]||(t[114]=c("h3",null,"Openingspagina - Knoppen Container",-1)),c("div",wd,[c("div",Sd,[t[110]||(t[110]=c("label",null,"Hoofdtekst",-1)),c("input",{type:"text",value:n.getContentValue("home_cta_title"),onInput:t[24]||(t[24]=l=>n.updateContentValue("home_cta_title",l.target.value)),onBlur:t[25]||(t[25]=l=>n.savePageContent("home_cta_title"))},null,40,kd)]),c("div",Cd,[t[111]||(t[111]=c("label",null,"Subtekst",-1)),c("textarea",{value:n.getContentValue("home_cta_subtitle"),onInput:t[26]||(t[26]=l=>n.updateContentValue("home_cta_subtitle",l.target.value)),onBlur:t[27]||(t[27]=l=>n.savePageContent("home_cta_subtitle")),rows:"2"},null,40,xd)]),c("div",Ed,[t[112]||(t[112]=c("label",null,"Knop 1 Tekst",-1)),c("input",{type:"text",value:n.getContentValue("home_cta_button_1_text"),onInput:t[28]||(t[28]=l=>n.updateContentValue("home_cta_button_1_text",l.target.value)),onBlur:t[29]||(t[29]=l=>n.savePageContent("home_cta_button_1_text"))},null,40,Pd)]),c("div",Rd,[t[113]||(t[113]=c("label",null,"Knop 2 Tekst",-1)),c("input",{type:"text",value:n.getContentValue("home_cta_button_2_text"),onInput:t[30]||(t[30]=l=>n.updateContentValue("home_cta_button_2_text",l.target.value)),onBlur:t[31]||(t[31]=l=>n.savePageContent("home_cta_button_2_text"))},null,40,Ad)])])]),c("div",Td,[t[117]||(t[117]=c("h3",null,"Boekingspagina - Header",-1)),c("div",Od,[c("div",Md,[t[115]||(t[115]=c("label",null,"Hoofdtekst (Header)",-1)),c("input",{type:"text",value:n.getContentValue("booking_header_title"),onInput:t[32]||(t[32]=l=>n.updateContentValue("booking_header_title",l.target.value)),onBlur:t[33]||(t[33]=l=>n.savePageContent("booking_header_title"))},null,40,Id)]),c("div",Dd,[t[116]||(t[116]=c("label",null,"Onderschrift",-1)),c("textarea",{value:n.getContentValue("booking_header_subtitle"),onInput:t[34]||(t[34]=l=>n.updateContentValue("booking_header_subtitle",l.target.value)),onBlur:t[35]||(t[35]=l=>n.savePageContent("booking_header_subtitle")),rows:"2"},null,40,jd)])])])])])):Re("",!0),n.activeTab==="settings"?(q(),W("div",Vd,[t[121]||(t[121]=c("div",{class:"section-header"},[c("h2",null,"Applicatie Instellingen")],-1)),c("div",Fd,[c("div",Bd,[t[119]||(t[119]=c("label",{for:"admin_email"},"Beheer Notificatie E-mail",-1)),ve(c("input",{type:"email",id:"admin_email","onUpdate:modelValue":t[36]||(t[36]=l=>n.settings.admin_notification_email=l),placeholder:"admin@voorbeeld.com"},null,512),[[_e,n.settings.admin_notification_email]]),c("button",{onClick:t[37]||(t[37]=l=>n.updateSetting("admin_notification_email",n.settings.admin_notification_email)),class:"save-btn",title:"Opslaan"}," 💾 ")]),c("div",Ld,[t[120]||(t[120]=c("label",{for:"business_name"},"Bedrijfsnaam",-1)),ve(c("input",{type:"text",id:"business_name","onUpdate:modelValue":t[38]||(t[38]=l=>n.settings.business_name=l),placeholder:"Fiets Service Centrum"},null,512),[[_e,n.settings.business_name]]),c("button",{onClick:t[39]||(t[39]=l=>n.updateSetting("business_name",n.settings.business_name)),class:"save-btn",title:"Opslaan"}," 💾 ")])])])):Re("",!0),n.showRequestModal?(q(),W("div",{key:5,class:"modal-overlay",onClick:t[49]||(t[49]=(...l)=>n.closeRequestModal&&n.closeRequestModal(...l))},[c("div",{class:"modal-content large",onClick:t[48]||(t[48]=at(()=>{},["stop"]))},[c("div",Nd,[t[122]||(t[122]=c("h3",null,"Service Aanvraag Details",-1)),c("button",{onClick:t[40]||(t[40]=(...l)=>n.closeRequestModal&&n.closeRequestModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),n.selectedRequest?(q(),W("div",Hd,[n.requestModalLoading?(q(),W("div",qd,[...t[123]||(t[123]=[c("div",{class:"loading-spinner"},null,-1),c("p",null,"Gegevens laden...",-1)])])):(q(),W("div",Ud,[c("div",Kd,[t[124]||(t[124]=c("strong",null,"Naam:",-1)),Se(" "+F(n.selectedRequest.name),1)]),c("div",Wd,[t[125]||(t[125]=c("strong",null,"Adres:",-1)),Se(" "+F(n.selectedRequest.address),1)]),c("div",Gd,[t[126]||(t[126]=c("strong",null,"Plaats:",-1)),Se(" "+F(n.selectedRequest.place),1)]),c("div",zd,[t[127]||(t[127]=c("strong",null,"E-mail:",-1)),Se(" "+F(n.selectedRequest.email||"Niet opgegeven"),1)]),c("div",Jd,[t[128]||(t[128]=c("strong",null,"Telefoon:",-1)),Se(" "+F(n.selectedRequest.phone||"Niet opgegeven"),1)]),c("div",Yd,[t[129]||(t[129]=c("strong",null,"Reparatie Beschrijving:",-1)),Se(" "+F(n.selectedRequest.repair_description),1)]),c("div",Qd,[t[130]||(t[130]=c("strong",null,"Gewenste Datum/Tijd:",-1)),Se(" "+F(n.formatDateTime(n.selectedRequest.requested_date,n.selectedRequest.requested_time)),1)]),c("div",Zd,[t[132]||(t[132]=c("strong",null,"Status:",-1)),ve(c("select",{"onUpdate:modelValue":t[41]||(t[41]=l=>n.selectedRequest.status=l),onChange:t[42]||(t[42]=(...l)=>n.updateRequestStatus&&n.updateRequestStatus(...l))},[...t[131]||(t[131]=[c("option",{value:"pending"},"In afwachting",-1),c("option",{value:"confirmed"},"Bevestigd",-1),c("option",{value:"completed"},"Voltooid",-1),c("option",{value:"cancelled"},"Geannuleerd",-1)])],544),[[Ja,n.selectedRequest.status]])]),c("div",Xd,[t[133]||(t[133]=c("strong",null,"Werkelijke Reparatie Datum:",-1)),ve(c("input",{type:"date","onUpdate:modelValue":t[43]||(t[43]=l=>n.selectedRequest.actual_repair_date=l),onChange:t[44]||(t[44]=(...l)=>n.updateRequestDate&&n.updateRequestDate(...l))},null,544),[[_e,n.selectedRequest.actual_repair_date]])]),c("div",$d,[t[134]||(t[134]=c("strong",null,"Werkelijke Reparatie Tijd:",-1)),ve(c("input",{type:"time","onUpdate:modelValue":t[45]||(t[45]=l=>n.selectedRequest.actual_repair_time=l),onChange:t[46]||(t[46]=(...l)=>n.updateRequestTime&&n.updateRequestTime(...l))},null,544),[[_e,n.selectedRequest.actual_repair_time]])])]))])):Re("",!0),c("div",eh,[c("button",{onClick:t[47]||(t[47]=(...l)=>n.closeRequestModal&&n.closeRequestModal(...l)),class:"btn-primary"},"Sluiten")])])])):Re("",!0),n.showAddBlockedDate?(q(),W("div",{key:6,class:"modal-overlay",onClick:t[56]||(t[56]=(...l)=>n.closeBlockedDateModal&&n.closeBlockedDateModal(...l))},[c("div",{class:"modal-content",onClick:t[55]||(t[55]=at(()=>{},["stop"]))},[c("div",th,[c("h3",null,F(n.editingBlockedDate?"Bewerken":"Toevoegen")+" Geblokkeerde Datum",1),c("button",{onClick:t[50]||(t[50]=(...l)=>n.closeBlockedDateModal&&n.closeBlockedDateModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",nh,[c("div",sh,[t[135]||(t[135]=c("label",{for:"blocked_date"},"Datum",-1)),ve(c("input",{type:"date",id:"blocked_date","onUpdate:modelValue":t[51]||(t[51]=l=>n.blockedDateForm.date=l),min:n.minDate},null,8,oh),[[_e,n.blockedDateForm.date]])]),c("div",rh,[t[136]||(t[136]=c("label",{for:"blocked_reason"},"Reden (Optioneel)",-1)),ve(c("textarea",{id:"blocked_reason","onUpdate:modelValue":t[52]||(t[52]=l=>n.blockedDateForm.reason=l),rows:"3"},null,512),[[_e,n.blockedDateForm.reason]])])]),c("div",ih,[c("button",{onClick:t[53]||(t[53]=(...l)=>n.saveBlockedDate&&n.saveBlockedDate(...l)),class:"btn-primary"},"Opslaan"),c("button",{onClick:t[54]||(t[54]=(...l)=>n.closeBlockedDateModal&&n.closeBlockedDateModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0),n.showEmailModal?(q(),W("div",{key:7,class:"modal-overlay",onClick:t[62]||(t[62]=(...l)=>n.closeEmailModal&&n.closeEmailModal(...l))},[c("div",{class:"modal-content",onClick:t[61]||(t[61]=at(()=>{},["stop"]))},[c("div",lh,[c("h3",null,"E-mail Versturen naar "+F((a=n.selectedRequest)==null?void 0:a.name),1),c("button",{onClick:t[57]||(t[57]=(...l)=>n.closeEmailModal&&n.closeEmailModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",ah,[c("div",ch,[t[137]||(t[137]=c("label",{for:"email_message"},"Bericht",-1)),ve(c("textarea",{id:"email_message","onUpdate:modelValue":t[58]||(t[58]=l=>n.emailForm.message=l),rows:"6",placeholder:"Voer je bericht in..."},null,512),[[_e,n.emailForm.message]])])]),c("div",uh,[c("button",{onClick:t[59]||(t[59]=(...l)=>n.submitEmail&&n.submitEmail(...l)),class:"btn-primary",disabled:n.emailLoading},F(n.emailLoading?"Versturen...":"E-mail Versturen"),9,fh),c("button",{onClick:t[60]||(t[60]=(...l)=>n.closeEmailModal&&n.closeEmailModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0),n.showSmsModal?(q(),W("div",{key:8,class:"modal-overlay",onClick:t[68]||(t[68]=(...l)=>n.closeSmsModal&&n.closeSmsModal(...l))},[c("div",{class:"modal-content",onClick:t[67]||(t[67]=at(()=>{},["stop"]))},[c("div",dh,[c("h3",null,"SMS Versturen naar "+F((u=n.selectedRequest)==null?void 0:u.name),1),c("button",{onClick:t[63]||(t[63]=(...l)=>n.closeSmsModal&&n.closeSmsModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",hh,[c("div",ph,[t[138]||(t[138]=c("label",{for:"sms_message"},"Bericht",-1)),ve(c("textarea",{id:"sms_message","onUpdate:modelValue":t[64]||(t[64]=l=>n.smsForm.message=l),rows:"6",placeholder:"Voer je bericht in..."},null,512),[[_e,n.smsForm.message]])])]),c("div",mh,[c("button",{onClick:t[65]||(t[65]=(...l)=>n.submitSms&&n.submitSms(...l)),class:"btn-primary",disabled:n.smsLoading},F(n.smsLoading?"Versturen...":"SMS Versturen"),9,gh),c("button",{onClick:t[66]||(t[66]=(...l)=>n.closeSmsModal&&n.closeSmsModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0),n.showCommunicationsModal?(q(),W("div",{key:9,class:"modal-overlay",onClick:t[72]||(t[72]=(...l)=>n.closeCommunicationsModal&&n.closeCommunicationsModal(...l))},[c("div",{class:"modal-content large",onClick:t[71]||(t[71]=at(()=>{},["stop"]))},[c("div",vh,[c("h3",null,"Communicatie Geschiedenis - "+F((p=n.selectedRequest)==null?void 0:p.name),1),c("button",{onClick:t[69]||(t[69]=(...l)=>n.closeCommunicationsModal&&n.closeCommunicationsModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",_h,[n.communications.length===0?(q(),W("div",bh," Geen communicatie gevonden voor deze aanvraag. ")):(q(),W("div",yh,[(q(!0),W(Ce,null,St(n.communications,l=>(q(),W("div",{key:l.id,class:"communication-item"},[c("div",wh,[c("span",Sh,F(n.getCommTypeText(l.type)),1),c("span",kh,F(n.getCommDirectionText(l.direction)),1),c("span",Ch,F(n.formatDateTime(l.created_at)),1)]),c("div",xh,F(l.message),1)]))),128))]))]),c("div",Eh,[c("button",{onClick:t[70]||(t[70]=(...l)=>n.closeCommunicationsModal&&n.closeCommunicationsModal(...l)),class:"btn-primary"},"Sluiten")])])])):Re("",!0),n.showAddPricelistItem?(q(),W("div",{key:10,class:"modal-overlay",onClick:t[82]||(t[82]=(...l)=>n.closePricelistModal&&n.closePricelistModal(...l))},[c("div",{class:"modal-content",onClick:t[81]||(t[81]=at(()=>{},["stop"]))},[c("div",Ph,[c("h3",null,F(n.editingPricelistItem?"Bewerken":"Toevoegen")+" Prijslijst Item",1),c("button",{onClick:t[73]||(t[73]=(...l)=>n.closePricelistModal&&n.closePricelistModal(...l)),class:"close-btn",title:"Sluiten"},"×")]),c("div",Rh,[c("div",Ah,[t[139]||(t[139]=c("label",{for:"pricelist_title"},"Titel",-1)),ve(c("input",{type:"text",id:"pricelist_title","onUpdate:modelValue":t[74]||(t[74]=l=>n.pricelistForm.title=l),placeholder:"Bijv. Banden vervangen"},null,512),[[_e,n.pricelistForm.title]])]),c("div",Th,[t[140]||(t[140]=c("label",{for:"pricelist_description"},"Beschrijving",-1)),ve(c("textarea",{id:"pricelist_description","onUpdate:modelValue":t[75]||(t[75]=l=>n.pricelistForm.description=l),rows:"3",placeholder:"Beschrijving van de service"},null,512),[[_e,n.pricelistForm.description]])]),c("div",Oh,[t[141]||(t[141]=c("label",{for:"pricelist_price"},"Prijs (€)",-1)),ve(c("input",{type:"number",id:"pricelist_price","onUpdate:modelValue":t[76]||(t[76]=l=>n.pricelistForm.price=l),step:"0.01",min:"0",placeholder:"25.00"},null,512),[[_e,n.pricelistForm.price]])]),c("div",Mh,[t[142]||(t[142]=c("label",{for:"pricelist_sort_order"},"Volgorde",-1)),ve(c("input",{type:"number",id:"pricelist_sort_order","onUpdate:modelValue":t[77]||(t[77]=l=>n.pricelistForm.sort_order=l),min:"0",placeholder:"1"},null,512),[[_e,n.pricelistForm.sort_order]])]),c("div",Ih,[c("label",null,[ve(c("input",{type:"checkbox","onUpdate:modelValue":t[78]||(t[78]=l=>n.pricelistForm.is_active=l)},null,512),[[za,n.pricelistForm.is_active]]),t[143]||(t[143]=Se(" Actief ",-1))])])]),c("div",Dh,[c("button",{onClick:t[79]||(t[79]=(...l)=>n.savePricelistItem&&n.savePricelistItem(...l)),class:"btn-primary"},"Opslaan"),c("button",{onClick:t[80]||(t[80]=(...l)=>n.closePricelistModal&&n.closePricelistModal(...l)),class:"btn-secondary"},"Annuleren")])])])):Re("",!0)])}const Vh=Qt(ef,[["render",jh],["__scopeId","data-v-c28c01c6"]]),Fh={name:"Login",setup(){const e=Ai(),t=os(),s=Z({email:"",password:""}),n=Z(!1),o=Z("");return{form:s,loading:n,error:o,handleLogin:async()=>{n.value=!0,o.value="";try{const i=await fetch("/api/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s.value)});if(!i.ok){const u=await i.json();throw new Error(u.message||"Inloggen mislukt")}const a=await i.json();t.login(a.user,a.token),e.push("/admin")}catch(i){o.value=i.message}finally{n.value=!1}}}}},Bh={class:"login"},Lh={class:"login-container"},Nh={class:"form-group"},Hh=["disabled"],qh={class:"form-group"},Uh=["disabled"],Kh={key:0,class:"form-error"},Wh=["disabled"];function Gh(e,t,s,n,o,r){return q(),W("div",Bh,[c("div",Lh,[t[5]||(t[5]=c("div",{class:"login-header"},[c("h1",null,"🔐 Beheerder Login"),c("p",null,"Log in om toegang te krijgen tot het beheerpaneel")],-1)),c("form",{onSubmit:t[2]||(t[2]=at((...i)=>n.handleLogin&&n.handleLogin(...i),["prevent"])),class:"login-form"},[c("div",Nh,[t[3]||(t[3]=c("label",{for:"email"},"E-mail",-1)),ve(c("input",{type:"email",id:"email","onUpdate:modelValue":t[0]||(t[0]=i=>n.form.email=i),required:"",placeholder:"admin@fietservice.nl",disabled:n.loading},null,8,Hh),[[_e,n.form.email]])]),c("div",qh,[t[4]||(t[4]=c("label",{for:"password"},"Wachtwoord",-1)),ve(c("input",{type:"password",id:"password","onUpdate:modelValue":t[1]||(t[1]=i=>n.form.password=i),required:"",placeholder:"Voer je wachtwoord in",disabled:n.loading},null,8,Uh),[[_e,n.form.password]])]),n.error?(q(),W("div",Kh,F(n.error),1)):Re("",!0),c("button",{type:"submit",class:"login-btn",disabled:n.loading},F(n.loading?"Inloggen...":"Inloggen"),9,Wh)],32)])])}const zh=Qt(Fh,[["render",Gh],["__scopeId","data-v-2b41928d"]]),Jh={name:"Pricelist",setup(){const e=Z([]),t=Z(!0),s=async()=>{try{const n=await fetch("/api/pricelist");n.ok&&(e.value=await n.json())}catch(n){console.error("Failed to fetch pricelist:",n)}finally{t.value=!1}};return Yt(()=>{s()}),{pricelist:e,loading:t}}},Yh={class:"pricelist"},Qh={class:"pricelist-header"},Zh={key:0,class:"loading-state"},Xh={key:1,class:"empty-state"},$h={key:2,class:"pricelist-grid"},ep={class:"price-header"},tp={class:"price"},np={class:"description"},sp={class:"cta-section"};function op(e,t,s,n,o,r){const i=Nn("router-link");return q(),W("div",Yh,[c("div",Qh,[t[1]||(t[1]=c("h1",null,"💰 Prijslijst",-1)),t[2]||(t[2]=c("p",null,"Transparante prijzen voor al onze fiets service diensten",-1)),be(i,{to:"/",class:"back-btn"},{default:tt(()=>[...t[0]||(t[0]=[Se("← Terug naar Home",-1)])]),_:1})]),n.loading?(q(),W("div",Zh,[...t[3]||(t[3]=[c("div",{class:"loading-spinner"},null,-1),c("p",null,"Prijzen laden...",-1)])])):n.pricelist.length===0?(q(),W("div",Xh,[...t[4]||(t[4]=[c("p",null,"Geen prijzen beschikbaar op dit moment.",-1)])])):(q(),W("div",$h,[(q(!0),W(Ce,null,St(n.pricelist,a=>(q(),W("div",{key:a.id,class:"price-card"},[c("div",ep,[c("h3",null,F(a.title),1),c("div",tp,"€"+F(a.price),1)]),c("p",np,F(a.description),1)]))),128))])),c("div",sp,[t[6]||(t[6]=c("h2",null,"Klaar om je afspraak te boeken?",-1)),t[7]||(t[7]=c("p",null,"Boek nu je service afspraak online!",-1)),be(i,{to:"/booking",class:"cta-button"},{default:tt(()=>[...t[5]||(t[5]=[Se("Nu Boeken",-1)])]),_:1})])])}const rp=Qt(Jh,[["render",op],["__scopeId","data-v-5946fc5a"]]),ip=[{path:"/",name:"Home",component:ku},{path:"/pricelist",name:"Pricelist",component:rp},{path:"/booking",name:"Booking",component:$u},{path:"/login",name:"Login",component:zh},{path:"/admin",name:"Admin",component:Vh,meta:{requiresAuth:!0}}],Ti=uu({history:Lc(),routes:ip});Ti.beforeEach((e,t,s)=>{if(e.meta.requiresAuth&&!os().isAuthenticated){s("/login");return}s()});const lp="/images/bikeservice_logo_navbar.svg",ap={name:"App",setup(){const e=os();return Yt(()=>{e.checkAuth()}),{isAuthenticated:e.isAuthenticated}}},cp={id:"app"},up={class:"navbar"},fp={class:"nav-container"},dp={class:"nav-menu"},hp={class:"main-content"};function pp(e,t,s,n,o,r){const i=Nn("router-link"),a=Nn("router-view");return q(),W("div",cp,[c("nav",up,[c("div",fp,[be(i,{to:"/",class:"nav-logo"},{default:tt(()=>[...t[0]||(t[0]=[c("img",{src:lp,alt:"Bike Service Logo",class:"logo-image"},null,-1)])]),_:1}),c("div",dp,[be(i,{to:"/",class:"nav-link"},{default:tt(()=>[...t[1]||(t[1]=[Se("Home",-1)])]),_:1}),be(i,{to:"/booking",class:"nav-link"},{default:tt(()=>[...t[2]||(t[2]=[Se("Service Boeken",-1)])]),_:1}),n.isAuthenticated?(q(),xs(i,{key:0,to:"/admin",class:"nav-link"},{default:tt(()=>[...t[3]||(t[3]=[Se("Beheer",-1)])]),_:1})):(q(),xs(i,{key:1,to:"/login",class:"nav-link"},{default:tt(()=>[...t[4]||(t[4]=[Se("Beheer Login",-1)])]),_:1}))])])]),c("main",hp,[be(a)])])}const mp=Qt(ap,[["render",pp]]),$s=$a(mp),gp=nc();$s.use(gp);$s.use(Ti);$s.mount("#app"); diff --git a/backend/public/assets/index-Dg5tUgMl.css b/backend/public/assets/index-jfsEyp3I.css similarity index 95% rename from backend/public/assets/index-Dg5tUgMl.css rename to backend/public/assets/index-jfsEyp3I.css index e3e588a..60a28dd 100644 --- a/backend/public/assets/index-Dg5tUgMl.css +++ b/backend/public/assets/index-jfsEyp3I.css @@ -1 +1 @@ -.home[data-v-677cbdbe]{text-align:center}.hero[data-v-677cbdbe]{background:linear-gradient(135deg,var(--primary-color) 0%,var(--primary-light) 100%);color:#fff;padding:4rem 2rem;border-radius:15px;margin-bottom:3rem;box-shadow:0 4px 20px #2c5f5d4d}.hero h1[data-v-677cbdbe]{font-size:3rem;margin-bottom:1rem}.hero p[data-v-677cbdbe]{font-size:1.2rem;opacity:.9}.features[data-v-677cbdbe]{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:2rem;margin-bottom:3rem}.feature-card[data-v-677cbdbe]{background:#fff;padding:2rem;border-radius:10px;box-shadow:0 4px 15px #0000001a;transition:transform .3s ease}.feature-card[data-v-677cbdbe]:hover{transform:translateY(-5px)}.feature-card h3[data-v-677cbdbe]{color:var(--primary-color);margin-bottom:1rem;font-size:1.3rem}.feature-card p[data-v-677cbdbe]{color:var(--text-gray);line-height:1.6}.cta[data-v-677cbdbe]{background:linear-gradient(135deg,#f8f9fa,#fff);padding:3rem 2rem;border-radius:15px;border:3px solid var(--primary-color);box-shadow:0 4px 20px #2c5f5d26}.cta h2[data-v-677cbdbe]{color:var(--primary-color);margin-bottom:1rem}.cta p[data-v-677cbdbe]{color:var(--text-gray);font-size:1.1rem;margin-bottom:2rem}.cta-buttons[data-v-677cbdbe]{display:flex;gap:1rem;justify-content:center}.cta-button[data-v-677cbdbe]{display:inline-block;background:var(--primary-color);color:#fff;padding:1rem 2rem;text-decoration:none;border-radius:10px;font-size:1.1rem;font-weight:700;transition:all .3s ease;box-shadow:0 4px 10px #2c5f5d4d}.cta-button[data-v-677cbdbe]:hover{background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 6px 15px #2c5f5d66}.cta-button.secondary[data-v-677cbdbe]{background:var(--secondary-color);box-shadow:0 4px 10px #8b6f474d}.cta-button.secondary[data-v-677cbdbe]:hover{background:var(--secondary-dark);box-shadow:0 6px 15px #8b6f4766}.booking[data-v-3d2c946f]{max-width:800px;margin:0 auto}.booking-header[data-v-3d2c946f]{text-align:center;margin-bottom:3rem}.booking-header h1[data-v-3d2c946f]{color:var(--primary-color);font-size:2.5rem;margin-bottom:1rem}.booking-header p[data-v-3d2c946f]{color:var(--text-gray);font-size:1.2rem}.booking-form-container[data-v-3d2c946f]{background:#fff;border-radius:15px;padding:2rem;box-shadow:0 4px 15px #0000001a}.booking-form[data-v-3d2c946f]{display:flex;flex-direction:column;gap:1.5rem}.form-row[data-v-3d2c946f]{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem}.form-row .full-width[data-v-3d2c946f]{grid-column:1 / -1}.form-group[data-v-3d2c946f]{display:flex;flex-direction:column}.form-group label[data-v-3d2c946f]{font-weight:700;color:var(--primary-color);margin-bottom:.5rem}.form-group input[data-v-3d2c946f],.form-group textarea[data-v-3d2c946f]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem;transition:border-color .3s ease}.form-group input[data-v-3d2c946f]:focus,.form-group textarea[data-v-3d2c946f]:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #2c5f5d1a}.form-group textarea[data-v-3d2c946f]{resize:vertical;min-height:80px}.custom-date-picker[data-v-3d2c946f]{border:2px solid #e1e8ed;border-radius:8px;overflow:hidden;background:#fff}.date-picker-header[data-v-3d2c946f]{display:flex;justify-content:space-between;align-items:center;padding:1rem;background:#f8f9fa;border-bottom:1px solid #e1e8ed}.nav-btn[data-v-3d2c946f]{background:none;border:none;font-size:1.5rem;cursor:pointer;padding:.5rem;border-radius:4px;transition:background-color .3s ease}.nav-btn[data-v-3d2c946f]:hover{background:#e1e8ed}.current-month[data-v-3d2c946f]{font-weight:700;color:var(--primary-color);text-transform:capitalize}.date-picker-grid[data-v-3d2c946f]{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;background:#e1e8ed}.weekday-header[data-v-3d2c946f]{background:#f8f9fa;padding:.75rem;text-align:center;font-weight:700;color:var(--primary-color);font-size:.875rem}.calendar-date[data-v-3d2c946f]{background:#fff;padding:.75rem;text-align:center;cursor:pointer;transition:all .3s ease;border:none;font-size:.875rem}.calendar-date[data-v-3d2c946f]:hover:not(.disabled):not(.blocked){background:#e3f2fd}.calendar-date.other-month[data-v-3d2c946f]{color:#bdc3c7;background:#f8f9fa}.calendar-date.disabled[data-v-3d2c946f]{color:#bdc3c7;background:#f8f9fa;cursor:not-allowed}.calendar-date.blocked[data-v-3d2c946f]{color:#dc3545;background:#f8d7da;cursor:not-allowed;position:relative}.calendar-date.blocked[data-v-3d2c946f]:after{content:"🚫";position:absolute;top:2px;right:2px;font-size:.75rem}.calendar-date.selected[data-v-3d2c946f]{background:var(--primary-color);color:#fff;font-weight:700}.calendar-date.today[data-v-3d2c946f]{font-weight:700;color:var(--primary-color);border:2px solid var(--primary-color)}.calendar-date.today.selected[data-v-3d2c946f]{color:#fff}.form-error[data-v-3d2c946f]{background:#fee;color:#c53030;padding:1rem;border-radius:8px;border:1px solid #feb2b2;text-align:center}.form-actions[data-v-3d2c946f]{text-align:center;margin-top:1rem}.submit-btn[data-v-3d2c946f]{background:var(--primary-color);color:#fff;border:none;padding:1rem 2rem;border-radius:10px;font-size:1.1rem;font-weight:700;cursor:pointer;transition:all .3s ease;box-shadow:0 4px 10px #2c5f5d4d}.submit-btn[data-v-3d2c946f]:hover:not(:disabled){background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 6px 15px #2c5f5d66}.submit-btn[data-v-3d2c946f]:disabled{background:#bdc3c7;cursor:not-allowed}.modal-overlay[data-v-3d2c946f]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content[data-v-3d2c946f]{background:#fff;border-radius:15px;padding:2rem;max-width:500px;width:90%;box-shadow:0 10px 30px #0000004d}.modal-header[data-v-3d2c946f]{text-align:center;margin-bottom:1.5rem}.modal-header h3[data-v-3d2c946f]{color:var(--primary-color);font-size:1.5rem}.modal-body[data-v-3d2c946f]{margin-bottom:2rem}.modal-body p[data-v-3d2c946f]{color:#666;line-height:1.6;margin-bottom:1rem}.modal-footer[data-v-3d2c946f]{text-align:center}.btn-primary[data-v-3d2c946f]{background:var(--primary-color);color:#fff;border:none;padding:.75rem 1.5rem;border-radius:8px;cursor:pointer;font-size:1rem;transition:all .3s ease;box-shadow:0 2px 6px #2c5f5d4d}.btn-primary[data-v-3d2c946f]:hover{background:var(--primary-dark);transform:translateY(-1px);box-shadow:0 4px 10px #2c5f5d66}@media (max-width: 768px){.form-row[data-v-3d2c946f]{grid-template-columns:1fr}.booking-form-container[data-v-3d2c946f]{padding:1.5rem}}.admin[data-v-c28c01c6]{max-width:1200px;margin:0 auto}.admin-header[data-v-c28c01c6]{text-align:center;margin-bottom:3rem}.admin-header h1[data-v-c28c01c6]{color:var(--primary-color);font-size:2.5rem;margin-bottom:1rem}.admin-header p[data-v-c28c01c6]{color:var(--text-gray);font-size:1.2rem;margin-bottom:1rem}.admin-user-info[data-v-c28c01c6]{display:flex;justify-content:center;align-items:center;gap:1rem;background:#f8f9fa;padding:1rem;border-radius:8px;border:1px solid #e1e8ed}.admin-user-info span[data-v-c28c01c6]{color:#2c3e50;font-weight:500}.logout-btn[data-v-c28c01c6]{background:#dc3545;color:#fff;border:none;padding:.5rem 1rem;border-radius:6px;cursor:pointer;font-size:.9rem;transition:background-color .3s ease}.logout-btn[data-v-c28c01c6]:hover{background:#c82333}.admin-tabs[data-v-c28c01c6]{display:flex;gap:.5rem;margin-bottom:2rem;border-bottom:2px solid #e1e8ed}.tab-button[data-v-c28c01c6]{background:none;border:none;padding:1rem 2rem;font-size:1rem;cursor:pointer;border-bottom:3px solid transparent;transition:all .3s ease}.tab-button.active[data-v-c28c01c6]{border-bottom-color:var(--primary-color);color:var(--primary-color);font-weight:700}.tab-button[data-v-c28c01c6]:hover{background:#f8f9fa}.tab-content[data-v-c28c01c6]{background:#fff;border-radius:15px;padding:2rem;box-shadow:0 4px 15px #0000001a}.section-header[data-v-c28c01c6]{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.section-header h2[data-v-c28c01c6]{color:var(--primary-color);margin:0}.refresh-btn[data-v-c28c01c6],.add-btn[data-v-c28c01c6]{background:var(--primary-color);color:#fff;border:none;width:40px;height:40px;border-radius:8px;cursor:pointer;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.refresh-btn[data-v-c28c01c6]:hover:not(:disabled),.add-btn[data-v-c28c01c6]:hover{background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 4px 8px #2c5f5d4d}.refresh-btn[data-v-c28c01c6]:disabled{background:#bdc3c7;cursor:not-allowed;opacity:.6}.refresh-btn[title][data-v-c28c01c6]:hover:after,.add-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.refresh-btn[title][data-v-c28c01c6]:hover:before,.add-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.requests-table[data-v-c28c01c6]{border:1px solid #e1e8ed;border-radius:8px;overflow:hidden}.table-header[data-v-c28c01c6]{display:grid;grid-template-columns:80px 1fr 200px 120px 200px;background:#f8f9fa;font-weight:700;color:#2c3e50}.header-cell[data-v-c28c01c6]{padding:1rem;border-right:1px solid #e1e8ed}.header-cell[data-v-c28c01c6]:last-child{border-right:none}.table-row[data-v-c28c01c6]{display:grid;grid-template-columns:80px 1fr 200px 120px 200px;border-bottom:1px solid #e1e8ed;transition:background-color .3s ease}.table-row[data-v-c28c01c6]:hover{background:#f8f9fa}.table-row[data-v-c28c01c6]:last-child{border-bottom:none}.cell[data-v-c28c01c6]{padding:1rem;border-right:1px solid #e1e8ed;display:flex;align-items:center}.cell[data-v-c28c01c6]:last-child{border-right:none}.status-badge[data-v-c28c01c6]{padding:.25rem .75rem;border-radius:20px;font-size:.875rem;font-weight:700;text-transform:capitalize}.status-badge.pending[data-v-c28c01c6]{background:#fff3cd;color:#856404}.status-badge.confirmed[data-v-c28c01c6]{background:#d1ecf1;color:#0c5460}.status-badge.completed[data-v-c28c01c6]{background:#d4edda;color:#155724}.status-badge.cancelled[data-v-c28c01c6]{background:#f8d7da;color:#721c24}.actions[data-v-c28c01c6]{gap:.5rem;justify-content:center}.action-btn[data-v-c28c01c6]{background:#6c757d;color:#fff;border:none;width:40px;height:40px;border-radius:6px;cursor:pointer;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.action-btn[data-v-c28c01c6]:hover:not(:disabled){background:#5a6268;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.action-btn[data-v-c28c01c6]:disabled{background:#bdc3c7;cursor:not-allowed;opacity:.6}.action-btn.view[data-v-c28c01c6]{background:#17a2b8}.action-btn.view[data-v-c28c01c6]:hover:not(:disabled){background:#138496}.action-btn.email[data-v-c28c01c6]{background:#28a745}.action-btn.email[data-v-c28c01c6]:hover:not(:disabled){background:#218838}.action-btn.sms[data-v-c28c01c6]{background:#ffc107;color:#212529}.action-btn.sms[data-v-c28c01c6]:hover:not(:disabled){background:#e0a800}.action-btn.comm[data-v-c28c01c6]{background:#6f42c1}.action-btn.comm[data-v-c28c01c6]:hover:not(:disabled){background:#5a32a3}.action-btn.edit[data-v-c28c01c6]{background:#17a2b8}.action-btn.edit[data-v-c28c01c6]:hover:not(:disabled){background:#138496}.action-btn.delete[data-v-c28c01c6]{background:#dc3545}.action-btn.delete[data-v-c28c01c6]:hover:not(:disabled){background:#c82333}.pricelist-table[data-v-c28c01c6]{border:1px solid #e1e8ed;border-radius:8px;overflow:hidden}.pricelist-table .table-header[data-v-c28c01c6]{display:grid;grid-template-columns:1fr 2fr 100px 80px 100px 120px;background:#f8f9fa;font-weight:700;color:#2c3e50}.pricelist-table .table-row[data-v-c28c01c6]{display:grid;grid-template-columns:1fr 2fr 100px 80px 100px 120px;border-bottom:1px solid #e1e8ed;transition:background-color .3s ease}.pricelist-table .table-row[data-v-c28c01c6]:hover{background:#f8f9fa}.pricelist-table .table-row[data-v-c28c01c6]:last-child{border-bottom:none}.status-badge.active[data-v-c28c01c6]{background:#d4edda;color:#155724}.status-badge.inactive[data-v-c28c01c6]{background:#f8d7da;color:#721c24}.action-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.action-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.loading-row[data-v-c28c01c6],.empty-row[data-v-c28c01c6]{grid-column:1 / -1;padding:2rem;text-align:center;color:#666}.blocked-dates-list[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.blocked-date-item[data-v-c28c01c6]{display:flex;justify-content:space-between;align-items:center;padding:1rem;border:1px solid #e1e8ed;border-radius:8px;background:#f8f9fa}.date-info[data-v-c28c01c6]{display:flex;flex-direction:column;gap:.5rem}.date[data-v-c28c01c6]{font-weight:700;color:#2c3e50}.reason[data-v-c28c01c6]{color:#666;font-size:.875rem}.date-actions[data-v-c28c01c6]{display:flex;gap:.5rem}.edit-btn[data-v-c28c01c6],.delete-btn[data-v-c28c01c6]{border:none;width:40px;height:40px;border-radius:6px;cursor:pointer;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.edit-btn[data-v-c28c01c6]{background:#17a2b8;color:#fff}.edit-btn[data-v-c28c01c6]:hover{background:#138496;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.delete-btn[data-v-c28c01c6]{background:#dc3545;color:#fff}.delete-btn[data-v-c28c01c6]:hover{background:#c82333;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.edit-btn[title][data-v-c28c01c6]:hover:after,.delete-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.edit-btn[title][data-v-c28c01c6]:hover:before,.delete-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.settings-form[data-v-c28c01c6]{display:flex;flex-direction:column;gap:2rem}.setting-group[data-v-c28c01c6]{display:flex;flex-direction:column;gap:.5rem}.setting-group label[data-v-c28c01c6]{font-weight:700;color:#2c3e50}.setting-group input[data-v-c28c01c6]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem}.setting-group input[data-v-c28c01c6]:focus{outline:none;border-color:#3498db}.save-btn[data-v-c28c01c6]{background:#28a745;color:#fff;border:none;width:40px;height:40px;border-radius:8px;cursor:pointer;align-self:flex-start;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.save-btn[data-v-c28c01c6]:hover{background:#218838;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.save-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.save-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.modal-overlay[data-v-c28c01c6]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content[data-v-c28c01c6]{background:#fff;border-radius:15px;padding:2rem;max-width:500px;width:90%;max-height:90vh;overflow-y:auto;box-shadow:0 10px 30px #0000004d}.modal-content.large[data-v-c28c01c6]{max-width:800px}.modal-header[data-v-c28c01c6]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid #e1e8ed}.modal-header h3[data-v-c28c01c6]{color:#2c3e50;margin:0}.close-btn[data-v-c28c01c6]{background:none;border:none;font-size:1.5rem;cursor:pointer;color:#666;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .3s ease;position:relative}.close-btn[data-v-c28c01c6]:hover{color:#333;background:#f8f9fa}.close-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.close-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.modal-body[data-v-c28c01c6]{margin-bottom:2rem}.modal-footer[data-v-c28c01c6]{display:flex;gap:1rem;justify-content:flex-end}.btn-primary[data-v-c28c01c6],.btn-secondary[data-v-c28c01c6]{padding:.75rem 1.5rem;border:none;border-radius:8px;cursor:pointer;font-size:1rem;transition:background-color .3s ease}.btn-primary[data-v-c28c01c6]{background:var(--primary-color);color:#fff}.btn-primary[data-v-c28c01c6]:hover:not(:disabled){background:var(--primary-dark);box-shadow:0 4px 10px #2c5f5d4d}.btn-secondary[data-v-c28c01c6]{background:#6c757d;color:#fff}.btn-secondary[data-v-c28c01c6]:hover{background:#5a6268}.form-group[data-v-c28c01c6]{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem}.form-group label[data-v-c28c01c6]{font-weight:700;color:#2c3e50}.form-group input[data-v-c28c01c6],.form-group textarea[data-v-c28c01c6]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem}.form-group input[data-v-c28c01c6]:focus,.form-group textarea[data-v-c28c01c6]:focus{outline:none;border-color:#3498db}.form-group textarea[data-v-c28c01c6]{resize:vertical;min-height:80px}.request-details[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.detail-row[data-v-c28c01c6]{display:flex;gap:1rem;align-items:center}.detail-row strong[data-v-c28c01c6]{min-width:150px;color:#2c3e50}.detail-row input[data-v-c28c01c6],.detail-row select[data-v-c28c01c6]{padding:.5rem;border:1px solid #e1e8ed;border-radius:4px;flex:1}.no-communications[data-v-c28c01c6]{text-align:center;color:#666;padding:2rem}.communications-list[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.communication-item[data-v-c28c01c6]{border:1px solid #e1e8ed;border-radius:8px;padding:1rem;background:#f8f9fa}.comm-header[data-v-c28c01c6]{display:flex;gap:1rem;margin-bottom:.5rem;font-size:.875rem}.comm-type[data-v-c28c01c6]{background:#3498db;color:#fff;padding:.25rem .5rem;border-radius:4px;font-weight:700}.comm-direction[data-v-c28c01c6]{color:#666}.comm-date[data-v-c28c01c6]{color:#666;margin-left:auto}.comm-message[data-v-c28c01c6]{color:#2c3e50;line-height:1.5}.loading-state[data-v-c28c01c6]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;color:#666}.loading-spinner[data-v-c28c01c6]{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:40px;height:40px;animation:spin-c28c01c6 1s linear infinite;margin-bottom:1rem}@keyframes spin-c28c01c6{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 768px){.admin-tabs[data-v-c28c01c6]{flex-direction:column}.table-header[data-v-c28c01c6],.table-row[data-v-c28c01c6]{grid-template-columns:1fr;gap:.5rem}.header-cell[data-v-c28c01c6],.cell[data-v-c28c01c6]{border-right:none;border-bottom:1px solid #e1e8ed}.actions[data-v-c28c01c6]{flex-direction:row;justify-content:center;gap:.5rem}.blocked-date-item[data-v-c28c01c6]{flex-direction:column;gap:1rem;align-items:flex-start}.modal-content[data-v-c28c01c6]{margin:1rem;width:calc(100% - 2rem)}.admin-user-info[data-v-c28c01c6]{flex-direction:column;gap:.5rem}}.content-sections[data-v-c28c01c6]{display:flex;flex-direction:column;gap:2rem}.content-section[data-v-c28c01c6]{background:#f8f9fa;padding:1.5rem;border-radius:10px;border:1px solid #e1e8ed}.content-section h3[data-v-c28c01c6]{color:#2c3e50;margin-bottom:1rem;font-size:1.3rem}.content-section h4[data-v-c28c01c6]{color:#2c3e50;margin-bottom:.75rem;font-size:1.1rem}.content-form[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.feature-group[data-v-c28c01c6]{background:#fff;padding:1rem;border-radius:8px;border:1px solid #e1e8ed}.feature-group[data-v-c28c01c6]:not(:last-child){margin-bottom:1rem}.content-form .form-group[data-v-c28c01c6]{margin-bottom:.5rem}.content-form .form-group label[data-v-c28c01c6]{font-weight:600;color:#2c3e50;margin-bottom:.5rem;display:block}.content-form .form-group input[data-v-c28c01c6],.content-form .form-group textarea[data-v-c28c01c6]{width:100%;padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem;transition:border-color .3s ease}.content-form .form-group input[data-v-c28c01c6]:focus,.content-form .form-group textarea[data-v-c28c01c6]:focus{outline:none;border-color:var(--primary-color);background:#f8f9fa;box-shadow:0 0 0 3px #2c5f5d1a}.content-form .form-group textarea[data-v-c28c01c6]{resize:vertical;font-family:inherit}.login[data-v-2c23c0dd]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--primary-color) 0%,var(--primary-light) 100%);padding:2rem}.login-container[data-v-2c23c0dd]{background:#fff;border-radius:15px;padding:3rem;box-shadow:0 10px 30px #0000004d;max-width:400px;width:100%}.login-header[data-v-2c23c0dd]{text-align:center;margin-bottom:2rem}.login-header h1[data-v-2c23c0dd]{color:var(--primary-color);font-size:2rem;margin-bottom:.5rem}.login-header p[data-v-2c23c0dd]{color:var(--text-gray);font-size:1rem}.login-form[data-v-2c23c0dd]{display:flex;flex-direction:column;gap:1.5rem}.form-group[data-v-2c23c0dd]{display:flex;flex-direction:column;gap:.5rem}.form-group label[data-v-2c23c0dd]{font-weight:700;color:var(--primary-color);font-size:.9rem}.form-group input[data-v-2c23c0dd]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem;transition:border-color .3s ease}.form-group input[data-v-2c23c0dd]:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #2c5f5d1a}.form-group input[data-v-2c23c0dd]:disabled{background:#f8f9fa;cursor:not-allowed}.form-error[data-v-2c23c0dd]{background:#fee;color:#c53030;padding:1rem;border-radius:8px;border:1px solid #feb2b2;text-align:center;font-size:.9rem}.login-btn[data-v-2c23c0dd]{background:var(--primary-color);color:#fff;border:none;padding:1rem;border-radius:8px;font-size:1rem;font-weight:700;cursor:pointer;transition:all .3s ease;box-shadow:0 4px 10px #2c5f5d4d}.login-btn[data-v-2c23c0dd]:hover:not(:disabled){background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 6px 15px #2c5f5d66}.login-btn[data-v-2c23c0dd]:disabled{background:#bdc3c7;cursor:not-allowed}.login-info[data-v-2c23c0dd]{margin-top:2rem;padding:1.5rem;background:#f8f9fa;border-radius:8px;border:1px solid #e1e8ed}.login-info p[data-v-2c23c0dd]{margin:.5rem 0;color:#666;font-size:.9rem}.login-info strong[data-v-2c23c0dd]{color:var(--primary-color)}@media (max-width: 480px){.login-container[data-v-2c23c0dd]{padding:2rem}.login-header h1[data-v-2c23c0dd]{font-size:1.75rem}}.pricelist[data-v-5946fc5a]{max-width:1200px;margin:0 auto;padding:2rem}.pricelist-header[data-v-5946fc5a]{text-align:center;margin-bottom:3rem}.pricelist-header h1[data-v-5946fc5a]{color:#2c3e50;font-size:3rem;margin-bottom:1rem}.pricelist-header p[data-v-5946fc5a]{color:#666;font-size:1.2rem;margin-bottom:2rem}.back-btn[data-v-5946fc5a]{display:inline-block;background:#6c757d;color:#fff;padding:.75rem 1.5rem;text-decoration:none;border-radius:8px;font-size:1rem;transition:background-color .3s ease}.back-btn[data-v-5946fc5a]:hover{background:#5a6268}.loading-state[data-v-5946fc5a],.empty-state[data-v-5946fc5a]{text-align:center;padding:4rem;color:#666}.loading-spinner[data-v-5946fc5a]{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:50px;height:50px;animation:spin-5946fc5a 1s linear infinite;margin:0 auto 1rem}@keyframes spin-5946fc5a{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.pricelist-grid[data-v-5946fc5a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:2rem;margin-bottom:4rem}.price-card[data-v-5946fc5a]{background:#fff;border:2px solid #e1e8ed;border-radius:15px;padding:2rem;box-shadow:0 4px 15px #0000001a;transition:all .3s ease}.price-card[data-v-5946fc5a]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #00000026;border-color:#3498db}.price-header[data-v-5946fc5a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:1rem;border-bottom:2px solid #f8f9fa}.price-header h3[data-v-5946fc5a]{color:#2c3e50;margin:0;font-size:1.3rem}.price[data-v-5946fc5a]{background:#3498db;color:#fff;padding:.5rem 1rem;border-radius:25px;font-size:1.2rem;font-weight:700}.description[data-v-5946fc5a]{color:#666;line-height:1.6;margin:0}.cta-section[data-v-5946fc5a]{text-align:center;background:#f8f9fa;padding:3rem 2rem;border-radius:15px;border:2px dashed #3498db}.cta-section h2[data-v-5946fc5a]{color:#2c3e50;margin-bottom:1rem}.cta-section p[data-v-5946fc5a]{color:#666;font-size:1.1rem;margin-bottom:2rem}.cta-button[data-v-5946fc5a]{display:inline-block;background:#3498db;color:#fff;padding:1rem 2rem;text-decoration:none;border-radius:10px;font-size:1.1rem;font-weight:700;transition:background-color .3s ease}.cta-button[data-v-5946fc5a]:hover{background:#2980b9}@media (max-width: 768px){.pricelist[data-v-5946fc5a]{padding:1rem}.pricelist-header h1[data-v-5946fc5a]{font-size:2rem}.pricelist-grid[data-v-5946fc5a]{grid-template-columns:1fr;gap:1rem}.price-header[data-v-5946fc5a]{flex-direction:column;text-align:center;gap:1rem}}:root{--primary-color: #2c5f5d;--primary-dark: #1f4443;--primary-light: #3d7a77;--secondary-color: #8b6f47;--secondary-dark: #6d5637;--secondary-light: #a68a5f;--text-dark: #2c3e50;--text-gray: #666;--bg-light: #f5f5f5;--bg-white: #ffffff}body{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background-color:var(--bg-light)}.navbar{background:linear-gradient(135deg,var(--primary-color) 0%,var(--primary-light) 100%);padding:.5rem 0;box-shadow:0 2px 10px #2c5f5d33}.nav-container{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;padding:0 2rem}.nav-logo{display:flex;align-items:center;text-decoration:none}.logo-image{height:70px;width:auto;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1));transition:transform .3s ease}.logo-image:hover{transform:scale(1.05)}.nav-menu{display:flex;gap:2rem;align-items:center}.nav-link{color:#fff;text-decoration:none;padding:.5rem 1rem;border-radius:5px;transition:all .3s ease;font-weight:500}.nav-link:hover{background-color:#ffffff26;transform:translateY(-1px)}.nav-link.router-link-active{background-color:var(--secondary-color)}.main-content{max-width:1200px;margin:2rem auto;padding:0 2rem}@media (max-width: 768px){.nav-container{flex-direction:column;gap:1rem;padding:1rem}.logo-image{height:75px}.nav-menu{flex-wrap:wrap;justify-content:center;gap:1rem}.nav-link{padding:.4rem .8rem;font-size:.9rem}}*{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}body{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;line-height:1.6;color:#333;background-color:#f5f5f5}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.mb-1{margin-bottom:.5rem}.mb-2{margin-bottom:1rem}.mb-3{margin-bottom:1.5rem}.mb-4{margin-bottom:2rem}.mt-1{margin-top:.5rem}.mt-2{margin-top:1rem}.mt-3{margin-top:1.5rem}.mt-4{margin-top:2rem}.p-1{padding:.5rem}.p-2{padding:1rem}.p-3{padding:1.5rem}.p-4{padding:2rem}.btn{display:inline-block;padding:.5rem 1rem;border:none;border-radius:5px;cursor:pointer;text-decoration:none;font-size:1rem;transition:all .3s ease}.btn-primary{background:#667eea;color:#fff}.btn-primary:hover{background:#5a6fd8}.btn-secondary{background:#6c757d;color:#fff}.btn-secondary:hover{background:#5a6268}.card{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:1.5rem;margin-bottom:1rem}@media (max-width: 768px){.nav-container{flex-direction:column;gap:1rem}.nav-menu{gap:1rem}.hero h1{font-size:2rem}.features{grid-template-columns:1fr}} +.home[data-v-677cbdbe]{text-align:center}.hero[data-v-677cbdbe]{background:linear-gradient(135deg,var(--primary-color) 0%,var(--primary-light) 100%);color:#fff;padding:4rem 2rem;border-radius:15px;margin-bottom:3rem;box-shadow:0 4px 20px #2c5f5d4d}.hero h1[data-v-677cbdbe]{font-size:3rem;margin-bottom:1rem}.hero p[data-v-677cbdbe]{font-size:1.2rem;opacity:.9}.features[data-v-677cbdbe]{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:2rem;margin-bottom:3rem}.feature-card[data-v-677cbdbe]{background:#fff;padding:2rem;border-radius:10px;box-shadow:0 4px 15px #0000001a;transition:transform .3s ease}.feature-card[data-v-677cbdbe]:hover{transform:translateY(-5px)}.feature-card h3[data-v-677cbdbe]{color:var(--primary-color);margin-bottom:1rem;font-size:1.3rem}.feature-card p[data-v-677cbdbe]{color:var(--text-gray);line-height:1.6}.cta[data-v-677cbdbe]{background:linear-gradient(135deg,#f8f9fa,#fff);padding:3rem 2rem;border-radius:15px;border:3px solid var(--primary-color);box-shadow:0 4px 20px #2c5f5d26}.cta h2[data-v-677cbdbe]{color:var(--primary-color);margin-bottom:1rem}.cta p[data-v-677cbdbe]{color:var(--text-gray);font-size:1.1rem;margin-bottom:2rem}.cta-buttons[data-v-677cbdbe]{display:flex;gap:1rem;justify-content:center}.cta-button[data-v-677cbdbe]{display:inline-block;background:var(--primary-color);color:#fff;padding:1rem 2rem;text-decoration:none;border-radius:10px;font-size:1.1rem;font-weight:700;transition:all .3s ease;box-shadow:0 4px 10px #2c5f5d4d}.cta-button[data-v-677cbdbe]:hover{background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 6px 15px #2c5f5d66}.cta-button.secondary[data-v-677cbdbe]{background:var(--secondary-color);box-shadow:0 4px 10px #8b6f474d}.cta-button.secondary[data-v-677cbdbe]:hover{background:var(--secondary-dark);box-shadow:0 6px 15px #8b6f4766}.booking[data-v-3d2c946f]{max-width:800px;margin:0 auto}.booking-header[data-v-3d2c946f]{text-align:center;margin-bottom:3rem}.booking-header h1[data-v-3d2c946f]{color:var(--primary-color);font-size:2.5rem;margin-bottom:1rem}.booking-header p[data-v-3d2c946f]{color:var(--text-gray);font-size:1.2rem}.booking-form-container[data-v-3d2c946f]{background:#fff;border-radius:15px;padding:2rem;box-shadow:0 4px 15px #0000001a}.booking-form[data-v-3d2c946f]{display:flex;flex-direction:column;gap:1.5rem}.form-row[data-v-3d2c946f]{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem}.form-row .full-width[data-v-3d2c946f]{grid-column:1 / -1}.form-group[data-v-3d2c946f]{display:flex;flex-direction:column}.form-group label[data-v-3d2c946f]{font-weight:700;color:var(--primary-color);margin-bottom:.5rem}.form-group input[data-v-3d2c946f],.form-group textarea[data-v-3d2c946f]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem;transition:border-color .3s ease}.form-group input[data-v-3d2c946f]:focus,.form-group textarea[data-v-3d2c946f]:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #2c5f5d1a}.form-group textarea[data-v-3d2c946f]{resize:vertical;min-height:80px}.custom-date-picker[data-v-3d2c946f]{border:2px solid #e1e8ed;border-radius:8px;overflow:hidden;background:#fff}.date-picker-header[data-v-3d2c946f]{display:flex;justify-content:space-between;align-items:center;padding:1rem;background:#f8f9fa;border-bottom:1px solid #e1e8ed}.nav-btn[data-v-3d2c946f]{background:none;border:none;font-size:1.5rem;cursor:pointer;padding:.5rem;border-radius:4px;transition:background-color .3s ease}.nav-btn[data-v-3d2c946f]:hover{background:#e1e8ed}.current-month[data-v-3d2c946f]{font-weight:700;color:var(--primary-color);text-transform:capitalize}.date-picker-grid[data-v-3d2c946f]{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;background:#e1e8ed}.weekday-header[data-v-3d2c946f]{background:#f8f9fa;padding:.75rem;text-align:center;font-weight:700;color:var(--primary-color);font-size:.875rem}.calendar-date[data-v-3d2c946f]{background:#fff;padding:.75rem;text-align:center;cursor:pointer;transition:all .3s ease;border:none;font-size:.875rem}.calendar-date[data-v-3d2c946f]:hover:not(.disabled):not(.blocked){background:#e3f2fd}.calendar-date.other-month[data-v-3d2c946f]{color:#bdc3c7;background:#f8f9fa}.calendar-date.disabled[data-v-3d2c946f]{color:#bdc3c7;background:#f8f9fa;cursor:not-allowed}.calendar-date.blocked[data-v-3d2c946f]{color:#dc3545;background:#f8d7da;cursor:not-allowed;position:relative}.calendar-date.blocked[data-v-3d2c946f]:after{content:"🚫";position:absolute;top:2px;right:2px;font-size:.75rem}.calendar-date.selected[data-v-3d2c946f]{background:var(--primary-color);color:#fff;font-weight:700}.calendar-date.today[data-v-3d2c946f]{font-weight:700;color:var(--primary-color);border:2px solid var(--primary-color)}.calendar-date.today.selected[data-v-3d2c946f]{color:#fff}.form-error[data-v-3d2c946f]{background:#fee;color:#c53030;padding:1rem;border-radius:8px;border:1px solid #feb2b2;text-align:center}.form-actions[data-v-3d2c946f]{text-align:center;margin-top:1rem}.submit-btn[data-v-3d2c946f]{background:var(--primary-color);color:#fff;border:none;padding:1rem 2rem;border-radius:10px;font-size:1.1rem;font-weight:700;cursor:pointer;transition:all .3s ease;box-shadow:0 4px 10px #2c5f5d4d}.submit-btn[data-v-3d2c946f]:hover:not(:disabled){background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 6px 15px #2c5f5d66}.submit-btn[data-v-3d2c946f]:disabled{background:#bdc3c7;cursor:not-allowed}.modal-overlay[data-v-3d2c946f]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content[data-v-3d2c946f]{background:#fff;border-radius:15px;padding:2rem;max-width:500px;width:90%;box-shadow:0 10px 30px #0000004d}.modal-header[data-v-3d2c946f]{text-align:center;margin-bottom:1.5rem}.modal-header h3[data-v-3d2c946f]{color:var(--primary-color);font-size:1.5rem}.modal-body[data-v-3d2c946f]{margin-bottom:2rem}.modal-body p[data-v-3d2c946f]{color:#666;line-height:1.6;margin-bottom:1rem}.modal-footer[data-v-3d2c946f]{text-align:center}.btn-primary[data-v-3d2c946f]{background:var(--primary-color);color:#fff;border:none;padding:.75rem 1.5rem;border-radius:8px;cursor:pointer;font-size:1rem;transition:all .3s ease;box-shadow:0 2px 6px #2c5f5d4d}.btn-primary[data-v-3d2c946f]:hover{background:var(--primary-dark);transform:translateY(-1px);box-shadow:0 4px 10px #2c5f5d66}@media (max-width: 768px){.form-row[data-v-3d2c946f]{grid-template-columns:1fr}.booking-form-container[data-v-3d2c946f]{padding:1.5rem}}.admin[data-v-c28c01c6]{max-width:1200px;margin:0 auto}.admin-header[data-v-c28c01c6]{text-align:center;margin-bottom:3rem}.admin-header h1[data-v-c28c01c6]{color:var(--primary-color);font-size:2.5rem;margin-bottom:1rem}.admin-header p[data-v-c28c01c6]{color:var(--text-gray);font-size:1.2rem;margin-bottom:1rem}.admin-user-info[data-v-c28c01c6]{display:flex;justify-content:center;align-items:center;gap:1rem;background:#f8f9fa;padding:1rem;border-radius:8px;border:1px solid #e1e8ed}.admin-user-info span[data-v-c28c01c6]{color:#2c3e50;font-weight:500}.logout-btn[data-v-c28c01c6]{background:#dc3545;color:#fff;border:none;padding:.5rem 1rem;border-radius:6px;cursor:pointer;font-size:.9rem;transition:background-color .3s ease}.logout-btn[data-v-c28c01c6]:hover{background:#c82333}.admin-tabs[data-v-c28c01c6]{display:flex;gap:.5rem;margin-bottom:2rem;border-bottom:2px solid #e1e8ed}.tab-button[data-v-c28c01c6]{background:none;border:none;padding:1rem 2rem;font-size:1rem;cursor:pointer;border-bottom:3px solid transparent;transition:all .3s ease}.tab-button.active[data-v-c28c01c6]{border-bottom-color:var(--primary-color);color:var(--primary-color);font-weight:700}.tab-button[data-v-c28c01c6]:hover{background:#f8f9fa}.tab-content[data-v-c28c01c6]{background:#fff;border-radius:15px;padding:2rem;box-shadow:0 4px 15px #0000001a}.section-header[data-v-c28c01c6]{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.section-header h2[data-v-c28c01c6]{color:var(--primary-color);margin:0}.refresh-btn[data-v-c28c01c6],.add-btn[data-v-c28c01c6]{background:var(--primary-color);color:#fff;border:none;width:40px;height:40px;border-radius:8px;cursor:pointer;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.refresh-btn[data-v-c28c01c6]:hover:not(:disabled),.add-btn[data-v-c28c01c6]:hover{background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 4px 8px #2c5f5d4d}.refresh-btn[data-v-c28c01c6]:disabled{background:#bdc3c7;cursor:not-allowed;opacity:.6}.refresh-btn[title][data-v-c28c01c6]:hover:after,.add-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.refresh-btn[title][data-v-c28c01c6]:hover:before,.add-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.requests-table[data-v-c28c01c6]{border:1px solid #e1e8ed;border-radius:8px;overflow:hidden}.table-header[data-v-c28c01c6]{display:grid;grid-template-columns:80px 1fr 200px 120px 200px;background:#f8f9fa;font-weight:700;color:#2c3e50}.header-cell[data-v-c28c01c6]{padding:1rem;border-right:1px solid #e1e8ed}.header-cell[data-v-c28c01c6]:last-child{border-right:none}.table-row[data-v-c28c01c6]{display:grid;grid-template-columns:80px 1fr 200px 120px 200px;border-bottom:1px solid #e1e8ed;transition:background-color .3s ease}.table-row[data-v-c28c01c6]:hover{background:#f8f9fa}.table-row[data-v-c28c01c6]:last-child{border-bottom:none}.cell[data-v-c28c01c6]{padding:1rem;border-right:1px solid #e1e8ed;display:flex;align-items:center}.cell[data-v-c28c01c6]:last-child{border-right:none}.status-badge[data-v-c28c01c6]{padding:.25rem .75rem;border-radius:20px;font-size:.875rem;font-weight:700;text-transform:capitalize}.status-badge.pending[data-v-c28c01c6]{background:#fff3cd;color:#856404}.status-badge.confirmed[data-v-c28c01c6]{background:#d1ecf1;color:#0c5460}.status-badge.completed[data-v-c28c01c6]{background:#d4edda;color:#155724}.status-badge.cancelled[data-v-c28c01c6]{background:#f8d7da;color:#721c24}.actions[data-v-c28c01c6]{gap:.5rem;justify-content:center}.action-btn[data-v-c28c01c6]{background:#6c757d;color:#fff;border:none;width:40px;height:40px;border-radius:6px;cursor:pointer;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.action-btn[data-v-c28c01c6]:hover:not(:disabled){background:#5a6268;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.action-btn[data-v-c28c01c6]:disabled{background:#bdc3c7;cursor:not-allowed;opacity:.6}.action-btn.view[data-v-c28c01c6]{background:#17a2b8}.action-btn.view[data-v-c28c01c6]:hover:not(:disabled){background:#138496}.action-btn.email[data-v-c28c01c6]{background:#28a745}.action-btn.email[data-v-c28c01c6]:hover:not(:disabled){background:#218838}.action-btn.sms[data-v-c28c01c6]{background:#ffc107;color:#212529}.action-btn.sms[data-v-c28c01c6]:hover:not(:disabled){background:#e0a800}.action-btn.comm[data-v-c28c01c6]{background:#6f42c1}.action-btn.comm[data-v-c28c01c6]:hover:not(:disabled){background:#5a32a3}.action-btn.edit[data-v-c28c01c6]{background:#17a2b8}.action-btn.edit[data-v-c28c01c6]:hover:not(:disabled){background:#138496}.action-btn.delete[data-v-c28c01c6]{background:#dc3545}.action-btn.delete[data-v-c28c01c6]:hover:not(:disabled){background:#c82333}.pricelist-table[data-v-c28c01c6]{border:1px solid #e1e8ed;border-radius:8px;overflow:hidden}.pricelist-table .table-header[data-v-c28c01c6]{display:grid;grid-template-columns:1fr 2fr 100px 80px 100px 120px;background:#f8f9fa;font-weight:700;color:#2c3e50}.pricelist-table .table-row[data-v-c28c01c6]{display:grid;grid-template-columns:1fr 2fr 100px 80px 100px 120px;border-bottom:1px solid #e1e8ed;transition:background-color .3s ease}.pricelist-table .table-row[data-v-c28c01c6]:hover{background:#f8f9fa}.pricelist-table .table-row[data-v-c28c01c6]:last-child{border-bottom:none}.status-badge.active[data-v-c28c01c6]{background:#d4edda;color:#155724}.status-badge.inactive[data-v-c28c01c6]{background:#f8d7da;color:#721c24}.action-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.action-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.loading-row[data-v-c28c01c6],.empty-row[data-v-c28c01c6]{grid-column:1 / -1;padding:2rem;text-align:center;color:#666}.blocked-dates-list[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.blocked-date-item[data-v-c28c01c6]{display:flex;justify-content:space-between;align-items:center;padding:1rem;border:1px solid #e1e8ed;border-radius:8px;background:#f8f9fa}.date-info[data-v-c28c01c6]{display:flex;flex-direction:column;gap:.5rem}.date[data-v-c28c01c6]{font-weight:700;color:#2c3e50}.reason[data-v-c28c01c6]{color:#666;font-size:.875rem}.date-actions[data-v-c28c01c6]{display:flex;gap:.5rem}.edit-btn[data-v-c28c01c6],.delete-btn[data-v-c28c01c6]{border:none;width:40px;height:40px;border-radius:6px;cursor:pointer;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.edit-btn[data-v-c28c01c6]{background:#17a2b8;color:#fff}.edit-btn[data-v-c28c01c6]:hover{background:#138496;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.delete-btn[data-v-c28c01c6]{background:#dc3545;color:#fff}.delete-btn[data-v-c28c01c6]:hover{background:#c82333;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.edit-btn[title][data-v-c28c01c6]:hover:after,.delete-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.edit-btn[title][data-v-c28c01c6]:hover:before,.delete-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.settings-form[data-v-c28c01c6]{display:flex;flex-direction:column;gap:2rem}.setting-group[data-v-c28c01c6]{display:flex;flex-direction:column;gap:.5rem}.setting-group label[data-v-c28c01c6]{font-weight:700;color:#2c3e50}.setting-group input[data-v-c28c01c6]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem}.setting-group input[data-v-c28c01c6]:focus{outline:none;border-color:#3498db}.save-btn[data-v-c28c01c6]{background:#28a745;color:#fff;border:none;width:40px;height:40px;border-radius:8px;cursor:pointer;align-self:flex-start;font-size:1.2rem;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative}.save-btn[data-v-c28c01c6]:hover{background:#218838;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.save-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.save-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.modal-overlay[data-v-c28c01c6]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content[data-v-c28c01c6]{background:#fff;border-radius:15px;padding:2rem;max-width:500px;width:90%;max-height:90vh;overflow-y:auto;box-shadow:0 10px 30px #0000004d}.modal-content.large[data-v-c28c01c6]{max-width:800px}.modal-header[data-v-c28c01c6]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid #e1e8ed}.modal-header h3[data-v-c28c01c6]{color:#2c3e50;margin:0}.close-btn[data-v-c28c01c6]{background:none;border:none;font-size:1.5rem;cursor:pointer;color:#666;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .3s ease;position:relative}.close-btn[data-v-c28c01c6]:hover{color:#333;background:#f8f9fa}.close-btn[title][data-v-c28c01c6]:hover:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:.5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;z-index:1000;margin-bottom:.5rem;box-shadow:0 2px 8px #0000004d}.close-btn[title][data-v-c28c01c6]:hover:before{content:"";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#333;margin-bottom:-.5rem;z-index:1000}.modal-body[data-v-c28c01c6]{margin-bottom:2rem}.modal-footer[data-v-c28c01c6]{display:flex;gap:1rem;justify-content:flex-end}.btn-primary[data-v-c28c01c6],.btn-secondary[data-v-c28c01c6]{padding:.75rem 1.5rem;border:none;border-radius:8px;cursor:pointer;font-size:1rem;transition:background-color .3s ease}.btn-primary[data-v-c28c01c6]{background:var(--primary-color);color:#fff}.btn-primary[data-v-c28c01c6]:hover:not(:disabled){background:var(--primary-dark);box-shadow:0 4px 10px #2c5f5d4d}.btn-secondary[data-v-c28c01c6]{background:#6c757d;color:#fff}.btn-secondary[data-v-c28c01c6]:hover{background:#5a6268}.form-group[data-v-c28c01c6]{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem}.form-group label[data-v-c28c01c6]{font-weight:700;color:#2c3e50}.form-group input[data-v-c28c01c6],.form-group textarea[data-v-c28c01c6]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem}.form-group input[data-v-c28c01c6]:focus,.form-group textarea[data-v-c28c01c6]:focus{outline:none;border-color:#3498db}.form-group textarea[data-v-c28c01c6]{resize:vertical;min-height:80px}.request-details[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.detail-row[data-v-c28c01c6]{display:flex;gap:1rem;align-items:center}.detail-row strong[data-v-c28c01c6]{min-width:150px;color:#2c3e50}.detail-row input[data-v-c28c01c6],.detail-row select[data-v-c28c01c6]{padding:.5rem;border:1px solid #e1e8ed;border-radius:4px;flex:1}.no-communications[data-v-c28c01c6]{text-align:center;color:#666;padding:2rem}.communications-list[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.communication-item[data-v-c28c01c6]{border:1px solid #e1e8ed;border-radius:8px;padding:1rem;background:#f8f9fa}.comm-header[data-v-c28c01c6]{display:flex;gap:1rem;margin-bottom:.5rem;font-size:.875rem}.comm-type[data-v-c28c01c6]{background:#3498db;color:#fff;padding:.25rem .5rem;border-radius:4px;font-weight:700}.comm-direction[data-v-c28c01c6]{color:#666}.comm-date[data-v-c28c01c6]{color:#666;margin-left:auto}.comm-message[data-v-c28c01c6]{color:#2c3e50;line-height:1.5}.loading-state[data-v-c28c01c6]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;color:#666}.loading-spinner[data-v-c28c01c6]{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:40px;height:40px;animation:spin-c28c01c6 1s linear infinite;margin-bottom:1rem}@keyframes spin-c28c01c6{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 768px){.admin-tabs[data-v-c28c01c6]{flex-direction:column}.table-header[data-v-c28c01c6],.table-row[data-v-c28c01c6]{grid-template-columns:1fr;gap:.5rem}.header-cell[data-v-c28c01c6],.cell[data-v-c28c01c6]{border-right:none;border-bottom:1px solid #e1e8ed}.actions[data-v-c28c01c6]{flex-direction:row;justify-content:center;gap:.5rem}.blocked-date-item[data-v-c28c01c6]{flex-direction:column;gap:1rem;align-items:flex-start}.modal-content[data-v-c28c01c6]{margin:1rem;width:calc(100% - 2rem)}.admin-user-info[data-v-c28c01c6]{flex-direction:column;gap:.5rem}}.content-sections[data-v-c28c01c6]{display:flex;flex-direction:column;gap:2rem}.content-section[data-v-c28c01c6]{background:#f8f9fa;padding:1.5rem;border-radius:10px;border:1px solid #e1e8ed}.content-section h3[data-v-c28c01c6]{color:#2c3e50;margin-bottom:1rem;font-size:1.3rem}.content-section h4[data-v-c28c01c6]{color:#2c3e50;margin-bottom:.75rem;font-size:1.1rem}.content-form[data-v-c28c01c6]{display:flex;flex-direction:column;gap:1rem}.feature-group[data-v-c28c01c6]{background:#fff;padding:1rem;border-radius:8px;border:1px solid #e1e8ed}.feature-group[data-v-c28c01c6]:not(:last-child){margin-bottom:1rem}.content-form .form-group[data-v-c28c01c6]{margin-bottom:.5rem}.content-form .form-group label[data-v-c28c01c6]{font-weight:600;color:#2c3e50;margin-bottom:.5rem;display:block}.content-form .form-group input[data-v-c28c01c6],.content-form .form-group textarea[data-v-c28c01c6]{width:100%;padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem;transition:border-color .3s ease}.content-form .form-group input[data-v-c28c01c6]:focus,.content-form .form-group textarea[data-v-c28c01c6]:focus{outline:none;border-color:var(--primary-color);background:#f8f9fa;box-shadow:0 0 0 3px #2c5f5d1a}.content-form .form-group textarea[data-v-c28c01c6]{resize:vertical;font-family:inherit}.login[data-v-2b41928d]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--primary-color) 0%,var(--primary-light) 100%);padding:2rem}.login-container[data-v-2b41928d]{background:#fff;border-radius:15px;padding:3rem;box-shadow:0 10px 30px #0000004d;max-width:400px;width:100%}.login-header[data-v-2b41928d]{text-align:center;margin-bottom:2rem}.login-header h1[data-v-2b41928d]{color:var(--primary-color);font-size:2rem;margin-bottom:.5rem}.login-header p[data-v-2b41928d]{color:var(--text-gray);font-size:1rem}.login-form[data-v-2b41928d]{display:flex;flex-direction:column;gap:1.5rem}.form-group[data-v-2b41928d]{display:flex;flex-direction:column;gap:.5rem}.form-group label[data-v-2b41928d]{font-weight:700;color:var(--primary-color);font-size:.9rem}.form-group input[data-v-2b41928d]{padding:.75rem;border:2px solid #e1e8ed;border-radius:8px;font-size:1rem;transition:border-color .3s ease}.form-group input[data-v-2b41928d]:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #2c5f5d1a}.form-group input[data-v-2b41928d]:disabled{background:#f8f9fa;cursor:not-allowed}.form-error[data-v-2b41928d]{background:#fee;color:#c53030;padding:1rem;border-radius:8px;border:1px solid #feb2b2;text-align:center;font-size:.9rem}.login-btn[data-v-2b41928d]{background:var(--primary-color);color:#fff;border:none;padding:1rem;border-radius:8px;font-size:1rem;font-weight:700;cursor:pointer;transition:all .3s ease;box-shadow:0 4px 10px #2c5f5d4d}.login-btn[data-v-2b41928d]:hover:not(:disabled){background:var(--primary-dark);transform:translateY(-2px);box-shadow:0 6px 15px #2c5f5d66}.login-btn[data-v-2b41928d]:disabled{background:#bdc3c7;cursor:not-allowed}.login-info[data-v-2b41928d]{margin-top:2rem;padding:1.5rem;background:#f8f9fa;border-radius:8px;border:1px solid #e1e8ed}.login-info p[data-v-2b41928d]{margin:.5rem 0;color:#666;font-size:.9rem}.login-info strong[data-v-2b41928d]{color:var(--primary-color)}@media (max-width: 480px){.login-container[data-v-2b41928d]{padding:2rem}.login-header h1[data-v-2b41928d]{font-size:1.75rem}}.pricelist[data-v-5946fc5a]{max-width:1200px;margin:0 auto;padding:2rem}.pricelist-header[data-v-5946fc5a]{text-align:center;margin-bottom:3rem}.pricelist-header h1[data-v-5946fc5a]{color:#2c3e50;font-size:3rem;margin-bottom:1rem}.pricelist-header p[data-v-5946fc5a]{color:#666;font-size:1.2rem;margin-bottom:2rem}.back-btn[data-v-5946fc5a]{display:inline-block;background:#6c757d;color:#fff;padding:.75rem 1.5rem;text-decoration:none;border-radius:8px;font-size:1rem;transition:background-color .3s ease}.back-btn[data-v-5946fc5a]:hover{background:#5a6268}.loading-state[data-v-5946fc5a],.empty-state[data-v-5946fc5a]{text-align:center;padding:4rem;color:#666}.loading-spinner[data-v-5946fc5a]{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:50px;height:50px;animation:spin-5946fc5a 1s linear infinite;margin:0 auto 1rem}@keyframes spin-5946fc5a{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.pricelist-grid[data-v-5946fc5a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:2rem;margin-bottom:4rem}.price-card[data-v-5946fc5a]{background:#fff;border:2px solid #e1e8ed;border-radius:15px;padding:2rem;box-shadow:0 4px 15px #0000001a;transition:all .3s ease}.price-card[data-v-5946fc5a]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #00000026;border-color:#3498db}.price-header[data-v-5946fc5a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:1rem;border-bottom:2px solid #f8f9fa}.price-header h3[data-v-5946fc5a]{color:#2c3e50;margin:0;font-size:1.3rem}.price[data-v-5946fc5a]{background:#3498db;color:#fff;padding:.5rem 1rem;border-radius:25px;font-size:1.2rem;font-weight:700}.description[data-v-5946fc5a]{color:#666;line-height:1.6;margin:0}.cta-section[data-v-5946fc5a]{text-align:center;background:#f8f9fa;padding:3rem 2rem;border-radius:15px;border:2px dashed #3498db}.cta-section h2[data-v-5946fc5a]{color:#2c3e50;margin-bottom:1rem}.cta-section p[data-v-5946fc5a]{color:#666;font-size:1.1rem;margin-bottom:2rem}.cta-button[data-v-5946fc5a]{display:inline-block;background:#3498db;color:#fff;padding:1rem 2rem;text-decoration:none;border-radius:10px;font-size:1.1rem;font-weight:700;transition:background-color .3s ease}.cta-button[data-v-5946fc5a]:hover{background:#2980b9}@media (max-width: 768px){.pricelist[data-v-5946fc5a]{padding:1rem}.pricelist-header h1[data-v-5946fc5a]{font-size:2rem}.pricelist-grid[data-v-5946fc5a]{grid-template-columns:1fr;gap:1rem}.price-header[data-v-5946fc5a]{flex-direction:column;text-align:center;gap:1rem}}:root{--primary-color: #2c5f5d;--primary-dark: #1f4443;--primary-light: #3d7a77;--secondary-color: #8b6f47;--secondary-dark: #6d5637;--secondary-light: #a68a5f;--text-dark: #2c3e50;--text-gray: #666;--bg-light: #f5f5f5;--bg-white: #ffffff}body{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background-color:var(--bg-light)}.navbar{background:linear-gradient(135deg,var(--primary-color) 0%,var(--primary-light) 100%);padding:.5rem 0;box-shadow:0 2px 10px #2c5f5d33}.nav-container{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;padding:0 2rem}.nav-logo{display:flex;align-items:center;text-decoration:none}.logo-image{height:70px;width:auto;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1));transition:transform .3s ease}.logo-image:hover{transform:scale(1.05)}.nav-menu{display:flex;gap:2rem;align-items:center}.nav-link{color:#fff;text-decoration:none;padding:.5rem 1rem;border-radius:5px;transition:all .3s ease;font-weight:500}.nav-link:hover{background-color:#ffffff26;transform:translateY(-1px)}.nav-link.router-link-active{background-color:var(--secondary-color)}.main-content{max-width:1200px;margin:2rem auto;padding:0 2rem}@media (max-width: 768px){.nav-container{flex-direction:column;gap:1rem;padding:1rem}.logo-image{height:75px}.nav-menu{flex-wrap:wrap;justify-content:center;gap:1rem}.nav-link{padding:.4rem .8rem;font-size:.9rem}}*{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}body{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;line-height:1.6;color:#333;background-color:#f5f5f5}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.mb-1{margin-bottom:.5rem}.mb-2{margin-bottom:1rem}.mb-3{margin-bottom:1.5rem}.mb-4{margin-bottom:2rem}.mt-1{margin-top:.5rem}.mt-2{margin-top:1rem}.mt-3{margin-top:1.5rem}.mt-4{margin-top:2rem}.p-1{padding:.5rem}.p-2{padding:1rem}.p-3{padding:1.5rem}.p-4{padding:2rem}.btn{display:inline-block;padding:.5rem 1rem;border:none;border-radius:5px;cursor:pointer;text-decoration:none;font-size:1rem;transition:all .3s ease}.btn-primary{background:#667eea;color:#fff}.btn-primary:hover{background:#5a6fd8}.btn-secondary{background:#6c757d;color:#fff}.btn-secondary:hover{background:#5a6268}.card{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:1.5rem;margin-bottom:1rem}@media (max-width: 768px){.nav-container{flex-direction:column;gap:1rem}.nav-menu{gap:1rem}.hero h1{font-size:2rem}.features{grid-template-columns:1fr}} diff --git a/backend/public/index.html b/backend/public/index.html index 4dc95ba..7133d6d 100644 --- a/backend/public/index.html +++ b/backend/public/index.html @@ -6,8 +6,8 @@ Bike Service - Jouw fiets, onze zorg - - + +
diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue index dc0eae4..2fc2724 100644 --- a/frontend/src/views/Login.vue +++ b/frontend/src/views/Login.vue @@ -39,12 +39,6 @@ {{ loading ? 'Inloggen...' : 'Inloggen' }} - -