PageSourceSearch

https://sapphiresc.com/_next/static/chunks/9544-89fb3739d2670145.js

js sapphiresc.com collected 2026-10-04 05:00:27 UTC 23,986 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9544],{37390:function(e,t,a){a.d(t,{_b:function(){return i}});let r=function(e){let t=e.flatMap(e=>e.credits<=0?[]:[e.price/(30*e.credits),e.yearlyPrice/(365*e.credits)]).filter(e=>Number.isFinite(e)&&e>0);if(0===t.length)throw Error("No paid daily-credit subscription plan is configured");return Math.min(...t)}(a(93292).dO);function i(e){var t,a;let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Math.max(0,Number(e)||0);return Math.max(Math.max(1,Math.ceil(null!==(t=i.minimumCredits)&&void 0!==t?t:1)),Math.ceil(n/(r*(1-Math.min(.8,Math.max(0,null!==(a=i.grossMargin)&&void 0!==a?a:.35))))))}},83563:function(e,t,a){function r(e){return"en"===e?"en":"tr"}function i(e){if("string"==typeof e)return e.trim()||void 0}function n(e){let t="number"==typeof e?e:Number(e);if(Number.isFinite(t)&&!(t<0))return Math.floor(t)}function s(e,t){if("string"==typeof e){let t=e.toUpperCase();if("RATE_LIMIT_EXCEEDED"===t||"RATE_LIMIT"===t||"RATE_LIMIT"===t)return"RATE_LIMIT";if("INSUFFICIENT_CREDITS"===t)return"INSUFFICIENT_CREDITS";if("ASSET_PERSIST_FAILED"===t)return"ASSET_PERSIST_FAILED";if("GENERATOR_OUTPUT_DIMENSION_MISMATCH"===t)return"GENERATOR_OUTPUT_DIMENSION_MISMATCH";if("GENERATOR_PROVIDER_TIMEOUT"===t)return"GENERATOR_PROVIDER_TIMEOUT";if("GENERATOR_SEAM_QUALITY_BELOW_THRESHOLD"===t)return"GENERATOR_SEAM_QUALITY_BELOW_THRESHOLD";if("DUPLICATE_IN_FLIGHT"===t)return"DUPLICATE_IN_FLIGHT"}let a=(t||"").toLowerCase();return a.includes("429")||a.includes("rate limit")||a.includes("too many requests")||a.includes("rate_limit")?"RATE_LIMIT":a.includes("insufficient credits")||a.includes("yetersiz kredi")?"INSUFFICIENT_CREDITS":"UNKNOWN"}function l(e,t){var a,l;let o=r(t);if(e instanceof TypeError&&e.message.includes("fetch"))return"en"===o?{code:"NETWORK",message:"Network connection error",details:"Check your internet connection and try again."}:{code:"NETWORK",message:"Ağ bağlantısı hatası",details:"İnternet bağlantınızı kontrol edin ve tekrar deneyin."};if(e instanceof SyntaxError)return"en"===o?{code:"INVALID_RESPONSE",message:"Invalid server response",details:"Please try again later."}:{code:"INVALID_RESPONSE",message:"Sunucu yanıtı ge\xe7ersiz",details:"L\xfctfen daha sonra tekrar deneyin."};let d=i(null==e?void 0:e.message)||"",c={},u=d;try{if(d.includes("{")){let e=JSON.parse(d);c=e,i(e.error)&&(u=i(e.error))}}catch(e){}let f=s(null!==(a=c.code)&&void 0!==a?a:null==e?void 0:e.code,u);switch(f){case"RATE_LIMIT":{let e=null!==(l=n(c.retryAfter))&&void 0!==l?l:10;return"en"===o?{code:f,message:"API rate limit exceeded. Please wait ".concat(e," seconds and try again."),details:"Sapphire Engine may be slower during peak load. Wait a few seconds before retrying."}:{code:f,message:"API rate limit aşıldı. L\xfctfen ".concat(e," saniye bekleyip tekrar deneyin."),details:"Sapphire Engine yoğunluk nedeniyle biraz yavaş olabilir. L\xfctfen birka\xe7 saniye bekleyin."}}case"INSUFFICIENT_CREDITS":{let e=n(c.required),t=n(c.available);if("en"===o)return{code:f,message:null!=e&&null!=t?"Insufficient credits. Required: ".concat(e,", Available: ").concat(t):u||"Insufficient credits.",details:"Buy credits on the pricing page."};return{code:f,message:null!=e&&null!=t?"Yetersiz kredi. Gerekli: ".concat(e,", Mevcut: ").concat(t):u||"Yetersiz kredi.",details:"Kredi satın almak i\xe7in fiyatlandırma sayfasına gidebilirsiniz."}}case"DUPLICATE_IN_FLIGHT":return"en"===o?{code:f,message:"A generation is already in progress for this request.",details:"Wait a few seconds — your previous request may still be running."}:{code:f,message:"Bu istek i\xe7in bir \xfcretim zaten devam ediyor.",details:"Birka\xe7 saniye bekleyin — \xf6nceki isteğiniz h\xe2l\xe2 \xe7alışıyor olabilir."};case"GENERATOR_PROVIDER_TIMEOUT":return"en"===o?{code:f,message:u||"The pattern provider timed out.",details:"Your credits were refunded. Wait a few seconds and try again."}:{code:f,message:u||"Desen sağlayıcısı zaman aşımına uğradı.",details:"Krediniz iade edildi. Birka\xe7 saniye bekleyip yeniden deneyin."};case"ASSET_PERSIST_FAILED":return"en"===o?{code:f,message:u||"The pattern could not be saved to durable storage. Your credits were refunded.",details:"Please try again in a few seconds."}:{code:f,message:u||"Desen kalıcı depolamaya kaydedilemedi. Krediniz iade edildi.",details:"L\xfctfen b
1irka\xe7 saniye sonra tekrar deneyin."};case"GENERATOR_OUTPUT_DIMENSION_MISMATCH":return"en"===o?{code:f,message:u||"Generated output dimensions did not match the selected fabric size. Your credits were refunded.",details:"Try a different fabric size or regenerate the pattern."}:{code:f,message:u||"\xdcretilen desen boyutu se\xe7ilen kumaş \xf6l\xe7\xfcs\xfcyle eşleşmedi. Krediniz iade edildi.",details:"Farklı bir kumaş \xf6l\xe7\xfcs\xfc se\xe7in veya deseni yeniden \xfcretin."};case"GENERATOR_SEAM_QUALITY_BELOW_THRESHOLD":return"en"===o?{code:f,message:u||"The generated tile did not pass the seamless-edge quality check. Your credits were refunded.",details:"Try a simpler motif, lower density, or regenerate the pattern."}:{code:f,message:u||"\xdcretilen karo dikişsiz kenar kalite kontrol\xfcn\xfc ge\xe7emedi. Krediniz iade edildi.",details:"Daha sade bir motif, daha d\xfcş\xfck yoğunluk deneyin veya deseni yeniden \xfcretin."};default:return{code:"UNKNOWN",message:u||("en"===o?"An unknown error occurred.":"Bilinmeyen hata oluştu")}}}function o(e,t){var a,o;let d=r(t),c="en"===d&&null!==(a=i(null==e?void 0:e.error_en))&&void 0!==a?a:i(null==e?void 0:e.error),u=s(null==e?void 0:e.code,c);if("RATE_LIMIT"===u){let t=null!==(o=n(null==e?void 0:e.retryAfter))&&void 0!==o?o:10;return"en"===d?{code:u,message:"API rate limit exceeded. Please wait ".concat(t," seconds and try again."),details:"Sapphire Engine may be slower during peak load. Wait a few seconds before retrying."}:{code:u,message:"API rate limit aşıldı. L\xfctfen ".concat(t," saniye bekleyip tekrar deneyin."),details:"Sapphire Engine yoğunluk nedeniyle biraz yavaş olabilir. L\xfctfen birka\xe7 saniye bekleyin."}}if("INSUFFICIENT_CREDITS"===u){let t=n(null==e?void 0:e.required),a=n(null==e?void 0:e.available);return"en"===d?{code:u,message:null!=t&&null!=a?"Insufficient credits. Required: ".concat(t,", Available: ").concat(a):c||"Insufficient credits.",details:"Buy credits on the pricing page."}:{code:u,message:null!=t&&null!=a?"Yetersiz kredi. Gerekli: ".concat(t,", Mevcut: ").concat(a):c||"Yetersiz kredi.",details:"Kredi satın almak i\xe7in fiyatlandırma sayfasına gidebilirsiniz."}}return l(c?{message:c,code:u}:{message:"",code:u},t)}function d(e,t){return o(e&&"object"==typeof e?e:{},t)}function c(e,t,a){let s=r(t),d=i(null==a?void 0:a.detail);switch(e){case"IMAGE_NOT_FOUND":return"en"===s?{code:e,message:"Image not found.",details:"Generate or reload the pattern first."}:{code:e,message:"G\xf6rsel bulunamadı.",details:"\xd6nce desen \xfcretin veya sayfayı yenileyin."};case"DOWNLOAD_FAILED":return"en"===s?{code:e,message:d?"Download error: ".concat(d):"Download failed.",details:"Try direct download without upscaling."}:{code:e,message:d?"İndirme hatası: ".concat(d):"İndirme başarısız.",details:"Upscale olmadan direkt indirmeyi deneyin."};case"EXPORT_FAILED":return"en"===s?{code:e,message:d?"Export error: ".concat(d):"Export failed."}:{code:e,message:d?"Dışa aktarma hatası: ".concat(d):"Dışa aktarma başarısız."};case"SAVE_FAILED":return"en"===s?{code:e,message:d?"Save error: ".concat(d):"Could not save to gallery.",details:"Your pattern is still on screen. Check your connection and try approving again."}:{code:e,message:d?"Kayıt hatası: ".concat(d):"Galeriye kaydedilemedi.",details:"Deseniniz h\xe2l\xe2 ekranda. Bağlantınızı kontrol edip onaylamayı tekrar deneyin."};case"GENERATE_FIRST":return"en"===s?{code:e,message:"Please generate a pattern first."}:{code:e,message:"L\xfctfen \xf6nce bir desen \xfcretin."};case"IMAGE_PROCESS_FAILED":return"en"===s?{code:e,message:"Image processing failed.",details:"Please try again or regenerate the pattern."}:{code:e,message:"G\xf6rsel işlenirken hata oluştu.",details:"Tekrar deneyin veya deseni yeniden \xfcretin."};case"CREDIT_CHECK_FAILED":return"en"===s?{code:e,message:"Could not verify credit balance.",details:"Check your connection and retry."}:{code:e,message:"Kredi bakiyesi doğrulanamadı.",details:"Bağlantınızı kontrol edip tekrar deneyin."};case"INVALID_IMAGE":return"en"===s?{code:e,message:"Invalid image format.",details:"Choose a valid PNG or JPEG pattern."}:{code:e,message:"Ge\xe7ersiz g\xf6rsel formatı.",details:"Ge\xe7erli bir PNG veya JPEG desen se\xe7in."};case"IMAGE_LOAD_BASE64":return"en"===s?{code:e,message:"Could not load embedded image.",details:"The image format may be invalid. Try regenerating or re-uploading."}:{code:e,message:"Base64 g\xf6rsel y\xfcklenemedi.",details:"G\xf6rsel formatı ge\xe7ersiz olabilir. Yeniden \xfcretin veya y\xfckleyin."};case"IMAGE_LOAD_CORS":return"en"===s?{code:e,message:"Could not load image.",details:"A browser security restriction (CORS) may be blocking the file."}:{code:e,message:"G\xf6rsel y\xfcklenemedi.",details:"Tarayıcı g\xfcvenlik kısıtlaması (CORS) olabilir."};case"INSUFFICIENT_CREDITS":return{...o({code:"INSUFFICIENT_CREDITS",required:n(null==a?void 0:a.required),available:n(null==a?void 0:a.balance),error:"en"===s?"Insufficient credits.":"Yetersiz kredi."},t),code:"INSUFFICIENT_CREDITS"};
1default:return{...l(d?{message:d}:{},t),code:e}}}function u(e,t){let a=r(t);switch(e){case"NO_IMAGE_URL":return"en"===a?{code:"INVALID_RESPONSE",message:"No image URL received from server",details:"Generation may have failed silently. Try again in a few seconds."}:{code:"INVALID_RESPONSE",message:"Sunucudan g\xf6rsel URL’si alınamadı",details:"\xdcretim sessizce başarısız olmuş olabilir. Birka\xe7 saniye sonra tekrar deneyin."};case"INVALID_IMAGE_URL":return"en"===a?{code:"INVALID_RESPONSE",message:"Invalid image URL from server",details:"The response did not include a usable image link. Try regenerating."}:{code:"INVALID_RESPONSE",message:"Sunucudan ge\xe7ersiz g\xf6rsel URL’si",details:"Yanıtta kullanılabilir bir g\xf6rsel bağlantısı yoktu. Yeniden \xfcretin."};default:return"en"===a?{code:"INVALID_RESPONSE",message:"Invalid server response",details:"Please try again later."}:{code:"INVALID_RESPONSE",message:"Sunucu yanıtı ge\xe7ersiz",details:"L\xfctfen daha sonra tekrar deneyin."}}}function f(e){return"string"==typeof e&&(e.startsWith("http")||e.startsWith("data:")||e.startsWith("blob:"))}a.d(t,{CC:function(){return l},GU:function(){return d},Xu:function(){return u},v6:function(){return f},wr:function(){return c}})},18929:function(e,t,a){a.d(t,{UU:function(){return d},VS:function(){return u},vK:function(){return c},zt:function(){return l}});let r=["erişim engellendi","g\xfcvenli olmayan y\xf6nlendirme","\xe7ok fazla y\xf6nlendirme","access denied","blocked","unsafe redirect"],i=["g\xf6rsel indirilemedi","g\xf6rsel d\xf6nd\xfcrmedi","failed to fetch","indirilemedi","fetch failed","network","timeout","aborted"];function n(e){let t="number"==typeof e?e:Number(e);if(Number.isFinite(t)&&!(t<=0))return Math.floor(t)}function s(e){if("string"==typeof e)return e.trim()||void 0}function l(e,t){if("string"==typeof e){let t=e.toUpperCase();if("IMAGE_TOO_LARGE"===t||"URL_BLOCKED"===t||"FETCH_FAILED"===t||"INSUFFICIENT_CREDITS"===t||"INVALID_IMAGE"===t||"ASSET_PERSIST_FAILED"===t)return t}return t?function(e){let t=(e||"").toLowerCase();return t?r.some(e=>t.includes(e))?"URL_BLOCKED":t.includes("ge\xe7ersiz")||t.includes("invalid")||t.includes("base64")||t.includes("http/https")?"INVALID_IMAGE":t.includes("\xe7ok b\xfcy\xfck")||t.includes("too large")||t.includes("megapixel")?"IMAGE_TOO_LARGE":(i.some(e=>t.includes(e)),"FETCH_FAILED"):"FETCH_FAILED"}(t):"UNKNOWN"}function o(e){if(e&&!(e<=0))return"".concat((e/1e6).toFixed(1),"M")}function d(e,t){var a,r,i;let d="en"===t?"en":"tr",c=s(null==e?void 0:e.error)||s(null==e?void 0:e.warning),u=l(null==e?void 0:e.code,c),f=n(null==e?void 0:null===(a=e.currentSize)||void 0===a?void 0:a.width),m=n(null==e?void 0:null===(r=e.currentSize)||void 0===r?void 0:r.height),g=n(null==e?void 0:null===(i=e.currentSize)||void 0===i?void 0:i.pixels),y=n(null==e?void 0:e.maxSide),I=n(null==e?void 0:e.maxPixels),v=n(null==e?void 0:e.requestedOutputPixels),E=n(null==e?void 0:e.maxOutputPixels),p=f&&m?"".concat(f,"\xd7").concat(m).concat(o(g)?" (".concat(o(g),")"):""):void 0,h=o(I);switch(u){case"IMAGE_TOO_LARGE":if("en"===d){if(p&&v&&E)return"The requested upscale for ".concat(p," would produce ").concat(o(v)," pixels, above the ").concat(o(E)," output limit. A lower safe scale will be selected automatically; retry the request. Credits were not charged.");if(p&&y)return"Image too large (".concat(p,"). Maximum input side for this upscale is ").concat(y,"px").concat(h?" / ~".concat(h," pixels"):"",". Resize the image and try again — credits were not charged for this rejection.");if(p)return"Image too large (".concat(p,"). Please resize below the supported limit and try again — credits were not charged for this rejection.");return c||"Image too large to upscale. Please resize and try again — credits were not charged for this rejection."}if(p&&v&&E)return"".concat(p," g\xf6rsel i\xe7in istenen b\xfcy\xfctme ").concat(o(v)," piksel \xfcretir ve ").concat(o(E)," \xe7ıktı sınırını aşar. Daha d\xfcş\xfck g\xfcvenli \xf6l\xe7ek otomatik se\xe7ilecek; yeniden deneyin. Kredi kesilmedi.");if(p&&y)return"G\xf6rsel \xe7ok b\xfcy\xfck (".concat(p,"). Bu upscale i\xe7in maksimum kenar ").concat(y,"px").concat(h?" / ~".concat(h," piksel"):"",". L\xfctfen k\xfc\xe7\xfclt\xfcp yeniden deneyin — bu red i\xe7in kredi kesilmez.");if(p)return"G\xf6rsel \xe7ok b\xfcy\xfck (".concat(p,"). Desteklenen limite k\xfc\xe7\xfclt\xfcp yeniden deneyin — bu red i\xe7in kredi kesilmez.");return c||"G\xf6rsel upscale i\xe7in \xe7ok b\xfcy\xfck. L\xfctfen k\xfc\xe7\xfclt\xfcp yeniden deneyin — bu red i\xe7in kredi kesilmez.";case"URL_BLOCKED":return"en"===d?"This image URL cannot be fetched for security reasons. Upload the file directly or use a Sapphire CDN / gallery link.":"Bu g\xf6rsel URL'si g\xfcvenlik nedeniyle indirilemiyor. Dosyayı doğrudan y\xfckleyin veya Sapphire CDN / galeri bağlantısı kullanın.";case"FETCH_FAILED":return"en"===d?c||"Could not download the source image. Check the link, then retry. If it keeps failing, upload the file directly.":c||"Kaynak g\xf6rsel indirilemedi. Bağlantıyı kontrol edip yeniden deneyin. Devam ederse dosyayı doğrudan y\xfckleyin.";case"INVALID_IMAGE":return"en"===d?c||"Invalid image. Please upload a valid PNG, JPEG, or WEBP file.":c||"Ge\xe7ersiz g\xf6rsel. L\xfctfen ge\xe7erli bir PNG, JPEG veya WEBP dosyası y\xfckleyin.";case"ASSET_PERSIST_FAILED":if("en"===d)return s(null==e?void 0:e.error_en)||c||"Output could not be saved to durable storage. Your credits were refunded. Please try again.";return c||"\xc7ıktı kalıcı depolamaya kaydedilemedi. Krediniz iade edildi. L\xfctfen tekrar deneyin.";case"INSUFFICIENT_CREDITS":{let t=n(null==e?void 0:e.required),a=n(null==e?void 0:e.available);if("en"===d){if(null!=t&&null!=a)return"Insufficient credits: ".concat(t," required, ").
1concat(a," available. Buy credits on the pricing page.");return"Insufficient credits. Buy credits on the pricing page."}if(null!=t&&null!=a)return"Yetersiz kredi: ".concat(t," gerekli, mevcut ").concat(a,". Fiyatlandırma sayfasından kredi alın.");return"Yetersiz kredi. Fiyatlandırma sayfasından kredi alın."}default:return c||("en"===d?"Upscale failed. Please try again.":"Upscale işlemi başarısız. L\xfctfen tekrar deneyin.")}}function c(e,t){let a=e&&"object"==typeof e?e:{},r=d(a,t);return{code:l(a.code,s(a.error)),message:r,body:a}}function u(e){return"IMAGE_TOO_LARGE"===e||"URL_BLOCKED"===e||"INSUFFICIENT_CREDITS"===e||"INVALID_IMAGE"===e||"ASSET_PERSIST_FAILED"===e}},34692:function(e,t,a){a.d(t,{H4:function(){return i},_E:function(){return n}});var r=a(37390);function i(e,t,a){let r=Math.max(1,Math.floor(Number(e)||0)),i=Math.max(1,Math.floor(Number(t)||0)),n=Math.min(16,Math.max(1,Number(a)||1));return Math.max(1,Math.ceil(r*i*n*n/1e6))}function n(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return(0,r._b)(function(e){let t=Math.max(1,Math.ceil(e));return t<=4?.005:t<=8?.01:t<=16?.02:t<=32?.04:t<=64?.06:.12}(e),{minimumCredits:t})}a(82957).lW},93448:function(e,t,a){a.d(t,{cn:function(){return n}});var r=a(61994),i=a(53335);function n(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];return(0,i.m6)((0,r.W)(t))}},76239:function(e,t,a){a.d(t,{d:function(){return s}});var r=a(59625),i=a(89134);let n={searchQuery:"",tags:[],categories:[],status:[],collections:[],sortBy:"newest",viewMode:"grid"},s=(0,r.Ue)()((0,i.tJ)((e,t)=>({variants:[],collections:[],filters:n,selectedVariantIds:[],favoriteVariantIds:[],currentUserRole:"client",currentUserId:"user-1",addVariant:a=>{let r=a.imageUrl||"",i=a.thumbnailUrl||"";if(r.startsWith("data:")&&(r.length>3e5?(console.warn("Base64 image too large, creating compressed thumbnail"),i=r):console.log("Saving base64 image to gallery")),!r){console.warn("No image URL for variant, skipping gallery save");return}let n=t(),s=n.currentUserId||a.createdBy||"unknown";if(n.variants.length>=5){console.warn("[Variant Gallery] Maximum variant limit reached (".concat(5,"). Cannot add more variants."));return}let l={...a,createdBy:s,imageUrl:r||"",thumbnailUrl:i||r||"",id:"var-".concat(Date.now(),"-").concat(Math.random().toString(36).substr(2,9)),createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),version:1,status:a.status||"draft",productionReady:a.productionReady||!1,qualityChecked:a.qualityChecked||!1,favoriteCount:0,isPublic:a.isPublic||!1};e(e=>{let t=[l,...e.variants.filter(e=>e.createdBy===s)];return t.length>5&&(console.warn("Gallery limit (".concat(5,") exceeded. Removing oldest.")),t=t.slice(0,5)),{variants:[...t,...e.variants.filter(e=>e.createdBy!==s)]}})},updateVariant:(t,a)=>{e(e=>({variants:e.variants.map(e=>e.id===t?{...e,...a,updatedAt:new Date().toISOString(),version:a.status!==e.status?e.version:e.version+1}:e)}))},deleteVariant:async t=>{try{let a=await fetch("/api/gallery/".concat(t),{method:"DELETE"});if(!a.ok){let e=await a.json();throw Error(e.error||"Silme işlemi başarısız")}e(e=>({variants:e.variants.filter(e=>e.id!==t),collections:e.collections.map(e=>({...e,variantIds:e.variantIds.filter(e=>e!==t)})),selectedVariantIds:e.selectedVariantIds.filter(e=>e!==t),favoriteVariantIds:e.favoriteVariantIds.filter(e=>e!==t)}))}catch(e){console.error("Varyant silme hatası:",e),alert("Silme işlemi başarısız: ".concat(e.message))}},duplicateVariant:a=>{let r=t().getVariantById(a);if(r){let t={...r,id:"var-".concat(Date.now(),"-").concat(Math.random().toString(36).substr(2,9)),name:"".concat(r.name," (Copy)"),createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),version:1,status:"draft",parentVariantId:r.id,favoriteCount:0};e(e=>({variants:[t,...e.variants]}))}},archiveVariant:e=>{let{currentUserId:a}=t();t().updateVariant(e,{status:"archived",archivedAt:new Date().toISOString(),archivedBy:a})},unarchiveVariant:e=>{t().updateVariant(e,{status:"draft",archivedAt:void 0,archivedBy:void 0})},createCollection:t=>
1{let a={...t,id:"col-".concat(Date.now(),"-").concat(Math.random().toString(36).substr(2,9)),variantIds:[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};e(e=>({collections:[a,...e.collections]}))},updateCollection:(t,a)=>{e(e=>({collections:e.collections.map(e=>e.id===t?{...e,...a,updatedAt:new Date().toISOString()}:e)}))},deleteCollection:t=>{e(e=>({collections:e.collections.filter(e=>e.id!==t)}))},addVariantToCollection:(t,a)=>{e(e=>({collections:e.collections.map(e=>e.id!==t||e.variantIds.includes(a)?e:{...e,variantIds:[...e.variantIds,a],updatedAt:new Date().toISOString()})}))},removeVariantFromCollection:(t,a)=>{e(e=>({collections:e.collections.map(e=>e.id===t?{...e,variantIds:e.variantIds.filter(e=>e!==a),updatedAt:new Date().toISOString()}:e)}))},setFilters:t=>{e(e=>({filters:{...e.filters,...t}}))},resetFilters:()=>{e({filters:n})},toggleVariantSelection:t=>{e(e=>({selectedVariantIds:e.selectedVariantIds.includes(t)?e.selectedVariantIds.filter(e=>e!==t):[...e.selectedVariantIds,t]}))},selectAllVariants:()=>{e({selectedVariantIds:t().getFilteredVariants().map(e=>e.id)})},clearSelection:()=>{e({selectedVariantIds:[]})},toggleFavorite:t=>{e(e=>{let a=e.favoriteVariantIds.includes(t);return{favoriteVariantIds:a?e.favoriteVariantIds.filter(e=>e!==t):[...e.favoriteVariantIds,t],variants:e.variants.map(e=>e.id===t?{...e,favoriteCount:a?e.favoriteCount-1:e.favoriteCount+1,isFavorite:!a}:e)}})},setCurrentUserRole:t=>{e({currentUserRole:t})},setCurrentUserId:t=>{e({currentUserId:t})},approveVariant:(e,a)=>{t().updateVariant(e,{status:"approved",approvedBy:a,approvedAt:new Date().toISOString()})},rejectVariant:(e,a,r)=>{t().updateVariant(e,{status:"rejected",rejectedBy:a,rejectedAt:new Date().toISOString(),rejectionReason:r})},markProductionReady:(e,a)=>{t().updateVariant(e,{productionReady:!0,productionNotes:a,status:"in_production"})},performQualityCheck:(e,a,r)=>{t().updateVariant(e,{qualityChecked:!0,qualityCheckedBy:a,qualityCheckedAt:new Date().toISOString(),qualityScore:r})},getFilteredVariants:()=>{let{variants:e,filters:a,favoriteVariantIds:r}=t(),i=[...e];if(a.searchQuery){let e=a.searchQuery.toLowerCase();i=i.filter(t=>{var a;return t.name.toLowerCase().includes(e)||(null===(a=t.description)||void 0===a?void 0:a.toLowerCase().includes(e))||t.tags.some(t=>t.toLowerCase().includes(e))})}if(a.tags.length>0&&(i=i.filter(e=>a.tags.some(t=>e.tags.includes(t)))),a.categories.length>0&&(i=i.filter(e=>e.category&&a.categories.includes(e.category))),a.status.length>0&&(i=i.filter(e=>a.status.includes(e.status))),a.collections.length>0){let e=new Set;a.collections.forEach(a=>{let r=t().getCollectionById(a);null==r||r.variantIds.forEach(t=>e.add(t))}),i=i.filter(t=>e.has(t.id))}if(a.createdBy&&(i=i.filter(e=>e.createdBy===a.createdBy)),a.dateRange){let e=new Date(a.dateRange.start),t=new Date(a.dateRange.end);i=i.filter(a=>{let r=new Date(a.createdAt);return r>=e&&r<=t})}return i.sort((e,t)=>{switch(a.sortBy){case"newest":return new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime();case"oldest":return new Date(e.createdAt).getTime()-new Date(t.createdAt).getTime();case"name":return e.name.localeCompare(t.name);case"favorites":return t.favoriteCount-e.favoriteCount;case"quality":return(t.qualityScore||0)-(e.qualityScore||0);default:return 0}}),i.map(e=>({...e,isFavorite:r.includes(e.id)}
1))},getVariantById:e=>t().variants.find(t=>t.id===e),getCollectionById:e=>t().collections.find(t=>t.id===e),getVariantsByCollection:e=>{let a=t().getCollectionById(e);return a?a.variantIds.map(e=>t().getVariantById(e)).filter(e=>void 0!==e):[]},getVariantsByTag:e=>t().variants.filter(t=>t.tags.includes(e)),getVariantsByStatus:e=>t().variants.filter(t=>t.status===e)}),{name:"sapphire-variant-gallery-v2",storage:(0,i.FL)(()=>({getItem:e=>{try{return localStorage.getItem(e)}catch(e){return console.error("[Variant Gallery] Failed to read from localStorage:",e),null}},setItem:(e,t)=>{try{localStorage.setItem(e,t)}catch(t){if((null==t?void 0:t.name)==="QuotaExceededError"||(null==t?void 0:t.code)===22)try{localStorage.removeItem(e)}catch(e){}else console.error("[Variant Gallery] Failed to save to localStorage:",t)}},removeItem:e=>{try{localStorage.removeItem(e)}catch(e){console.error("[Variant Gallery] Failed to remove from localStorage:",e)}}})),partialize:e=>({filters:{...n,viewMode:e.filters.viewMode,sortBy:e.filters.sortBy},favoriteVariantIds:e.favoriteVariantIds,currentUserRole:e.currentUserRole})}))}}]);

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.