PageSourceSearch

https://www.kokaihop.se/_next/static/chunks/0fsdbrqrul9vf.js

js kokaihop.se collected 2026-10-02 11:53:29 UTC 109,974 bytes, 428 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,373375,e=>{"use strict";let t=(0,e.i(475254).default)("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],373375)},630374,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(326999),i=e.i(37727),s=e.i(806908);let n=r.Root;r.Trigger;let l=r.Portal,o=r.Close,d=a.forwardRef(({className:e,...a},i)=>(0,t.jsx)(r.Overlay,{ref:i,className:(0,s.cn)("fixed inset-0 z-50 bg-ink/55 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a}));d.displayName=r.Overlay.displayName;let c=a.forwardRef(({className:e,children:a,...n},o)=>(0,t.jsxs)(l,{children:[(0,t.jsx)(d,{}),(0,t.jsxs)(r.Content,{ref:o,className:(0,s.cn)("fixed inset-0 z-50 m-auto flex h-fit w-full max-w-lg max-h-[calc(100dvh-2rem)] flex-col overflow-y-auto gap-4 rounded-card bg-white p-8 shadow-overlay duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",e),...n,children:[a,(0,t.jsxs)(r.Close,{className:"absolute right-4 top-4 roun
1ded-field opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[(0,t.jsx)(i.X,{className:"h-4 w-4"}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]})]})]}));c.displayName=r.Content.displayName;let u=({className:e,...a})=>(0,t.jsx)("div",{className:(0,s.cn)("flex flex-col space-y-1.5 text-center sm:text-left",e),...a});u.displayName="DialogHeader";let g=({className:e,...a})=>(0,t.jsx)("div",{className:(0,s.cn)("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...a});g.displayName="DialogFooter";let m=a.forwardRef(({className:e,...a},i)=>(0,t.jsx)(r.Title,{ref:i,className:(0,s.cn)("text-lg font-semibold leading-none tracking-tight",e),...a}));m.displayName=r.Title.displayName;let p=a.forwardRef(({className:e,...a},i)=>(0,t.jsx)(r.Description,{ref:i,className:(0,s.cn)("text-sm text-muted-foreground",e),...a}));p.displayName=r.Description.displayName,e.s(["Dialog",0,n,"DialogClose",0,o,"DialogContent",0,c,"DialogDescription",0,p,"DialogFooter",0,g,"DialogHeader",0,u,"DialogTitle",0,m])},810980,e=>{"use strict";let t=(0,e.i(475254).default)("BookOpen",[["path",{d:"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z",key:"vv98re"}],["path",{d:"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z",key:"1cyq3y"}]]);e.s(["BookOpen",0,t],810980)},645953,e=>{"use strict";e.s(["slugify",0,function(e){let t="";for(let a of(e??"").normalize("NFC").toLowerCase()){let e="åäöáàâãéèêëíìîïóòôõúùûüýÿñç".indexOf(a);t+=-1===e?a:"aaoaaaaeeeeiiiioooouuuuyync"[e]}return t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}])},745411,e=>{"use strict";var t=e.i(527997),a=e.i(645953);async function r(e){let a=e.map(e=>e.id).filter(Boolean);if(0===a.length)return;let r=(0,t.createClient)(),{data:i,error:s}=await r.from("blog_post_recipes").select(`
2      blog_post_id,
3      recipe_order,
4      recipes!inner(
5        id,
6        slug,
7        title,
8        image_url,
9        is_published
10      )
11    `).in("blog_post_id",a).eq("recipes.is_published",!0).order("recipe_order",{ascending:!0});if(s||!i)return;let n=new Map;for(let e of i){let t=e.recipes;if(!t?.id)continue;let a=n.get(e.blog_post_id)??[];a.push({id:t.id,title:t.title,slug:t.slug,image_url:t.image_url}),n.set(e.blog_post_id,a)}for(let t of e){let e=n.get(t.id);e&&e.length>0&&(t.related_recipes=e.slice(0,3))}}async function i(e){let t=await fetch("/api/embeddings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:e})});if(!t.ok)throw Error((await t.json().catch(()=>({}))).error||`Embeddings API error: ${t.statusText}`);return(await t.json()).embedding}function s(e){return{id:e.id,status:e.status,published:e.published,title:e.title,introduction:e.introduction,content:e.content,friendly_url:e.friendly_url,published_at:e.published_at,main_image:e.main_image,author_id:e.author_id,language_code:e.language_code,is_featured:e.is_featured,created_at:e.created_at,updated_at:e.updated_at,author:e.author?{id:e.author.id,name:e.author.name||"",avatar:e.author.avatar,slug:e.author.slug}:void 0,categories:e.categories?.map(e=>e.category).filter(Boolean)||[],recipes:e.recipes?.sort((e,t)=>e.recipe_order-t.recipe_order).map(e=>e.recipe?{...e.recipe,created_by:e.recipe.created_by||{id:"",name:"",avatar:""},sections:[],tags:e.recipe.tags?.map(e=>e.tag).filter(Boolean)||[]}:null).filter(Boolean)||[],tags:e.tags?.map(e=>e.tag).filter(Boolean)||[]}}function n(e){return{id:e.id,title:e.title,introduction:e.introduction,friendly_url:e.friendly_url,main_image:e.main_image,published_at:e.published_at,is_featured:e.is_featured,reading_minutes:e.reading_minutes,author:e.author?{id:e.author.id,name:e.author.name||"",avatar:e.author.avatar,slug:e.author.slug}:void 0,categories:e.categories?.map(e=>e.category).filter(Boolean)||[],tags:e.tags?.map(e=>e.tag).filter(Boolean)||[]}}function l(e){return{id:e.id,title:e.title,introduction:e.introduction,friendly_url:e.friendly_url,main_image:e.main_image,status:e.status,published:e.published,published_at:e.published_at,created_at:e.created_at,updated_at:e.updated_at,reading_minutes:e.reading_minutes,is_featured:e.is_featured,author:e.author?{id:e.author.id,name:e.author.name||"",avatar:e.author.avatar,slug:e.author.slug}:void 0,categories:e.categories?.map(e=>
11e.category).filter(Boolean)||[],tags:e.tags?.map(e=>e.tag).filter(Boolean)||[]}}e.s(["POSTS_PER_PAGE",0,12,"blogPostService",0,{async searchPublishedByTitle(e,a=8){let r=e.trim();if(!r)return[];let i=(0,t.createClient)(),{data:s,error:n}=await i.from("blog_posts").select("id, title, friendly_url, main_image").eq("published",!0).ilike("title",`%${r}%`).order("published_at",{ascending:!1}).limit(a);return n?(console.error("Error searching blog posts by title:",n),[]):s??[]},async getPublishedPosts(e=0,a,i){let s=i??(0,t.createClient)(),l=12*e,o=s.from("blog_posts").select(`
12        id,
13        title,
14        introduction,
15        friendly_url,
16        main_image,
17        published_at,
18        reading_minutes,
19        author:users!author_id (
20          id,
21          name,
22          avatar,
23          slug
24        ),
25        categories:blog_post_categories (
26          category:blog_categories (
27            id,
28            name,
29            slug
30          )
31        ),
32        tags:blog_post_tags (
33          tag:tags (
34            id,
35            name,
36            slug
37          )
38        )
39      `,{count:"exact"}).eq("published",!0).order("published_at",{ascending:!1}).range(l,l+12-1);a?.category_id&&(o=o.contains("categories",[{category_id:a.category_id}])),a?.tag_id&&(o=o.contains("tags",[{tag_id:a.tag_id}])),a?.author_id&&(o=o.eq("author_id",a.author_id)),a?.search&&(o=o.textSearch("fts",a.search));let{data:d,error:c,count:u}=await o;if(c)throw console.error("Error fetching blog posts:",c),c;let g=d?.map(n)||[],m=!!u&&l+g.length<u;return await r(g),{posts:g,hasMore:m,total:u||0}},async searchPosts(e,a=0){let r=e.trim();if(!r)return{posts:[],hasMore:!1};let s=(0,t.createClient)(),n=null;try{let e=await i(r);n="["+e.join(",")+"]"}catch(e){console.error("Error generating query embedding:",e)}let{data:l,error:o}=await s.rpc("search_blog_posts",{query_text:r,query_embedding:n,limit_count:12,offset_count:12*a});if(o)throw console.error("Error searching blog posts:",o),o;let d=(l||[]).map(e=>({id:e.id,title:e.title,introduction:e.introduction,friendly_url:e.friendly_url,main_image:e.main_image,published_at:e.published_at,reading_minutes:e.reading_minutes,is_featured:e.is_featured,author:e.author?{id:e.author.id,name:e.author.name||"",avatar:e.author.avatar,slug:e.author.slug}:void 0,categories:e.categories||[],tags:e.tags||[]})),c=12===d.length;return{posts:d,hasMore:c}},async getPostBySlug(e,a,r){let i=(r??(0,t.createClient)()).from("blog_posts").select(`
40        *,
41        author:users!author_id (
42          id,
43          name,
44          avatar,
45          slug
46        ),
47        categories:blog_post_categories (
48          category:blog_categories (
49            id,
50            name,
51            slug
52          )
53        ),
54        recipes:blog_post_recipes (
55          recipe_order,
56          recipe:recipes (
57            id,
58            user_id,
59            title,
60            slug,
61            description,
62            image_url,
63            prep_time,
64            cook_time,
65            servings,
66            difficulty,
67            created_at,
68            created_by:users!recipes_user_id_fkey (
69              id,
70              name,
71              avatar,
72              slug
73            ),
74            tags:recipe_tags (
75              tag:tags (
76                id,
77                name,
78                slug
79              )
80            )
81          )
82        ),
83        tags:blog_post_tags (
84          tag:tags (
85            id,
86            name,
87            slug
88          )
89        )
90      `).eq("friendly_url",e);a||(i=i.eq("published",!0));let{data:n,error:l}=await i.single();if(l){if("PGRST116"===l.code)return null;throw console.error("Error fetching blog post:",l),l}return a&&n&&!n.published&&n.author_id!==a?null:n?s(n):null},async getPostById(e,a){let r=a??(0,t.createClient)(),{data:i,error:n}=await r.from("blog_posts").select(`
91        *,
92        author:users!author_id (
93          id,
94          name,
95          avatar,
96          slug
97        ),
98        categories:blog_post_categories (
99          category:blog_categories (
100            id,
101            name,
102            slug
103          )
104        ),
105        recipes:blog_post_recipes (
106          recipe_order,
107          recipe:recipes (
108            id,
109            user_id,
110            title,
111            slug,
112            description,
113            image_url,
114            prep_time,
115            cook_time,
116            servings,
117            difficulty,
118            created_at,
119            created_by:users!recipes_user_id_fkey (
120              id,
121              name,
122              avatar,
123              slug
124            ),
125            tags:recipe_tags (
126              tag:tags (
127                id,
128                name,
129                slug
130              )
131            )
132          )
133        ),
134        tags:blog_post_tags (
135          tag:tags (
136            id,
137            name,
138            slug
139          )
140        )
141      `).eq("id",e).single();
141if(n){if("PGRST116"===n.code)return null;throw console.error("Error fetching blog post:",n),n}return i?s(i):null},async createPost(e,a){let r=(0,t.createClient)(),i=Date.now();console.log(`[Blog Post Creation] Starting blog post creation: "${e.title}"`);try{let{data:t,error:s}=await r.from("blog_posts").insert({title:e.title,introduction:e.introduction,content:e.content,friendly_url:e.friendly_url,main_image:e.main_image,status:e.status||"draft",published:e.published||!1,published_at:e.published_at,language_code:e.language_code||"sv",is_featured:e.is_featured||!1,author_id:a}).select().single();if(s)throw console.error("[Blog Post Creation] Error creating post:",s),s;if(console.log(`[Blog Post Creation] Post created in ${Date.now()-i}ms`),e.category_ids&&e.category_ids.length>0){let a=e.category_ids.map(e=>({blog_post_id:t.id,blog_category_id:e})),{error:i}=await r.from("blog_post_categories").insert(a);if(i)throw console.error("[Blog Post Creation] Error inserting categories:",i),await r.from("blog_posts").delete().eq("id",t.id),i}if(e.recipe_ids&&e.recipe_ids.length>0){let a=e.recipe_ids.map((e,a)=>({blog_post_id:t.id,recipe_id:e,recipe_order:a})),{error:i}=await r.from("blog_post_recipes").insert(a);if(i)throw console.error("[Blog Post Creation] Error inserting recipes:",i),await r.from("blog_posts").delete().eq("id",t.id),i}if(e.tag_ids&&e.tag_ids.length>0){let a=e.tag_ids.map(e=>({blog_post_id:t.id,tag_id:e})),{error:i}=await r.from("blog_post_tags").insert(a);if(i)throw console.error("[Blog Post Creation] Error inserting tags:",i),await r.from("blog_posts").delete().eq("id",t.id),i}console.log(`[Blog Post Creation] Total time: ${Date.now()-i}ms`);let n=await this.getPostById(t.id);if(!n)throw Error("Failed to fetch created post");return n}catch(e){throw console.error(`[Blog Post Creation] Failed after ${Date.now()-i}ms:`,e),e}},async updatePost(e){let a=(0,t.createClient)(),r=Date.now();console.log(`[Blog Post Update] Starting update for post ID: ${e.id}`);try{let{error:t}=await a.from("blog_posts").update({title:e.title,introduction:e.introduction,content:e.content,friendly_url:e.friendly_url,main_image:e.main_image,status:e.status,published:e.published,published_at:e.published_at,language_code:e.language_code,is_featured:e.is_featured,updated_at:new Date().toISOString()}).eq("id",e.id);if(t)throw console.error("[Blog Post Update] Error updating post:",t),t;if(await a.from("blog_post_categories").delete().eq("blog_post_id",e.id),await a.from("blog_post_recipes").delete().eq("blog_post_id",e.id),await a.from("blog_post_tags").delete().eq("blog_post_id",e.id),e.category_ids&&e.category_ids.length>0){let t=e.category_ids.map(t=>({blog_post_id:e.id,blog_category_id:t}));await a.from("blog_post_categories").insert(t)}if(e.recipe_ids&&e.recipe_ids.length>0){let t=e.recipe_ids.map((t,a)=>({blog_post_id:e.id,recipe_id:t,recipe_order:a}));await a.from("blog_post_recipes").insert(t)}if(e.tag_ids&&e.tag_ids.length>0){let t=e.tag_ids.map(t=>({blog_post_id:e.id,tag_id:t}));await a.from("blog_post_tags").insert(t)}console.log(`[Blog Post Update] Total time: ${Date.now()-r}ms`);let i=await this.getPostById(e.id);if(!i)throw Error("Failed to fetch updated post");return i}catch(e){throw console.error(`[Blog Post Update] Failed after ${Date.now()-r}ms:`,e),e}},async deletePost(e){let a=(0,t.createClient)(),{error:r}=await a.from("blog_posts").delete().eq("id",e);if(r)throw console.error("Error deleting blog post:",r),r},generateSlug:e=>(0,a.slugify)(e),async isSlugAvailable(e,a){let r=(0,t.createClient)().from("blog_posts").select("id").eq("friendly_url",e);a&&(r=r.neq("id",a));let{data:i,error:s}=await r;if(s)throw console.error("Error checking slug availability:",s),s;return!i||0===i.length},async getPostStats(e,a,r){let i=r??(0,t.createClient)(),{count:s}=await i.from("blog_post_likes").select("*",{count:"exact",head:!0}).eq("blog_post_id",e),{count:n}=await i.from("blog_post_views").select("id",{count:"exact",head:!0}).eq("blog_post_id",e),l=!1;if(a){let{data:t}=await i.from("blog_post_likes").select("id").eq("blog_post_id",e).eq("user_id",a).single();l=!!t}return{likeCount:s||0,viewCount:n||0,isLiked:l}},async getAuthorPublishedPosts(e,a=0,r=12){let i=(0,t.createClient)(),s=a*r,{data:l,error:o,count:d}=await i.from("blog_posts").select(`
142        id,
143        title,
144        friendly_url,
145        main_image,
146        published_at,
147        reading_minutes,
148        categories:blog_post_categories (
149          category:blog_categories (
150            id,
151            name,
152            slug
153          )
154        )
155      `,{count:"exact"}).eq("author_id",e).eq("published",!0).order("published_at",{ascending:!1}).range(s,s+r-1);if(o)throw console.error("Error fetching author blog posts:",o),o;let c=l?.map(n)||[],u=d||0;return{posts:c,hasMore:s+c.length<u,total:u}},async getUserPosts(e){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("blog_posts").select(`
156        id,
157        title,
158        introduction,
159        friendly_url,
160        main_image,
161        status,
162        published,
163        published_at,
164        created_at,
165        updated_at,
166        reading_minutes,
167        author:users!author_id (
168          id,
169          name,
170          avatar,
171          slug
172        ),
173        categories:blog_post_categories (
174          category:blog_categories (
175            id,
176            name,
177            slug
178          )
179        ),
180        tags:blog_post_tags (
181          tag:tags (
182            id,
183            name,
184            slug
185          )
186        )
187      `).eq("author_id",e).order("created_at",{ascending:!1});if(i)throw console.error("Error fetching user blog posts:",i),i;return r?.map(l)||[]},async getMyPostsOverview(){let e=(0,t.createClient)(),{data:a,error:r}=await e.rpc("get_my_blog_posts_overview");if(r||!a)return console.error("Error fetching blog post overview:",r),null;let i=new Map;for(let e of a.posts??[])i.set(e.id,{views:Number(e.views),comments:Number(e.comments),words:Number(e.words)});return{stats:i,reads30d:Number(a.reads_30d??0),readsPrev30d:Number(a.reads_prev??0),unanswered:Number(a.unanswered??0)}},async uploadImage(e,a){let r=(0,t.createClient)(),{data:i,error:s}
187=await r.storage.from("blog-images").upload(a,e,{cacheControl:"3600",upsert:!1});if(s)throw s;let{data:{publicUrl:n}}=r.storage.from("blog-images").getPublicUrl(i.path);return n},async getLatestPosts(e=3){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("blog_posts").select(`
188        id,
189        title,
190        introduction,
191        friendly_url,
192        main_image,
193        published_at,
194        reading_minutes,
195        author:users!author_id (
196          id,
197          name,
198          avatar,
199          slug
200        ),
201        categories:blog_post_categories (
202          category:blog_categories (
203            id,
204            name,
205            slug
206          )
207        ),
208        tags:blog_post_tags (
209          tag:tags (
210            id,
211            name,
212            slug
213          )
214        )
215      `).eq("published",!0).order("published_at",{ascending:!1}).limit(e);if(i)throw console.error("Error fetching latest blog posts:",i),i;return r?.map(n)||[]},async getPopularPosts(e=3){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("blog_posts").select(`
216        id,
217        title,
218        introduction,
219        friendly_url,
220        main_image,
221        published_at,
222        reading_minutes,
223        author:users!author_id (
224          id,
225          name,
226          avatar,
227          slug
228        ),
229        categories:blog_post_categories (
230          category:blog_categories (
231            id,
232            name,
233            slug
234          )
235        ),
236        tags:blog_post_tags (
237          tag:tags (
238            id,
239            name,
240            slug
241          )
242        )
243      `).eq("published",!0).order("published_at",{ascending:!1}).limit(3*e);if(i)throw console.error("Error fetching popular blog posts:",i),i;return r?(await Promise.all(r.map(async e=>{let{count:t}=await a.from("blog_post_views").select("id",{count:"exact",head:!0}).eq("blog_post_id",e.id);return{post:e,viewCount:t||0}}))).sort((e,t)=>t.viewCount-e.viewCount).slice(0,e).map(({post:e})=>n(e)):[]},async getMostReadPosts(e=5,a){let r=a??(0,t.createClient)(),{data:i,error:s}=await r.from("blog_posts").select(`
244        id,
245        title,
246        introduction,
247        friendly_url,
248        main_image,
249        published_at,
250        reading_minutes,
251        author:users!author_id (
252          id,
253          name,
254          avatar,
255          slug
256        ),
257        categories:blog_post_categories (
258          category:blog_categories (
259            id,
260            name,
261            slug
262          )
263        ),
264        tags:blog_post_tags (
265          tag:tags (
266            id,
267            name,
268            slug
269          )
270        )
271      `).eq("published",!0).order("published_at",{ascending:!1}).limit(4*e);return s||!i?(s&&console.error("Error fetching most-read posts:",s),[]):(await Promise.all(i.map(async e=>{let{count:t}=await r.from("blog_post_views").select("id",{count:"exact",head:!0}).eq("blog_post_id",e.id);return{post:e,viewCount:t||0}}))).sort((e,t)=>t.viewCount-e.viewCount).slice(0,e).map(({post:e,viewCount:t})=>({...n(e),view_count:t}))},async getBlogCategories(e){let a=e??(0,t.createClient)(),{data:r,error:i}=await a.from("blog_categories").select("id, name, slug").order("sort_order");if(i)throw i;return r??[]},async getPopularBlogTopics(e=8,a){let r=a??(0,t.createClient)(),{data:i,error:s}=await r.from("blog_categories").select("id, name, used:blog_post_categories!inner ( blog_post_id )").order("sort_order").limit(1,{referencedTable:"used"}).limit(e);return s||!i?[]:i.map(({id:e,name:t})=>({id:e,name:t}))},async getFeaturedPosts(e=3,a){let r=a??(0,t.createClient)(),{data:i,error:s}=await r.from("blog_posts").select(`
272        id,
273        title,
274        introduction,
275        friendly_url,
276        main_image,
277        published_at,
278        reading_minutes,
279        author:users!author_id (
280          id,
281          name,
282          avatar,
283          slug
284        ),
285        categories:blog_post_categories (
286          category:blog_categories (
287            id,
288            name,
289            slug
290          )
291        ),
292        tags:blog_post_tags (
293          tag:tags (
294            id,
295            name,
296            slug
297          )
298        )
299      `).eq("published",!0).eq("is_featured",!0).order("published_at",{ascending:!1}).limit(e);
299if(s)throw console.error("Error fetching featured blog posts:",s),s;return i?.map(n)||[]}}])},270756,e=>{"use strict";let t=(0,e.i(475254).default)("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);e.s(["Lock",0,t],270756)},248256,e=>{"use strict";let t=(0,e.i(475254).default)("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);e.s(["Globe",0,t],248256)},769492,e=>{"use strict";e.s(["getDisplayName",0,function(e,t){return t||e||"Anonymous Chef"}])},154136,e=>{"use strict";var t=e.i(843476),a=e.i(522016),r=e.i(248256),i=e.i(270756),s=e.i(605853),n=e.i(9265),l=e.i(577274),o=e.i(806908),d=e.i(769492);e.s(["CollectionCard",0,function({collection:e,dark:d,compact:c,className:u,actions:g}){let m=`/receptsamlingar/${e.slug||e.id}`,p=e.thumbnails.slice(0,3);for(;p.length<3;)p.push(null);let h=Math.max(0,e.recipeCount-3),f=h>=1e3?`${Math.round(h/100)/10}k`:String(h),_=(0,l.parseCoverVariant)(e.coverVariant)??{},k=(0,t.jsxs)(a.default,{href:m,className:(0,o.cn)("group flex h-full flex-col gap-3.5 rounded-card p-2 pb-[18px] shadow-card",d?"bg-plum":"bg-white",g?void 0:u),children:[(0,t.jsxs)("div",{className:"grid grid-cols-[repeat(4,minmax(0,1fr))] gap-1.5",children:[p.map((a,r)=>(0,t.jsx)("div",{className:(0,o.cn)("relative aspect-square overflow-hidden",d?"bg-white/[.08]":"bg-plum-tint",0===r?"rounded-l-inner rounded-r-lg":"rounded-lg"),children:a?(0,t.jsx)(s.default,{src:a,fallbackIcon:(0,t.jsx)(n.CardCover,{seed:`${e.id}-${r}`,size:"tint",decorative:!0,..._}),alt:"",fill:!0,sizes:"80px",className:"object-cover"}):(0,t.jsx)(n.CardCover,{seed:`${e.id}-${r}`,size:"tint",decorative:!0,..._})},r)),(0,t.jsx)("div",{className:(0,o.cn)("flex aspect-square items-center justify-center rounded-l-lg rounded-r-inner text-[15px] font-extrabold tabular-nums",d?"bg-white/[.12] text-white":"bg-plum-tint text-ink"),children:h>0?`+${f}`:null})]}),(0,t.jsxs)("div",{className:"flex flex-1 flex-col gap-2 px-2.5",children:[(0,t.jsx)("h3",{className:(0,o.cn)("line-clamp-2 h-12 text-xl font-extrabold leading-[1.2] tracking-[-.025em]",d?"text-white":"text-ink"),children:e.name}),(0,t.jsxs)("div",{className:"flex h-[26px] gap-1.5 overflow-hidden",children:[(0,t.jsxs)("span",{className:(0,o.cn)("inline-flex h-[26px] flex-none items-center whitespace-nowrap rounded-full px-2.5 text-[11.5px] font-semibold tabular-nums",d?"bg-white/[.12] text-white":"bg-plum-tint text-plum"),children:[e.recipeCount," recept"]}),e.isPrivate?(0,t.jsxs)("span",{"aria-label":"Privat samling",className:(0,o.cn)("inline-flex h-[26px] flex-none items-center gap-1 whitespace-nowrap rounded-full text-[11.5px] font-semibold",c?"w-[26px] justify-center":"px-2.5",d?"bg-white/[.12] text-white":"bg-plum-tint text-plum"),children:[(0,t.jsx)(i.Lock,{className:"h-[11px] w-[11px]",strokeWidth:2.6}),c?null:"Privat"]}):e.followersCount&&!c?(0,t.jsxs)("span",{className:(0,o.cn)("inline-flex h-[26px] flex-none items-center whitespace-nowrap rounded-full px-2.5 text-[11.5px] font-semibold tabular-nums",d?"bg-white/[.12] text-white":"bg-plum-tint text-plum"),children:[e.followersCount.toLocaleString("sv-SE")," följare"]}):null]}),e.authorName?(0,t.jsxs)("div",{className:"mt-auto flex items-center gap-2 pt-0.5",children:[(0,t.jsx)("span",{className:(0,o.cn)("flex h-6 w-6 flex-none items-center justify-center rounded-full text-[9.5px] font-bold",d?"bg-white/[.14] text-white":"bg-plum text-white"),children:"private"===e.bylineIcon?(0,t.jsx)(i.Lock,{className:"h-3 w-3",strokeWidth:2.4}):"public"===e.bylineIcon?(0,t.jsx)(r.Globe,{className:"h-3 w-3",strokeWidth:2.4}):((e="")=>e.split(" ").filter(Boolean).slice(0,2).map(e=>e[0]).join("").toUpperCase())(e.authorName)}),(0,t.jsxs)("span",{className:(0,o.cn)("min-w-0 truncate text-[12.5px] font-semibold",d?"text-white/70":"text-ink-60"),children:[e.authorName,e.bylineSub?` \xb7 ${e.bylineSub}`:""]})]}):(0,t.jsx)("div",{className:"mt-auto h-6"})]})]});return g?(0,t.jsxs)("div",{className:(0,o.cn)("relative h-full",u),children:[k,(0,t.jsx)("div",{className:"absolute right-3 top-3 z-10",children:g})]}):k},"collectionToCardData",0,function(e){let t=e.preview_images??(e.recipes??[]).map(e=>
299e.image_url).filter(Boolean);return{id:e.id,slug:e.slug,name:e.name,recipeCount:e.recipe_count??e.statistics?.recipe_count??e.recipes?.length??0,followersCount:e.followers_count??e.statistics?.follower_count??0,authorName:e.created_by?(0,d.getDisplayName)(e.created_by.name||void 0,e.created_by.nickname):null,thumbnails:t,coverVariant:e.cover_variant??null}}])},201928,e=>{"use strict";let t=(0,e.i(475254).default)("ShoppingCart",[["circle",{cx:"8",cy:"21",r:"1",key:"jimo8o"}],["circle",{cx:"19",cy:"21",r:"1",key:"13723u"}],["path",{d:"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12",key:"9zh506"}]]);e.s(["ShoppingCart",0,t],201928)},756262,207236,e=>{"use strict";var t=e.i(527997),a=e.i(866371);let r=new Set(["vatten","vattnet","kallvatten","varmvatten","isvatten"]),i=new Set(["kallt","kall","kalla","iskallt","iskall","ljummet","ljummen","ljumt","ljum","ljumma","fingervarmt","fingervarm","varmt","varm","varma","hett","het","heta","kokhett","kokhet","kokande","kokt","kokta","rumsvarmt","rumstempererat","tempererat","grader","grad","celsius","c","till","för","i","av","kokning","koka","kokandet","blötläggning","blötlägga","blötläggning","jäsning","degen","deg","servering","spädning","utspädning","pensling","vattnas","ca","cirka","ev","eventuellt","eventuell","lite","mer","mera","extra","nästan","knappt","drygt","ungefär","minst","samt","och","eller","plus","per","st","liter","deciliter","centiliter","milliliter","dl","cl","ml","l","msk","tsk","krm","kopp","koppar"]);function s(e){let t=(e??"").toLowerCase().replace(/\([^)]*\)/g," ").split(/[^a-zà-öø-ÿ]+/).filter(Boolean);return 0!==t.length&&!!t.some(e=>r.has(e))&&t.every(e=>r.has(e)||i.has(e))}function n(e){return e.trim().replace(/\s+/g," ").toLocaleLowerCase("sv-SE")}function l(e,t){return(e.unit_id??null)===(t.unit_id??null)&&(!!e.ingredient_id&&!!t.ingredient_id&&e.ingredient_id===t.ingredient_id||n(e.name)===n(t.name))}function o(e,t){return null==e?t??null:null==t?e:Math.round((e+t)*1e3)/1e3}function d(e,t){let a=Array.from(new Set([e,t].flatMap(e=>(e??"").split(",").map(e=>e.trim())).filter(Boolean)));return a.length?a.join(", "):null}function c(e){if(!e)return e;let t=e.translations;if(!t||0===t.length)return e;let a=t.find(e=>"sv"===e.language_code)??t[0];return{...e,name:a.name,name_plural:a.name_plural,language_code:a.language_code}}e.s(["isPlainWater",0,s],207236);let u="ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";e.s(["shoppingListService",0,{async getUserShoppingLists(e,a=!1){let r=(0,t.createClient)().from("shopping_lists").select(`
300        *,
301        items:shopping_list_items(count),
302        recipes:shopping_list_recipes(count)
303      `).eq("user_id",e).order("created_at",{ascending:!1});a||(r=r.eq("is_archived",!1));let{data:i,error:s}=await r;if(s)throw s;return i.map(e=>({...e,item_count:e.items[0]?.count||0,recipe_count:e.recipes[0]?.count||0}))||[]},async getUserShoppingListCards(e,a){let r=(0,t.createClient)(),{data:i,error:s}=await r.from("shopping_lists").select(`
304        *,
305        items:shopping_list_items(id, shopping_list_id, name, amount, is_checked, item_order, created_at, updated_at, unit:unit_id(id, unit_type, translations:units_i18n(name, name_plural, language_code))),
306        recipes:shopping_list_recipes(count),
307        shared_with:shopping_list_shares(id, shopping_list_id, user_id, permissions, created_at, user:users(id, name, avatar))
308      `).eq("user_id",e).eq("is_archived",a).order("updated_at",{ascending:!1});if(s)throw s;return(i??[]).map(e=>{let t=(e.items??[]).map(e=>({...e,unit:c(e.unit)})).sort((e,t)=>(e.item_order??0)-(t.item_order??0));return{...e,items:t,item_count:t.length,recipe_count:e.recipes?.[0]?.count||0,shared_with:e.shared_with??[]}})},async getSharedShoppingLists(e){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("shopping_list_shares").select(`
309        shopping_list_id,
310        permissions,
311        shopping_lists:shopping_list_id(
312          *,
313          items:shopping_list_items(count),
314          recipes:shopping_list_recipes(count),
315          user:user_id(id, name, avatar)
316        )
317      `).eq("user_id",e);if(i)throw i;let s=[];
317return r&&r.forEach(e=>{if(e.shopping_lists){let t=e.shopping_lists;t.share_permissions=e.permissions,s.push({...t,item_count:t?.items?.length||0,recipe_count:t?.recipes?.length||0})}}),s},async getShoppingListById(e,r){let i=(0,t.createClient)(),{data:s,error:n}=await i.from("shopping_lists").select(`
318        *,
319        items:shopping_list_items(
320          *,
321          ingredient:ingredient_id(*, translations:ingredients_i18n(*)),
322          unit:unit_id(*, translations:units_i18n(*))
323        ),
324        recipes:shopping_list_recipes(
325          *,
326          recipe:recipe_id(id, slug, title, image_url)
327        ),
328        shared_with:shopping_list_shares(
329          *,
330          user:user_id(id, name, avatar)
331        )
332      `).eq("id",e).maybeSingle();if(n)throw n;let l=s?.shared_with?.find(e=>e.user_id===r);return s&&(s.user_id===r||l)?{...s,share_permissions:s.user_id===r?void 0:l?.permissions,items:(s.items??[]).map(e=>({...e,ingredient:c(e.ingredient),unit:c(e.unit)})).sort((e,t)=>e.item_order-t.item_order),shared_with:s.shared_with.map(e=>({...e,user:e.user?new a.User(e.user):null}))}:null},async createShoppingList(e){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("shopping_lists").insert({user_id:e.user_id,name:e.name,description:e.description,is_archived:!1}).select().single();if(i)throw i;return r},async updateShoppingList(e,a){let r=(0,t.createClient)(),{data:i,error:s}=await r.from("shopping_lists").update({name:a.name,description:a.description,is_archived:a.is_archived}).eq("id",e).select().single();if(s)throw s;return i},async deleteShoppingList(e){let a=(0,t.createClient)(),{error:r}=await a.from("shopping_lists").delete().eq("id",e);if(r)throw r},async archiveShoppingList(e){return this.updateShoppingList(e,{is_archived:!0})},async unarchiveShoppingList(e){return this.updateShoppingList(e,{is_archived:!1})},async addShoppingListItem(e){let a=(0,t.createClient)(),{data:r}=await a.from("shopping_list_items").select("item_order").eq("shopping_list_id",e.
332shopping_list_id).order("item_order",{ascending:!1}).limit(1).maybeSingle(),i=r?r.item_order+1:0,{data:s,error:n}=await a.from("shopping_list_items").insert({shopping_list_id:e.shopping_list_id,name:e.name,ingredient_id:e.ingredient_id,amount:e.amount,unit_id:e.unit_id,notes:e.notes,category:e.category,is_checked:!1,item_order:e.item_order??i}).select(`
333        *,
334        ingredient:ingredient_id(*, translations:ingredients_i18n(*)),
335        unit:unit_id(*, translations:units_i18n(*))
336      `).single();if(n)throw n;return{...s,ingredient:c(s.ingredient),unit:c(s.unit)}},async addIngredientsToShoppingList(e,a){let r=(0,t.createClient)(),{data:i,error:s}=await r.from("shopping_list_items").select("id, name, ingredient_id, amount, unit_id, notes, is_checked, item_order").eq("shopping_list_id",e);if(s)throw s;let n=i??[],c=function(e,t){let a=e.filter(e=>!e.is_checked).map(e=>({...e})),r=new Set,i=[];for(let e of t){let t=a.find(t=>l(t,e));if(t){t.amount=o(t.amount,e.amount),t.notes=d(t.notes,e.notes),r.add(t.id);continue}let s=i.find(t=>l(t,e));if(s){s.amount=o(s.amount,e.amount),s.notes=d(s.notes,e.notes);continue}i.push({...e,notes:e.notes??null})}return{updates:a.filter(e=>r.has(e.id)).map(e=>({id:e.id,amount:e.amount??null,notes:e.notes??null})),inserts:i}}(n,a);for(let e of c.updates){let{error:t}=await r.from("shopping_list_items").update({amount:e.amount,notes:e.notes,updated_at:new Date().toISOString()}).eq("id",e.id);if(t)throw t}if(c.inserts.length>0){let t=n.reduce((e,t)=>Math.max(e,t.item_order??0),0)+1,{error:a}=await r.from("shopping_list_items").insert(c.inserts.map(a=>({shopping_list_id:e,name:a.name,ingredient_id:a.ingredient_id??null,amount:a.amount??null,unit_id:a.unit_id??null,notes:a.notes??null,is_checked:!1,item_order:t++})));if(a)throw a}},async updateShoppingListItem(e,a){let r=(0,t.createClient)(),{data:i,error:s}=await r.from("shopping_list_items").update({name:a.name,amount:a.amount,unit_id:a.unit_id,is_checked:a.is_checked,notes:a.notes,category:a.category,item_order:a.item_order}).eq("id",e).select(`
337        *,
338        ingredient:ingredient_id(*, translations:ingredients_i18n(*)),
339        unit:unit_id(*, translations:units_i18n(*))
340      `).single();if(s)throw s;return{...i,ingredient:c(i.ingredient),unit:c(i.unit)}},async toggleItemChecked(e){let a=(0,t.createClient)(),{data:r}=await a.from("shopping_list_items").select("is_checked").eq("id",e).single();if(!r)throw Error("Item not found");return this.updateShoppingListItem(e,{is_checked:!r.is_checked})},async deleteShoppingListItem(e){let a=(0,t.createClient)(),{error:r}=await a.from("shopping_list_items").delete().eq("id",e);if(r)throw r},async reorderShoppingListItems(e,a){let r=(0,t.createClient)(),{error:i}=await r.rpc("reorder_shopping_list_items",{p_list_id:e,p_item_ids:a});if(i)throw i},async addRecipeToShoppingList(e){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("shopping_list_recipes").insert({shopping_list_id:e.shopping_list_id,recipe_id:e.recipe_id,servings:e.servings}).select(`
341        *,
342        recipe:recipe_id(*)
343      `).single();if(i)throw i;let{data:n}=await a.from("recipe_sections").select(`
344        id,
345        recipe_ingredients:recipe_ingredients(
346          id,
347          ingredient_id,
348          amount,
349          unit_id,
350          ingredient_order,
351          display_name,
352          ingredients:ingredient_id(id, translations:ingredients_i18n(name, language_code)),
353          units:unit_id(id, translations:units_i18n(name, language_code))
354        )
355      `).eq("recipe_id",e.recipe_id);if(!n)return r;let{data:l}=await a.from("recipes").select("servings").eq("id",e.recipe_id).single(),o=l?e.servings/l.servings:1,d=[];return n.forEach(e=>{e.recipe_ingredients&&e.recipe_ingredients.length>0&&e.recipe_ingredients.forEach(e=>{let t=e.ingredients?.translations,a=e.display_name??(e=>{if(e&&0!==e.length)return(e.find(e=>"sv"===e.language_code)??e[0]).name})(t)??"Unknown ingredient";s(a)||d.push({ingredient_id:e.ingredient_id,name:a,amount:e.amount?e.amount*o:null,unit_id:e.unit_id})})}),d.length>0&&await this.addIngredientsToShoppingList(e.shopping_list_id,d),r},async removeRecipeFromShoppingList(e){let a=(0,t.createClient)(),{error:r}=await a.from("shopping_list_recipes").delete().eq("id",e);if(r)throw r},async setLinkSharing(e,a,r){let i,s=(0,t.createClient)(),n=r||(i=new Uint8Array(10),crypto.getRandomValues(i),Array.from(i,e=>u[e%u.length]).join("")),{data:l,error:o}=await s.from("shopping_lists").update({share_token:n,link_sharing_enabled:a,updated_at:new Date().toISOString()}).eq("id",e).select("share_token, link_sharing_enabled").single();if(o)throw o;return l},async shareShoppingList(e){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("shopping_list_shares").insert({shopping_list_id:e.shopping_list_id,user_id:e.user_id,permissions:e.permissions}).select(`
356        *,
357        user:user_id(id, name, avatar)
358      `).single();if(i)throw i;return r},async updateSharedPermissions(e,a){let r=(0,t.createClient)(),{data:i,error:s}=await r.from("shopping_list_shares").update({permissions:a}).eq("id",e).select(`
359        *,
360        user:user_id(id, name, avatar)
361      `).single();if(s)throw s;return i},async removeSharedAccess(e){let a=(0,t.createClient)(),{error:r}=await a.from("shopping_list_shares").delete().eq("id",e);if(r)throw r},async clearCheckedItems(e){let a=(0,t.createClient)(),{error:r}=await a.from("shopping_list_items").delete().eq("shopping_list_id",e).eq("is_checked",!0);if(r)throw r},async restoreShoppingListItems(e,a){if(0===a.length)return;let r=(0,t.createClient)(),i=a.map(t=>({id:t.id,shopping_list_id:e,ingredient_id:t.ingredient_id??null,
361name:t.name,amount:t.amount??null,unit_id:t.unit_id??null,is_checked:t.is_checked,notes:t.notes??null,item_order:t.item_order,category:t.category??null,created_at:t.created_at})),{error:s}=await r.from("shopping_list_items").insert(i);if(!s)return;if("23505"!==s.code)throw s;let{data:n}=await r.from("shopping_list_items").select("item_order").eq("shopping_list_id",e).order("item_order",{ascending:!1}).limit(1).maybeSingle(),l=n?n.item_order+1:0,{error:o}=await r.from("shopping_list_items").insert(i.map((e,t)=>({...e,item_order:l+t})));if(o)throw o},async markAllItems(e,a){let r=(0,t.createClient)(),{error:i}=await r.from("shopping_list_items").update({is_checked:a}).eq("shopping_list_id",e);if(i)throw i}}],756262)},163456,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(60529),i=e.i(806908);let s=(0,a.memo)((0,a.forwardRef)(function({format:e},a){return(0,t.jsx)("div",{ref:a,className:(0,i.cn)("holidAds w-full min-h-[var(--holid-h)] md:min-h-[var(--holid-h-md)]",e),suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:""}})}),()=>!0);e.s(["HolidAdSlot",0,function({name:e,format:n="widescreen",reserve:l="fixed",media:o,className:d}){let c=(0,r.holidSlotMinHeight)(n),u=(0,a.useRef)(null),[g,m]=(0,a.useState)("pending"),[p,h]=(0,a.useState)(!o&&void 0);(0,a.useEffect)(()=>{if(!o)return;let e=window.matchMedia(o),t=()=>h(e.matches);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[o]),(0,a.useEffect)(()=>{let e=u.current;if(!e)return;let t=!1,a=a=>{if(t)return;let r=a.slot?.getSlotElementId?.();if(!r)return;let i=document.getElementById(r);if(i&&e.contains(i)){if(!a.isEmpty){let t=Array.isArray(a.size)?a.size:null,r=t&&"number"==typeof t[1]?t[1]:i.offsetHeight;r>0&&(e.style.minHeight=`${r}px`)}m(e=>"filled"===e?"filled":a.isEmpty?"empty":"filled")}},i=(0,r.holidGoogletag)();i?.cmd.push(()=>{try{window.googletag?.pubads?.()?.addEventListener?.("slotRenderEnded",a)}catch{}});let s=window.setTimeout(()=>{t||m(e=>"pending"===e?"empty":e)},9e4);return()=>{t=!0;try{window.googletag?.pubads?.()?.removeEventListener?.("slotRenderEnded",a)}catch{}window.clearTimeout(s)}},[p]);let[f,_]=(0,a.useState)(!1);(0,a.useEffect)(()=>{if("collapse"!==l||"empty"!==g||f)return;let e=u.current;if(!e)return;let t=new IntersectionObserver(([e])=>{!e.isIntersecting&&e.boundingClientRect.top>0&&(_(!0),t.disconnect())},{threshold:0});return t.observe(e),()=>t.disconnect()},[l,g,f]);
361let k="empty"===g&&("collapse-aside"===l||"collapse"===l&&f);return!1===p?null:(0,t.jsxs)("div",{className:(0,i.cn)("holid-slot my-8 text-center",d),"data-holid-slot":e,"data-holid-state":g,style:k?{display:"none"}:void 0,children:[(0,t.jsx)("span",{className:(0,i.cn)("block text-[12.5px] font-bold text-ink-60 mb-1.5 select-none","filled"!==g&&"invisible"),"aria-hidden":"filled"!==g,children:"Annons"}),(0,t.jsx)("div",{style:{"--holid-h":`${c.mobile}px`,"--holid-h-md":`${c.desktop}px`},children:(0,t.jsx)(s,{ref:u,format:n})})]})}])},966590,576838,e=>{"use strict";var t=e.i(843476),a=e.i(522016);let r=(0,e.i(475254).default)("BadgeCheck",[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["BadgeCheck",0,r],576838);var i=e.i(782622),s=e.i(806908);e.s(["ChefRow",0,function({href:e,name:n,avatar:l,meta:o,verified:d,big:c,action:u,className:g}){return(0,t.jsxs)("article",{className:(0,s.cn)("flex h-full items-center gap-3.5 rounded-inner bg-white p-3 shadow-card",g),children:[(0,t.jsx)(a.default,{href:e,className:"flex-none","aria-hidden":!0,tabIndex:-1,children:(0,t.jsx)(i.PersonAvatar,{name:n,src:l,size:c?56:48})}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsxs)(a.default,{href:e,className:"flex items-center gap-1.5 truncate text-[15px] font-extrabold text-ink transition-colors duration-colour hover:text-coral-deep",children:[(0,t.jsx)("span",{className:"truncate",children:n}),d?(0,t.jsx)(r,{className:"h-4 w-4 flex-none text-coral",strokeWidth:2.2}):null]}),o?(0,t.jsx)("p",{className:"truncate text-[12.5px] font-semibold tabular-nums text-ink-60",children:o}):null]}),u?(0,t.jsx)("div",{className:"flex-none",children:u}):null]})},"isVerifiedChef",0,function(e){return(e??0)>=4.5}],966590)},905590,e=>{"use strict";var t=e.i(527997);let a=["kladdkaka","pannkakor"],r=[{slug:"kanelbullar",from:"2026-09-29",until:"2026-10-05"}];var i=e.i(8540);let s={async getTrendingRecipes(e=20,a=0,r){let i=r??(0,t.createClient)(),{data:s,error:l}=await i.rpc("get_trending_recipes",{limit_count:e,min_views:a});return l?(console.error("Error fetching trending recipes:",l),[]):(s||[]).map(n)},async getTrendingCollections(e=20,a=0,r=0){let i=(0,t.createClient)(),{data:s,error:n}=await i.rpc("get_trending_collections",{limit_count:e,min_recipes:a,offset_count:r});if(n)throw console.error("Error fetching trending collections:",n),n;return(s||[]).map(l)},async getTrendingTags(e=20,a=0){let r=(0,t.createClient)(),{data:i,error:s}=await r.rpc("get_trending_tags",{limit_count:e,min_recipes:a});return s?(console.error("Error fetching trending tags:",s),[]):(i||[]).map(o)},async getTasteTags(e){var s;let n,l,d=e??(0,t.createClient)(),c=(s=(0,i.siteCalendarDay)(),n=`${s.year}-${String(s.month).padStart(2,"0")}-${String(s.day).padStart(2,"0")}`,[...l=r.filter(e=>e.from<=n&&n<=e.until).map(e=>e.slug),...a.filter(e=>!l.includes(e))]),[u,g]=await Promise.all([d.from("tags").select("id, name, slug, icon, thumbnail, statistics:tag_statistics(recipe_count)").in("slug",c),d.rpc("get_trending_tags",{limit_count:8+c.length,min_recipes:20,time_period:"30d"})]);u.error&&console.error("Error fetching pinned taste tags:",u.error),g.error&&console.error("Error fetching trending tags:",g.error);let m=u.data??[];return[...c.flatMap(e=>{let t=m.find(t=>t.slug===e);if(!t)return[];let a=Array.isArray(t.statistics)?t.statistics[0]:t.statistics;return[o({tag_id:t.id,tag_name:t.name,tag_slug:t.slug,tag_icon:t.icon,tag_thumbnail:t.thumbnail,recipe_count:a?.recipe_count})]}),...(g.data??[]).map(o).filter(e=>!c.includes(e.tagSlug))].slice(0,8)},async getTrendingCategories(e=20,a=0,r="30d",i){let s=i??(0,t.createClient)(),{data:n,error:l}=await s.rpc("get_trending_categories",{limit_count:e,min_recipes:a,time_period:r});return l?(console.error("Error fetching trending categories:",l),[]):(n||[]).map(d)},async getCategories(){let e=(0,t.createClient)(),{data:a,error:r}=await e.from("categories").select("id, name, slug, icon").order("name");return r?(console.error("Error fetching categories:",r),[]):(a||[]).map(e=>({id:e.id,name:e.name,slug:e.slug,icon:e.icon||"🍽️"}))},async getFeaturedCategories(e=12,a){let r=a??(0,t.createClient)(),{data:i,error:n}=await r.from("categories").select("id, name, slug, icon, thumbnail, statistics:category_statistics(recipe_count)").eq("is_featured",!0).order("name").limit(e);
361if(n)return console.error("Error fetching featured categories:",n),[];let l=(i||[]).map(e=>{let t=Array.isArray(e.statistics)?e.statistics[0]:e.statistics;return{id:e.id,name:e.name,slug:e.slug,icon:e.icon||"🍽️",thumbnail:e.thumbnail,recipeCount:t?.recipe_count}});if(l.length>=e)return l;let o=e-l.length,d=new Set(l.map(e=>e.id));return[...l,...(await s.getTrendingCategories(e,0,"30d",a)).filter(e=>!d.has(e.categoryId)).slice(0,o).map(e=>({id:e.categoryId,name:e.categoryName,slug:e.categorySlug,icon:e.categoryIcon||"🍽️",thumbnail:e.categoryThumbnail,recipeCount:e.recipeCount}))]},async getRecentlyViewed(e,a=10){let r=(0,t.createClient)();if(!e)return[];try{let{data:t,error:i}=await r.from("recipe_views").select(`
362          recipe_id,
363          viewed_at,
364          recipes!inner(
365            id,
366            slug,
367            title,
368            description,
369            image_url,
370            user_id,
371            users!inner(
372              id,
373              name,
374              nickname,
375              avatar,
376              slug
377            ),
378            stats:recipe_statistics(
379              total_likes,
380              total_comments,
381              total_ratings,
382              average_rating
383            )
384          )
385        `).eq("user_id",e).order("viewed_at",{ascending:!1}).limit(a);i&&console.error("Error fetching recipe views:",i);let{data:s,error:n}=await r.from("collection_views").select(`
386          collection_id,
387          viewed_at,
388          recipe_collections!inner(
389            id,
390            slug,
391            name,
392            description,
393            image_url,
394            user_id,
395            users!inner(
396              id,
397              name,
398              nickname,
399              avatar,
400              slug
401            )
402          )
403        `).eq("user_id",e).order("viewed_at",{ascending:!1}).limit(a);n&&console.error("Error fetching collection views:",n);let l=[],o=new Set,d=new Set;for(let e of t||[]){let t=e.recipes,a=t.id;if(o.has(a))continue;o.add(a);let r=t.users;l.push({id:a,slug:t.slug,type:"recipe",title:t.title,description:t.description,imageUrl:t.image_url,viewedAt:e.viewed_at,userId:r.id,userSlug:r.slug,userName:r.name,userNickname:r.nickname,userAvatar:r.avatar,averageRating:t.stats?.average_rating,ratingCount:t.stats?.total_ratings,commentCount:t.stats?.total_comments})}for(let e of s||[]){let t=e.recipe_collections,a=t.id;if(d.has(a))continue;d.add(a);let i=t.users,{count:s}=await r.from("recipe_collection_recipes").select("id",{count:"exact",head:!0}).eq("recipe_collection_id",a);l.push({id:a,slug:t.slug,type:"collection",title:t.name,description:t.description,imageUrl:t.image_url,viewedAt:e.viewed_at,userId:i.id,userSlug:i.slug,userName:i.name,userNickname:i.nickname,userAvatar:i.avatar,recipeCount:s||0})}return l.sort((e,t)=>new Date(t.viewedAt).getTime()-new Date(e.viewedAt).getTime()),l.slice(0,a)}catch(e){return console.error("Error fetching recently viewed:",e),[]}},async getPopularChannels(e=5){let a=(0,t.createClient)(),{data:r,error:i}=await a.from("channels").select(`
404        id,
405        name,
406        description,
407        image_url,
408        channel_type
409      `).eq("channel_type","public").eq("is_archived",!1).limit(50);return i?(console.error("Error fetching popular channels:",i),[]):r&&0!==r.length?r.sort(()=>Math.random()-.5).slice(0,e).map(e=>{let t=e.channel_statistics?.[0]||{};return{channelId:e.id,name:e.name,description:e.description,imageUrl:e.image_url,channelType:e.channel_type,totalMembers:t.total_members||0,totalMessages:t.total_messages||0,messagesLast7Days:t.messages_last_7_days||0,activeMembersLast7Days:t.active_members_last_7_days||0,trendingScore:t.trending_score||0,isActive:!0}}):[]},async getFeaturedTagsWithRecipes(e=4,a=3){let r=(0,t.createClient)(),{data:i,error:s}=await r.from("tags").select("id, name, slug, thumbnail").limit(5*e);if(s)return console.error("Error fetching tags:",s),[];if(!i?.length)return[];let n=i.sort(()=>Math.random()-.5).slice(0,3*e).map(e=>e.id),{data:l,error:o}=await r.from("recipe_tags").select(`
410        tag_id,
411        recipes!inner(
412          id,
413          slug,
414          title,
415          image_url,
416          user_id,
417          users!inner(
418            id,
419            name,
420            nickname,
421            avatar,
422            slug
423          ),
424          ratings:recipe_ratings(
425            rating
426          )
427        )
428      `).in("tag_id",n).eq("recipes.is_published",!0).not("recipes.image_url","is",null);if(o)return console.error("Error fetching recipes for tags:",o),[];let d=new Map;for(let e of l||[]){let t=d.get(e.tag_id)??[];t.push(e.recipes),d.set(e.tag_id,t)}let c=new Map(i.map(e=>[e.id,e])),u=[];for(let t of n){let r=d.get(t);if(!r?.length)continue;let i=c.get(t),s=r.slice(0,a);if(u.push({tagId:i.id,tagName:i.name,tagSlug:i.slug,tagThumbnail:i.thumbnail||s[0].image_url,recipes:s.map(e=>({recipeId:e.id,recipeSlug:e.slug,title:e.title,imageUrl:e.image_url,userId:e.user_id,userSlug:e.users?.slug,userName:e.users?.name||"",userNickname:e.users?.nickname,userAvatar:e.users?.avatar,averageRating:e.ratings?.length>0?e.ratings.reduce((e,t)=>
428e+t.rating,0)/e.ratings.length:void 0,commentCount:void 0}))}),u.length>=e)break}return u}};function n(e){return{recipeId:e.recipe_id,slug:e.slug,title:e.title||"",description:e.description,imageUrl:e.image_url,prepTime:e.prep_time,cookTime:e.cook_time,difficulty:e.difficulty,categoryId:e.category_id,categoryName:e.category_name,categorySlug:e.category_slug,userId:e.user_id,userSlug:e.user_slug,userName:e.user_name||e.name||"",userNickname:e.user_nickname||e.nickname,userAvatar:e.user_avatar||e.avatar,totalViews:e.total_views||0,totalLikes:e.total_likes||0,totalComments:e.total_comments||0,totalRatings:e.total_ratings||0,timesCooked:e.times_cooked||0,timesCookedLastWeek:e.times_cooked_last_7_days||0,averageRating:e.average_rating||0,trendingScore:e.trending_score||0,createdAt:e.created_at}}function l(e){return{collectionId:e.collection_id,collectionSlug:e.slug,title:e.name||e.title||"",description:e.description,imageUrl:e.image_url,userId:e.user_id,userSlug:e.user_slug,userName:e.user_name||e.name||"",userNickname:e.user_nickname||e.nickname,userAvatar:e.user_avatar||e.avatar,recipeCount:e.recipe_count||0,totalViews:e.total_views||0,totalLikes:e.total_likes||0,totalFollowers:e.total_followers||e.follower_count||0,trendingScore:e.trending_score||0,isTrending:(e.trending_score||0)>50,recipeImages:e.recipe_images||[],tagline:e.tagline||void 0}}function o(e){return{tagId:e.tag_id,tagName:e.tag_name||e.name||"",tagSlug:e.tag_slug||e.slug||"",tagIcon:e.tag_icon||e.icon,tagThumbnail:e.tag_thumbnail||e.thumbnail,recipeCount:e.recipe_count||0,totalViews:e.total_views||0,totalLikes:e.total_likes||0,timesCooked:e.times_cooked||0,averageRating:e.average_rating||0,trendingScore:e.trending_score||0,growthScore:e.growth_score||0}}function d(e){return{categoryId:e.category_id,categoryName:e.category_name||e.name||"",categorySlug:e.category_slug||e.slug||"",categoryIcon:e.category_icon||e.icon,categoryThumbnail:e.category_thumbnail||e.thumbnail,recipeCount:e.recipe_count||0,totalViews:e.total_views||0,totalLikes:e.total_likes||0,timesCooked:e.times_cooked||0,averageRating:e.average_rating||0,trendingScore:e.trending_score||0,growthScore:e.growth_score||0}}e.s(["discoverService",0,s],905590)},154476,e=>{"use strict";var t=e.i(843476),a=e.i(991918),r=e.i(37727),i=e.i(225913),s=e.i(806908);let n=(0,i.cva)("inline-flex items-center gap-1.5 whitespace-nowrap rounded-full font-bold transition-colors duration-colour select-none focus-visible:outline-none focus-visible:shadow-focus",{variants:{state:{default:"bg-plum-tint text-plum hover:bg-line",selected:"bg-plum text-white",unavailable:"bg-plum-tint text-ink-35 cursor-default",accent:"bg-coral-tint text-coral-deep",tinted:"bg-[var(--chip-bg)] text-[color:var(--chip-fg)]",onDark:"bg-white/[.12] text-white hover:bg-white/20",outline:"border-2 border-ink bg-transparent text-ink hover:bg-plum-tint"},size:{sm:"h-7 px-[11px] text-xs",default:"h-[38px] px-4 text-[13.5px]",lg:"h-11 px-[18px] text-[14.5px]"}},defaultVariants:{state:"default",size:"default"}});e.s(["Chip",0,function({className:e,state:i,size:l,count:o,onRemove:d,asChild:c,children:u,...g}){let m=(0,s.cn)(n({state:i,size:l}),d&&"pr-2.5",e);return c?(0,t.jsx)(a.Slot,{className:m,...g,children:u}):(0,t.jsxs)("button",{type:"button",className:m,"aria-pressed":"radio"!==g.role&&"selected"===i||void 0,"aria-checked":"radio"===g.role?"selected"===i:void 0,disabled:"unavailable"===i||g.disabled,...g,children:[u,null!=o?(0,t.jsx)("span",{className:(0,s.cn)("tabular-nums","selected"===i?"opacity-60":"unavailable"===i?void 0:"onDark"===i?"text-white/65":"text-ink-70"),children:o}):null,d?(0,t.jsx)("span",{role:"button",tabIndex:-1,"aria-label":"Ta bort",onClick:e=>{e.stopPropagation(),d()},className:"inline-flex items-center justify-center",children:(0,t.jsx)(r.X,{className:"h-[11px] w-[11px] md:h-3 md:w-3",strokeWidth:2.6})}):null]})},"ChipGroup",0,function({className:e,children:a,...r}){return(0,t.jsx)("div",{className:(0,s.cn)("inline-flex rounded-full bg-plum-tint p-1",e),role:"group",...r,children:a})},"chipVariants",0,n])},8231,e=>{"use strict";var t=e.i(271645);e.s(["useBelowMd",0,function(){let[e,a]=(0,t.useState)(!1);return(0,t.useEffect)(()=>{let e=window.matchMedia("(max-width: 767px)"),t=()=>a(e.matches);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),e}
428])},798934,e=>{"use strict";var t=e.i(527997);function a(e,t=Date.now()){let r=e.published_seconds??0;if(!1===e.is_published)return r;let i=Date.parse(e.published_since??e.created_at??"");return Number.isFinite(i)?r+Math.max(0,Math.floor((t-i)/1e3)):r}e.s(["REMOVAL_REQUEST_REASONS",0,["mistake","personal_data","copyright","outdated","other"],"REMOVAL_REQUEST_REASON_LABELS",0,{mistake:"Publicerat av misstag",personal_data:"Innehåller personuppgifter",copyright:"Bild eller text jag inte har rätt att publicera",outdated:"Receptet är felaktigt eller inaktuellt",other:"Annat"},"publishStatus",0,function(e){return!1!==e.is_published?"published":(e.published_seconds??0)>0?"unpublished":"draft"},"recipeRemovalRequestService",0,{async create(e,t,a){let r=await fetch(`/api/recipes/${e}/removal-request`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({reason:t,details:a})});if(!r.ok)throw Error((await r.json().catch(()=>({}))).error||"Kunde inte skicka begäran")},async listMyPending(){let e=(0,t.createClient)(),{data:a,error:r}=await e.from("recipe_removal_requests").select("id, recipe_id, status, created_at").eq("status","pending");return r?(console.error("Error loading removal requests:",r),[]):a??[]}},"requiresRemovalRequest",0,function(e,t=Date.now()){return!1!==e.is_published||a(e,t)>=86400},"withPublishedState",0,function(e,t,r=Date.now()){return t===(!1!==e.is_published)?{...e,is_published:t}:t?{...e,is_published:!0,published_since:new Date(r).toISOString()}:{...e,is_published:!1,published_seconds:a(e,r),published_since:null}}])},113042,e=>{"use strict";e.s(["RECIPE_CARD_METRICS",0,{title:"h-11",pills:"h-[26px]"}])},141413,e=>{"use strict";var t=e.i(271645),a=e.i(6799);let r=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function i(e){return r.test(e)}var s=e.i(152222),n=e.i(527997),l=e.i(491617),o=e.i(723959);let d=function(e){let t=new Map,a=new Map,r=null,s=new Set,n=new Set,l=new Set,o=new Set,d=!1,c=e=>{let a=t.get(e);return a||(a={},t.set(e,a)),a},u=e=>{a.get(e)?.forEach(e=>e())},g=(e,t)=>{Object.assign(c(e),t),u(e)},m=e=>{let t=[];for(let a=0;a<e.length;a+=100)t.push(e.slice(a,a+100));return t},p=()=>{d||(d=!0,e.schedule(()=>{d=!1,h()}))};async function h(){let t=[];l.forEach(e=>t.push(e));let a=[];o.forEach(e=>a.push(e)),l.clear(),o.clear();let i=r;if(i&&t.length>0)for(let a of m(t))try{let t=new Set(await e.fetchLiked(i,a));if(r!==i)break;for(let e of a)g(e,{liked:t.has(e)})}catch(t){for(let e of a)s.delete(e);e.onError?.(t)}if(a.length>0)for(let t of m(a))try{let a=await e.fetchCounts(t);for(let e of t){let t=a.get(e);g(e,{count:t??0})}}catch(a){for(let e of t)n.delete(e);e.onError?.(a)}}return{snapshot(e){let a=t.get(e);return{liked:a?.liked===!0,count:a?.count??null,pending:a?.pending===!0,resolved:null===r||a?.liked!==void 0}},subscribe(e,t){let r=a.get(e)??new Set;return a.set(e,r),r.add(t),()=>{r.delete(t),0===r.size&&a.delete(e)}},setUser(e){e!==r&&(r=e,s=new Set,l.clear(),t.forEach((e,t)=>{void 0!==e.liked&&(e.liked=void 0,u(t))}))},seedCount(e,t){null==t||void 0===c(e).count&&g(e,{count:t})},requestLiked(e){r&&i(e)&&void 0===c(e).liked&&(s.has(e)||(s.add(e),l.add(e),p()))},requestCount(e){!i(e)||n.has(e)||(n.add(e),o.add(e),p())},async toggle(t){let a=r;if(!a)throw Error("Cannot like a recipe while signed out");if(!i(t))return{liked:!1,count:null};let s=c(t);if(s.pending)return{liked:!0===s.liked,count:s.count??null};let n={liked:s.liked,count:s.count},l=!0!==s.liked,o=void 0===n.count?void 0:Math.max(0,n.count+(l?1:-1));g(t,{liked:l,count:o,pending:!0});try{let r=await e.toggle(t,a);return g(t,{liked:r.isLiked,count:r.likesCount,pending:!1}),{liked:r.isLiked,count:r.likesCount}}catch(e){throw g(t,{...n,pending:!1}),e}}}}({async fetchLiked(e,t){let a=(0,n.createClient)(),{data:r,error:i}=await a.from("recipe_likes").select("recipe_id").eq("user_id",e).in("recipe_id",t);if(i)throw i;return(r??[]).map(e=>e.recipe_id)},async fetchCounts(e){let t=(0,n.createClient)(),{data:a,error:r}=await t.from("recipe_statistics").select("recipe_id, total_likes").in("recipe_id",e);if(r)throw r;return new Map((a??[]).map(e=>[e.recipe_id,e.total_likes??0]))},toggle:(e,t)=>
428s.recipeService.likeRecipe(e,t),schedule:e=>{setTimeout(e,16)},onError:e=>{console.error("Failed to read like state:",e)}});e.s(["toggleRecipeLikeAs",0,function(e,t){return d.setUser(t),d.toggle(e)},"useRecipeLike",0,function(e,r={}){let{count:i=null,exactCount:s=!1}=r,{authUser:n,loading:c}=(0,l.useAuth)(),{showLoginForLiking:u}=(0,o.useLoginEncouragement)(),g=n?.id??null,[m,p]=(0,t.useState)(()=>d.snapshot(e));(0,t.useEffect)(()=>{let t=()=>p(d.snapshot(e)),a=d.subscribe(e,t);return c||d.setUser(g),d.seedCount(e,i),s&&d.requestCount(e),c||d.requestLiked(e),t(),a},[e,g,c,i,s]);let h=(0,t.useCallback)(()=>{g?d.toggle(e).catch(()=>{a.toast.error("Misslyckades att gilla/avgilla recept. Försök igen.")}):u()},[e,g,u]);return{liked:m.liked,count:m.count??i,pending:m.pending,resolved:!c&&m.resolved,toggle:h}}],141413)},25736,675771,e=>{"use strict";var t=e.i(843476),a=e.i(522016),r=e.i(643531),i=e.i(790597),s=e.i(870273),n=e.i(806908),l=e.i(605853),o=e.i(9265),d=e.i(314324),c=e.i(113042),u=e.i(141413),g=e.i(798934);let m={published:{label:"Publicerat",pill:"bg-white",dot:"bg-sage"},draft:{label:"Utkast",pill:"bg-white",dot:"bg-ink-35"},unpublished:{label:"Avpublicerat",pill:"bg-coral-tint",dot:"bg-coral"}};function p({children:e,accent:a}){return(0,t.jsx)("span",{className:(0,n.cn)("inline-flex h-[26px] flex-none items-center gap-1 whitespace-nowrap rounded-full px-2.5 text-[11.5px] font-semibold tabular-nums",a?"bg-coral-tint font-bold text-coral-deep":"bg-plum-tint text-plum"),children:e})}e.s(["PUBLISH_STATUS",0,m],675771),e.s(["RecipeCard",0,function({recipe:e,className:h,priority:f=!1,sizes:_=d.IMAGE_SIZES.recipeGridCard,selectable:k=!1,selected:b=!1,onToggleSelect:y,actions:v,onOpen:w}){let x,{liked:C,count:S,pending:j,toggle:N}=(0,u.useRecipeLike)(e.id,{count:e.total_likes??null}),T=`/recept/${e.slug||e.id}`,E=!!e.image_url,R=(0,g.publishStatus)(e),L="published"===R?null:m[R],I=(x=e.average_rating||e.rating)?x.toFixed(1).replace(".",","):null,M=(e.prep_time??0)+(e.cook_time??0),P=e.created_by,q=(0,t.jsx)(o.CardCover,{seed:e.id,title:e.title,kind:"recipe",size:k||L?"glyph":"full",decorative:!0});return(0,t.jsxs)("article",{className:(0,n.cn)("flex h-full flex-col gap-3 rounded-card bg-white p-2 pb-4 shadow-card",h),children:[(0,t.jsxs)("div",{className:"photo-frame relative aspect-square overflow-hidden rounded-inner bg-plum-tint",children:[(0,t.jsx)(a.default,{href:T,className:"absolute inset-0","aria-label":e.title,onClick:w?e=>{e.preventDefault(),w()}:void 0,children:E?(0,t.jsx)(l.default,{src:e.image_url,fallbackIcon:q,alt:"",fill:!0,className:"object-cover transition-transform duration-media hover:scale-[1.04]",sizes:_,priority:f}):q}),k?(0,t.jsx)("button",{type:"button",onClick:y,"aria-pressed":b,"aria-label":b?"Avmarkera receptet":"Markera receptet",className:(0,n.cn)("absolute left-3 top-3 flex h-[30px] w-[30px] items-center justify-center rounded-full transition-colors duration-colour",b?"bg-coral shadow-[0_0_0_3px_#fff]":"border-2 border-line bg-white/90"),children:b?(0,t.jsx)(r.Check,{className:"h-[15px] w-[15px] text-ink",strokeWidth:3}):null}):L?(0,t.jsxs)("span",{className:(0,n.cn)("pointer-events-none absolute left-3 top-3 inline-flex h-7 items-center gap-1.5 rounded-full px-3 text-[11px] font-bold text-plum",L.pill),children:[(0,t.jsx)("span",{className:(0,n.cn)("h-1.5 w-1.5 rounded-full",L.dot),"aria-hidden":!0}),L.label]}):(S??0)>=100?(0,t.jsx)("span",{className:"photo-only pointer-events-none absolute left-3 top-3 inline-flex h-7 items-center rounded-full bg-white px-3 text-[11px] font-bold text-plum",children:"Populär"}):null,v?(0,t.jsx)("div",{className:"absolute right-3 top-3",children:v}):k?null:(0,t.jsx)("button",{type:"button",onClick:N,disabled:j,"aria-pressed":C,"aria-label":C?`Ta bort gilla-markering f\xf6r ${e.title}`:`Gilla ${e.title}`,className:"absolute right-3 top-3 flex h-[38px] w-[38px] items-center justify-center rounded-full bg-coral text-ink transition-colors duration-colour hover:bg-coral-hover",children:(0,t.jsx)(i.Heart,{className:(0,n.cn)("h-4 w-4",C&&"fill-ink"),strokeWidth:2})})]}),(0,t.jsxs)("div",{className:"flex flex-1 flex-col gap-2 px-2.5",children:[(0,t.jsx)("h3",{className:(0,n.cn)("line-clamp-2 text-[17px] font-bold leading-[1.3] tracking-[-.01em] text-ink [text-wrap:pretty]",c.RECIPE_CARD_METRICS.title),children:(0,t.jsx)(a.default,{href:T,className:"transition-colors duration-colour hover:text-coral-deep",onClick:w?e=>{e.preventDefault(),w()}:void 0,children:e.title})}),(0,t.jsxs)("div",{className:(0,n.cn)("flex flex-wrap gap-1.5 overflow-hidden",c.RECIPE_CARD_METRICS.pills),children:[M>0?(0,t.jsxs)(p,{children:[M," min"]}):null,I?(0,t.jsxs)(p,{accent:!0,children:[(0,t.jsx)(s.Star,{className:"h-[11px] w-[11px] f
428ill-coral-deep text-coral-deep"}),I]}):null,e.category?.name?(0,t.jsx)(p,{children:e.category.name}):null]}),P?(0,t.jsxs)("div",{className:"mt-auto flex items-center gap-2 pt-0.5",children:[(0,t.jsx)("span",{className:"flex h-6 w-6 flex-none items-center justify-center rounded-full bg-plum text-[9.5px] font-bold text-white",children:((e="")=>e.split(" ").map(e=>e[0]).join("").slice(0,2).toUpperCase())(P.name)}),(0,t.jsx)(a.default,{href:`/kockar/${P.slug??P.id}`,className:"-my-1 truncate py-1 text-[12.5px] font-semibold text-ink-60 transition-colors duration-colour hover:text-plum",children:P.name})]}):(0,t.jsx)("div",{className:"mt-auto h-6"})]})]})}],25736)},313376,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(806908);function i({fill:e,size:r,className:s}){let n=(0,a.useId)();return(0,t.jsxs)("svg",{width:r,height:r,viewBox:"0 0 24 24","aria-hidden":!0,className:s,children:["half"===e&&(0,t.jsx)("defs",{children:(0,t.jsxs)("linearGradient",{id:n,children:[(0,t.jsx)("stop",{offset:"50%",stopColor:"#b34a2d"}),(0,t.jsx)("stop",{offset:"50%",stopColor:"#e6dbe0"})]})}),(0,t.jsx)("path",{d:"M12 2l3.1 6.3 6.9 1-5 4.9 1.2 6.8L12 17.8 5.8 21l1.2-6.8-5-4.9 6.9-1z",fill:"half"===e?`url(#${n})`:"full"===e?"#b34a2d":"#e6dbe0"})]})}e.s(["StarGlyph",0,i,"StarRow",0,function({value:e,size:a,className:s}){return(0,t.jsx)("span",{className:(0,r.cn)("inline-flex",a>=20?"gap-0.5":"gap-px",s),children:[1,2,3,4,5].map(r=>(0,t.jsx)(i,{size:a,fill:e>=r-.25?"full":e>=r-.75?"half":"empty"},r))})}])},354381,e=>{"use strict";let t=/\[recept ([^\]\s]+)\]/g;function a(e,a){let r=e??"",i=[],s=0,n=e=>{if(!e)return;let t=i[i.length-1];t?.kind==="text"?t.text+=e:i.push({kind:"text",text:e})};for(let e of Array.from(r.matchAll(t))){n(r.slice(s,e.index));let t=e[1],l=a[t];l?i.push({kind:"recipe",slug:t,title:l}):n(t.replace(/-\d+$/,"").replace(/-+/g," ").trim()),s=(e.index??0)+e[0].length}return n(r.slice(s)),i}e.s(["descriptionParts",0,a,"plainDescription",0,function(e,t){return a(e,t).map(e=>"text"===e.kind?e.text:e.title).join("")}])},707866,e=>{"use strict";let t=(0,e.i(475254).default)("Library",[["path",{d:"m16 6 4 14",key:"ji33uf"}],["path",{d:"M12 6v14",key:"1n7gus"}],["path",{d:"M8 8v12",key:"1gg7y9"}],["path",{d:"M4 4v16",key:"6qkkli"}]]);e.s(["Library",0,t],707866)},157157,e=>{"use strict";var t=e.i(843476),a=e.i(522016),r=e.i(491617),i=e.i(723959);e.s(["CreateRecipeLink",0,function({href:e="/recept/nytt",onClick:s,children:n,...l}){let{authUser:o}=(0,r.useAuth)(),{showLoginForCreating:d}=(0,i.useLoginEncouragement)();return(0,t.jsx)(a.default,{...l,href:e,onClick:e=>{s?.(e),!e.defaultPrevented&&(o||(e.preventDefault(),d()))},children:n})}])},983057,e=>{"use strict";let t=["noll","en","två","tre","fyra","fem","sex","sju","åtta","nio","tio","elva","tolv"];function a(e){return e>=0&&e<t.length?t[e]:e.toLocaleString("sv-SE")}let r=["tretton","fjorton","femton","sexton","sjutton","arton","nitton"],i=["","","tjugo","trettio","fyrtio","femtio","sextio","sjuttio","åttio","nittio"];e.s(["swedishNumberWord",0,a,"swedishNumberWordCapitalized",0,function(e){let t=a(e);return t.charAt(0).toUpperCase()+t.slice(1)},"swedishNumberWordLongCapitalized",0,function(e,a={}){let s=function(e,a={}){let s=e=>1===e&&a.neuter?"ett":t[e];if(e>=0&&e<t.length)return s(e);if(e>=13&&e<=19)return r[e-13];if(e>=20&&e<=99){let t=e%10;return`${i[Math.floor(e/10)]}${t?s(t):""}`}return e.toLocaleString("sv-SE")}(e,a);return s.charAt(0).toUpperCase()+s.slice(1)},"swedishOrdinal",0,function(e){let t=e%100,a=e%10;return`${e.toLocaleString("sv-SE")}:${(1===a||2===a)&&11!==t&&12!==t?"a":"e"}`}])},729731,e=>{"use strict";function t(e){return Date.UTC(e.year,e.month-1,e.day)}function a(e){let t=new Date(e);return{year:t.getUTCFullYear(),month:t.getUTCMonth()+1,day:t.getUTCDate()}}function r(e){return`${e.year}-${String(e.month).padStart(2,"0")}-${String(e.day).padStart(2,"0")}`}function i(e){let r=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!r)return null;let i={year:Number(r[1]),month:Number(r[2]),day:Number(r[3])},s=a(t(i));return s.year===i.year&&s.month===i.month&&s.day===i.day?i:null}
428function s(e,s){return r(a(t(i(e))+864e5*s))}function n(e){return new Date(t(i(e))).getUTCDay()}function l(e){let a,r,s;return(r=(a=new Date(t(i(e)))).getUTCDay()||7,a.setUTCDate(a.getUTCDate()+4-r),s=Date.UTC(a.getUTCFullYear(),0,1),{year:a.getUTCFullYear(),week:Math.ceil(((a.getTime()-s)/864e5+1)/7)}).week}e.s(["WEEKDAY_LONG",0,["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"WEEKDAY_SHORT",0,["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],"addDays",0,s,"parseIsoDate",0,i,"toIsoDate",0,r,"weekNumberOf",0,l,"weekSlug",0,function(e){return`v${l(e)}`},"weekStartOf",0,function(e){let t=r(e);return s(t,-((n(t)||7)-1))},"weekdayOf",0,n])},117801,e=>{"use strict";let t=(0,e.i(475254).default)("UserMinus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);e.s(["UserMinus",0,t],117801)},164274,e=>{"use strict";var t=e.i(843476),a=e.i(531278),r=e.i(107233),i=e.i(117801),s=e.i(167881),n=e.i(806908);e.s(["FollowButton",0,function({isFollowing:e,isLoading:l=!1,displayName:o,onClick:d,size:c="row",tone:u="default",list:g,className:m}){let p="onTint"===u,h="following"===g&&e,f="row"===c?"h-[13px] w-[13px]":"h-4 w-4";return(0,t.jsxs)(s.Button,{variant:e?"tint":"default",onClick:d,disabled:l,"aria-label":e?`Sluta f\xf6lja ${o}`:`F\xf6lj ${o}`,className:(0,n.cn)("row"===c?"h-[38px] gap-1.5 px-3.5 text-[13px]":"h-12 gap-2 px-6 text-[15px]",p&&(e?"bg-plum text-white hover:bg-ink":"bg-white text-plum hover:bg-page"),h&&"bg-white text-plum shadow-[inset_0_0_0_1.5px_theme(colors.line)] hover:bg-plum-tint",m),children:[l?(0,t.jsx)(a.Loader2,{className:"h-4 w-4 animate-spin"}):h?(0,t.jsx)(i.UserMinus,{className:f,strokeWidth:2.4}):p||e?null:(0,t.jsx)(r.Plus,{className:f,strokeWidth:2.6}),h?"Avfölj":e?"Följer":"followers"===g?"Följ tillbaka":"Följ"]})}])},570573,e=>{"use strict";var t=e.i(843476),a=e.i(271645);let r='div[id^="browsi_wrapper_"]';function i({boundaryRef:e,media:t="(max-width: 767.98px)"}){return(0,a.useEffect)(()=>{let a=window.matchMedia(t),i=()=>{let t=e.current;t&&a.matches&&function(e){let t=e.ownerDocument;if(t)for(let a of Array.from(t.querySelectorAll(r)))(function(e,t){let a=e.compareDocumentPosition(t);return(4&a)!=0&&(16&a)==0})(a,e)&&a.remove()}(t)};i();let s=new MutationObserver(e=>{for(let t of e)for(let e of Array.from(t.addedNodes))if(e.nodeType===Node.ELEMENT_NODE&&(e.matches(r)||null!==e.querySelector(r)))return void i()});s.observe(document.body,{childList:!0,subtree:!0});let n=()=>i();return a.addEventListener("change",n),()=>{s.disconnect(),a.removeEventListener("change",n)}},[e,t]),null}e.s(["BrowsiKeepOut",0,i,"BrowsiKeepOutBoundary",0,function({children:e,className:r,media:s}){let n=(0,a.useRef)(null);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i,{boundaryRef:n,media:s}),(0,t.jsx)("div",{ref:n,className:r,children:e})]})}],570573)},292457,e=>{"use strict";let t=(0,e.i(475254).default)("Utensils",[["path",{d:"M3 2v7c0 1.1.9 2 2 2h4a2 2 0 0 0 2-2V2",key:"cjf0a3"}],["path",{d:"M7 2v20",key:"1473qp"}],["path",{d:"M21 15V2a5 5 0 0 0-5 5v6c0 1.1.9 2 2 2h3Zm0 0v7",key:"j28e5"}]]);e.s(["Utensils",0,t],292457)},212513,e=>{"use strict";var t=e.i(527997);class a extends Error{constructor(e){super(`Attempt timed out after ${e}ms`),this.name="AttemptTimeoutError"}}let r=e=>new Promise(t=>setTimeout(t,e));async function i(e,t={}){let s,{attempts:n=3,timeoutMs:l=2e4,baseDelayMs:o=500,maxDelayMs:d=4e3,shouldRetry:c,onRetry:u}=t;for(let t=1;t<=n;t++){let i=new AbortController,g=setTimeout(()=>i.abort(new a(l)),l);try{return await e(i.signal)}catch(i){if(s=i,t>=n||c&&!c(i,t))throw i;u?.(i,t);let e=Math.min(d,o*2**(t-1)),a=Math.random()*e*.3;await r(e+a)}finally{clearTimeout(g)}}throw s}function s(e){let t=e.query.trim();if(t)try{fetch("/api/search",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,query:t}),keepalive:!0}).catch(()=>{})}catch{}}e.s(["searchResultToCollection",0,function(e){if("collection"!==e.entity_type)throw Error("Result is not a collection");let t=Array.isArray(e.metadata.recipe_images)?e.metadata.recipe_images.filter(e=>"string"==typeof e):[];return{id:e.entity_id,slug:e.slug||void 0,user_id:e.created_by?.id,name:e.title,de
428scription:e.description||void 0,tagline:e.metadata.tagline||void 0,image_url:e.image_url||void 0,is_shared:e.metadata.is_shared||!1,active:!0,created_at:new Date(e.created_at),updated_at:new Date(e.created_at),followers_count:e.metadata.follower_count||0,recipe_count:Number(e.metadata.recipe_count)||0,recipes:t.map(e=>({image_url:e})),created_by:e.created_by?{id:e.created_by.id,name:e.created_by.name,nickname:e.created_by.nickname,avatar:e.created_by.avatar,slug:e.created_by.slug}:void 0}},"searchResultToRecipe",0,function(e){if("recipe"!==e.entity_type)throw Error("Result is not a recipe");return{id:e.entity_id,slug:e.slug,user_id:e.created_by?.id||"",title:e.title,description:e.description||"",prep_time:e.metadata.prep_time,cook_time:e.metadata.cook_time,difficulty:e.metadata.difficulty,category_id:e.metadata.category_id,cuisine_id:e.metadata.cuisine_id,serving_unit_id:e.metadata.serving_unit_id,serving_unit:e.metadata.serving_unit?{id:e.metadata.serving_unit_id,name:e.metadata.serving_unit}:void 0,image_url:e.image_url||void 0,created_at:e.created_at,created_by:{id:e.created_by?.id||"",name:e.created_by?.name||"",avatar:e.created_by?.avatar||"",slug:e.created_by?.slug||void 0},sections:[],tags:[],rating:e.metadata.average_rating,average_rating:e.metadata.average_rating,comment_count:e.metadata.total_comments,view_count:e.metadata.total_views,times_cooked:e.metadata.times_cooked,total_likes:e.metadata.total_likes,total_ratings:e.metadata.total_ratings,total_comments:e.metadata.total_comments}},"searchResultToUser",0,function(e){if("user"!==e.entity_type)throw Error("Result is not a user");return{id:e.entity_id,name:e.created_by?.name||e.title||"",email:e.metadata.email||"",slug:e.created_by?.slug||void 0,avatar:e.image_url||"",bio:e.description||void 0,cooking_experience:e.metadata.cooking_experience,created_at:e.created_at}},"trendingRecipeToRecipeWithStats",0,function(e){return{id:e.recipeId,slug:e.slug,user_id:e.userId,title:e.title,description:e.description||"",prep_time:e.prepTime,cook_time:e.cookTime,difficulty:e.difficulty,category:e.categoryName?{id:e.categoryId??"",name:e.categoryName,slug:e.categorySlug??""}:void 0,image_url:e.imageUrl,created_at:e.createdAt,created_by:{id:e.userId,name:e.userName,avatar:e.userAvatar||"",slug:e.userSlug},sections:[],tags:[],rating:e.averageRating,view_count:e.totalViews,times_cooked:e.timesCooked,total_likes:e.totalLikes,comment_count:e.totalComments,average_rating:e.averageRating,total_ratings:e.totalRatings,total_comments:e.totalComments}},"unifiedSearchService",0,{async searchRecipes(e,t={}){let{limit:a=24,offset:r=0,ftsWeight:n=1,semanticWeight:l=1,filters:o={},sort:d="relevance"}=t,c=e.trim(),u=await i(async e=>{let t=await fetch("/api/recipe-search",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({q:c,limit:a,offset:r,ftsWeight:n,semanticWeight:l,filters:o,sort:d}),signal:e});if(!t.ok)throw Error((await t.json().catch(()=>({}))).error||`Search failed: ${t.statusText}`);return(await t.json()).results??[]},{onRetry:(e,t)=>console.warn(`Recipe search attempt ${t} failed, retrying…`,e)});return s({kind:"recipes",query:c,filters:o,result_count:u?.length??0}),u||[]},async searchUsers(e,a={}){let r=(0,t.createClient)(),{limit:i=20,offset:n=0}=a,{data:l,error:o}=await r.rpc("search_users_fts",{query_text:e,limit_count:i,offset_count:n});if(o)throw console.error("User search error:",o),o;return s({kind:"users",query:e,result_count:l?.length??0}),l||[]},async searchCollections(e,a={}){let r=(0,t.createClient)(),{limit:i=20,offset:n=0,ftsWeight:l=1,semanticWeight:o=1}=a,{data:d,error:c}=await r.rpc("search_collections_hybrid",{query_text:e,query_embedding:null,limit_count:i,offset_count:n,fts_weight:l,semantic_weight:o});if(c)throw console.error("Collection search error:",c),c;return s({kind:"collections",query:e,result_count:d?.length??0}),d||[]}}],212513)},571034,e=>{"use strict";let t=[{key:"ravara",label:"Råvara",tagSlugs:["kyckling","pasta","lax-1","fisk","kott","choklad","skaldjur","fars","smordeg","mandelmassa","fiskfile","vegofars"]},{key:"kok",label:"Kök",tagSlugs:["italienskt","tex-mex","indisk","asiatisk","fransk-1","mexikansk","grekisk","amerikansk","spansk","thai","orientalisk","koreansk","sydamerikansk"]},{key:"kost",label:"Kost",tagSlugs:["vegetariskt","vego","glutenfri","laktosfri","lchf","aggfri","mjolkfri","fullkorn","nyttigt","paleo","saltfritt","salt-fattigt"]},{key:"tillfalle",label:"Tillfälle",tagSlugs:["jul","pask","midsommar","nyar","advent","lucia","halloween","fars-dag","fest","kalas","buffe","bjudmat","brunch","fredagsmys","
428sondagsmiddag","picknick","sommar","host","grill","vardag","helg","mellanmal"]}];t.flatMap(e=>e.tagSlugs),e.s(["MEAL_GROUP",0,{key:"maltid",label:"Måltid"},"TAG_GROUPS",0,t])},526166,e=>{"use strict";var t=e.i(571034);[...t.TAG_GROUPS.filter(e=>"kok"===e.key||"kost"===e.key).flatMap(e=>e.tagSlugs)],t.TAG_GROUPS.find(e=>"tillfalle"===e.key)?.tagSlugs,e.s(["HUB_SECTION_IDS",0,{themed:"tema",sorts:"hitta-din-sort",sides:"tillbehor",posts:"kokskunskap",cooks:"kockar",collections:"samlingar",all:"alla",explore:"utforska"},"cooksLede",0,function(e){return 12===e?"Flest recept med den här taggen det senaste året.":"Flest recept med den här taggen på Kokaihop."},"formatCount",0,function(e){return e.toLocaleString("sv-SE")},"formatRating",0,function(e){return e&&e>0?e.toFixed(1).replace(".",","):null}])},34093,e=>{"use strict";e.i(526166),Array.from(new Set([...[{key:"vardag",label:"Vardagsmat",themes:["vardagsmat","vardag","vardagsmiddag","vardagsrecept"],search:"vardagsmat"},{key:"fredagsmys",label:"Fredagsmys",themes:["fredagsmys"],search:"fredagsmys"},{key:"helg",label:"Helgmat",themes:["helgmat","helg"],search:"helgmat"},{key:"fest",label:"Fest och bjudmat",themes:["fest","festmat","bjudmat"],search:"fest"},{key:"grillat",label:"Grillat",themes:["grillat","grill","grilla"],search:"grillat",season:{from:[4,15],to:[9,15]}},{key:"tapas",label:"Tapas",themes:["tapas"],search:"tapas"},{key:"forratter",label:"Förrätter",themes:["förrätt","förrätter"],search:"förrätter"},{key:"smaratter",label:"Smårätter",themes:["smårätter"],search:"smårätter"},{key:"drinkar",label:"Drinkar",themes:["drinkar"],search:"drinkar"},{key:"kalas",label:"Kalas",themes:["kalas"],search:"kalas"},{key:"matlador",label:"Matlådor",themes:["matlådor","matlåda"],search:"matlådor"},{key:"halloween",label:"Halloween",themes:["halloween"],search:"halloween",season:{from:[10,1],to:[11,2]},holiday:!0},{key:"jul",label:"Jul",themes:["jul","julmat","julrecept","julbord"],search:"jul",season:{from:[11,1],to:[12,26]},holiday:!0},{key:"nyar",label:"Nyår",themes:["nyår"],search:"nyår",season:{from:[12,1],to:[1,1]},holiday:!0},{key:"pask",label:"Påsk",themes:["påsk"],search:"påsk",season:{from:[3,1],to:[4,20]},holiday:!0},{key:"midsommar",label:"Midsommar",themes:["midsommar"],search:"midsommar",season:{from:[5,20],to:[6,30]},holiday:!0}].flatMap(e=>e.themes),...[{key:"kyckling",label:"Kyckling",tagSlugs:["kyckling"],themes:["kyckling","kycklingrätter"],search:"kyckling",more:"med kyckling",recipesTag:"kyckling",recipesLabel:"kycklingrecept"},{key:"fisk",label:"Fisk",tagSlugs:["fisk","lax-1","skaldjur"],themes:["fisk","fiskrätter","fisk och skaldjur","lax","skaldjur"],search:"fisk",more:"med fisk",recipesTag:"fisk",recipesLabel:"fiskrecept"},{key:"pasta",label:"Pasta",tagSlugs:["pasta"],themes:["pasta","pastarätter"],search:"pasta",more:"med pasta",recipesTag:"pasta",recipesLabel:"pastarecept"},{key:"vego",label:"Vegetariskt",tagSlugs:["vegetariskt"],themes:["vegetariskt","vegetarisk","vegetariska","vegetariska rätter","vegetarisk mat","vego","veg"],search:"vegetariskt",more:"med vegetariskt",recipesTag:"vegetariskt",recipesLabel:"vegetariska recept"},{key:"soppor",label:"Soppor & grytor",tagSlugs:["soppa","gryta"],themes:["soppa","soppor","gryta","grytor"],search:"soppa",more:"med soppor",recipesTag:"soppa",recipesLabel:"soppor"},{key:"kakor",label:"Kakor",tagSlugs:["kaka-1","kladdkaka","smakakor"],themes:["kakor","kaka","mjuka kakor","småkakor"],search:"kakor",more:"med kakor",recipesTag:"kaka-1",recipesLabel:"kakrecept"},{key:"brod",label:"Bröd & bullar",tagSlugs:["brod","bullar"],themes:["bröd","matbröd","bullar"],search:"bröd",more:"med bröd",recipesTag:"brod",recipesLabel:"brödrecept"},{key:"tartor",label:"Tårtor",tagSlugs:["tarta"],themes:["tårtor","tårta"],search:"tårtor",more:"med tårtor",recipesTag:"tarta",recipesLabel:"tårtrecept"},{key:"efterratt",label:"Efterrätter",tagSlugs:["efterratt","dessert"],themes:["efterrätt","efterrätter","dessert","desserter","efterätt","efterätter"],search:"efterrätter",more:"med efterrätter",recipesTag:"efterratt",recipesLabel:"efterrätter"}].flatMap(e=>e.themes)]));let t=["populara","nya","redaktionens","mina","foljer"];e.s(["HUB_PAGE_SIZE",0,24,"HUB_SECTION_IDS",0,{popular:"populara",
428season:"sasong",dinner:"middag",occasions:"tillfallen",baking:"bakat",following:"foljer",newest:"nya",all:"alla",explore:"utforska"},"LENS_TABS",0,[{lens:"populara",label:"Populära"},{lens:"nya",label:"Nya"},{lens:"redaktionens",label:"Redaktionens"},{lens:"mina",label:"Mina"}],"LENS_TITLES",0,{populara:"Populära samlingar",nya:"Nya samlingar",redaktionens:"Redaktionens val",mina:"Mina samlingar",foljer:"Från kockar du följer"},"OCCASIONS_SHOWN",0,7,"lensFromVisa",0,function(e){return t.includes(e??"")?e:null},"pickPopular",0,function(e,t){let a=[],r=new Set;for(let i of e){if(a.length>=t)break;let e=[...i.subjectTagIds,...i.leadTagId?[i.leadTagId]:[]];if(!e.some(e=>r.has(e)))for(let t of(a.push(i),e))r.add(t)}for(let r of e){if(a.length>=t)break;a.includes(r)||a.push(r)}return a}])},304599,e=>{"use strict";var t=e.i(527997),a=e.i(34093);function r(e){return{id:e.id,slug:e.slug,name:e.name,recipeCount:Number(e.recipe_count??0),followersCount:Number(e.follower_count??0),authorName:e.author_nickname?.trim()||e.author_name?.trim()||null,thumbnails:e.preview_images??[],coverVariant:e.cover_variant}}async function i(e,t,a){let{data:r,error:i}=await a.rpc("get_hub_collections",{p_limit:e,p_offset:t,p_tag_ids:null});if(i)throw i;return r??[]}async function s(e,a){let s=await i(e,a,(0,t.createClient)());return{total:Number(s[0]?.total_count??0),collections:s.map(r)}}async function n(e,s=(0,t.createClient)()){let l=(await i(a.HUB_PAGE_SIZE,0,s)).map(e=>({id:e.id,leadTagId:e.lead_tag_id,subjectTagIds:e.subject_tag_ids??[],card:r(e)}));return(0,a.pickPopular)(l,e).map(e=>e.card)}e.s(["cardRowToCard",0,function(e){return{id:e.id,slug:e.slug,name:e.name,recipeCount:e.recipeCount,followersCount:e.followersCount,authorName:e.author?.name??null,thumbnails:e.thumbnails}},"getPopularCollections",0,n,"getRankedCollections",0,s])},489853,e=>{"use strict";let t=(0,e.i(475254).default)("CalendarDays",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M8 18h.01",key:"lrp35t"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M16 18h.01",key:"kzsmim"}]]);e.s(["CalendarDays",0,t],489853)},115057,e=>{"use strict";let t=(0,e.i(475254).default)("ArrowUpRight",[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]);e.s(["ArrowUpRight",0,t],115057)},130449,e=>{"use strict";var t=e.i(843476),a=e.i(522016),r=e.i(605853),i=e.i(9265),s=e.i(754704),n=e.i(806908);e.s(["CategoryTile",0,function({category:e,priority:l,variant:o="wide"}){let d=(0,s.capitalize)(e.name),c=(e.recipeCount??0).toLocaleString("sv-SE"),u="square"===o,g=(0,t.jsx)(i.CardCover,{seed:`category-${e.id}`,title:d,kind:"category",meta:`${c} recept`,decorative:!0});return(0,t.jsxs)(a.default,{href:`/recept/kategori/${e.slug}`,"aria-label":`${d}, ${c} recept`,className:(0,n.cn)("photo-frame group relative block overflow-hidden bg-plum-tint focus-visible:outline-none focus-visible:shadow-focus",u?"aspect-square rounded-[20px] sm:rounded-[22px]":"aspect-[3/2] rounded-[22px] sm:rounded-card"),children:[e.thumbnail?(0,t.jsx)(r.default,{src:e.thumbnail,alt:"",fill:!0,priority:l,sizes:u?"(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 220px":"(max-width: 640px) 50vw, (max-width: 1280px) 33vw, 330px",className:"object-cover transition-transform duration-500 group-hover:scale-[1.03]",fallbackIcon:g}):g,(0,t.jsx)("div",{"aria-hidden":!0,className:"photo-scrim pointer-events-none absolute inset-0 bg-[linear-gradient(to_top,rgba(42,31,38,.75),rgba(42,31,38,0)_55%)]"}),u?(0,t.jsxs)("div",{className:"photo-only absolute inset-x-3 bottom-2.5 sm:inset-x-4 sm:bottom-3.5",children:[(0,t.jsx)("h3",{className:"text-[15px] font-extrabold leading-[1.1] tracking-[-.02em] text-white sm:text-[17px]",children:d}),(0,t.jsx)("span",{className:"text-[11px] font-semibold tabular-nums text-white/70 sm:text-xs",children:c})]}):(0,t.jsxs)("div",{className:"photo-only absolute inset-x-3.5 bottom-3 flex items-end justify-between gap-2.5 sm:inset-x-5 sm:bottom-[18px]",children:[(0,t.jsx)("h3",{className:"min-w-0 text-lg font-extrabold leading-[1.1] tracking-[-.02em] text-white sm:text-2xl sm:tracking-[-.025em]",children:d}),(0,t.jsx)("span",{className:"inline-flex h-6 flex-none items-center rounded-full bg-white/[.92] px-[9px] text-[11px] font-bold tabular-nums text-plum sm:h-7 sm:px-[11px] sm:text-xs",children:c})]})]})}])},986244,e=>{"use strict";var t=e.i(843476),a=e.i(522016),r=e.i(463059),i=e.i(605853),s=e.i(9265),n=e.i(25736),l=e.i(754704);e.s(["CategoryRow",0,function({category:e,recipes:o,anchorId:d}){let c=`/recept/kategori/${e.slug}
428`,u=(0,l.capitalize)(e.name),g=e.recipeCount.toLocaleString("sv-SE"),m=(0,t.jsx)(s.CardCover,{seed:`category-${e.id}`,title:u,kind:"category",size:"glyph",decorative:!0});return(0,t.jsxs)("section",{id:d,"data-category-row":!0,className:"scroll-mt-[76px]",children:[(0,t.jsxs)("div",{className:"mb-4 flex items-end justify-between gap-6",children:[(0,t.jsxs)(a.default,{href:c,className:"group flex min-w-0 items-center gap-4",children:[(0,t.jsx)("span",{className:"photo-frame relative block h-14 w-14 flex-none overflow-hidden rounded-[16px] bg-plum-tint sm:h-16 sm:w-16 sm:rounded-[18px]",children:e.thumbnail?(0,t.jsx)(i.default,{src:e.thumbnail,alt:"",fill:!0,sizes:"64px",className:"object-cover",fallbackIcon:m}):m}),(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsxs)("h2",{className:"text-[22px] font-extrabold leading-[1.05] tracking-[-.025em] text-ink transition-colors duration-colour group-hover:text-coral-deep sm:text-[26px]",children:[u," ",(0,t.jsxs)("span",{className:"text-[15px] font-semibold tabular-nums text-ink-60 sm:text-base",children:["· ",g]})]}),e.description&&(0,t.jsx)("p",{className:"mt-[5px] truncate text-[14.5px] text-ink-60",children:e.description})]})]}),(0,t.jsxs)(a.default,{href:c,className:"inline-flex h-10 flex-none items-center gap-1.5 rounded-full bg-plum-tint px-4 text-[13px] font-bold text-plum transition-colors duration-colour hover:bg-line focus-visible:outline-none focus-visible:shadow-focus",children:[(0,t.jsxs)("span",{className:"hidden sm:inline",children:["Visa alla ",g]}),(0,t.jsx)("span",{className:"sm:hidden",children:"Alla"}),(0,t.jsx)(r.ChevronRight,{className:"h-3 w-3",strokeWidth:2.6})]})]}),0===o.length?(0,t.jsxs)("p",{className:"rounded-inner bg-plum-tint px-5 py-6 text-center text-[14.5px] font-semibold text-ink-60",children:["Inga populära recept i ",u," ännu."]}):(0,t.jsx)("div",{className:"grid grid-cols-2 gap-3.5 md:grid-cols-[repeat(3,minmax(0,1fr))] md:gap-[18px] xl:grid-cols-[repeat(4,minmax(0,1fr))]",children:o.slice(0,4).map((a,r)=>(0,t.jsx)(n.RecipeCard,{recipe:{id:a.id,slug:a.slug,user_id:a.user.id,title:a.title,description:a.description??"",prep_time:a.prepTime,cook_time:a.cookTime,image_url:a.imageUrl,created_at:a.createdAt,created_by:{id:a.user.id,name:a.user.nickname||a.user.name||"",avatar:a.user.avatar??""},sections:[],category:{id:e.id,name:e.name,slug:e.slug},rating:a.averageRating,average_rating:a.averageRating,total_ratings:a.totalRatings,total_likes:a.totalLikes,total_comments:a.totalComments,times_cooked:a.timesCooked},className:3===r?"md:hidden xl:flex":void 0},a.id))})]})},"ROW_RECIPE_COUNT",0,4],986244)},434122,e=>{"use strict";var t=e.i(8540),a=e.i(526166);let r=["populara","mest-foljda","topprankade","flest-recept","nya","foljer"];e.s(["FEATURE_MIN_RECIPES",0,3,"HUB_PAGE_SIZE",0,24,"HUB_SECTION_IDS",0,{popular:"populara",
428subjects:"specialiteter",activity:"nytt",topRated:"hogst-betyg",following:"foljer",all:"alla",explore:"utforska"},"LENS_LEDES",0,{populara:"Vars recept flest öppnar just nu.","mest-foljda":"Flest följare på Kokaihop.",topprankade:"Högst snittbetyg, bland kockar med minst fem recept och femtio betyg.","flest-recept":"Flest publicerade recept.",nya:"De senast anslutna som har delat ett recept.",foljer:"Senast aktiva först."},"LENS_TABS",0,[{lens:"populara",label:"Populära"},{lens:"mest-foljda",label:"Mest följda"},{lens:"topprankade",label:"Topprankade"},{lens:"flest-recept",label:"Flest recept"},{lens:"nya",label:"Nya"}],"LENS_TITLES",0,{populara:"Populära hemmakockar","mest-foljda":"Mest följda",topprankade:"Topprankade","flest-recept":"Flest recept",nya:"Nya hemmakockar",foljer:"Kockar du följer"},"cookHref",0,function(e){return`/kockar/${e.slug||e.id}`},"cookMeta",0,function(e,r){let i=e.recipeCount>0?`${(0,a.formatCount)(e.recipeCount)} recept`:null,s=e.followers>0?`${(0,a.formatCount)(e.followers)} f\xf6ljare`:null,n=(0,a.formatRating)(e.averageRating);return(()=>{switch(r){case"mest-foljda":return[s,i];case"topprankade":return[n?`${n} i snitt`:null,e.ratingsCount>0?`${(0,a.formatCount)(e.ratingsCount)} betyg`:null];case"nya":{let a=(0,t.formatSiteDateShort)(e.joinedAt);return[a?`Medlem sedan ${a}`:null,i]}default:return[i,s]}})().filter(Boolean).join(" · ")},"lensFromVisa",0,function(e){return r.includes(e??"")?e:null},"sqlLens",0,function(e){return"foljer"===e?"aktiva":e}])},724461,e=>{"use strict";var t=e.i(527997),a=e.i(434122);function r(e){return e.nickname?.trim()||e.name?.trim()||"Kock"}function i(e){return{id:e.user_id,name:r(e),slug:e.slug,avatar:e.avatar,banner:e.banner_image?.trim()||null,recipeCount:Number(e.published_recipes??0),recentRecipes:Number(e.recipes_last_30_days??0),followers:Number(e.total_followers??0),ratingsCount:Number(e.ratings_count??0),averageRating:null===e.average_rating?null:Number(e.average_rating),joinedAt:e.joined_at,latestRecipeAt:e.latest_recipe_at,summary:e.summary?.trim()||null,recipes:e.recipes??[]}}function s(e){return{id:e.id,name:e.name,slug:e.slug,avatar:e.avatar,recipeCount:e.recipeCount,followers:e.followers,ratingsCount:e.ratingsCount,averageRating:e.averageRating,joinedAt:e.joinedAt}}async function n(e,t){if(t.userIds&&0===t.userIds.length)return{list:{total:0,totalRecipes:0,cooks:[]},error:null};let{data:a,error:r}=await e.rpc("get_hub_cooks",{p_lens:t.order,p_limit:t.limit,p_offset:t.offset??0,p_user_ids:t.userIds??null,p_min_recipes:t.minRecipes??1,p_thumbs:t.thumbs??0});if(r)return{list:null,error:r};let s=a??[];return{list:{total:Number(s[0]?.total_count??0),totalRecipes:Number(s[0]?.total_recipes??0),cooks:s.map(i)},error:null}}async function l(e,r,i,o=null){let{list:d,error:c}=await n((0,t.createClient)(),{order:(0,a.sqlLens)(e),limit:r,offset:i,userIds:o});if(c)throw c;return{total:d?.total??0,cooks:(d?.cooks??[]).map(s)}}async function o(e,r=(0,t.createClient)()){let{list:i,error:l}=await n(r,{order:"populara",limit:e,minRecipes:a.FEATURE_MIN_RECIPES});if(l)throw l;return(i?.cooks??[]).map(s)}async function d(e,a){let{list:r,error:i}=await n((0,t.createClient)(),{order:"aktiva",limit:a,userIds:e,thumbs:1});if(i)throw i;return r??{total:0,totalRecipes:0,cooks:[]}}e.s(["getFollowedCooks",0,d,"getHubCookPage",0,l,"getPopularCooks",0,o,"searchResultToGridCook",0,function(e){let t=e.metadata??{},a=e=>("number"==typeof e?e:Number(e??0))||0;return{id:e.entity_id,name:r({nickname:t.nickname,name:e.title}),slug:e.created_by?.slug??null,avatar:e.image_url||null,recipeCount:a(t.total_recipes),followers:a(t.total_followers),ratingsCount:0,averageRating:a(t.average_rating)||null,joinedAt:e.created_at??null}}])},197334,e=>{"use strict";var t=e.i(271645),a=e.i(60529);e.s(["HolidTargeting",0,function({pageType:e,category:r,recipeId:i,recipeSlug:s}){return(0,t.useEffect)(()=>{(0,a.publishHolidTargeting)({page_type:e,category:r,recipe_id:i,recipe_slug:s})},[e,r,i,s]),null}])},612119,e=>{"use strict";var t=e.i(527997);function a(e){return{recommendationId:e.recommendation_id,rank:e.rank,confidenceLevel:e.confidence_level,reason:e.reason_data||{}
428,recipeId:e.recipe_id,slug:e.slug,title:e.title,description:e.description,imageUrl:e.image_url,prepTime:e.prep_time,cookTime:e.cook_time,createdAt:e.created_at,userId:e.user_id,userSlug:e.user_slug,userName:e.user_name,userNickname:e.user_nickname,userAvatar:e.user_avatar,averageRating:e.average_rating||0,totalRatings:e.total_ratings||0,totalLikes:e.total_likes||0}}e.s(["recommendationsService",0,{async getRecipeRecommendations(e=12){let r=(0,t.createClient)(),{data:i,error:s}=await r.rpc("get_my_recipe_recommendations",{p_limit:e});return s?(console.error("Error fetching recipe recommendations:",s),[]):(i||[]).map(a)},async ensureRecommendations(){let e=(0,t.createClient)(),{data:a,error:r}=await e.rpc("ensure_my_recommendations");return r?(console.error("Error ensuring recommendations:",r),0):a??0},async dismissRecommendation(e){let a=(0,t.createClient)(),{error:r}=await a.from("user_recommendations").update({is_dismissed:!0,updated_at:new Date().toISOString()}).eq("id",e);r&&console.error("Error dismissing recommendation:",r)},markInteracted(e){(0,t.createClient)().from("user_recommendations").update({is_interacted:!0,interacted_at:new Date().toISOString(),updated_at:new Date().toISOString()}).eq("id",e).then(({error:e})=>{e&&console.error("Error marking recommendation interacted:",e)})}}])},433472,e=>{"use strict";var t=e.i(843476),a=e.i(271645),r=e.i(555436),i=e.i(37727),s=e.i(972520),n=e.i(167881),l=e.i(806908);let o=["Pasta carbonara","Vegetariskt chokladkaka","Snabb middag för hela familjen","Glutenfri pizza","Nyttig frukost","Enkel dessert","Vegetariskt måltid","Italiensk mat","Köttfärsrecept","Spicy thai curry","Husmanskost"];e.s(["SearchBar",0,function({onSearch:e,initialQuery:d="",className:c,shouldFocus:u,idlePlaceholder:g="Sök recept, ingredienser, kockar…",examples:m=o,variant:p="pill",animatePlaceholder:h=!0}){let f="compact"===p,_=f||!h,[k,b]=(0,a.useState)(d),[y,v]=(0,a.useState)(!1),[w,x]=(0,a.useState)(""),[C,S]=(0,a.useState)(0),[j,N]=(0,a.useState)(0),[T,E]=(0,a.useState)(!1),R=(0,a.useRef)(null);(0,a.useEffect)(()=>{b(d)},[d]),(0,a.useEffect)(()=>{u&&R.current&&setTimeout(()=>{R.current?.focus()},100)},[u]),(0,a.useEffect)(()=>{if(_||k||y)return void x(g);let e=m[C%m.length],t=setTimeout(()=>{!T&&j<e.length?(x(e.slice(0,j+1)),N(j+1)):T||j!==e.length?T&&j>0?(x(e.slice(0,j-1)),N(j-1)):T&&0===j&&(E(!1),S((C+1)%m.length),setTimeout(()=>{},500)):setTimeout(()=>E(!0),2500)},T?30:100);return()=>clearTimeout(t)},[_,j,T,C,k,y,m,g]);let L=async t=>{t.preventDefault(),k.trim()&&e(k.trim())};return(0,t.jsx)("div",{className:(0,l.cn)("w-full",c),children:(0,t.jsx)("form",{onSubmit:L,role:"search",children:(0,t.jsxs)("div",{className:(0,l.cn)("flex w-full items-center rounded-full transition-colors duration-colour focus-within:shadow-focus",f?"h-12 gap-2 border-2 border-ink bg-white pl-4 pr-1.5":"h-[52px] gap-2 bg-plum-tint pl-[18px] pr-1.5 focus-within:bg-white md:h-[58px] md:gap-3 md:pl-5"),children:[(0,t.jsx)(r.Search,{className:(0,l.cn)("flex-none text-ink-60",f?"h-[17px] w-[17px]":"h-[18px] w-[18px] md:h-5 md:w-5"),strokeWidth:2.2}),(0,t.jsx)("input",{ref:R,type:"text",enterKeyHint:"search","aria-label":"Sök recept",placeholder:_||k||y?g:w+"|",value:k,onChange:e=>b(e.target.value),onKeyDown:e=>{(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),R.current?.focus())},onFocus:()=>v(!0),onBlur:()=>v(!1),className:"min-w-0 flex-1 bg-transparent text-base font-bold text-ink outline-none placeholder:font-semibold placeholder:text-ink-60 md:font-semibold"}),k?(0,t.jsx)("button",{type:"button",onClick:()=>{b(""),e(""),R.current?.focus()},className:(0,l.cn)("flex flex-none items-center justify-center rounded-full transition-colors duration-colour",f?"h-[30px] w-[30px] bg-plum-tint text-plum hover:bg-line":"h-8 w-8 bg-page text-ink-60 hover:text-ink"),"aria-label":"Rensa sökning",children:(0,t.jsx)(i.X,{className:f?"h-3 w-3":"h-[13px] w-[13px] md:h-4 md:w-4",strokeWidth:2.6})}):null,f?null:(0,t.jsxs)(n.Button,{type:"submit",variant:"secondary",disabled:h&&!k.trim(),"aria-label":"Sök",className:"h-10 w-10 flex-none p-0 md:h-[46px] md:w-auto md:px-[22px] md:text-[14.5px]",children:[(0,t.jsx)("span",{className:"hidden md:inline",children:"Sök"}),(0,t.jsx)(s.ArrowRight,{className:"h-4 w-4 md:hidden",strokeWidth:2.4})]})]})})})}])},28362,e=>{"use strict";let t="kokaihop:recent-searches";function a(){try{let e=window.localStorage.getItem(t),a=e?JSON.parse(e):[];return Array.isArray(a)?a.filter(e=>"string"==typeof e):[]}catch{return[]}}e.s(["readRecentSearches",0,a,"rememberSearch",0,function(e){let r=e.trim();if(r)try{let e=a().filter(e=>e.toLowerCase()!==r.toLowerCase());window.localStorage.setItem(t,JSON.stringify([r,...e].slice(0,8)))}catch{}}])},812373,e=>{"use strict";var t=e.i(527997);e.s(["startPageService",0,{async getSeenTagIds(){let e=(0,t.createClient)(),{data:{session:a}}=await e.auth.getSession();if(!a)return new Set;let{data:r,error:i}=await e.rpc("get_user_seen_tag_ids");return i?(console.error("Error fetching seen tags:",i),new Set):new Set((r??[]).map(e=>"string"==typeof e?e:e.get_user_seen_tag_ids))},async getRecentActivityCount(e){let a=(0,t.createClient)(),r=new Date(Date.now()-2592e6).toISOString(),[i,s]=await Promise.all([a.from("recipe_likes").select("id",{count:"exact",head:!0}).eq("user_id",e).gte("created_at",r),a.from("cooked_recipes").select("id",{count:"exact",head:!0}).eq("user_id",e).gte("created_at",r)]);return(i.count??0)+(s.count??0)}}])},346746,e=>{"use strict";let t={key:"frukost",meal:"frukost",question:"Vad blir det till frukost?",lede:"Börja dagen med något gott, från en snabb gröt till en lång helgfrukost.",label:"Till frukost",popularLine:"Populärt till frukost",browseTitle:"Hitta något gott till frukost",browseHref:"/recept/kategori/frukost"},a={key:"lunch",meal:"lunch",question:"Vad blir det till lunch?",lede:"Något snabbt och gott mitt på dagen, frå
428n hemmakockar i hela Sverige.",label:"Till lunch",popularLine:"Populärt till lunch",browseTitle:"Hitta något gott till lunch",browseHref:"/recept/tagg/lunch"},r={key:"ikvall",meal:"middag",question:"Vad blir det ikväll?",lede:"Tusentals middagstips från hemmakockar som gärna delar med sig.",label:"Ikväll",popularLine:"Populärt till middag",browseTitle:"Hitta något gott till ikväll",browseHref:"/recept/kategori/huvudratt"},i={key:"imorgon",meal:"middag",question:"Vad blir det imorgon?",lede:"Bestäm middagen redan nu, så har du ett beslut mindre imorgon.",label:"Imorgon",popularLine:"Populärt till middag",browseTitle:"Planera morgondagens middag",browseHref:"/recept/kategori/huvudratt"};function s(e){return e>=5&&e<10?t:e>=10&&e<14?a:e>=14&&e<22?r:i}let n=["kyckling","kott","fars","fisk","lax-1","fiskfile","skaldjur","gryta","soppa","pasta","kottbullar","farsbiffar","biffar","pyttipanna","artsoppa","husman","middag","lunch","huvudratt","varmratt","vardag","sondagsmiddag"],l=["kyckling","kott","fars","fisk","lax-1","skaldjur","tacopaj","matpaj","gron-paj","pizza","tex-mex","vegetariskt","middag","lunch","huvudratt","varmratt","vardag"],o=["kyckling","kycklingsallad","kott","fisk","lax-1","skaldjur","pasta","middag","lunch","huvudratt"],d=["efterratt","dessert","dessertpaj","kaka-1","kakor","smakakor","tarta","kladdkaka","kladdkakemuffins","kladdmuffins","muffins","cupcake","bullar","kanelbullar","lussebullar","semlor","cheesecake","bakelse","bakning","hembakat","mazariner","rulltarta","marangtarta","chokladtarta","daimtarta","tartbotten","rocky-road","mjuka-kakor","takakor","chokladmousse","tirams","chokladkaka","chokladbollar","choklad","godis","julgodis","paskdessert","nyarsdessert","paskkaka","fika","sylt","brod","frallor","smafranska","matbrod","pizzadeg","tillbehor","dressing","dipp","kryddor","snacks","snittar","tilltugg","plockmat","glogg","sommardrink","nyarsdrink","kaffedrink","smoothie"],c=["fruktsoppa","blåbärssoppa","nyponsoppa","smoothie","muffins","kladdkaka","cheesecake","tiramisu","marmelad","pepparkak","lussekatt","lussebull","kanelbull","semla","semlor","chokladboll","äppelpaj","äpplepaj","smulpaj","rabarberpaj","blåbärspaj"],u=["dessert-paj","stora-sma-kakor","godis","dryck-drinkar","sas-dressing-roror"],g={frukost:{admit:[{categories:["frukost"]},{tags:["frukost","frukostmuffins"]},{categories:["matbrod","smorgas","ovrigt"],tags:["brunch"]},{categories:["dryck-drinkar","ovrigt"],tags:["smoothie"]}],neverCategories:[...u.filter(e=>"dryck-drinkar"!==e),"huvudratt","soppa-gryta","paj-pizza","sallad","forratt"],neverTags:["fisk","fiskfile","fiskgryta","fisksoppa","grillad-fisk","lax-1","skaldjur","kott","fars","farsbiffar","biffar","kottbullar","frikadeller","kyckling","grillad-kyckling","kycklingpasta","kycklingsallad","schnitzel","rostbiff","hamburgare","burgare","chili-con-carne","julskinka","julmat","gryta","gratang","lasagne","langkok","stek","helstekt","pasta","pizza","tacos","tex-mex","wok","risotto","soppa","kalpudding-dolmar","grill","till-grillen","grillspett","middag","sondagsmiddag","sommarmiddag","huvudratt","varmratt","efterratt","dessert","dessertpaj","tarta","kladdkaka","godis","cheesecake","chokladmousse","tirams","choklad","glogg","sommardrink","nyarsdrink","kaffedrink"],neverTitleWords:["gratäng","gryta","lasagne","köttfärs","köttbullar","torsk","fisk","räk","kyckling","fläskfilé","oxfilé","entrecote","kotlett","schnitzel","stroganoff","kassler","falukorv","tacos","pizza","chili con carne","curry","risotto","spaghetti","sill","choklad","milkshake","drink"],preferTags:["frukost"],preferCategories:["frukost"]},lunch:{admit:[{categories:["huvudratt","soppa-gryta","vegetariskt-vegan"]},{categories:["sallad"],tags:o},{categories:["paj-pizza"],tags:l},{categories:["smorgas"],tags:["smorgasar","toast","wraps","rakmacka","lunch"]},{categories:["ovrigt"],tags:n},{tags:["lunch"]}],neverCategories:[...u,"frukost","matbrod","tillbehor-smaratter","forratt"],neverTags:[...d,"smorgastarta","varm-smorgastarta"],neverTitleWords:c,preferTags:["lunch","soppa","snabbt","snabblagad","lattlagat-1","matpaj","kycklingsallad"],preferCategories:["soppa-gryta"]},middag:{admit:[{categories:["huvudratt","soppa-gryta","vegetariskt-vegan"]},{categories:["paj-pizza"],tags:l},{categories:["sallad"],tags:o},{categories:["ovrigt"],tags:n},{tags:["middag","sondagsmiddag","sommarmiddag","huvudratt","varmratt"]}],neverCategories:[...u,"frukost","matbrod","smorgas","tillbehor-smaratter","forratt"],neverTags:[...d,"frukost","frukostmuffins","brunch","mellanmal","smorgastarta","varm-smorgastarta"],neverTitleWords:c,preferTags:[],preferCategories:[]}},m={frukost:{neverCategories:["matbrod"],neverTags:[],maxMinutes:30}
428,lunch:{neverCategories:[],neverTags:["langkok","helstekt"],maxMinutes:45},middag:{neverCategories:[],neverTags:["langkok","helstekt"],maxMinutes:45}},p={frukost:["brunch","helg"],lunch:["brunch","helg"],middag:[]},h={0:["sondagsmiddag","helg","langkok"],1:["vardag","snabbt","lattlagat-1","middag"],2:["vardag","snabbt","lattlagat-1","middag"],3:["vardag","snabbt","lattlagat-1","middag"],4:["vardag","snabbt","lattlagat-1","middag","artsoppa"],5:["fredagsmys","tacos","tex-mex","pizza","hamburgare"],6:["helg","middag","bjudmat"]},f=[{tags:["jul","julmat","julskinka","julkottbullar","julbrod","julgodis","glogg","advent","lucia","lussebullar"],from:[11,15],to:[1,6]},{tags:["nyar","nyarsdessert","nyarsdrink"],from:[12,20],to:[1,2]},{tags:["semlor"],from:[1,7],to:[3,31]},{tags:["pask","paskdessert","paskkaka"],from:[3,1],to:[4,30]},{tags:["sommar","sommarmiddag","sommardrink","picknick"],from:[5,1],to:[8,31]},{tags:["midsommar"],from:[6,1],to:[6,30]},{tags:["host","hostgryta"],from:[9,1],to:[11,30]},{tags:["halloween"],from:[10,10],to:[11,2]},{tags:["fars-dag"],from:[11,1],to:[11,15]},{tags:["vintersallad"],from:[11,1],to:[2,28]}],_=["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"];function k(e){return Array.from(new Set(e))}function b(e,t){let a=new Set(e.tagSlugs),r=e=>e.some(e=>a.has(e));if(!t.admit.some(t=>(void 0!==t.categories||void 0!==t.tags)&&(void 0===t.categories||null!==e.categorySlug&&t.categories.includes(e.categorySlug))&&(void 0===t.tags||r(t.tags)))||null!==e.categorySlug&&t.neverCategories.includes(e.categorySlug)||r(t.neverTags)||null!==t.maxMinutes&&e.minutes>t.maxMinutes)return!1;let i=e.title.toLowerCase();return!t.neverTitleWords.some(e=>i.includes(e))}let y=[["kyckling",/kyckling/],["fisk",/fisk|lax|torsk|sej|kolja|räk/],["färs",/färs|köttbull|biffar/],["pannkakor",/pannkak|plätt|pancake|crepe|crêpe/],["våfflor",/våffl/],["ägg",/omelett|äggröra|frittata|ägg\b/],["gröt",/gröt|havregryn|overnight|chiapudding/],["müsli",/müsli|musli|mysli|granola/],["smoothie",/smoothie|shot\b/],["bröd",/bröd|fralla|frallor|bullar|scones|franska|bagel|tekak|limpa|knäck/],["soppa",/soppa/],["gryta",/gryta/],["paj",/paj|quiche/],["pasta",/pasta|spagetti|spaghetti|lasagne|tagliatelle|penne|carbonara/],["gratäng",/gratäng/],["taco",/taco/],["pizza",/pizza/],["sallad",/sallad/]];e.s(["chooseMealPicks",0,function(e,t,{limit:a=6,minRatings:r=0}={}){let i=e.filter(e=>b(e,t)&&!!e.imageUrl&&(e.totalRatings<3||e.averageRating>=3.5)),s=i.filter(e=>e.totalRatings>=r),n=s.length>0?s:i,l=n.filter(e=>"popular"!==e.source).slice(0,3),o=n.filter(e=>"popular"===e.source),d=[],c=new Set,u=new Set,g=new Set,m=(e,t)=>{let r;if(d.length>=a||c.has(e.recipeId))return;let i=e.title.toLowerCase().replace(/[^a-z0-9åäöéü]+/g,"");if(u.has(i))return;let s=(r=e.title.toLowerCase(),y.filter(([,e])=>e.test(r)).map(([e])=>e));if(!(t&&s.some(e=>g.has(e))))for(let t of(d.push(e),c.add(e.recipeId),u.add(i),s))g.add(t)};for(let e of l)m(e,!1);for(let e of o)m(e,!0);for(let e of o)m(e,!1);return d},"fitsMeal",0,b,"mealMomentFor",0,function(e,t){let a,r=s(e),i={year:(a=new Date(Date.UTC(t.year,t.month-1,t.day+ +(e>=22)))).getUTCFullYear(),month:a.getUTCMonth()+1,day:a.getUTCDate(),weekday:a.getUTCDay()};return{slot:r,day:i,rules:function(e,t){var a;let r=g[e],i=0===(a=t.weekday)||6===a||"middag"===e&&5===a,s=[],n=[];for(let e of f)(!function({month:e,day:t},a,r){let i=100*e+t,s=100*a[0]+a[1],n=100*r[0]+r[1];return s<=n?i>=s&&i<=n:i>=s||i<=n}(t,e.from,e.to)?s:n).push(...e.tags);let l=[..."middag"===e?h[t.weekday]:[],...0===t.weekday||6===t.weekday?p[e]:[]];return{...r,neverCategories:k([...r.neverCategories,...i?[]:m[e].neverCategories]),neverTags:k([...r.neverTags,...s,...i?[]:m[e].neverTags]),neverTitleWords:k([...r.neverTitleWords,..._.filter((e,a)=>a!==t.weekday)]),preferTags:k([...r.preferTags,...l,...n]).filter(e=>!r.neverTags.includes(e)),maxMinutes:i?null:m[e].maxMinutes}}(r.meal,i),seed:`${i.year}-${i.month}-${i.day}:${r.key}`}},"questionFor",0,function(e){return s(e).question},"weekdayMaxMinutes",0,function(e){return m[e].maxMinutes}])},409312,e=>{"use strict";var t=e.i(527997);function a(e){return{recipeId:e.recipe_id,source:e.source,recommendationId:e.recommendation_id??null,reason:e.reason_data||{},slug:e.slug??void 0,title:e.title,imageUrl:e.image_url,categorySlug:e.category_slug??null,tagSlugs:e.tag_slugs??[],minutes:(e.prep_time??0)+(e.cook_time??0),userName:e.user_name??void 0,userNickname:e.user_nickname??void 0,averageRating:Number(e.average_rating)||0,totalRatings:e.total_ratings||0}}e.s(["mealPicksService",0,{async getCandidates(e,r,i=16,s){let n=s??(0,t.createClient)(),{data:l,error:o}=await n.rpc("get_my_meal_picks",{p_rules:e,p_seed:r,p_limit:i});return o?(console.error("Error fetching meal picks:",o),[]):(l||[]).slice().sort((e,t)=>
428e.pick_order-t.pick_order).map(a)}}])},648094,e=>{"use strict";var t=e.i(527997),a=e.i(175479),r=e.i(409312),i=e.i(346746);async function s(e,t){let{data:a,error:r}=await e.from("landing_hero_recipes").select("recipe_id");if(r||!a||0===a.length)return[];let{data:s}=await e.from("recipes").select("id, slug, title, image_url, is_published, prep_time, cook_time, categories(slug), recipe_tags(tags(slug)), users!inner(name, nickname, avatar), recipe_statistics(average_rating, total_ratings)").in("id",a.map(e=>e.recipe_id));return(s??[]).filter(e=>e.is_published&&e.image_url).map(e=>{let t=Array.isArray(e.recipe_statistics)?e.recipe_statistics[0]:e.recipe_statistics,a=(e.prep_time??0)+(e.cook_time??0),r={title:e.title,categorySlug:e.categories?.slug??null,tagSlugs:(e.recipe_tags??[]).map(e=>e.tags?.slug).filter(Boolean),minutes:a};return{recipe:e,stats:t,facts:r}}).filter(({facts:e})=>(0,i.fitsMeal)(e,t)).map(({recipe:e,stats:t,facts:a})=>({id:e.id,slug:e.slug,title:e.title,imageUrl:e.image_url,chefName:e.users?.nickname||e.users?.name||"",chefAvatar:e.users?.avatar??null,rating:t?.average_rating?Number(t.average_rating):0,totalRatings:t?.total_ratings||0,minutes:a.minutes}))}async function n(e,a){let n=a??(0,t.createClient)(),[l,o]=await Promise.all([s(n,e.rules).catch(()=>[]),r.mealPicksService.getCandidates(e.rules,e.seed,16,n)]),d=(0,i.chooseMealPicks)(o,e.rules,{limit:3,minRatings:10}).map(e=>({id:e.recipeId,slug:e.slug,title:e.title,imageUrl:e.imageUrl??"",chefName:e.userNickname||e.userName||"",chefAvatar:null,rating:e.averageRating,totalRatings:e.totalRatings,minutes:e.minutes})),c=new Set;return[...function(e){let t=[...e];for(let e=t.length-1;e>0;e--){let a=Math.floor(Math.random()*(e+1));[t[e],t[a]]=[t[a],t[e]]}return t}(l),...d].filter(e=>!c.has(e.id)&&(c.add(e.id),!0)).slice(0,3)}e.s(["getHeroCollageRecipes",0,n,"landingHeroService",0,{async list(){let e=(0,t.createClient)(),{data:a,error:r}=await e.from("landing_hero_recipes").select("id, recipe_id, created_at").order("created_at",{ascending:!1});if(r||!a||0===a.length)return[];let i=a.map(e=>e.recipe_id),{data:s}=await e.from("recipes").select("id, title, image_url, slug").in("id",i),n=new Map((s??[]).map(e=>[e.id,e]));return a.map(e=>{let t=n.get(e.recipe_id);return{id:e.id,recipeId:e.recipe_id,title:t?.title??"Recept",imageUrl:t?.image_url??void 0,slug:t?.slug??void 0}})},async add(e){await (0,a.adminApi)("/api/admin/landing-hero","POST",{recipeId:e},"Kunde inte lägga till receptet")},async remove(e){await (0,a.adminApi)(`/api/admin/landing-hero/${e}`,"DELETE",void 0,"Kunde inte ta bort receptet")}}])}]);

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.