datocms-plugin-asset-optimization 0.7.8 → 0.7.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,6 +14,13 @@ The DatoCMS Asset Optimization Plugin leverages Imgix's powerful image processin
14
14
  - Convert images to modern formats like AVIF or WebP
15
15
  - Track optimization progress with detailed logs
16
16
  - View statistics on storage savings
17
+ - Preview the impact of your settings before replacing anything
18
+
19
+ ## Where it lives in DatoCMS
20
+
21
+ After installation, the plugin adds an **Asset Management → Optimize assets** entry in your environment's **Configuration** section. The plugin's configuration screen also provides a shortcut button to that page.
22
+
23
+ The plugin requires the `currentUserAccessToken` permission so it can replace assets on your behalf.
17
24
 
18
25
  ## Installation
19
26
 
@@ -21,7 +28,6 @@ The DatoCMS Asset Optimization Plugin leverages Imgix's powerful image processin
21
28
  2. Go to Settings > Plugins
22
29
  3. Search for "Asset Optimization"
23
30
  4. Click "Install"
24
- 5. Configure the plugin settings as desired
25
31
 
26
32
  ## Important: Use Sandbox Environments First
27
33
 
@@ -39,11 +45,40 @@ This approach allows you to safely experiment with different optimization parame
39
45
 
40
46
  ## Usage
41
47
 
42
- 1. After installation, navigate to the plugin in your DatoCMS dashboard
48
+ 1. Open **Configuration → Optimize assets**.
43
49
  2. Configure the optimization settings according to your needs
44
- 3. Click "Start Optimization" to begin the process
45
- 4. Watch the progress as the plugin processes your assets
46
- 5. View the results including statistics on size savings
50
+ 3. Click **Preview Optimization** to dry-run the process and see expected savings without touching any assets
51
+ 4. When you're happy with the projected results, click **Start Optimization**. You'll be asked to confirm twice before any asset is replaced
52
+ 5. Watch the progress and the live activity log as the plugin processes your assets
53
+ 6. Review the final statistics, including per-category lists of optimized, skipped, and failed assets
54
+
55
+ ### Settings reference
56
+
57
+ The form groups settings into four sections:
58
+
59
+ - **Size Thresholds**
60
+ - *Large Asset (MB)* and *Very Large Asset (MB)* — assets above each threshold get their own quality and resize profile
61
+ - *Minimum Size Reduction (%)* — only replace an asset if Imgix can shrink it by at least this much
62
+
63
+ - **Basic Optimization**
64
+ - *Preserve Original Format* — keep JPG/PNG/etc. instead of converting (`fm` parameter)
65
+ - *Auto Compress* — let Imgix pick compression automatically (`auto=compress`)
66
+ - *Target Format* (when not preserving) — `webp` or `avif`
67
+ - *Resize Large Images* — toggle to limit max width via `max-w`
68
+
69
+ - **Resize Dimensions** (visible when resize is enabled)
70
+ - *Large Image Max Width (px)* and *Very Large Image Max Width (px)*
71
+
72
+ - **Compression Settings**
73
+ - *Large Image Quality* / *Very Large Image Quality* — `q` value 0–100 (hidden in lossless mode)
74
+
75
+ - **Advanced Options**
76
+ - *Use Lossless Compression* (`lossless=1`)
77
+ - *Use DPR Optimization* (`dpr=2` for Retina)
78
+ - *Enhanced Chroma Sampling* (`chromasub=444` for JPEGs)
79
+ - *Preserve Color Profiles* (`cs=origin`)
80
+
81
+ A *Restore Defaults* button is available at any time.
47
82
 
48
83
  ### Asset Filtering & Optimization
49
84
 
@@ -69,6 +104,7 @@ This approach allows you to safely experiment with different optimization parame
69
104
  - Mass-update existing media libraries with optimized assets
70
105
  - Apply consistent optimization settings across your entire asset collection
71
106
  - Save time compared to manual optimization workflows
107
+ - Up to 10 assets are processed in parallel for faster runs
72
108
 
73
109
  ## Development
74
110
 
