PageSourceSearch

https://westeroscraft.com/assets/route-BPwe7Zyq.js

js westeroscraft.com collected 2026-10-01 12:15:59 UTC 17,181 bytes, 1 lines download raw bytes

1import{i as e,t}from"./jsx-runtime-Cx0BB4qO.js";import{n}from"./invariant-HguoSw0I.js";import{r}from"./link-CLHzqhUk.js";import{t as i}from"./createLucideIcon-DrUIos_6.js";import{t as a}from"./corner-down-left-B_v_DOv2.js";import{t as o}from"./x-COfgRWPI.js";import{t as s}from"./checkbox-DbaJVxbp.js";import{t as c}from"./button-DnQfmTgB.js";import{a as l,c as u,i as d,n as f,o as p,s as m}from"./command-DlasA-0Z.js";import{t as h}from"./kbd-DTLLgdjJ.js";import{$ as g,$t as _,J as v,X as y,Y as b,Z as x,at as S,ct as C,et as w,i as T,it as E,lt as D,nt as O,ot as k,q as A,rt as j,st as M,tt as N}from"./index-DSSE01Jf.js";import{t as P}from"./input-BnWVlAis.js";import{n as F,t as I}from"./projects-browse-context-BlJlTu_S.js";var L=i(`list-filter`,[[`path`,{d:`M2 5h20`,key:`1fs1ex`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`path`,{d:`M9 19h6`,key:`456am0`}]]),R=e(n(),1),z=t(),B=5,V=`inline-flex h-auto items-center rounded-none border border-hairline bg-transparent px-1.5 py-px font-mono text-[0.8125rem] tracking-[0.1em] text-stone`;function H({open:e,onOpenChange:t,initialQuery:n,projects:i,builders:o,houses:s,onApplyQuery:c}){let g=r(),[_,v]=(0,R.useState)(n);(0,R.useEffect)(()=>{e&&v(n)},[e,n]);let y=_.trim().toLowerCase(),{builds:b,matchedBuilders:x,matchedHouses:C}=(0,R.useMemo)(()=>{if(!y)return{builds:[],matchedBuilders:[],matchedHouses:[]};let e=[];for(let t of i){if(e.length>=B)break;`${t.name} ${t.region?N[t.region]:``} ${t.builders.map(e=>e.username).join(` `)} ${t.houses.map(e=>e.name).join(` `)}`.toLowerCase().includes(y)&&e.push(t)}let t=[];for(let e of o){if(t.length>=B)break;(e.username.toLowerCase().includes(y)||e.projects.some(e=>e.name.toLowerCase().includes(y)))&&t.push(e)}let n=[];for(let e of s){if(n.length>=B)break;(e.name.toLowerCase().includes(y)||(e.description?.toLowerCase().includes(y)??!1))&&n.push(e)}return{builds:e,matchedBuilders:t,matchedHouses:n}},[y,i,o,s]),w=b.length>0||x.length>0||C.length>0;function E(){t(!1)}let D=e=>{E(),g.navigate({to:`/projects/$slug`,params:{slug:e}})},O=e=>{E(),g.navigate({to:`/projects`,search:{tab:`builds`,builders:[e]}})},k=e=>{E(),g.navigate({to:`/projects`,search:{tab:`builds`,houses:[e]}})};return(0,z.jsxs)(f,{open:e,onOpenChange:t,shouldFilter:!1,label:`Search projects`,description:`Search builds, builders, and houses. Press Enter to open a result, or filter the page by your search.`,children:[(0,z.jsx)(l,{value:_,onValueChange:v,placeholder:`Search builds, builders, houses…`}),(0,z.jsx)(m,{children:y===``?(0,z.jsx)(`p`,{className:`px-3 py-10 text-center font-display text-[0.9375rem] text-stone italic [font-variation-settings:'opsz'_18,'SOFT'_40,'WONK'_0]`,children:`Search the realm by build, builder, or house.`}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(d,{heading:`Filter`,children:(0,z.jsxs)(p,{value:`apply-filter`,onSelect:()=>{E(),c(_.trim())},className:`gap-3`,children:[(0,z.jsx)(L,{className:`size-4 shrink-0 text-stone`,"aria-hidden":!0}),(0,z.jsxs)(`span`,{className:`min-w-0 flex-1 truncate`,children:[`Filter results for`,` `,(0,z.jsxs)(`span`,{className:`font-medium text-ironwood`,children:[`“`,_.trim(),`”`]})]})]})}),b.length>0&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(u,{}),(0,z.jsx)(d,{heading:`Builds`,children:b.map(e=>(0,z.jsxs)(p,{value:`build:${e.slug}`,onSelect:()=>D(e.slug),children:[(0,z.jsx)(`span`,{className:`block size-8 shrink-0 overflow-hidden border border-hairline bg-parchment`,"aria-hidden":!0,children:e.featuredImageId?(0,z.jsx)(`img`,{src:T(e.featuredImageId,`w=96,h=96,fit=cover,format=auto`),alt:``,width:32,height:32,className:`block h-full w-full object-cover`}):(0,z.jsx)(`span`,{className:`flex h-full w-full items-center justify-center`,children:(0,z.jsx)(`span`,{className:`block size-1.5`,style:{background:e.region?j[e.region]:`var(--ds-stone)`}})})}),(0,z.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.name}),(0,z.jsx)(`span`,{className:`shrink-0 font-mono text-[0.8125rem] tracking-[0.12em] text-stone uppercase`,children:e.region?N[e.region]:S[e.status]})]},e.id))})]}),x.length>0&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(u,{}),(0,z.jsx)(d,{heading:`Builders`,children:x.map(e=>(0,z.jsxs)(p,{value:`builder:${e.username}`,onSelect:()=>O(e.username),children:[(0,z.jsx)(`span`,{className:`block size-8 shrink-0 overflow-hidden border border-hairline bg-parchment [image-rendering:pixelated]`,"aria-hidden":!0,
1children:(0,z.jsx)(`img`,{src:`https://mc-heads.net/avatar/${e.username}/64`,alt:``,width:32,height:32,className:`block h-full w-full object-cover`})}),(0,z.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono text-[0.875rem]`,children:e.username}),(0,z.jsxs)(`span`,{className:`shrink-0 font-mono text-[0.8125rem] tracking-[0.12em] text-stone uppercase [font-variant-numeric:tabular-nums]`,children:[e.projects.length,` `,e.projects.length===1?`build`:`builds`]})]},e.id))})]}),C.length>0&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(u,{}),(0,z.jsx)(d,{heading:`Houses`,children:C.map(e=>(0,z.jsxs)(p,{value:`house:${e.slug}`,onSelect:()=>k(e.slug),children:[(0,z.jsx)(`span`,{className:`flex size-8 shrink-0 items-center justify-center overflow-hidden border border-hairline bg-parchment`,"aria-hidden":!0,children:e.bannerId?(0,z.jsx)(`img`,{src:T(e.bannerId,`w=96,h=192,fit=contain,format=auto`),alt:``,width:20,height:32,className:`block h-full w-auto object-contain [image-rendering:pixelated]`}):null}),(0,z.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-display text-[1rem] font-[460] [font-variation-settings:'opsz'_18,'SOFT'_25,'WONK'_0]`,children:e.name}),(0,z.jsxs)(`span`,{className:`shrink-0 font-mono text-[0.8125rem] tracking-[0.12em] text-stone uppercase [font-variant-numeric:tabular-nums]`,children:[e.projects.length,` `,e.projects.length===1?`build`:`builds`]})]},e.id))})]}),!w&&(0,z.jsx)(`p`,{className:`px-3 pt-3 pb-5 text-center font-display text-[0.9375rem] text-stone italic [font-variation-settings:'opsz'_18,'SOFT'_40,'WONK'_0]`,children:`No builds, builders, or houses by that name.`})]})}),(0,z.jsxs)(`div`,{className:`flex items-center gap-4 border-t border-hairline px-5 py-2.5 font-mono text-[0.8125rem] tracking-[0.08em] text-stone`,children:[(0,z.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,z.jsx)(h,{className:V,children:(0,z.jsx)(a,{className:`size-3`,"aria-hidden":!0})}),`open`]}),(0,z.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,z.jsx)(h,{className:V,children:`esc`}),`close`]})]})]})}function U({region:e,size:t=22,className:n=``}){return(0,z.jsx)(`span`,{className:`block shrink-0 overflow-hidden bg-parchment [image-rendering:pixelated] ${n}`,style:{width:t,height:t},"aria-hidden":!0,children:(0,z.jsx)(`img`,{src:w[e],alt:``,loading:`lazy`,decoding:`async`,width:t,height:t,className:`block h-full w-full object-cover`})})}var W=200;function G(){let{search:e,patchSearch:t,toggleArrayValue:n,clearAllFilters:r,hasAnyFilter:i,houses:a,regionCounts:o,statusCounts:s,typeCounts:l,categoryCounts:u,otherCounts:d}=F();return(0,z.jsxs)(`div`,{className:`flex flex-col`,children:[(0,z.jsx)(K,{}),(0,z.jsxs)(`div`,{className:`mt-6 flex items-center justify-between border-b border-hairline pb-3`,children:[(0,z.jsx)(`h2`,{className:`m-0 font-mono text-[0.8125rem] font-medium tracking-[0.12em] text-stone uppercase`,children:`Filters`}),i&&(0,z.jsx)(c,{type:`button`,variant:`mono`,size:`xs`,onClick:r,children:`Clear all`})]}),(e.houses.length>0||e.builders.length>0)&&(0,z.jsxs)(`div`,{className:`flex flex-wrap gap-1.5 border-b border-hairline py-3`,children:[e.builders.map(e=>(0,z.jsx)(Y,{label:e,onRemove:()=>n(`builders`,e)},`b-${e}`)),e.houses.map(e=>(0,z.jsx)(Y,{label:a.find(t=>t.slug===e)?.name??e,onRemove:()=>n(`houses`,e)},`h-${e}`))]}),(0,z.jsx)(q,{title:`Region`,count:e.regions.length,onClear:()=>t({regions:[]}),children:O.map(t=>(0,z.jsx)(J,{checked:e.regions.includes(t),count:o.get(t)??0,onToggle:()=>n(`regions`,t),leading:(0,z.jsx)(U,{region:t,size:20}),label:N[t]},t))}),(0,z.jsx)(q,{title:`Status`,count:e.statuses.length,onClear:()=>t({statuses:[]}),children:E.map(t=>(0,z.jsx)(J,{checked:e.statuses.includes(t),count:s.get(t)??0,onToggle:()=>n(`statuses`,t),leading:(0,z.jsx)(`span`,{className:`inline-block size-1.5 shrink-0`,style:{background:k[t]},"aria-hidden":!0}),label:S[t]},t))}),(0,z.jsx)(q,{title:`Type`,count:e.types.length,onClear:()=>t({types:[]}),children:M.map(t=>(0,z.jsx)(J,{checked:e.types.includes(t),count:l.get(t)??0,onToggle:()=>n(`types`,t),label:C[t]},t))}),(0,z.jsx)(q,{title:`Category`,count:e.categories.length,onClear:()=>t({categories:[]}),children:v.map(t=>(0,z.jsx)(J,{checked:e.categories.includes(t),count:u.get(t)??0,onToggle:()=>n(`categories`,t),label:b[t]},t))}),(0,z.jsx)(q,{title:`Other`,count:e.other.length,onClear:()=>t({other:[]}),last:!0,children:y.map(t=>(0,z.jsx)(J,{checked:e.other.includes(t),count:d.get(t)??0,onToggle:()=>
1n(`other`,t),label:x[t]},t))})]})}function K(){let{search:e,patchSearch:t,openPalette:n}=F(),r=(0,R.useRef)(null),[i,a]=(0,R.useState)(e.q);return(0,R.useEffect)(()=>{if(i===e.q)return;let n=setTimeout(()=>t({q:i}),W);return()=>clearTimeout(n)},[i,e.q,t]),(0,R.useEffect)(()=>{document.activeElement!==r.current&&a(e.q)},[e.q]),(0,z.jsxs)(`div`,{className:`relative`,children:[(0,z.jsx)(`label`,{htmlFor:`projects-rail-q`,className:`sr-only`,children:`Search builds, builders, and houses`}),(0,z.jsx)(P,{ref:r,id:`projects-rail-q`,type:`search`,value:i,onChange:e=>a(e.target.value),placeholder:`Search builds…`,autoComplete:`off`,className:`pr-12 [&::-webkit-search-cancel-button]:hidden`}),(0,z.jsx)(c,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:n,"aria-label":`Open quick search`,"aria-keyshortcuts":`Meta+K Control+K`,className:`absolute top-1/2 right-1.5 size-auto -translate-y-1/2 p-1 hover:opacity-70`,children:(0,z.jsx)(h,{className:`pointer-events-none inline-flex h-6 items-center rounded-none border border-hairline bg-vellum px-1.5 font-mono text-[0.8125rem] tracking-[0.1em] text-stone`,children:`⌘K`})})]})}function q({title:e,count:t,onClear:n,last:r,children:i}){return(0,z.jsxs)(`section`,{className:`py-4 ${r?``:`border-b border-hairline`}`,children:[(0,z.jsxs)(`div`,{className:`mb-2.5 flex items-center justify-between`,children:[(0,z.jsx)(`h3`,{className:`m-0 font-mono text-[0.8125rem] font-medium tracking-[0.12em] text-stone uppercase`,children:e}),t>0&&(0,z.jsxs)(c,{type:`button`,variant:`mono`,size:`xs`,onClick:n,"aria-label":`Clear ${e} filter`,className:`tracking-[0.04em] normal-case [font-variant-numeric:tabular-nums]`,children:[t,` ✕`]})]}),(0,z.jsx)(`div`,{className:`flex flex-col`,children:i})]})}function J({checked:e,count:t,onToggle:n,leading:r,label:i}){let a=t===0&&!e;return(0,z.jsxs)(`label`,{className:`group flex cursor-pointer items-center gap-2.5 py-1.5 transition-opacity duration-[120ms] ease-ds ${a?`cursor-not-allowed opacity-40`:``}`,children:[(0,z.jsx)(s,{checked:e,disabled:a,onCheckedChange:()=>n(),"aria-label":i}),r,(0,z.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-body text-[1rem] leading-[1.4] text-ironwood`,children:i}),(0,z.jsx)(`span`,{className:`shrink-0 font-mono text-[0.8125rem] font-medium text-stone [font-variant-numeric:tabular-nums]`,children:t.toLocaleString(`en-US`)})]})}function Y({label:e,onRemove:t}){return(0,z.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 border border-ironwood px-2 py-1 font-mono text-[0.8125rem] font-medium tracking-[0.02em] text-ironwood normal-case`,children:[e,(0,z.jsx)(c,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:t,"aria-label":`Remove ${e}`,className:`-m-1 p-1`,children:(0,z.jsx)(`span`,{className:`inline-flex size-[18px] items-center justify-center bg-ironwood text-vellum transition-[background-color] duration-[120ms] ease-ds hover:bg-wax-seal-red`,"aria-hidden":!0,children:(0,z.jsx)(o,{className:`size-3`})})})]})}var X=[`highgarden`,`kings-landing`,`castle-black`,`pyke`,`storms-end`,`the-eyrie`];function Z(e){let t=new Map,n=[],r=new Set(X);for(let i of e)r.has(i.slug)?t.set(i.slug,i):n.push(i);let i=[];for(let e of X){let n=t.get(e);n&&i.push(n)}return[...i,...n]}function Q(){let{projects:e,builders:t,houses:n}=A.useLoaderData(),r=(0,R.useMemo)(()=>Z(e),[e]),i=A.useSearch(),a=A.useNavigate(),[o,s]=(0,R.useState)(!1);(0,R.useEffect)(()=>{function e(e){(e.key===`k`||e.key===`K`)&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),s(e=>!e))}return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]);let c=(0,R.useCallback)(e=>{a({to:`/projects`,search:t=>{let n={...t,...e};return e.page===void 0&&(n.page=1),D(n)}})},[a]),l=(0,R.useCallback)((e,t)=>{let n=i[e],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];c({[e]:r,tab:`builds`})},[i,c]),u=(0,R.useCallback)(()=>{c({q:``,regions:[],statuses:[],types:[],categories:[],houses:[],builders:[],other:[]})},[c]),d=(0,R.useCallback)(()=>s(!0),[]),f=(0,R.useMemo)(()=>new Set(i.regions),[i.regions]),p=(0,R.useMemo)(()=>new Set(i.statuses),[i.statuses]),m=(0,R.useMemo)(()=>new Set(i.types),[i.types]),h=(0,R.useMemo)(()=>new Set(i.categories),[i.categories]),b=(0,R.useMemo)(()=>new Set(i.houses),[i.houses]),x=(0,R.useMemo)(()=>new Set(i.builders),[i.builders]),S=(0,R.useMemo)(()=>new Set(i.other),[i.other]),C=i.q.trim().toLowerCase(),w=(0,R.useMemo)(()=>r.map(e=>({project:e,haystack:[e.name,e.description??``,e.region?N[e.region]:``,e.builders.map(e=>e.username).join(` `),e.houses.map(e=>e.name).join(` `)].join(` `).toLowerCase(),categorySlugs:new Set(e.categories.map(e=>e.slug)),houseSlugs:new Set(e.houses.map(e=>e.slug)),builderUsernames:new Set(e.builders.map(e=>e.username)),hasMembers:e.builders.length>0,hasWiki:e.hasWiki})),[r]),T=f.size>0||p.size>0||m.size>0||h.size>0||b.size>0||x.size>0||S.size>0||C.length>0,{filteredProjects:O,regionCounts:k,statusCounts:j,typeCounts:P,categoryCounts:F,otherCounts:L}=(0,R.useMemo)(()=>{let e=new Map;for(let t of g)e.set(t,0);let t=new Map;for(let e of E)t.set(e,0);let n=new Map;for(let e of M)n.set(e,0);let r=new Map;for(let e of v)r.set(e,0);let i=new Map;for(let e of y)i.set(e,0);let a=[],o=f.size>0,s=p.size>0,c=m.size>0,l=h.size>0,u=b.size>0,d=x.size>0,_=S.size>0,D=C.length>0;for(let g of w){let v=g.project,y=!o||!!v.region&&f.has(v.region),w=!s||p.has(v.status),T=!c||m.has(v.projectType),E=!l;if(!E){for(let e of g.categorySlugs)if(h.has(e)){E=!0;break}}let O=!u;if(!O){for(let e of g.houseSlugs)if(b.has(e)){O=!0;break}}let k=!d;if(!k){for(let e of g.builderUsernames)if(x.has(e)){k=!0;break}}let A=!_;if(!A){let e=!0;S.has(`has_image`)&&!v.featuredImageId&&(e=!1),e&&S.has(`has_members`)&&!g.hasMembers&&(e=!1),e&&S.has(`has_wiki`)&&!g.hasWiki&&(e=!1),A=e}let j=!D||g.haystack.includes(C);if(y&&w&&T&&E&&O&&k&&A&&j&&a.push(v),w&&T&&E&&O&&k&&A&&j&&v.region&&e.set(v.region,(e.get(v.region)??0)+1),y&&T&&E&&O&&k&&A&&j&&t.set(v.status,(t.get(v.status)??0)+1),y&&w&&E&&O&&k&&A&&j&&n.set(v.projectType,(n.get(v.projectType)??0)+1),y&&w&&T&&O&&k&&A&&j)for(let e of v.categories){let t=e.slug;r.has(t)&&r.set(t,(r.get(t)??0)+1)}y&&w&&T&&E&&O&&k&&j&&(v.featuredImageId&&i.set(`has_image`,(i.get(`has_image`)??0)+1),g.hasMembers&&i.set(`has_members`,(i.get(`has_members`)??0)+1),g.hasWiki&&i.set(`has_wiki`,(i.get(`has_wiki`)??0)+1))}return{filteredProjects:T?a:a.filter(e=>e.featuredImageId),regionCounts:e,statusCounts:t,typeCounts:n,categoryCounts:r,otherCounts:i}},[w,f,p,m,h,b,x,S,C,T]),B=(0,R.useMemo)(()=>C.length===0?t:t.filter(e=>e.username.toLowerCase().includes(C)?!0:e.projects.some(e=>
1e.name.toLowerCase().includes(C))),[t,C]),V=(0,R.useMemo)(()=>C.length===0?n:n.filter(e=>!!(e.name.toLowerCase().includes(C)||e.description?.toLowerCase().includes(C))),[n,C]),U=(0,R.useMemo)(()=>{let e=0,t=0,n=new Set;for(let i of r)i.status===`completed`&&e++,i.status===`in_progress`&&t++,i.region&&n.add(i.region);return{total:r.length,completed:e,inProgress:t,regionCount:n.size}},[r]),W=i.regions.length+i.statuses.length+i.types.length+i.categories.length+i.houses.length+i.builders.length+i.other.length,K=(0,R.useMemo)(()=>({search:i,patchSearch:c,toggleArrayValue:l,clearAllFilters:u,openPalette:d,projects:r,builders:t,houses:n,filteredProjects:O,filteredBuilders:B,filteredHouses:V,regionCounts:k,statusCounts:j,typeCounts:P,categoryCounts:F,otherCounts:L,stats:U,hasAnyFilter:T,totalActiveFacets:W}),[i,c,l,u,d,r,t,n,O,B,V,k,j,P,F,L,U,T,W]);return(0,z.jsx)(I.Provider,{value:K,children:(0,z.jsxs)(`div`,{className:`ds-page`,children:[(0,z.jsxs)(`div`,{className:`mx-auto grid w-full max-w-[144rem] grid-cols-1 min-[1100px]:grid-cols-[280px_minmax(0,1fr)]`,children:[(0,z.jsx)(`aside`,{className:`pl-5 max-[1099px]:hidden min-[1100px]:border-r min-[1100px]:border-hairline`,"aria-label":`Search and filters`,children:(0,z.jsx)(`div`,{className:`sticky top-[var(--ds-nav-h,64px)] max-h-[calc(100vh-var(--ds-nav-h,64px))] ds-scroll-thin overflow-y-auto overscroll-contain pt-12 pr-6 pb-10`,children:(0,z.jsx)(G,{})})}),(0,z.jsx)(`div`,{className:`min-w-0 px-5 min-[641px]:px-8 min-[1100px]:px-12`,children:(0,z.jsx)(_,{})})]}),(0,z.jsx)(H,{open:o,onOpenChange:s,initialQuery:i.q,projects:r,builders:t,houses:n,onApplyQuery:e=>c({q:e})})]})})}export{Q as component};

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.