PageSourceSearch

https://tinosdovecoteplatform.lovable.app/assets/BibliographyPage-DpmY1zdy.js

js tinosdovecoteplatform.lovable.app collected 2026-10-03 03:50:49 UTC 21,033 bytes, 6 lines download raw bytes

1import{x as O,r as p,j as e,ao as z,v as x,s as d,b as W,ap as F,S as H,d as M,e as Y}from"./index-5fxczZZ_.js";import{r as V,u as Z}from"./usePageHeroImages-B2thdnOH.js";import{C as G}from"./chevron-down-CJCiZOCV.js";import{T as J}from"./trash-2-D2mcNGVO.js";import{C as Q}from"./chevron-left-l0CzNZDT.js";import{C as X}from"./chevron-right-DjdLzoWU.js";/**
2 * @license lucide-react v0.462.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const ee=O("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),R=["Βιβλίο","Άρθρο","Αρχείο","Φωτογραφία","Χάρτης","Έντυπο","Άλλο"],te=({items:U,reload:b,heroImages:h=[],reloadHeroImages:l})=>{const[$,u]=p.useState(!1),[k,m]=p.useState(""),[E,n]=p.useState(""),[v,w]=p.useState(""),[j,_]=p.useState("Βιβλίο"),[C,B]=p.useState(""),[A,S]=p.useState(""),[a,i]=p.useState(null),g=()=>{m(""),n(""),w(""),_("Βιβλίο"),B(""),S(""),i(null)},f=async()=>{if(!k.trim()){x({title:"Συμπλήρωσε τίτλο"});return}if(!a){x({title:"Πρόσθεσε μια φωτογραφία",description:"Κάθε καταχώρηση πρέπει να έχει εικόνα."});return}u(!0);try{let t=null;if(a){const r=a.name.split(".").pop()??"jpg",o=`${crypto.randomUUID()}.${r}`,{error:c}=await d.storage.from("bibliography").upload(o,a,{cacheControl:"3600",upsert:!1});if(c)throw c;t=o}const{error:s}=await d.from("bibliography_items").insert({title:k.trim(),author:E.trim()||null,year:v.trim()||null,kind:j||null,description:C.trim()||null,source_url:A.trim()||null,image_path:t});if(s)throw s;x({title:"Προστέθηκε"}),g(),b()}catch(t){const s=t instanceof Error?t.message:"Σφάλμα";x({title:"Σφάλμα",description:s,variant:"destructive"})}finally{u(!1)}},I=async(t,s)=>{try{const r=s.name.split(".").pop()??"jpg",o=`${crypto.randomUUID()}.${r}`,{error:c}=await d.storage.from("bibliography").upload(o,s,{cacheControl:"3600",upsert:!1});if(c)throw c;const{error:y}=await d.from("bibliography_items").update({image_path:o}).eq("id",t.id);if(y)throw y;t.image_path&&!t.image_path.startsWith("http")&&await d.storage.from("bibliography").remove([t.image_path]),b()}catch(r){const o=r instanceof Error?r.message:"Σφάλμα";x({title:"Σφάλμα",description:o,variant:"destructive"})}},N=async(t,s)=>{const{error:r}=await d.from("bibliography_items").update(s).eq("id",t.id);if(r){x({title:"Σφάλμα",description:r.message,variant:"destructive"});return}b()},P=async t=>{if(!confirm(`Διαγραφή "${t.title}";`))return;const{error:s}=await d.from("bibliography_items").delete().eq("id",t.id);if(s){x({title:"Σφάλμα",description:s.message,variant:"destructive"});return}t.image_path&&!t.image_path.startsWith("http")&&await d.storage.from("bibliography").remove([t.image_path]),b()},T=async t=>{var r;const s=(r=t.target.files)==null?void 0:r[0];if(s)try{const o=s.name.split(".").pop()??"jpg",c=`${crypto.randomUUID()}.${o}`,{error:y}=await d.storage.from("bibliography").upload(c,s,{cacheControl:"3600",upsert:!1});if(y)throw y;const{error:D}=await d.from("page_hero_images").insert({page:"bibliography",image_path:c,sort_order:h.length});if(D)throw D;x({title:"Προστέθηκε φωτογραφία"}),l==null||l()}catch(o){const c=o instanceof Error?o.message:"Σφάλμα";x({title:"Σφάλμα",description:c,variant:"destructive"})}finally{t.target.value=""}},q=async(t,s)=>{if(!l)return;const r=s==="up"?t-1:t+1;if(r<0||r>=h.length)return;const o=[...h],c=o[t];o[t]=o[r],o[r]=c;const y=o.map((D,L)=>d.from("page_hero_images").update({sort_order:L}).eq("id",D.id));await Promise.all(y),l()},K=async t=>{if(!confirm("Διαγραφή φωτογραφίας από το head;"))return;const{error:s}=await d.from("page_hero_images").delete().eq("id",t.id);if(s){x({title:"Σφάλμα",description:s.message,variant:"destructive"});return}t.image_path.startsWith("http")||await d.storage.from("bibliography").remove([t.image_path]),l==null||l()};return e.jsxs("div",{className:"border border-dashed border-foreground
6/40 p-6 mt-12 bg-background",children:[e.jsx("div",{className:"text-[10px] font-mono uppercase tracking-[0.25em] opacity-70 mb-4",children:"Admin · Διαχείριση αρχείου / βιβλιογραφίας"}),e.jsxs("div",{className:"border border-foreground/20 p-4 mb-8 bg-[#f7f1e3]",children:[e.jsx("div",{className:"text-[10px] font-mono uppercase tracking-[0.25em] opacity-70 mb-3",children:"Φωτογραφίες Head (carousel)"}),e.jsxs("div",{className:"flex flex-wrap gap-3 mb-4",children:[h.map((t,s)=>{const r=V(t.image_path);return e.jsxs("div",{className:"relative group w-24",children:[e.jsx("img",{src:r||"",alt:"hero",className:"w-24 h-16 object-cover border border-foreground/30"}),e.jsxs("div",{className:"absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-1",children:[e.jsx("button",{type:"button",onClick:()=>q(s,"up"),disabled:s===0,className:"text-white hover:text-amber-300 disabled:opacity-30",children:e.jsx(ee,{size:14})}),e.jsx("button",{type:"button",onClick:()=>q(s,"down"),disabled:s===h.length-1,className:"text-white hover:text-amber-300 disabled:opacity-30",children:e.jsx(G,{size:14})}),e.jsx("button",{type:"button",onClick:()=>K(t),className:"text-white hover:text-red-300",children:e.jsx(J,{size:14})})]})]},t.id)}),e.jsxs("label",{className:"w-24 h-16 border-2 border-dashed border-foreground
6/40 flex items-center justify-center cursor-pointer hover:border-foreground transition-colors",children:[e.jsx("span",{className:"text-2xl opacity-50",children:"+"}),e.jsx("input",{type:"file",accept:"image/*",className:"hidden",onChange:T})]})]}),e.jsx("p",{className:"text-[10px] font-grotesk opacity-60",children:"Πρόσθεσε, αναδιάταξε ή διέγραψε φωτογραφίες που εμφανίζονται στο head της σελίδας."})]}),e.jsxs("div",{className:"grid md:grid-cols-2 gap-3 mb-6",children:[e.jsx("input",{type:"text",placeholder:"Τίτλος *",value:k,onChange:t=>m(t.target.value),className:"border border-foreground/40 bg-background px-3 py-2 text-sm font-grotesk md:col-span-2"}),e.jsx("input",{type:"text",placeholder:"Συγγραφέας / Πηγή",value:E,onChange:t=>n(t.target.value),className:"border border-foreground/40 bg-background px-3 py-2 text-sm font-grotesk"}),e.jsx("input",{type:"text",placeholder:"Έτος",value:v,onChange:t=>w(t.target.value),className:"border border-foreground
6/40 bg-background px-3 py-2 text-sm font-grotesk"}),e.jsx("select",{value:j,onChange:t=>_(t.target.value),className:"border border-foreground/40 bg-background px-3 py-2 text-sm font-grotesk",children:R.map(t=>e.jsx("option",{value:t,children:t},t))}),e.jsx("input",{type:"url",placeholder:"Σύνδεσμος (προαιρετικά)",value:A,onChange:t=>S(t.target.value),className:"border border-foreground/40 bg-background px-3 py-2 text-sm font-grotesk"}),e.jsx("textarea",{placeholder:"Σύντομη περιγραφή / σημείωση",value:C,onChange:t=>B(t.target.value),className:"border border-foreground/40 bg-background px-3 py-2 text-sm font-grotesk md:col-span-2 min-h-[60px]"}),e.jsxs("label",{className:"md:col-span-2 text-xs font-grotesk space-y-1",children:[e.jsxs("span",{className:"block uppercase tracking-[0.2em] opacity-70",children:["Φωτογραφία * ",a&&`· ${a.name}`]}),e.jsx("input",{type:"file",accept:"image/*",required:!0,onChange:t=>{var s;return i(((s=t.target.files)==null?void 0:s[0])??null)},className:"text-xs font-grotesk"})]}),e.jsx("button",{type:"button",onClick:f,disabled:$,className:"md:col-span-2 font-grotesk text-xs uppercase tracking-[0.2em] border border-foreground px-5 py-3 hover:bg-foreground hover:text-background transition-colors disabled:opacity-50",children:$?"Ανέβασμα…":"+ Προσθήκη αναφοράς"})]}),U.length>0&&e.jsx("div",{className:"space-y-3",children:U.map(t=>{const s=z(t.image_path);return e.jsxs("div",{className:"flex gap-4 items-start border border-foreground
6/20 p-3",children:[s&&e.jsx("img",{src:s,alt:t.title,className:"w-20 h-24 object-cover flex-shrink-0 sepia-[0.2]"}),e.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[e.jsx("input",{type:"text",defaultValue:t.title,onBlur:r=>r.target.value!==t.title&&N(t,{title:r.target.value}),className:"w-full border border-foreground/30 bg-background px-2 py-1 text-sm font-grotesk"}),e.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[e.jsx("input",{type:"text",placeholder:"Συγγραφέας",defaultValue:t.author??"",onBlur:r=>r.target.value!==(t.author??"")&&N(t,{author:r.target.value||null}),className:"border border-foreground/30 bg-background px-2 py-1 text-xs font-grotesk"}),e.jsx("input",{type:"text",placeholder:"Έτος",defaultValue:t.year??"",onBlur:r=>r.target.value!==(t.year??"")&&N(t,{year:r.target.value||null}),className:"border border-foreground/30 bg-background px-2 py-1 text-xs font-grotesk"}),e.jsx("select",{defaultValue:t.kind??"Βιβλίο",onChange:r=>N(t,{kind:r.target.value}),className:"border border-foreground
6/30 bg-background px-2 py-1 text-xs font-grotesk",children:R.map(r=>e.jsx("option",{value:r,children:r},r))})]}),e.jsx("textarea",{defaultValue:t.description??"",placeholder:"Περιγραφή",onBlur:r=>r.target.value!==(t.description??"")&&N(t,{description:r.target.value||null}),className:"w-full border border-foreground/30 bg-background px-2 py-1 text-xs font-grotesk min-h-[40px]"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-xs",children:[e.jsx("input",{type:"url",placeholder:"URL",defaultValue:t.source_url??"",onBlur:r=>r.target.value!==(t.source_url??"")&&N(t,{source_url:r.target.value||null}),className:"flex-1 min-w-[160px] border border-foreground/30 bg-background px-2 py-1 font-grotesk"}),e.jsxs("label",{className:"font-grotesk cursor-pointer underline opacity-80 hover:opacity-100",children:["Αλλαγή εικόνας",e.jsx("input",{type:"file",accept:"image/*",className:"hidden",onChange:r=>{var c;const o=(c=r.target.files)==null?void 0:c[0];o&&I(t,o)}})]}),e.jsx("button",{type:"button",onClick:()=>P(t),className:"ml-auto font-grotesk opacity-70 hover:opacity-100 hover:text-destructive",children:"Διαγραφή"})]})]})]},t.id)})})]})},re="/assets/bibliography-hero-BcwlUlaZ.png",ce=()=>{const[U,b]=p.useState();p.useEffect(()=>{d.auth.getUser().then(({data:i})=>{var g;return b((g=i.user)==null?void 0:g.id)});const{data:a}=d.auth.onAuthStateChange((i,g)=>{var f;return b((f=g==null?void 0:g.user)==null?void 0:f.id)});return()=>a.subscription.unsubscribe()},[]);const{isAdmin:h}=W(U),{items:l,reload:$}=F(),{images:u,reload:k}=Z("bibliography"),[m,E]=p.useState("Όλα"),[n,v]=p.useState(null),[w,j]=p.useState(0),_=p.useMemo(()=>{const a=new Set;return l.forEach(i=>i.kind&&a.add(i.kind)),["Όλα",...Array.from(a)]},[l]),C=p.useMemo(()=>m==="Όλα"?l:l.filter(a=>a.kind===m),[l,m]),B=()=>{u.length!==0&&j(a=>(a+1)%u.length)},A=()=>{u.length!==0&&j(a=>(a-1+u.length)%u.length)},S=u.length>0?V(u[w].image_path):re;return e.jsxs("div",{className:"min-h-screen text-foreground bg-[#efe9dd] relative overflow-hidden",children:[e.jsx("div",{className:"pointer-events-none absolute inset-0 opacity-[0.35] mix-blend-multiply",style:{backgroundImage:"radial-gradient(circle at 20% 30%, rgba(120,90,40,0.18) 0, transparent 40%), radial-gradient(circle at 80% 70%, rgba(80,60,30,0.15) 0, transparent 45%), radial-gradient(circle at 50% 90%, rgba(150,110,60,0.12) 0, transparent 50%)"}}),e.jsx("div",{className:"pointer-events-none absolute inset-0 opacity-[0.12]",style:{backgroundImage:"repeating-linear-gradient(0deg, rgba(0,0,0,0.25) 0 1px, transparent 1px 3px), repeating-linear-gradient(90deg, rgba(0,0,0,0.18) 0 1px, transparent 1px 3px)"}}),e.jsx(H,{title:"Βιβλιογραφία — Tinos Dovecotes",description:"Επιλεγμένη βιβλιογραφία και πηγές για τους περιστεριώνες και την αρχιτεκτονική της Τήνου.",path:"/bibliography"}),e.jsx(M,{}),e.jsxs("main",{className:"relative pt-32 pb-24",children:[e.jsxs("section",{className:"container max-w-6xl",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsx("div",{className:"h-px flex-1 bg-foreground
6/40"}),e.jsx("div",{className:"text-[10px] font-mono uppercase tracking-[0.4em] opacity-70",children:"Αρχείο · Βιβλιογραφία"}),e.jsx("div",{className:"h-px flex-1 bg-foreground/40"})]}),e.jsxs("figure",{className:"mb-10 relative",children:[e.jsxs("div",{className:"relative w-full bg-[#f7f1e3] border border-foreground/30 shadow-[0_8px_30px_-12px_rgba(60,40,15,0.4)]",children:[S?e.jsx("img",{src:S,alt:"Αρχειακή φωτογραφία",className:"w-full max-h-[70vh] object-contain"}):e.jsx("div",{className:"w-full h-[40vh] flex items-center justify-center bg-[#e6dec8]",children:e.jsx("span",{className:"font-display italic text-foreground/40 text-2xl",children:"Δεν υπάρχουν φωτογραφίες"})}),u.length>1&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:A,className:"absolute left-3 top-1/2 -translate-y-1/2 w-10 h-10 bg-background/80 backdrop-blur border border-foreground/30 flex items-center justify-center hover:bg-background transition-colors shadow-lg","aria-label":"Προηγούμενη φωτογραφία",children:e.jsx(Q,{size:20})}),e.jsx("button",{type:"button",onClick:B,className:"absolute right-3 top-1/2 -translate-y-1/2 w-10 h-10 bg-background/80 backdrop-blur border border-foreground
6/30 flex items-center justify-center hover:bg-background transition-colors shadow-lg","aria-label":"Επόμενη φωτογραφία",children:e.jsx(X,{size:20})})]}),u.length>1&&e.jsx("div",{className:"absolute bottom-3 left-1/2 -translate-x-1/2 flex gap-2",children:u.map((a,i)=>e.jsx("button",{type:"button",onClick:()=>j(i),className:`w-2 h-2 rounded-full transition-colors ${i===w?"bg-foreground":"bg-foreground/40 hover:bg-foreground/60"}`,"aria-label":`Φωτογραφία ${i+1}`},i))})]}),e.jsx("figcaption",{className:"font-mono text-[10px] uppercase tracking-[0.3em] opacity-60 mt-3 text-center",children:"Αρχειακή τεκμηρίωση · Τήνος"})]}),e.jsxs("h1",{className:"font-display italic md:text-7xl leading-[0.95] tracking-tight mb-10 text-[hsl(var(--ink-blue))] font-sans font-semibold text-4xl",children:["Πηγές, αναφορές",e.jsx("br",{}),e.jsx("span",{className:"italic opacity-80",children:"& αρχειακά τεκμήρια."})]}),e.jsxs("div",{className:"font-grotesk text-base md:text-lg opacity-80 max-w-2xl leading-relaxed space-y-4",children:[e.jsx("p",{children:"Οι περιστεριώνες της Τήνου αποτέλεσαν, εδώ και δεκαετίες, σημείο ιδιαίτερου ενδιαφέροντος για κατοίκους, περιηγητές, ερευνητές, αρχιτέκτονες, καλλιτέχνες και επισκέπτες από την Ελλάδα και το εξωτερικό. Η μοναδική τους παρουσία μέσα στο τοπίο, η αρχιτεκτονική λεπτομέρεια, η σχέση τους με την αγροτική ζωή και η ιδιαίτερη ιστορία τους, δημιούργησαν διαχρονικά την ανάγκη καταγραφής, μελέτης και περιήγησης γύρω από αυτούς."}),e.jsx("p",{children:"Μέσα στα χρόνια πραγματοποιήθηκαν πολλές και διαφορετικές προσπάθειες τεκμηρίωσης των περιστεριώνων: από προσωπικά ημερολόγια και φωτογραφικές καταγραφές, μέχρι οργανωμένες εκδόσεις, βιβλία, φυλλάδια, ακαδημαϊκές μελέτες, σχολικές εργασίες και ερευνητικά αρχεία. Η βιβλιογραφία που αφορά αυτά τα ιδιαίτερα αγροτικά μνημεία της Τήνου είναι σήμερα ιδιαίτερα πλούσια, πολυσυλλεκτική και εμπνευστική, αποτυπώνοντας διαφορετικές οπτικές γύρω από την ιστορία, την αρχιτεκτονική, τη λαογραφία και τη σύγχρονη σημασία τους."}),e.jsx("p",{children:"Στην ενότητα αυτή επιχειρούμε να συγκεντρώσουμε και να παρουσιάσουμε μέρος αυτού του υλικού, δημιουργώντας ένα ανοιχτό και διαρκώς εξελισσόμενο αρχείο αναφοράς για τους περιστεριώνες της Τήνου."})]}),_.length>1&&e.jsx("div",{className:"flex flex-wrap gap-2 mt-10",children:_.map(a=>e.jsx("button",{type:"button",onClick:()=>E(a),className:`font-mono text-[10px] uppercase tracking-[0.25em] px-4 py-2 border transition-colors ${m===a?"bg-foreground text-background border-foreground":"border-foreground
6/40 hover:border-foreground"}`,children:a},a))})]}),e.jsxs("section",{className:"container max-w-6xl mt-16",children:[C.length===0?e.jsx("div",{className:"border border-dashed border-foreground/30 p-12 text-center",children:e.jsxs("p",{className:"font-grotesk opacity-70 italic",children:["Καμία καταχώρηση ακόμη. ",h&&"Πρόσθεσε την πρώτη αναφορά παρακάτω."]})}):e.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-3 gap-x-6 gap-y-12",children:C.map((a,i)=>{const g=z(a.image_path),f=i*7%5-2;return e.jsx("article",{className:"group",children:e.jsxs("button",{type:"button",onClick:()=>v(a),className:"block w-full text-left",children:[e.jsxs("div",{className:"relative mb-4",children:[e.jsx("div",{className:"absolute inset-0 bg-foreground/10 translate-x-1.5 translate-y-1.5",style:{transform:`rotate(${f}deg) translate(6px,6px)`}}),e.jsxs("div",{className:"relative bg-[#f7f1e3] border border-foreground/30 p-2 shadow-[0_4px_18px_-8px_rgba(60,40,15,0.5)] transition-transform group-hover:-translate-y-1",style:{transform:`rotate(${f}deg)`},children:[g?e.jsx("img",{src:g,alt:a.title,loading:"lazy",className:"w-full aspect-[3/4] object-cover sepia-[0.25] contrast-[1.02]"}):e.jsx("div",{className:"w-full aspect-[3/4] bg-[#e6dec8] flex items-center justify-center",children:e.jsx("span",{className:"font-display italic text-foreground/40 text-2xl",children:a.kind??"—"})}),e.jsx("span",{className:"absolute -top-3 left-1/2 -translate-x-1/2 w-16 h-5 bg-[#e8c97a]/60 border border-[#c9a84c]/30 rotate-[-3deg]"})]})]}),e.jsxs("div",{className:"px-1",children:[e.jsxs("div",{className:"font-mono text-[10px] uppercase tracking-[0.3em] opacity-60 mb-1",children:[a.kind??"Αναφορά",a.year&&` · ${a.year}`]}),e.jsx("h3",{className:"font-display text-xl font-medium leading-snug group-hover:underline",children:a.title}),a.author&&e.jsx("div",{className:"font-grotesk text-sm italic opacity-75 mt-1",children:a.author})]})]})},a.id)})}),h&&e.jsx(te,{items:l,reload:$,heroImages:u,reloadHeroImages:k})]})]}),n&&e.jsx("div",{className:"fixed inset-0 z-[60] bg-black/70 flex items-center justify-center p-4 animate-fade-in",onClick:()=>v(null),children:e.jsxs("div",{className:"bg-[#f7f1e3] text-foreground max-w-3xl w-full max-h-[90vh] overflow-y-auto border border-foreground
6/40 shadow-2xl",onClick:a=>a.stopPropagation(),children:[e.jsx("div",{className:"flex justify-end p-3",children:e.jsx("button",{type:"button",onClick:()=>v(null),className:"font-mono text-xs uppercase tracking-[0.25em] opacity-70 hover:opacity-100",children:"Κλείσιμο ×"})}),e.jsxs("div",{className:"grid md:grid-cols-2 gap-6 p-6 pt-0",children:[e.jsx("div",{children:z(n.image_path)?e.jsx("img",{src:z(n.image_path),alt:n.title,className:"w-full object-contain max-h-[70vh] sepia-[0.2] border border-foreground/20"}):e.jsx("div",{className:"aspect-[3/4] bg-[#e6dec8]"})}),e.jsxs("div",{className:"flex flex-col",children:[e.jsxs("div",{className:"font-mono text-[10px] uppercase tracking-[0.3em] opacity-60 mb-2",children:[n.kind??"Αναφορά",n.year&&` · ${n.year}`]}),e.jsx("h2",{className:"font-display text-3xl font-semibold leading-tight mb-3",children:n.title}),n.author&&e.jsx("div",{className:"font-grotesk italic opacity-80 mb-4",children:n.author}),n.description&&e.jsx("p",{className:"font-grotesk text-sm leading-relaxed opacity-90 whitespace-pre-wrap",children:n.description}),n.source_url&&e.jsx("a",{href:n.source_url,target:"_blank",rel:"noreferrer",className:"mt-6 self-start font-mono text-[11px] uppercase tracking-[0.25em] border border-foreground px-4 py-2 hover:bg-foreground hover:text-background transition-colors",children:"Πηγή ↗"})]})]})]})}),e.jsx(Y,{})]})};export{ce as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.