@@ -1 +1 @@
1
- import{b as y,A as g}from"./index-CV8dvyAg.js";const w=t=>new Promise(e=>setTimeout(e,t)),R=(t,e,s,r)=>{const c=e*r**t;return Math.min(c,s)},C=(t,e)=>{const s=t?Number.parseInt(t,10):0;return s>0?s*1e3:R(e.retryCount,e.initialRetryDelay,e.maxRetryDelay,e.retryBackoffFactor)},q=(t,e,s)=>y({apiToken:t,environment:e,autoRetry:!1,...s?{baseUrl:s}:{}}),v=t=>t instanceof g&&t.response.status===429,b=t=>t.response.headers["retry-after"]??t.response.headers["x-ratelimit-reset"],$=t=>{const e={};for(const[s,r]of Object.entries(t))typeof r=="string"?e[s]=r:(typeof r=="number"||typeof r=="boolean")&&(e[s]=String(r));return e},A=async(t,e,s)=>{const r=await fetch(t);if(!r.ok)throw new Error(`Failed to fetch image from URL: ${r.status} ${r.statusText}`);const l=await(await r.blob()).arrayBuffer(),i=new Uint8Array(l),a=await fetch(e,{method:"PUT",headers:{...s,"Content-Length":i.length.toString()},body:i});if(!a.ok)throw new Error(`Failed to upload file to S3: ${a.status} ${a.statusText}`)};async function p(t,e,s,r,c,l,i=0,a=1e3,u=6e4,h=2){if(console.log(`Replacing DatoCMS asset ID ${t} with image from URL: ${e}${i>0?` (retry ${i})`:""}`),!t||!s)throw new Error("Missing required parameters: assetId and apiToken are required");const d={retryCount:i,initialRetryDelay:a,maxRetryDelay:u,retryBackoffFactor:h},m=async(o=1)=>p(t,e,s,r,c,l,i+o,a,u,h);try{const o=q(s,r,c),n=await o.uploadRequest.create({filename:l||"optimized-image.jpg"});await A(e,n.url,$(n.request_headers));const f=await o.uploads.rawUpdate(t,{data:{id:t,type:"upload",attributes:{path:n.id}}});return console.log("Asset replaced successfully:",f),f}catch(o){if(v(o)&&i<5){const n=C(b(o),d);return console.error(`Rate limit exceeded while replacing asset. Retrying in ${n}ms...`),await w(n),m()}throw console.error("Error replacing asset:",o),o}}class D{queue=[];activeCount=0;config;processing=!1;completedCount=0;failedCount=0;resolvePromise=null;constructor(e){this.config={...e,concurrency:e.concurrency||3,initialRetryDelay:e.initialRetryDelay||1e3,maxRetryDelay:e.maxRetryDelay||6e4,retryBackoffFactor:e.retryBackoffFactor||2}}addTask(e,s,r){this.queue.push({assetId:e,newImageUrl:s,filename:r,retryCount:0})}async processTask(e){try{await p(e.assetId,e.newImageUrl,this.config.apiToken,this.config.environment,this.config.baseUrl,e.filename,e.retryCount,this.config.initialRetryDelay,this.config.maxRetryDelay,this.config.retryBackoffFactor),this.completedCount++}catch(s){console.error(`Failed to replace asset ${e.assetId} after multiple retries:`,s),this.failedCount++}finally{this.activeCount--,this.processQueue()}}processQueue(){if(this.queue.length===0&&this.activeCount===0&&this.resolvePromise){this.resolvePromise({succeeded:this.completedCount,failed:this.failedCount}),this.resolvePromise=null,this.processing=!1;return}for(;this.queue.length>0&&this.activeCount<(this.config.concurrency||3);){const e=this.queue.shift();e&&(this.activeCount++,this.processTask(e))}}start(){return this.processing?Promise.reject(new Error("Asset replacer is already processing")):(this.processing=!0,this.completedCount=0,this.failedCount=0,new Promise(e=>{this.resolvePromise=e,this.processQueue()}))}getStatus(){return{queued:this.queue.length,active:this.activeCount,completed:this.completedCount,failed:this.failedCount}}}export{D as AssetReplacer,p as default};
1
+ import{b as y,A as g}from"./index-DWcPZazL.js";const w=t=>new Promise(e=>setTimeout(e,t)),R=(t,e,s,r)=>{const c=e*r**t;return Math.min(c,s)},C=(t,e)=>{const s=t?Number.parseInt(t,10):0;return s>0?s*1e3:R(e.retryCount,e.initialRetryDelay,e.maxRetryDelay,e.retryBackoffFactor)},q=(t,e,s)=>y({apiToken:t,environment:e,autoRetry:!1,...s?{baseUrl:s}:{}}),v=t=>t instanceof g&&t.response.status===429,b=t=>t.response.headers["retry-after"]??t.response.headers["x-ratelimit-reset"],$=t=>{const e={};for(const[s,r]of Object.entries(t))typeof r=="string"?e[s]=r:(typeof r=="number"||typeof r=="boolean")&&(e[s]=String(r));return e},A=async(t,e,s)=>{const r=await fetch(t);if(!r.ok)throw new Error(`Failed to fetch image from URL: ${r.status} ${r.statusText}`);const l=await(await r.blob()).arrayBuffer(),i=new Uint8Array(l),a=await fetch(e,{method:"PUT",headers:{...s,"Content-Length":i.length.toString()},body:i});if(!a.ok)throw new Error(`Failed to upload file to S3: ${a.status} ${a.statusText}`)};async function p(t,e,s,r,c,l,i=0,a=1e3,u=6e4,h=2){if(console.log(`Replacing DatoCMS asset ID ${t} with image from URL: ${e}${i>0?` (retry ${i})`:""}`),!t||!s)throw new Error("Missing required parameters: assetId and apiToken are required");const d={retryCount:i,initialRetryDelay:a,maxRetryDelay:u,retryBackoffFactor:h},m=async(o=1)=>p(t,e,s,r,c,l,i+o,a,u,h);try{const o=q(s,r,c),n=await o.uploadRequest.create({filename:l||"optimized-image.jpg"});await A(e,n.url,$(n.request_headers));const f=await o.uploads.rawUpdate(t,{data:{id:t,type:"upload",attributes:{path:n.id}}});return console.log("Asset replaced successfully:",f),f}catch(o){if(v(o)&&i<5){const n=C(b(o),d);return console.error(`Rate limit exceeded while replacing asset. Retrying in ${n}ms...`),await w(n),m()}throw console.error("Error replacing asset:",o),o}}class D{queue=[];activeCount=0;config;processing=!1;completedCount=0;failedCount=0;resolvePromise=null;constructor(e){this.config={...e,concurrency:e.concurrency||3,initialRetryDelay:e.initialRetryDelay||1e3,maxRetryDelay:e.maxRetryDelay||6e4,retryBackoffFactor:e.retryBackoffFactor||2}}addTask(e,s,r){this.queue.push({assetId:e,newImageUrl:s,filename:r,retryCount:0})}async processTask(e){try{await p(e.assetId,e.newImageUrl,this.config.apiToken,this.config.environment,this.config.baseUrl,e.filename,e.retryCount,this.config.initialRetryDelay,this.config.maxRetryDelay,this.config.retryBackoffFactor),this.completedCount++}catch(s){console.error(`Failed to replace asset ${e.assetId} after multiple retries:`,s),this.failedCount++}finally{this.activeCount--,this.processQueue()}}processQueue(){if(this.queue.length===0&&this.activeCount===0&&this.resolvePromise){this.resolvePromise({succeeded:this.completedCount,failed:this.failedCount}),this.resolvePromise=null,this.processing=!1;return}for(;this.queue.length>0&&this.activeCount<(this.config.concurrency||3);){const e=this.queue.shift();e&&(this.activeCount++,this.processTask(e))}}start(){return this.processing?Promise.reject(new Error("Asset replacer is already processing")):(this.processing=!0,this.completedCount=0,this.failedCount=0,new Promise(e=>{this.resolvePromise=e,this.processQueue()}))}getStatus(){return{queued:this.queue.length,active:this.activeCount,completed:this.completedCount,failed:this.failedCount}}}export{D as AssetReplacer,p as default};
@@ -0,0 +1 @@
1
+ @font-face{font-display:auto;font-family:colfax-web;font-style:normal;font-weight:700;src:url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff2"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:italic;font-weight:700;src:url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff2"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:normal;font-weight:500;src:url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff2"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("woff"),url(https://use.typekit.net/af/522c51/00000000000000003b9acde6/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:italic;font-weight:500;src:url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff2"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("woff"),url(https://use.typekit.net/af/4e71b3/00000000000000003b9acde7/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i5&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:normal;font-weight:400;src:url(https://use.typekit.net/af/bac079/00000000000000003b9acde4/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3) format("woff2"),url(https://use.typekit.net/af/bac079/00000000000000003b9acde4/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3) format("woff"),url(https://use.typekit.net/af/bac079/00000000000000003b9acde4/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3) format("opentype")}@font-face{font-display:auto;font-family:colfax-web;font-style:italic;font-weight:400;src:url(https://use.typekit.net/af/c1cc04/00000000000000003b9acde5/27/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3) format("woff2"),url(https://use.typekit.net/af/c1cc04/00000000000000003b9acde5/27/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3) format("woff"),url(https://use.typekit.net/af/c1cc04/00000000000000003b9acde5/27/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3) format("opentype")}html{font-size:16px;height:auto}body,html{margin:0;padding:0}@layer datocms-react-ui{html{scrollbar-color:var(--color--scrollbar--fill) transparent}}._button_nnl9b_1{-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;border-radius:4px;box-sizing:border-box;color:var(--color--ink);cursor:pointer;display:inline-block;font-family:inherit;font-weight:var(--font-weight-bold);line-height:inherit;opacity:1;text-decoration:none;transition:all .3s var(--material-ease);vertical-align:middle;white-space:nowrap}._button_nnl9b_1:focus,._button_nnl9b_1:hover{opacity:.8}._button_nnl9b_1:active{opacity:.7}._disabled_nnl9b_30{cursor:not-allowed}._buttonType-muted_nnl9b_34{background-color:var(--color--primary-soft--surface);color:var(--color--primary-soft--ink)}._buttonType-muted_nnl9b_34._disabled_nnl9b_30{background-color:var(--color--disabled--surface);color:var(--color--disabled--ink)}._buttonType-muted_nnl9b_34._disabled_nnl9b_30:active,._buttonType-muted_nnl9b_34._disabled_nnl9b_30:focus,._buttonType-muted_nnl9b_34._disabled_nnl9b_30:hover{color:var(--color--disabled--ink)}._buttonType-primary_nnl9b_50{background-color:var(--color--primary--surface)}._buttonType-primary_nnl9b_50,._buttonType-primary_nnl9b_50:active,._buttonType-primary_nnl9b_50:focus,._buttonType-primary_nnl9b_50:hover{color:var(--color--primary--ink)}._buttonType-primary_nnl9b_50:hover{background-color:var(--color--primary--surface-hover)}._buttonType-primary_nnl9b_50:active,._buttonType-primary_nnl9b_50:focus{background-color:var(--color--primary--surface-active)}._buttonType-primary_nnl9b_50._disabled_nnl9b_30{background-color:var(--color--disabled--surface);color:var(--color--disabled--ink)}._buttonType-primary_nnl9b_50._disabled_nnl9b_30:active,._buttonType-primary_nnl9b_50._disabled_nnl9b_30:focus,._buttonType-primary_nnl9b_50._disabled_nnl9b_30:hover{color:var(--color--disabled--ink)}._buttonType-negative_nnl9b_80,._buttonType-negative_nnl9b_80:active,._buttonType-negative_nnl9b_80:focus,._buttonType-negative_nnl9b_80:hover{background-color:var(--color--danger--surface);color:var(--color--danger--ink)}._buttonType-negative_nnl9b_80._disabled_nnl9b_30{background-color:var(--color--disabled--surface);color:var(--color--disabled--ink)}._buttonSize-xxs_nnl9b_97{font-size:.9em;padding:.4em .8em}._buttonSize-xs_nnl9b_102{font-size:1em;padding:.6em .8em}._buttonSize-s_nnl9b_107{font-size:1em;padding:.7em 1em}._buttonSize-m_nnl9b_112{font-size:1.1em;padding:.7em 1em}._buttonSize-l_nnl9b_117{font-size:1.2em;padding:.7em 1em}._buttonSize-xl_nnl9b_122{font-size:1.2em;padding:1em}._fullWidth_nnl9b_127{display:block;text-align:center;width:100%}._button__leftIcon_nnl9b_133,._button__rightIcon_nnl9b_134{display:inline-block;line-height:.6;vertical-align:middle}._button__leftIcon_nnl9b_133 svg,._button__rightIcon_nnl9b_134 svg{fill:var(--color--ink-link);color:var(--color--ink-link)}._button__leftIcon_nnl9b_133{margin-right:.5em}._button__leftIcon_nnl9b_133:last-child{margin-right:0}._button__rightIcon_nnl9b_134{margin-left:.5em}._button__rightIcon_nnl9b_134:first-child{margin-left:0}._Button_a50of_1{justify-column:center;align-items:center;-webkit-appearance:none;-moz-appearance:none;background-color:var(--color--surface);border:0;border:1px solid var(--color--border);box-sizing:border-box;color:var(--color--ink);color:var(--color--ink-subtle);cursor:pointer;display:flex;font-family:inherit;font-size:inherit;line-height:inherit;padding:7px 13px}._Button_a50of_1:hover{background-color:var(--color--surface-hover)}._Button_a50of_1 svg{fill:var(--color--ink-subtle);color:var(--color--ink-subtle)}._Button--s_a50of_31{padding:3px 10px}._Button--disabled_a50of_35{color:var(--color--disabled--ink);cursor:not-allowed}._Button--disabled_a50of_35:hover{background:var(--color--surface)}._Button--selected_a50of_44{background-color:var(--color--primary--surface-secondary);color:var(--color--primary--ink)}._Button--selected_a50of_44 svg{fill:var(--color--primary--ink);color:var(--color--primary--ink)}._Button--selected_a50of_44._Button--disabled_a50of_35,._Button--selected_a50of_44:hover{background-color:var(--color--primary--surface-secondary)}._Button_a50of_1:first-child{border-left-width:1px;border-radius:4px 0 0 4px}._Button_a50of_1:last-child{border-radius:0 4px 4px 0}._Group_1b5yn_1{align-items:stretch;background-color:var(--color--surface);display:flex;overflow:hidden}._themeVariables_11af8_1{--base-body-color-rgb-components:52,54,58;--base-body-color:var(--color--ink);--light-body-color-rgb-components:132,132,132;--light-body-color:var(--color--ink-subtle);--placeholder-body-color-rgb-components:198,198,198;--placeholder-body-color:var(--color--ink-placeholder);--light-bg-color-rgb-components:245,245,245;--light-bg-color:var(--color--surface-muted);--lighter-bg-color-rgb-components:248,248,248;--lighter-bg-color:var(--color--surface-muted);--disabled-bg-color-rgb-components:237,237,237;--disabled-bg-color:var(--color--disabled--surface);--border-color-rgb-components:240,240,240;--border-color:var(--color--border);--darker-border-color-rgb-components:215,215,215;--darker-border-color:var(--color--border-hover);--alert-color-rgb-components:255,94,73;--alert-color:var(--color--ink-danger);--warning-color-rgb-components:255,215,0;--warning-color:var(--color--ink-warning);--notice-color-rgb-components:70,215,0;--notice-color:var(--color--ink-success);--warning-bg-color-rgb-components:255,255,229;--warning-bg-color:var(--color--warning-soft--surface);--add-color-rgb-components:76,176,109;--add-color:var(--color--diff-added--surface);--remove-color-rgb-components:235,87,106;--remove-color:var(--color--diff-removed--surface);--base-font-family:"colfax-web","Roboto","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;--monospaced-font-family:"Roboto Mono","Menlo","Bitstream Vera Sans Mono",Consolas,Courier,monospace;--font-weight-bold:500;--spacing-xs:.1875rem;--spacing-s:.375rem;--spacing-m:.75rem;--spacing-l:1.5rem;--spacing-xl:2.25rem;--spacing-xxl:3.75rem;--spacing-xxxl:6rem;--negative-spacing-xs:-.1875rem;--negative-spacing-s:-.375rem;--negative-spacing-m:-.75rem;--negative-spacing-l:-1.5rem;--negative-spacing-xl:-2.25rem;--negative-spacing-xxl:-3.75rem;--negative-spacing-xxxl:-6rem;--font-size-xxs:.6875rem;--font-size-xs:.75rem;--font-size-s:.875rem;--font-size-m:.9375rem;--font-size-l:1.0625rem;--font-size-xl:1.1875rem;--font-size-xxl:1.5625rem;--font-size-xxxl:1.875rem;--material-ease:cubic-bezier(.55,0,.1,1);--inertial-ease:cubic-bezier(.19,1,.22,1)}._canvas_11af8_85{-webkit-text-size-adjust:100%;text-rendering:optimizeLegibility;color:var(--color--ink);font-family:var(--base-font-family);font-size:var(--font-size-m);line-height:1.5}._inspector_4pnoo_1{margin:var(--spacing-l) 0}._panel_4pnoo_5{border-bottom:1px solid var(--color--border)}._panelHandle_4pnoo_9{all:inherit;background:var(--color--surface-muted);border:0;box-sizing:border-box;cursor:pointer;display:block;font-weight:var(--font-weight-bold);padding:5px 10px;width:100%}._panelHandle_4pnoo_9:hover{background:var(--color--surface-hover)}._panelBody_4pnoo_25{border-left:1px solid var(--color--border);border-right:1px solid var(--color--border);padding:20px}._groupDescription_4pnoo_31{font-size:var(--font-size-s);line-height:1.2;margin-bottom:20px}._propertyGroup_4pnoo_37{border:1px solid var(--color--border);border-radius:5px}._propertyOrMethod_4pnoo_42{border-bottom:1px solid var(--color--border);line-height:1.2}._propertyOrMethod_4pnoo_42 p{margin:0}._propertyOrMethodBody_4pnoo_51{padding:15px}._propertyOrMethodExample_4pnoo_55{position:relative}._propertyOrMethodExample_4pnoo_55 pre{background:var(--color--surface-muted);font-size:.8em;margin:0;max-height:240px;overflow:auto;padding:15px}._propertyOrMethodName_4pnoo_68{color:var(--color--ink-subtle);display:block;font-family:var(--monospaced-font-family);font-size:.9em;font-weight:700;margin-bottom:5px;text-decoration:none}._propertyOrMethodName_4pnoo_68:hover{text-decoration:underline}._propertyOrMethodExampleActions_4pnoo_82{background:var(--color--surface);display:flex;padding:15px}._propertyOrMethodExampleActions_4pnoo_82>*{margin-right:10px}._fieldError_kqzsn_1{color:var(--color--ink-danger);font-size:var(--font-size-xs);line-height:1.2;margin-top:var(--spacing-s)}._FieldGroup_uz9ju_1{display:block}._FieldGroup__item_uz9ju_5{display:block;margin-bottom:var(--spacing-l)}._FieldGroup__item_uz9ju_5:last-child{margin-bottom:0}._fieldHint_1q1d1_1{color:var(--color--ink-subtle);font-size:var(--font-size-xs);line-height:1.2;margin-top:var(--spacing-s)}._fieldHint_1q1d1_1 a{color:inherit}._fieldHint_1q1d1_1 a:hover{text-decoration:none}._Form_5qspp_1,._Form__item_5qspp_5{display:block}._Form__item_5qspp_5:last-child{margin-bottom:0}._Form__item--default_5qspp_13{margin-bottom:var(--spacing-l)}._Form__item--condensed_5qspp_17{margin-bottom:var(--spacing-m)}._formLabel_12h4v_1{align-items:center;color:var(--color--ink-subtle);display:flex;margin-bottom:var(--spacing-s)}._formLabel_12h4v_1:hover ._formLabel__code_12h4v_8{opacity:1}._formLabel--error_12h4v_14{color:var(--color--ink-danger)}._formLabel__label_12h4v_18{flex:1}._formLabel__code_12h4v_8{font-family:var(--monospaced-font-family);font-size:.95em;opacity:0;position:absolute;transition:opacity .2s var(--material-ease)}._hotKey_17bh5_1{align-items:center;display:inline-flex;gap:15px}._label_17bh5_7{align-items:center;display:flex}._keys_17bh5_12{align-items:center;display:inline-flex;gap:4px}._hotKeyKey_17bh5_18{background:var(--color--primary-soft--surface);border-radius:3px;padding:5px 8px}._Section_12uz1_1{display:flex;flex-direction:column;gap:var(--spacing-m);position:relative}._Section--highlighted_12uz1_8:before{animation:_pageContentSectionHighligh_12uz1_1 4s ease-in-out .25s forwards;border-radius:4px;box-shadow:0 0 0 4px var(--color--focus--border);content:"";inset:-20px -30px;pointer-events:none;position:absolute;z-index:10}._Section__header_12uz1_22{margin-left:var(--negative-spacing-l);margin-right:var(--negative-spacing-l)}._Section__header--clickable_12uz1_27{cursor:pointer;-webkit-user-select:none;user-select:none}._Section__header--clickable_12uz1_27:hover ._Section__arrow_12uz1_31:before{opacity:.7}._Section__title_12uz1_36{align-items:center;display:flex;gap:var(--spacing-m)}._Section__title_12uz1_36:after,._Section__title_12uz1_36:before{background-color:var(--color--border);content:"";height:1px}._Section__title_12uz1_36:before{width:calc(var(--spacing-l) - var(--spacing-m))}._Section__title_12uz1_36:after{flex:1;margin-right:var(--spacing-l)}._Section__title__content_12uz1_58{align-items:center;display:inline-flex;flex-shrink:0;font-size:var(--font-size-l);font-weight:var(--font-weight-bold)}._Section__arrow_12uz1_31{align-self:stretch;margin-right:.3em;position:relative;width:15px}._Section__arrow_12uz1_31:before{border-bottom:6px solid transparent;border-left:6px solid var(--color--ink);border-top:6px solid transparent;content:"";height:0;left:6px;margin-top:-6px;position:absolute;top:50%;transform-origin:50% 50%;transition:transform .2s ease-out;width:0}._Section__arrow--is-open_12uz1_88:before{transform:rotate(90deg)}@keyframes _pageContentSectionHighligh_12uz1_1{0%{box-shadow:0 0 0 4px var(--color--focus--border),0 0 0 4px var(--color--focus--outline)}15%{box-shadow:0 0 0 4px var(--color--focus--border),0 0 0 80px transparent}75%{box-shadow:0 0 0 4px var(--color--focus--border),0 0 0 80px transparent}to{box-shadow:0 0 0 4px transparent,0 0 0 80px transparent}}._SidebarPanel_a4c7y_1{border-bottom:1px solid var(--color--border)}._SidebarPanel__header_a4c7y_5{align-items:center;-webkit-appearance:none;-moz-appearance:none;background-color:var(--color--surface);background-color:var(--color--surface-muted);border:0;box-sizing:border-box;color:var(--color--ink);cursor:pointer;display:flex;font-family:inherit;font-size:inherit;line-height:inherit;padding:0;text-align:left;-webkit-user-select:none;user-select:none;width:100%}._SidebarPanel__header_a4c7y_5:focus,._SidebarPanel__header_a4c7y_5:hover{background-color:var(--color--surface-hover)}._SidebarPanel__header__title_a4c7y_30{flex:1;font-weight:500;padding:0 20px}._SidebarPanel__header__chevron_a4c7y_36{align-items:center;display:flex;padding:13px 15px}._SidebarPanel__content_a4c7y_42{padding:20px}._SidebarPanel__content--no-padding_a4c7y_46{padding:0}._Spinner--inline_1u42l_1{display:inline-block;position:relative;vertical-align:middle}._Spinner--centered_1u42l_7{left:50%;position:absolute;top:50%}._Spinner__bar_1u42l_13{animation:_Spinner__spin_1u42l_1 1.2s linear infinite;background-color:var(--color--ink-subtle);height:14%;left:-20%;position:absolute;top:0;width:40%}@keyframes _Spinner__spin_1u42l_1{0%{opacity:1}to{opacity:.15}}._switchField__flex_ietsf_1{align-items:center;display:flex}._switchField__switchInput_ietsf_6{width:55px}._switchField__label_ietsf_10{color:var(--color--ink);flex:1;line-height:1.1;line-height:20px;margin-bottom:0;pointer-events:none;-moz-user-select:text;-ms-user-select:text;-webkit-user-select:text;user-select:text}._switchField__below_ietsf_22{margin-left:55px;margin-top:var(--spacing-s)}._switchInput__inner_vh6pt_1{color:var(--color--primary--ink);font-size:12px;left:24px;position:absolute;transition:left .3s cubic-bezier(.35,0,.25,1)}._switchInput_vh6pt_1{background-color:var(--color--ink-muted);border:1px solid var(--color--border);border-radius:20px;box-sizing:border-box;cursor:pointer;display:inline-block;height:22px;line-height:20px;position:relative;transition:all .3s cubic-bezier(.35,0,.25,1);vertical-align:middle;width:44px}._switchInput_vh6pt_1:after{animation-duration:.3s;animation-name:_switchInput__off_vh6pt_1;animation-timing-function:cubic-bezier(.35,0,.25,1);background-color:var(--color--surface);border-radius:50%;box-shadow:var(--shadow--raised);content:" ";cursor:pointer;height:18px;left:2px;position:absolute;top:1px;transform:scale(1);transition:left .3s cubic-bezier(.35,0,.25,1),transform .3s cubic-bezier(.35,0,.25,1);width:18px}._switchInput_vh6pt_1:focus:after,._switchInput_vh6pt_1:hover:after{animation-name:_switchInput__on_vh6pt_1;transform:scale(1.1)}._switchInput__checked_vh6pt_50{background-color:var(--color--primary--surface);border-color:var(--color--primary--surface)}._switchInput__checked_vh6pt_50 ._switchInput__inner_vh6pt_1{left:6px}._switchInput__checked_vh6pt_50:after{left:22px}._switchInput__disabled_vh6pt_63{background:var(--color--disabled--surface);border-color:var(--color--border);cursor:no-drop}._switchInput__disabled_vh6pt_63:after{animation-name:_none_vh6pt_1;background:var(--color--disabled--ink);cursor:no-drop}._switchInput__disabled_vh6pt_63:focus:after,._switchInput__disabled_vh6pt_63:hover:after{animation-name:_none_vh6pt_1;transform:scale(1)}@keyframes _switchInput__on_vh6pt_1{0%{transform:scale(1)}50%{transform:scale(1.25)}to{transform:scale(1.1)}}@keyframes _switchInput__off_vh6pt_1{0%{transform:scale(1.1)}to{transform:scale(1)}}._TextInput_1kqkh_1{appearance:none;background-color:var(--color--surface);background-image:none;border:1px solid var(--color--border);border-radius:0;box-sizing:border-box;color:inherit;display:block;font-family:inherit;font-size:var(--font-size-m);padding:10px;resize:none;transition:border .2s var(--material-ease);width:100%}._TextInput_1kqkh_1::placeholder{color:var(--color--ink-placeholder)}._TextInput_1kqkh_1:hover{border-color:var(--color--border-hover)}._TextInput_1kqkh_1:focus{border-color:var(--color--focus--border);box-shadow:0 0 0 4px var(--color--focus--outline);outline:0}._TextInput--monospaced_1kqkh_32{font-family:var(--monospaced-font-family);font-size:var(--font-size-s)}._TextInput--disabled_1kqkh_37{background:var(--color--disabled--surface);border-color:var(--color--border);color:var(--color--disabled--ink)}._TextInput--error_1kqkh_43,._TextInput--error_1kqkh_43:focus,._TextInput--error_1kqkh_43:hover{border-color:var(--color--danger-soft--border)}._TextInput--error_1kqkh_43:focus{box-shadow:0 0 0 4px var(--color--danger-soft--outline)}._TextareaInput_1xr0a_1{appearance:none;background-color:var(--color--surface);background-image:none;border:1px solid var(--color--border);border-radius:0;box-sizing:border-box;color:inherit;display:block;font-family:inherit;font-size:var(--font-size-m);padding:10px;resize:none;transition:border .2s var(--material-ease);width:100%}._TextareaInput_1xr0a_1::placeholder{color:var(--color--ink-placeholder)}._TextareaInput_1xr0a_1:hover{border-color:var(--color--border-hover)}._TextareaInput_1xr0a_1:focus{border-color:var(--color--focus--border);box-shadow:0 0 0 4px var(--color--focus--outline);outline:0}._TextareaInput--monospaced_1xr0a_32{font-family:var(--monospaced-font-family);font-size:var(--font-size-s)}._TextareaInput--disabled_1xr0a_37{background:var(--color--disabled--surface);border-color:var(--color--border);color:var(--color--disabled--ink)}._TextareaInput--error_1xr0a_43,._TextareaInput--error_1xr0a_43:focus,._TextareaInput--error_1xr0a_43:hover{border-color:var(--color--danger-soft--border)}._TextareaInput--error_1xr0a_43:focus{box-shadow:0 0 0 4px var(--color--danger-soft--outline)}._Button_36kvr_1{align-items:center;-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;border-left:1px solid var(--color--border);border-right:1px solid var(--color--border);box-sizing:border-box;color:var(--color--ink);cursor:pointer;display:flex;font-family:inherit;justify-content:center;line-height:inherit;min-height:49px;padding:0;width:49px}._Button_36kvr_1:focus,._Button_36kvr_1:hover{background-color:var(--color--surface-hover)}._Button_36kvr_1:first-child{border-left:0}._Button_36kvr_1:last-child{border-right:0}@media screen and (min-width:380px){._Button_36kvr_1{min-height:59px;width:59px}._Button_36kvr_1 svg{font-size:20px}}._Stack_1nnzo_1{align-items:center;display:flex;flex:1;flex-direction:row;justify-content:center;padding:10px 15px}._Stack--s_1nnzo_10{padding-bottom:var(--spacing-s);padding-top:var(--spacing-s)}._Stack--l_1nnzo_15{padding-left:var(--spacing-xl);padding-right:var(--spacing-xl)}._Title_1dx5n_1{font-size:var(--font-size-l);font-weight:500;line-height:1.1;margin-right:15px}@media screen and (min-width:380px){._Title_1dx5n_1{font-size:var(--font-size-xl)}}._Toolbar_50246_1{align-items:stretch;border-bottom:1px solid var(--color--border);border-top:1px solid var(--color--border);display:flex;position:relative}._Toolbar_50246_1:first-child{border-top-width:0}._Toolbar_50246_1:last-child{border-bottom-width:0}._tooltip_6pcmg_1{word-wrap:break-word;background:var(--color--tooltip--surface);border-radius:4px;box-shadow:var(--shadow--floating);color:var(--color--tooltip--ink);-webkit-hyphens:auto;hyphens:auto;max-width:400px;overflow-wrap:break-word;padding:10px 15px}._Dropdown_1051c_1{position:relative}._Dropdown__spacer_1051c_5{inset:0;pointer-events:none;position:absolute}._Dropdown__menu__search_1051c_11{border-bottom:1px solid var(--color--border);padding:7px}._Dropdown__menu__search__input_1051c_16{appearance:none;background-color:var(--color--surface);background-image:none;border:1px solid var(--color--border);border-radius:3px;box-sizing:border-box;color:inherit;display:block;font-family:inherit;font-size:.9em;padding:8px;resize:none;transition:border .2s var(--material-ease);width:100%}._Dropdown__menu__search__input_1051c_16::placeholder{color:var(--color--ink-placeholder)}._Dropdown__menu__search__input_1051c_16:hover{border-color:var(--color--border-hover)}._Dropdown__menu__search__input_1051c_16:focus{border-color:var(--color--focus--border);box-shadow:0 0 0 4px var(--color--focus--outline);outline:0}._Dropdown__menu-container_1051c_47{position:fixed;visibility:hidden}._Dropdown__menu_1051c_11{background-color:var(--color--surface-raised);border-radius:4px;box-shadow:var(--shadow--floating);margin-bottom:var(--spacing-xl);margin-top:10px;min-width:200px;padding:1px 0;text-align:initial}._Dropdown__menu__inner_1051c_63{margin:7px 0}._Dropdown__menu__group__title_1051c_67{background-color:var(--color--surface-muted);color:var(--color--ink-subtle);font-size:var(--font-size-xs);padding:5px 15px 3px;text-transform:uppercase}._Dropdown__menu__group__content_1051c_75{margin:8px 0}._Dropdown__menu__text_1051c_79{color:var(--color--ink-subtle);display:block;line-height:1.2;padding:4px 15px;position:relative;text-align:left}._Dropdown__menu__option_1051c_88{align-items:center;color:var(--color--ink);display:flex;padding:4px 15px;position:relative;text-align:left;text-decoration:none;white-space:nowrap}._Dropdown__menu__option_1051c_88:focus,._Dropdown__menu__option_1051c_88:hover{background-color:var(--color--surface-hover)}._Dropdown__menu__option_1051c_88>a{color:inherit;display:block;text-decoration:none}._Dropdown__menu__option--is-selected_1051c_110{background-color:var(--color--selected--surface)}._Dropdown__menu__option--is-disabled_1051c_114{opacity:.5}._Dropdown__menu__option--is-disabled_1051c_114 ._Dropdown__menu__option__content_1051c_117{cursor:not-allowed}._Dropdown__menu__option--is-dangerous_1051c_122:focus,._Dropdown__menu__option--is-dangerous_1051c_122:hover{background-color:var(--color--danger--surface);color:var(--color--danger--ink)}._Dropdown__menu__option--is-dangerous_1051c_122:focus svg,._Dropdown__menu__option--is-dangerous_1051c_122:hover svg{fill:var(--color--danger--ink);color:var(--color--danger--ink)}._Dropdown__menu__option--is-active_1051c_135{font-weight:500}._Dropdown__menu__option--is-active_1051c_135:focus,._Dropdown__menu__option--is-active_1051c_135:hover{background-color:none}._Dropdown__menu__option--is-invalid_1051c_148,._Dropdown__menu__option--is-valid_1051c_144{padding-left:35px}._Dropdown__menu__option--is-invalid_1051c_148:before{background-color:var(--color--danger--surface);border-radius:4px;content:"";font-size:12px;height:8px;left:15px;position:absolute;top:50%;transform:translateY(-50%);width:8px}._Dropdown__menu__option__content_1051c_117{-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;box-sizing:border-box;color:inherit;cursor:pointer;flex:1;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0;text-align:left}._Dropdown__menu__option__content_1051c_117>svg{fill:var(--color--ink-subtle);color:var(--color--ink-subtle);display:inline-block;font-size:13px;padding-right:8px;vertical-align:middle}._Dropdown__menu__option__icons_1051c_191{align-items:center;display:flex;padding-left:15px}._Dropdown__menu__option__icon_1051c_191{-webkit-appearance:none;-moz-appearance:none;background-color:transparent;border:0;box-sizing:border-box;color:var(--color--ink);color:var(--color--ink-subtle);cursor:pointer;display:inline-block;font-family:inherit;font-size:inherit;font-size:13px;line-height:inherit;line-height:10px;opacity:0;padding:3px;position:relative;top:-1px;transition:transform .1s ease-in-out;width:100%;width:auto}._Dropdown__menu__option_1051c_88:focus ._Dropdown__menu__option__icon_1051c_191,._Dropdown__menu__option_1051c_88:hover ._Dropdown__menu__option__icon_1051c_191{opacity:1}._Dropdown__menu__option__icon_1051c_191:focus,._Dropdown__menu__option__icon_1051c_191:hover{transform:scale(1.2)}._Dropdown__menu__option__icon_1051c_191 svg{fill:var(--color--ink-subtle);color:var(--color--ink-subtle)}._Dropdown__menu__option__icon--delete_1051c_239{color:var(--color--danger--ink)}._Dropdown__menu__option__icon--delete_1051c_239 svg{fill:var(--color--danger--ink);color:var(--color--danger--ink)}._Dropdown__menu__separator_1051c_247{background-color:var(--color--border);height:1px;margin:8px 0}._Dropdown__menu_1051c_11{overflow-y:auto}._SplitViewPane_1cl1f_1{height:100%;overflow-y:auto;position:absolute;width:100%}._SplitViewSash_9ds0h_1{align-items:center;background-color:transparent;display:flex;height:100%;justify-content:center;position:absolute;top:0;transition:background-color .2s .15s;width:100%;z-index:2}._SplitViewSash--dragging_9ds0h_15,._SplitViewSash_9ds0h_1:hover{background-color:var(--color--primary-soft--surface)}._SplitViewSash--dragging_9ds0h_15:has(._SplitViewSash__content_9ds0h_19:hover),._SplitViewSash_9ds0h_1:hover:has(._SplitViewSash__content_9ds0h_19:hover){background-color:transparent}._SplitViewSash--no-resize_9ds0h_24{pointer-events:none}._SplitViewSash--vertical_9ds0h_28{cursor:col-resize}._SplitViewSash--horizontal_9ds0h_32{cursor:row-resize}._SplitViewSash__content_9ds0h_19{cursor:pointer;left:50%;padding:15px 0;pointer-events:auto;position:absolute;top:50%;transform:translate(-50%,-50%)}._SplitViewSash__content__button_9ds0h_46{align-items:center;background:var(--color--surface);border:1px solid var(--color--border);border-radius:6px;color:var(--color--ink-subtle);display:flex;font-size:10px;height:20px;justify-content:center;width:20px;z-index:2}._SplitViewSash__content__button_9ds0h_46 svg{fill:currentColor;display:block}._SplitViewSash__content_9ds0h_19:hover ._SplitViewSash__content__button_9ds0h_46{background:var(--color--surface-hover);color:var(--color--ink)}._SplitView_1oi17_1{flex:1;height:100%;position:relative;width:100%}._SplitView--dragging_1oi17_8._SplitView--vertical_1oi17_8{cursor:col-resize}._SplitView--dragging_1oi17_8._SplitView--horizontal_1oi17_12{cursor:row-resize}._SplitView--disable-select_1oi17_16{-webkit-user-select:none;user-select:none}._SplitView--disable-select_1oi17_16 ._SplitViewPane_1oi17_20{pointer-events:none}._VerticalSplitPane__expand_28erb_1{background:var(--color--surface);cursor:pointer;inset:0;position:absolute;transition:all .3s cubic-bezier(.55,0,.1,1)}._VerticalSplitPane__expand_28erb_1:hover{animation:_VerticalSplitPane__expand_28erb_1 .6s cubic-bezier(.55,0,.1,1);background:var(--color--surface-hover)}._VerticalSplitPane__expand_28erb_1._VerticalSplitPane__expand_28erb_1{border-right:1px solid var(--color--border);transform-origin:left}._VerticalSplitPane__expand_28erb_1._VerticalSplitPane__expand--right_28erb_25{border-left:1px solid var(--color--border);transform-origin:right}@keyframes _VerticalSplitPane__expand_28erb_1{0%{transform:scaleX(1)}50%{transform:scaleX(2)}to{transform:scaleX(1)}}._VerticalSplitPaneOverlay_28erb_42{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:var(--color--backdrop--surface);height:100%;inset:0;overflow:hidden;position:absolute;z-index:12}._VerticalSplitPaneOverlay__primary_28erb_55{inset:0;position:absolute;z-index:1}._VerticalSplitPaneOverlay__primary--left_28erb_64{margin-right:20px}._VerticalSplitPaneOverlay__primary--right_28erb_68{margin-left:20px}._VerticalSplitPaneOverlay__secondary_28erb_72{background:var(--color--surface);bottom:0;box-shadow:var(--shadow--ambient);position:absolute;top:0}._VerticalSplitPaneOverlay__secondary--left_28erb_80{left:0}._VerticalSplitPaneOverlay__secondary--right_28erb_84{right:0}._VerticalSplitPaneOverlay__sash_28erb_88{height:100%;position:absolute;top:0}._VerticalSplitPaneOverlay__secondary--left_28erb_80 ._VerticalSplitPaneOverlay__sash_28erb_88{right:0}._VerticalSplitPaneOverlay__secondary--right_28erb_84 ._VerticalSplitPaneOverlay__sash_28erb_88{left:0}:root{--spacing-xs: 4px;--spacing-s: 8px;--spacing-m: 16px;--spacing-l: 24px;--spacing-xl: 32px;--font-size-xxs: 12px;--font-size-xs: 14px;--font-size-s: 16px;--font-size-m: 18px;--font-size-l: 20px;--font-size-xl: 24px}._assetListCard_1a3vu_16{margin-top:var(--spacing-m);border-radius:8px;background-color:var(--color--surface);border:1px solid var(--color--border);box-shadow:var(--shadow--raised);overflow:hidden;position:relative;animation:_fadeIn_1a3vu_1 .3s ease-in-out}@keyframes _fadeIn_1a3vu_1{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}._assetListCard_1a3vu_16:hover{box-shadow:var(--shadow--lifted)}._assetListHeaderTitle_1a3vu_51{display:flex;align-items:center;gap:var(--spacing-s)}._assetListHeaderTitle_1a3vu_51 h3{margin:0;font-size:var(--font-size-m);color:var(--color--ink-link);display:flex;align-items:center;gap:var(--spacing-xs)}._categoryBadge_1a3vu_66{display:flex;align-items:center;justify-content:center;min-width:28px;height:28px;padding:0 var(--spacing-xs);border-radius:14px;font-size:var(--font-size-xs);font-weight:600;color:var(--color--primary--ink);margin-right:var(--spacing-xs)}._badgeGreen_1a3vu_80{background-color:var(--color--success-soft--surface)}._badgeRed_1a3vu_84{background-color:var(--color--danger-soft--surface)}._badgeGray_1a3vu_88{background-color:var(--color--surface-muted)}._badgeBlue_1a3vu_92{background-color:var(--color--primary--surface)}._noAssetsMessage_1a3vu_96{padding:var(--spacing-l);text-align:center;color:var(--color--ink-subtle);font-style:italic}._assetList_1a3vu_16{list-style:none;padding:0;margin:0;max-height:400px;overflow-y:auto}._assetListItem_1a3vu_111{padding:var(--spacing-m);border-bottom:1px solid var(--color--border);transition:background-color .2s ease}._assetListItem_1a3vu_111:last-child{border-bottom:none}._assetListItem_1a3vu_111:hover{background-color:var(--color--primary-soft--surface)}._assetItemContent_1a3vu_125{display:flex;align-items:flex-start;gap:var(--spacing-m)}._assetIcon_1a3vu_131{flex-shrink:0}._fileIconWrapper_1a3vu_135{width:40px;height:40px;display:flex;align-items:center;justify-content:center;background-color:var(--color--primary--surface);color:var(--color--primary--ink);font-size:var(--font-size-xs);font-weight:600;border-radius:4px}._assetDetails_1a3vu_148{flex:1;min-width:0}._assetPath_1a3vu_153{margin:0 0 var(--spacing-xs) 0;font-weight:500;word-break:break-word;line-height:1.4}._optimizationStats_1a3vu_160{display:flex;flex-wrap:wrap;align-items:center;gap:var(--spacing-s);margin-top:var(--spacing-xs)}._sizeInfo_1a3vu_168{display:flex;align-items:center;gap:var(--spacing-xs);flex-wrap:wrap}._sizeBefore_1a3vu_175,._sizeAfter_1a3vu_176{display:flex;align-items:center;gap:4px}._sizeLabel_1a3vu_182{color:var(--color--ink-subtle);font-size:var(--font-size-xs)}._sizeValue_1a3vu_187{font-family:var(--mono-font-family);font-size:var(--font-size-xs)}._sizeBefore_1a3vu_175 ._sizeValue_1a3vu_187{color:var(--color--danger-soft--ink)}._sizeAfter_1a3vu_176 ._sizeValue_1a3vu_187{color:var(--color--success-soft--ink)}._sizeArrow_1a3vu_200{color:var(--color--ink-subtle);margin:0 var(--spacing-xs)}._savingsBadge_1a3vu_205{display:inline-block;padding:4px var(--spacing-s);border-radius:4px;font-size:var(--font-size-xxs);font-weight:600;color:var(--color--primary--ink);margin-left:var(--spacing-xs)}._assetActions_1a3vu_215{display:flex;align-items:center;flex-shrink:0;margin-left:auto}._inspector_1a3vu_222{margin-top:var(--spacing-l)}._container_1a3vu_226{padding:var(--spacing-l);max-width:900px;margin:0 auto}._header_1a3vu_232{margin-bottom:var(--spacing-l);border-bottom:1px solid var(--color--border);padding-bottom:var(--spacing-m)}._headerTitle_1a3vu_238{font-size:28px;margin-bottom:var(--spacing-s);color:var(--color--ink-link)}._description_1a3vu_244{font-size:16px;line-height:1.5;color:var(--color--ink-subtle);max-width:600px}._card_1a3vu_251{background-color:var(--color--surface);border-radius:8px;box-shadow:var(--shadow--raised);padding:var(--spacing-l);margin-bottom:var(--spacing-l);border:1px solid var(--color--border)}._stats_1a3vu_260{display:flex;flex-wrap:wrap;gap:var(--spacing-m);margin-top:var(--spacing-m);margin-bottom:var(--spacing-l)}._statItem_1a3vu_268{flex:1;min-width:120px;background-color:var(--color--surface-muted);border-radius:8px;padding:var(--spacing-m);text-align:center;border:1px solid var(--color--border)}._statValue_1a3vu_278{font-size:24px;font-weight:700;margin-bottom:4px;color:var(--color--ink-link)}._statLabel_1a3vu_285{font-size:14px;color:var(--color--ink-subtle)}._optimizingContainer_1a3vu_290{margin-top:var(--spacing-l);display:flex;flex-direction:column;align-items:center;padding:var(--spacing-l);background-color:var(--color--surface);border-radius:8px;box-shadow:var(--shadow--raised);border:1px solid var(--color--border)}._statusText_1a3vu_302{margin-top:var(--spacing-m);font-weight:500;color:var(--color--ink-link)}._percentageText_1a3vu_308{margin-top:var(--spacing-xs);font-weight:500;color:var(--color--ink-link);font-size:18px}._progressBar_1a3vu_315{width:100%;height:10px;background-color:var(--color--surface-muted);border-radius:5px;margin-top:var(--spacing-m);overflow:hidden;box-shadow:inset 0 0 0 1px var(--color--border);position:relative}._progressBarFill_1a3vu_326{height:100%;background:linear-gradient(to right,var(--color--ink-link),var(--color--focus--outline));transition:width .3s ease;border-radius:5px;position:absolute;top:0;left:0}._resultContainer_1a3vu_340{margin-top:var(--spacing-l);padding:var(--spacing-l);background-color:var(--color--surface);border-radius:8px;box-shadow:var(--shadow--raised);border:1px solid var(--color--border)}._resultTitle_1a3vu_349{font-size:20px;font-weight:500;margin-bottom:var(--spacing-m);color:var(--color--ink-link);display:flex;align-items:center}._resultIcon_1a3vu_358{margin-right:var(--spacing-s);font-size:24px}._logWrapper_1a3vu_363{margin-top:var(--spacing-l);border:1px solid var(--color--border);border-radius:8px;background-color:var(--color--surface-muted);display:flex;flex-direction:column;overflow:hidden}._logHeader_1a3vu_373{display:flex;justify-content:space-between;align-items:center;padding:var(--spacing-m);border-bottom:1px solid var(--color--border);background-color:var(--color--surface-muted);position:sticky;top:0;z-index:10}._logsContainer_1a3vu_385{max-height:300px;overflow-y:auto;padding:0 var(--spacing-m)}._logs_1a3vu_385{font-family:monospace;font-size:12px;white-space:pre-wrap;display:flex;flex-direction:column;padding-top:var(--spacing-s);padding-bottom:var(--spacing-s)}._logEntry_1a3vu_401{font-family:var(--mono-font-family);font-size:var(--font-size-xs);padding:var(--spacing-xs) 0;line-height:1.5;white-space:pre-wrap;word-break:break-word;display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}._logEntry_1a3vu_401 ._sizeComparison_1a3vu_414{display:inline-block;margin-left:var(--spacing-s);font-family:var(--mono-font-family);font-size:var(--font-size-xs);white-space:nowrap}._logEntry_1a3vu_401:nth-child(odd){background-color:var(--color--surface-muted)}._buttonContainer_1a3vu_426{display:flex;justify-content:center;margin-top:var(--spacing-l)}._optimizeButton_1a3vu_432{background-color:var(--color--primary--surface)!important;transition:all .2s ease!important}._optimizeButton_1a3vu_432:hover{transform:translateY(-2px);box-shadow:var(--shadow--lifted)}._infoIcon_1a3vu_442{margin-right:8px;color:var(--color--ink-link);display:inline-flex;align-items:center}._imageIcon_1a3vu_449{width:24px;height:24px;margin-right:8px}._noAssetsMessage_1a3vu_96{text-align:center;padding:var(--spacing-l);color:var(--color--ink-subtle);font-style:italic}._clickable_1a3vu_462{cursor:pointer;transition:transform .2s,box-shadow .2s;border:2px solid transparent}._clickable_1a3vu_462:hover{transform:translateY(-2px);box-shadow:var(--shadow--lifted);border-color:var(--color--focus--border)}._clickable_1a3vu_462:focus{outline:none;border-color:var(--color--focus--border);box-shadow:0 0 0 2px var(--color--focus--outline)}._assetListContainer_1a3vu_482{margin:var(--spacing-l) 0;background-color:var(--color--surface);border-radius:8px;box-shadow:var(--shadow--raised);max-width:600px;margin-left:auto;margin-right:auto;overflow:hidden;border:1px solid var(--color--border)}._assetListHeader_1a3vu_42{display:flex;justify-content:space-between;align-items:center;padding:var(--spacing-m);background-color:var(--color--surface-muted);border-bottom:1px solid var(--color--border)}._assetListTitle_1a3vu_503{margin:0;font-size:var(--font-size-l);color:var(--color--ink-link)}._closeButton_1a3vu_509{background:none;border:none;font-size:var(--font-size-xl);color:var(--color--ink-subtle);cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%}._closeButton_1a3vu_509:hover{background-color:var(--color--border);color:var(--color--ink-link)}._closeButton_1a3vu_509:focus{outline:none;box-shadow:0 0 0 2px var(--color--focus--outline)}._assetList_1a3vu_16{max-height:300px;overflow-y:auto;padding:var(--spacing-m)}._assetItem_1a3vu_125{display:flex;justify-content:space-between;align-items:center;padding:var(--spacing-m);border-bottom:1px solid var(--color--border)}._assetDetails_1a3vu_148{flex:1;min-width:0;margin-right:var(--spacing-m)}._assetPath_1a3vu_153{word-break:break-word;margin-bottom:var(--spacing-xs);font-size:var(--font-size-s)}._sizeComparison_1a3vu_414{display:flex;align-items:center;font-size:var(--font-size-s);flex-wrap:wrap}._assetActions_1a3vu_215{display:flex;gap:var(--spacing-s);align-items:center;flex-shrink:0}._originalSize_1a3vu_574{color:var(--color--danger-soft--ink);font-weight:500}._sizeArrow_1a3vu_200{margin:0 var(--spacing-xs);color:var(--color--ink-subtle)}._optimizedSize_1a3vu_584{color:var(--color--success-soft--ink);font-weight:500}._sizeSavings_1a3vu_589{font-size:var(--font-size-xs);color:var(--color--success-soft--ink);margin-left:var(--spacing-xs)}._assetLink_1a3vu_595{flex-shrink:0;font-size:var(--font-size-s);color:var(--color--ink-link);text-decoration:none;padding:var(--spacing-s) var(--spacing-m);border:1px solid var(--color--focus--border);border-radius:var(--border-radius);transition:background-color .2s,color .2s;font-weight:500;display:inline-block;min-width:100px;text-align:center}._assetLink_1a3vu_595:hover{background-color:var(--color--primary--surface);color:var(--color--primary--ink)}._assetLink_1a3vu_595:focus{outline:none;box-shadow:0 0 0 2px var(--color--focus--outline)}._twoColumnGrid_1a3vu_622{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-l);margin-top:var(--spacing-s);margin-bottom:var(--spacing-m)}@media(max-width:768px){._twoColumnGrid_1a3vu_622{grid-template-columns:1fr}}._settingsContainer_1a3vu_636{width:100%;max-width:800px;box-sizing:border-box}._settingsForm_1a3vu_642{max-width:800px;width:100%;box-sizing:border-box;display:flex;flex-direction:column;gap:var(--spacing-m)}._settingsForm_1a3vu_642 h4{margin-top:var(--spacing-m);margin-bottom:var(--spacing-m);color:var(--color--ink-link);font-size:18px;border-bottom:1px solid var(--color--border);padding-bottom:var(--spacing-xs)}._assetOptimizerTitle_1a3vu_660{font-size:24px;font-weight:500;margin-bottom:var(--spacing-l);color:var(--color--ink-link)}._fieldRow_1a3vu_667{display:flex;flex-wrap:wrap;gap:var(--spacing-m)}._field_1a3vu_667{flex:1;min-width:180px}._formActionContainer_1a3vu_678{margin-top:var(--spacing-l)}._buttonGroup_1a3vu_682{display:flex;flex-direction:column;gap:var(--spacing-m)}@media(min-width:600px){._buttonGroup_1a3vu_682{flex-direction:row;flex-wrap:wrap;justify-content:space-between}._buttonGroup_1a3vu_682>button:first-child{flex:1}._buttonGroup_1a3vu_682>button:nth-child(2){flex:2}._buttonGroup_1a3vu_682>button:last-child{flex:2}}._note_1a3vu_708{padding:var(--spacing-s);background-color:var(--color--surface-muted);border-radius:var(--border-radius);margin-bottom:var(--spacing-m)}._note_1a3vu_708 p{margin:0;color:var(--color--ink);font-size:14px}._startButtonContainer_1a3vu_721{margin-top:var(--spacing-l);width:100%;padding:0;box-sizing:border-box}._startButtonContainer_1a3vu_721 button{width:100%}._resultsContainer_1a3vu_732{margin:var(--spacing-l) 0;padding:var(--spacing-m);background-color:var(--color--surface);border-radius:8px;box-shadow:var(--shadow--raised);border:1px solid var(--color--border)}._optimizationSummaryTitle_1a3vu_741{font-size:24px;margin-bottom:var(--spacing-m);color:var(--color--ink-link);border-bottom:1px solid var(--color--border);padding-bottom:var(--spacing-s)}._statsCardGrid_1a3vu_749{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--spacing-m);margin-bottom:var(--spacing-l)}._statsCard_1a3vu_749{background-color:var(--color--surface);border-radius:8px;padding:var(--spacing-m);text-align:center;border:1px solid var(--color--border);box-shadow:var(--shadow--raised);transition:all .2s ease-in-out}._clickableStatsCard_1a3vu_766{cursor:pointer;position:relative;overflow:hidden}._clickableStatsCard_1a3vu_766:hover{border-color:var(--color--focus--border);transform:translateY(-2px);box-shadow:var(--shadow--lifted)}._clickableStatsCard_1a3vu_766:active{transform:translateY(0);box-shadow:var(--shadow--raised)}._clickableStatsCard_1a3vu_766:after{content:"";position:absolute;bottom:0;left:0;width:100%;height:3px;background-color:var(--color--primary--surface);transform:scaleX(0);transform-origin:right;transition:transform .3s ease-in-out}._clickableStatsCard_1a3vu_766:hover:after{transform:scaleX(1);transform-origin:left}._clickableStatsCard_1a3vu_766:focus-visible{outline:2px solid var(--color--focus--outline);outline-offset:2px}._statsCardTitle_1a3vu_806{margin-top:0;margin-bottom:var(--spacing-xs);font-size:var(--font-size-s);color:var(--color--ink);font-weight:600}._statsCardValue_1a3vu_814{font-size:2.5rem;font-weight:700;margin:var(--spacing-xs) 0}._optimizedValue_1a3vu_820{color:var(--color--success-soft--ink)}._skippedValue_1a3vu_824{color:var(--color--warning-soft--ink)}._failedValue_1a3vu_828{color:var(--color--danger-soft--ink)}._statsCardLabel_1a3vu_832{font-size:var(--font-size-xs);color:var(--color--ink-subtle)}._savingsSummary_1a3vu_837{margin:var(--spacing-m) 0}._savingsCard_1a3vu_841{background-color:var(--color--surface);border:1px solid var(--color--border);border-radius:8px;padding:var(--spacing-m)}._savingsRow_1a3vu_848{display:flex;justify-content:space-between;align-items:center;padding:var(--spacing-xs) 0;border-bottom:1px solid var(--color--border, var(--color--border))}._savingsRow_1a3vu_848:last-child{border-bottom:none}._savingsLabel_1a3vu_860{font-size:14px;color:var(--color--ink-subtle)}._savingsValue_1a3vu_865{font-weight:500;color:var(--color--ink-link);font-size:16px}._actionsContainer_1a3vu_871{margin-top:var(--spacing-l);width:100%}._actionsContainer_1a3vu_871>button{width:100%!important}._infoText_1a3vu_880{font-size:.9rem;color:var(--color--ink-subtle);background-color:var(--color--surface-muted);padding:var(--spacing-m);border-radius:var(--border-radius);margin:var(--spacing-s) 0 var(--spacing-m);line-height:1.4}._infoText_1a3vu_880 strong{color:var(--color--ink-link);font-weight:600}._hintWithDoc_1a3vu_896{display:flex;align-items:center;margin-top:4px;font-size:.8125rem;color:var(--color--ink-subtle);line-height:1.2;border:none;background:transparent;padding:0;text-align:left;cursor:pointer}._plainHint_1a3vu_910{display:flex;align-items:center;margin-top:4px;font-size:.8125rem;color:var(--color--ink-subtle);line-height:1.2;border:none;background:transparent;padding:0;text-align:left}._hintWithDoc_1a3vu_896 ._docLinkIcon_1a3vu_923{display:inline-flex;align-items:center;justify-content:center;margin-left:4px;color:var(--color--ink-subtle);font-size:10px;background-color:transparent;width:14px;height:14px;border-radius:50%;border:1px solid var(--color--border-hover)}._hintWithDoc_1a3vu_896:focus{outline:none}._hintWithDoc_1a3vu_896:focus-visible{box-shadow:0 0 0 2px var(--color--focus--outline)}._docLink_1a3vu_923{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-left:6px;padding:0;border:none;background:transparent;cursor:pointer;vertical-align:middle}._docLink_1a3vu_923 ._docLinkIcon_1a3vu_923{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;background-color:var(--color--primary--surface);color:var(--color--primary--ink);font-size:10px;font-weight:700;transition:background-color .2s ease}._docLink_1a3vu_923:hover ._docLinkIcon_1a3vu_923{background-color:var(--color--primary--surface)}._docLink_1a3vu_923:focus{outline:none}._docLink_1a3vu_923:focus ._docLinkIcon_1a3vu_923{box-shadow:0 0 0 2px var(--color--focus--outline)}._currentAssetPreview_1a3vu_987{display:flex;align-items:center;background-color:var(--color--surface);border-radius:8px;padding:var(--spacing-s);margin-bottom:var(--spacing-m);border:1px solid var(--color--border);box-shadow:var(--shadow--raised)}._assetPreviewImage_1a3vu_998{flex-shrink:0;width:120px;height:80px;border-radius:4px;overflow:hidden;margin-right:var(--spacing-m);background-color:var(--color--surface-muted);position:relative}._assetPreviewImage_1a3vu_998 img{width:100%;height:100%;object-fit:cover}._assetPreviewInfo_1a3vu_1015{flex:1;min-width:0}._assetPreviewTitle_1a3vu_1020{font-size:var(--font-size-s);font-weight:600;color:var(--color--ink-link);margin-bottom:var(--spacing-xs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._assetPreviewMeta_1a3vu_1030{font-size:var(--font-size-xxs);color:var(--color--ink-subtle);display:flex;flex-wrap:wrap;gap:var(--spacing-xs)}._advancedOptionsGroup_1a3vu_1039{margin-top:var(--spacing-l)}._advancedOptionsGroup_1a3vu_1039 h4{color:var(--color--ink-link);margin-bottom:var(--spacing-m);font-size:var(--font-size-m)}._optionsGrid_1a3vu_1049{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-l);margin-bottom:var(--spacing-m)}._optionItem_1a3vu_1056{display:flex;flex-direction:column;gap:var(--spacing-xs)}._paramTooltip_1a3vu_1063{position:relative;display:inline-block}._paramTooltip_1a3vu_1063 ._tooltipText_1a3vu_1068{visibility:hidden;width:auto;min-width:120px;background-color:var(--color--tooltip--surface);color:var(--color--tooltip--ink);text-align:center;border-radius:6px;padding:6px 10px;position:absolute;z-index:1;bottom:125%;left:50%;transform:translate(-50%);opacity:0;transition:opacity .2s,visibility .2s;font-size:var(--font-size-xxs);font-family:var(--mono-font-family, monospace);pointer-events:none;white-space:nowrap}._paramTooltip_1a3vu_1063 ._tooltipText_1a3vu_1068:after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:var(--color--ink) transparent transparent transparent}._paramTooltip_1a3vu_1063:hover ._tooltipText_1a3vu_1068{visibility:visible;opacity:1}._buttonTooltip_1a3vu_1108{position:relative;display:inline-block}._buttonTooltip_1a3vu_1108 ._tooltipText_1a3vu_1068{visibility:hidden;min-width:200px;max-width:300px;background-color:var(--color--tooltip--surface);color:var(--color--tooltip--ink);text-align:center;border-radius:4px;padding:var(--spacing-s) var(--spacing-m);position:absolute;z-index:1;bottom:125%;left:50%;transform:translate(-50%);opacity:0;transition:opacity .3s;font-size:var(--font-size-xs);line-height:1.5;pointer-events:none}._buttonTooltip_1a3vu_1108 ._tooltipText_1a3vu_1068:after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:var(--color--tooltip--surface) transparent transparent transparent}._buttonTooltip_1a3vu_1108:hover ._tooltipText_1a3vu_1068{visibility:visible;opacity:1}._previewInfoBox_1a3vu_1151{width:100%;margin-bottom:var(--spacing-m);padding:var(--spacing-m);background-color:var(--color--surface-muted);border-radius:8px;border:1px solid var(--color--border);display:flex;align-items:center}._previewInfoBox_1a3vu_1151 svg{margin-right:var(--spacing-s);color:var(--color--ink-link);flex-shrink:0}._previewInfoBox_1a3vu_1151 p{margin:0;color:var(--color--ink);font-size:var(--font-size-s);line-height:1.5}