PageSourceSearch

https://repsshield.com/assets/ChangelogPage-BwwMeoP8.js

js repsshield.com collected 2026-10-02 02:00:40 UTC 13,482 bytes, 9 lines download raw bytes

1import{j as e,cx as C,a7 as S,m as E,n as M,f as F,o as I,l as P,r as L,P as R}from"./index-DGo-vssZ.js";import{r as d}from"./vendor-Qgthw7N1.js";import{L as $}from"./link-2-BPmLs3Hl.js";const A={feature:"🎁",improvement:"⭐",bugfix:"🔧",highlight:"✨"};function y({title:t,items:s,variant:i="highlight"}){if(!s||s.length===0)return null;const o=A[i];return e.jsxs("div",{className:"mb-6 last:mb-0",children:[e.jsxs("h4",{className:"flex items-center gap-2 mb-3.5",children:[e.jsx("span",{className:"text-[17px] leading-none","aria-hidden":"true",children:o}),e.jsx("span",{className:"text-[15px] font-semibold text-gray-900",children:t})]}),e.jsx("ul",{className:"space-y-3",children:s.map((a,r)=>{if(typeof a=="string")return e.jsxs("li",{className:"flex items-start gap-2.5 text-[15px] leading-relaxed text-gray-600",children:[e.jsx("span",{className:"mt-[9px] h-1.5 w-1.5 rounded-full bg-[#44958C] shrink-0"}),a]},r);if("type"in a){const l=a.type==="feature"?"bg-emerald-500":"bg-blue-500";return e.jsxs("li",{className:"flex items-start gap-2.5",children:[e.jsx("span",{className:`mt-[9px] h-1.5 w-1.5 rounded-full ${l} shrink-0`}),e.jsxs("div",{className:"text-[15px] leading-relaxed",children:[e.jsx("span",{className:"font-medium text-gray-800",children:a.title}),a.description&&e.jsx("p",{className:"text-gray-500 mt-0.5",children:a.description})]})]},r)}else return e.jsxs("li",{className:"flex items-start gap-2.5",children:[e.jsx("span",{className:"mt-[9px] h-1.5 w-1.5 rounded-full bg-red-400 shrink-0"}),e.jsxs("div",{className:"text-[15px] leading-relaxed",children:[e.jsx("span",{className:"font-medium text-gray-800",children:a.title}),a.description&&e.jsx("p",{className:"text-gray-500 mt-0.5",children:a.description})]})]},r)})})]})}function u({image:t,className:s,maxH:i,onClick:o,overlay:a}){return e.jsxs("figure",{className:`group cursor-zoom-in ${s||""}`,onClick:o,children:[e.jsxs("div",{className:`
2          relative overflow-hidden rounded-lg border border-gray-200/80 bg-gray-50
3          transition-all duration-200 hover:shadow-md hover:border-gray-300/80
4          ${i}
5        `,children:[e.jsx("img",{src:t.url,alt:t.alt||t.caption||"Release screenshot",className:"w-full h-full object-cover object-top group-hover:scale-[1.02] transition-transform duration-300",loading:"lazy"}),e.jsx("div",{className:"absolute inset-0 bg-black/0 group-hover:bg-black/5 transition-colors duration-200"}),a]}),t.caption&&e.jsx("figcaption",{className:"text-[11px] text-gray-400 mt-1.5 text-center italic",children:t.caption})]})}function T({count:t}){return e.jsx("div",{className:"absolute inset-0 bg-black/40 flex items-center justify-center rounded-lg transition-colors group-hover:bg-black/50",children:e.jsxs("span",{className:"text-white font-medium text-lg drop-shadow-sm",children:["+",t," more"]})})}function H({images:t,currentIndex:s,onClose:i,onNavigate:o}){const a=t[s],r=t.length>1;return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/70 backdrop-blur-sm p-4 sm:p-8 animate-[fadeIn_0.15s_ease-out]",onClick:i,role:"dialog","aria-label":"Image preview",children:e.jsxs("div",{className:"relative max-w-4xl w-full",onClick:l=>l.stopPropagation(),children:[e.jsx("button",{type:"button",onClick:i,className:"absolute -top-10 right-0 text-white/60 hover:text-white text-sm transition-colors",children:"Close"}),e.jsx("img",{src:a.url,alt:a.alt||a.caption||"Release image",className:"w-full max-h-[80vh] object-contain rounded-lg shadow-2xl cursor-default"}),a.caption&&e.jsx("p",{className:"text-white/80 text-sm text-center mt-3",children:a.caption}),r&&e.jsxs(e.Fragment,{children:[s>0&&e.jsx("button",{type:"button",onClick:()=>o(s-1),className:"absolute left-0 top-1/2 -translate-y-1/2 -translate-x-12 sm:-translate-x-14 h-10 w-10 rounded-full bg-white/10 hover:bg-white/20 flex items-center justify-center text-white transition-colors","aria-label":"Previous image",children:e.jsx("svg",{className:"h-5 w-5",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{d:"M15 18l-6-6 6-6"})})}),s<t.length-1&&e.jsx("button",{type:"button",onClick:()=>o(s+1),className:"absolute right-0 top-1/2 -translate-y-1/2 translate-x-12 sm:translate-x-14 h-10 w-10 rounded-full bg-white/10 hover:bg-white/20 flex items-center justify-center text-white transition-colors","aria-label":"Next image",children:e.jsx("svg",{className:"h-5 w-5",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{d:"M9 18l6-6-6-6"})})}),e.jsxs("div",{className:"absolute -bottom-8 left-1/2 -translate-x-1/2 text-white/50 text-xs",children:[s+1," / ",t.length]})]})]})})}function _({images:t,onImageClick:s}){const[i,o]=d.useState(!1),a=t.length;if(a===0)return null;if(a===1)return e.jsx("div",{className:"mb-5",children:e.jsx(u,{image:t[0],maxH:"max-h-[280px]",onClick:()=>s(0)})});if(a===2)return e.jsx("div",{className:"mb-5 grid grid-cols-2 gap-2.5",children:t.map((l,c)=>e.jsx(u,{image:l,maxH:"max-h-[200px]",onClick:()=>s(c)},c))});if(a===3)return e.jsxs("div",{className:"mb-5 space-y-2.5",children:[e.jsx(u,{image:t[0],maxH:"max-h-[220px]",onClick:()=>s(0)}),e.jsx("div",{className:"grid grid-cols-2 gap-2.5",children:t.slice(1).map((l,c)=>e.jsx(u,{image:l,maxH:"max-h-[160px]",onClick:()=>s(c+1)},c+1))})]});const r=a-3;return e.jsxs("div",{className:"mb-5 space-y-2.5",children:[e.jsx(u,{image:t[0],maxH:"max-h-[220px]",onClick:()=>s(0)}),e.jsxs("div",{className:"grid grid-cols-2 gap-2.5",children:[e.jsx(u,{image:t[1],maxH:"max-h-[160px]",onClick:()=>s(1)}),e.jsx(u,{image:t[2],maxH:"max-h-[160px]",onClick:()=>i?s(2):o(!0),overlay:!i&&r>0?e.jsx(T,{count:r}):void 0})]}),i&&a>3&&e.jsx("div",{className:"grid grid-cols-2 gap-2.5 animate-[fadeInUp_0.25s_ease-out]",children:t.slice(3).map((l,c)=>e.jsx(u,{image:l,maxH:"max-h-[160px]",onClick:()=>s(c+3)},c+3))})]})}function B(t){return`v${t}`}function D({changelog:t,activeFilter:s,animationDelay:i}){var N,w;const o=C(t.releaseDate),a=S(o,"MMMM d, yyyy"),[r,l]=d.useState(null),[c,j]=d.use
5State(!1),n=B(t.version),m=t.images||[],h=d.useCallback(x=>{l(x)},[]),p=d.useCallback(()=>{l(null)},[]),g=d.useCallback(async()=>{const x=`${window.location.origin}${window.location.pathname}#${n}`;try{await navigator.clipboard.writeText(x)}catch{}window.history.replaceState(null,"",`#${n}`),j(!0),window.setTimeout(()=>j(!1),1600)},[n]),b=s==="all"||s==="features"?((N=t.changes)==null?void 0:N.filter(x=>x.type==="feature"))??[]:[],f=s==="all"||s==="improvements"?((w=t.changes)==null?void 0:w.filter(x=>x.type==="improvement"))??[]:[],v=s==="all"||s==="bugfixes"?t.bugFixes??[]:[];return e.jsxs(e.Fragment,{children:[e.jsxs(E,{value:t.version,id:n,className:"changelog-entry scroll-mt-24 border-b border-gray-200/70 opacity-0 animate-[fadeInUp_0.4s_ease-out_forwards]",style:{animationDelay:`${i}ms`},children:[e.jsxs("div",{className:"flex items-start gap-1 [&>h3]:flex-1 [&>h3]:min-w-0",children:[e.jsx(M,{className:"hover:no-underline py-5 pr-1",children:e.jsxs("div",{className:"min-w-0 text-left",children:[e.jsxs("div",{className:"flex items-center gap-2.5 flex-wrap",children:[e.jsx("span",{className:"text-base font-semibold text-gray-900 tracking-tight",children:a}),e.jsxs("span",{className:"font-mono text-xs bg-[#44958C]/10 text-[#44958C] px-2 py-0.5 rounded font-medium shrink-0",children:["v",t.version]})]}),e.jsx("p",{className:"mt-1 text-sm text-gray-500 leading-snug",children:t.title})]})}),e.jsx("button",{type:"button",onClick:g,"aria-label":`Copy link to the ${a} release`,title:c?"Copied!":"Copy link to this release",className:"mt-[21px] shrink-0 rounded-full p-1.5 text-gray-300 transition-colors hover:bg-gray-100 hover:text-[#44958C]",children:c?e.jsx(F,{className:"h-4 w-4 text-emerald-500"}):e.jsx($,{className:"h-4 w-4"})})]}),e.jsx(I,{children:e.jsxs("div",{className:"pt-1 pb-7",children:[t.highlights&&t.highlights.length>0&&e.jsx("div",{className:"border-l-2 border-[#44958C]/40 pl-4 mb-6",children:t.highlights.map((x,k)=>e.jsx("p",{className:"text-gray-600 italic text-[0.95rem] leading-relaxed",children:x},k))}),e.jsx(_,{images:m,onImageClick:h}),b.length>0&&e.jsx(y,{title:"New Features",variant:"feature",items:b}),f.length>0&&e.jsx(y,{title:"Improvements",variant:"improvement",items:f}),v.length>0&&e.jsx(y,{title:"Bug Fixes",variant:"bugfix",items:v})]})})]}),r!==null&&m.length>0&&e.jsx(H,{images:m,currentIndex:r,onClose:p,onNavigate:l})]})}const V=[{label:"All",value:"all"},{label:"Features",value:"features"},{label:"Improvements",value:"improvements"},{label:"Bug Fixes",value:"bugfixes"}];function U(t,s){var i,o,a;switch(s){case"features":return((i=t.changes)==null?void 0:i.some(r=>r.type==="feature"))||!1;case"improvements":return((o=t.changes)==null?void 0:o.some(r=>r.type==="improvement"))||!1;case"bugfixes":return(((a=t.bugFixes)==null?void 0:a.length)||0)>0;default:return!0}}function q({changelogs:t}){const[s,i]=d.useState("all"),[o,a]=d.useState([]),r=d.useRef(!1),l=d.useMemo(()=>[...t].sort((n,m)=>{const h=n.version.split(".").map(Number),p=m.version.split(".").map(Number);for(let g=0;g<Math.max(h.length,p.length);g++){const b=h[g]||0,f=p[g]||0;if(b!==f)return f-b}return 0}),[t]),c=d.useMemo(()=>s==="all"?l:l.filter(n=>U(n,s)),[l,s]),j=d.useMemo(()=>{const n=new Map;return c.forEach((m,h)=>{n.set(m.version,Math.min(h*50,400))}),n},[c]);return d.useEffect(()=>{!r.current&&l.length>0&&(r.current=!0,a(l.map(n=>n.version)))},[l]),d.useEffect(()=>{const n=window.location.hash.replace(/^#/,"");if(!n||l.length===0)return;let m=n;try{m=decodeURIComponent(n)}catch{}const h=window.setTimeout(()=>{const p=document.getElementById(m);p&&p.scrollIntoView({block:"start"})},150);return()=>window.clearTimeout(h)},[l]),e.jsxs("div",{children:[e.jsx("div",{className:"flex items-center gap-2 overflow-x-auto pb-5 mb-2 border-b border-gray-200/60 scrollbar-hide",role:"group","aria-label":"Filter changelog entries",children:V.map(n=>e.jsx("button",{onClick:()=>i(n.value),"aria-pressed":s===n.value,className:`
6              px-4 py-1.5 rounded-full text-sm font-medium whitespace-nowrap
7              transition-all duration-200 ease-out
8              ${s===n.value?"bg-[#44958C] text-white shadow-sm":"bg-transparent text-gray-500 border border-gray-200 hover:border-gray-300 hover:text-gray-700"}
9            `,children:n.label},n.value))}),c.length===0?e.jsx("div",{className:"text-center py-20",children:e.jsxs("p",{className:"text-gray-400 italic",children:["No ",s==="all"?"":s.replace("bugfixes","bug fix")," entries yet."]})}):e.jsx(P,{type:"multiple",value:o,onValueChange:a,className:"w-full",children:c.map(n=>e.jsx(D,{changelog:n,activeFilter:s,animationDelay:j.get(n.version)??
90},n.version))})]})}async function z(){const t=await fetch("/api/changelog");if(!t.ok)throw new Error("Failed to fetch changelog");return t.json()}function O(){return L({queryKey:["changelog"],queryFn:z,staleTime:5*60*1e3})}function Q(){const{data:t,isLoading:s,error:i}=O();return d.useEffect(()=>{document.title="What's New - REPSShield Changelog";const o=document.querySelector('meta[name="description"]');o&&o.setAttribute("content","See the latest updates, features, and improvements to REPSShield. Track our progress as we build the best REP status tracking tool for real estate professionals.");const a=window.location.origin+window.location.pathname,r=document.getElementById("canonical-link")||document.querySelector('link[rel="canonical"]');if(r)r.href=a;else{const l=document.createElement("link");l.rel="canonical",l.id="canonical-link",l.href=a,document.head.appendChild(l)}},[]),e.jsxs(R,{children:[e.jsx("section",{className:"lm-section-spacing pb-2 sm:pb-4",children:e.jsxs("div",{className:"lm-container max-w-[780px]",children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-[0.14em] text-[#44958C] mb-3",children:"What's New"}),e.jsx("h1",{className:"text-3xl sm:text-4xl font-bold text-gray-900 mb-2 tracking-tight",style:{fontFamily:"'Playfair Display', serif"},children:"Changelog"}),e.jsx("p",{className:"text-sm sm:text-base text-gray-500 leading-relaxed",children:"Follow our latest updates and improvements."})]})}),e.jsx("section",{className:"flex-1 pb-20",children:e.jsx("div",{className:"lm-container max-w-[780px]",children:s?e.jsx(W,{}):i?e.jsxs("div",{className:"text-center py-20",children:[e.jsx("p",{className:"text-gray-500 mb-1",children:"Unable to load changelog."}),e.jsx("p",{className:"text-sm text-gray-400",children:"Please try again later."})]}):t&&t.length>0?e.jsx(q,{changelogs:t}):e.jsx("div",{className:"text-center py-20",children:e.jsx("p",{className:"text-gray-400 italic",children:"No releases yet. Check back soon."})})})})]})}function W(){return e.jsxs("div",{className:"pt-2",children:[e.jsx("div",{className:"flex gap-2 pb-5 mb-2 border-b border-gray-200/60",children:[1,2,3,4].map(t=>e.jsx("div",{className:"h-8 w-24 bg-gray-100 rounded-full animate-pulse"},t))}),[1,2].map(t=>e.jsxs("div",{className:"py-6 border-b border-gray-100",children:[e.jsx("div",{className:"h-5 w-44 bg-gray-100 rounded animate-pulse mb-2"}),e.jsx("div",{className:"h-4 w-64 bg-gray-100 rounded animate-pulse mb-6"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"h-4 w-full bg-gray-100 rounded animate-pulse"}),e.jsx("div",{className:"h-4 w-11/12 bg-gray-100 rounded animate-pulse"}),e.jsx("div",{className:"h-4 w-4/5 bg-gray-100 rounded animate-pulse"})]})]},t))]})}export{Q 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.