ima2-gen 1.1.8 → 1.1.9

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.
Files changed (230) hide show
  1. package/README.md +56 -27
  2. package/bin/commands/annotate.js +137 -0
  3. package/bin/commands/annotate.ts +118 -0
  4. package/bin/commands/cancel.js +37 -33
  5. package/bin/commands/cancel.ts +45 -0
  6. package/bin/commands/canvas-versions.js +91 -0
  7. package/bin/commands/canvas-versions.ts +80 -0
  8. package/bin/commands/cardnews.js +293 -0
  9. package/bin/commands/cardnews.ts +248 -0
  10. package/bin/commands/comfy.js +63 -0
  11. package/bin/commands/comfy.ts +54 -0
  12. package/bin/commands/config.js +270 -0
  13. package/bin/commands/config.ts +265 -0
  14. package/bin/commands/edit.js +97 -72
  15. package/bin/commands/edit.ts +116 -0
  16. package/bin/commands/gen.js +140 -118
  17. package/bin/commands/gen.ts +176 -0
  18. package/bin/commands/history.js +164 -0
  19. package/bin/commands/history.ts +145 -0
  20. package/bin/commands/ls.js +60 -42
  21. package/bin/commands/ls.ts +60 -0
  22. package/bin/commands/metadata.js +45 -0
  23. package/bin/commands/metadata.ts +36 -0
  24. package/bin/commands/multimode.js +159 -0
  25. package/bin/commands/multimode.ts +146 -0
  26. package/bin/commands/node.js +176 -0
  27. package/bin/commands/node.ts +157 -0
  28. package/bin/commands/observability.js +201 -0
  29. package/bin/commands/observability.ts +176 -0
  30. package/bin/commands/ping.js +26 -20
  31. package/bin/commands/ping.ts +29 -0
  32. package/bin/commands/prompt.js +506 -0
  33. package/bin/commands/prompt.ts +421 -0
  34. package/bin/commands/ps.js +78 -71
  35. package/bin/commands/ps.ts +78 -0
  36. package/bin/commands/session.js +308 -0
  37. package/bin/commands/session.ts +265 -0
  38. package/bin/commands/show.js +75 -40
  39. package/bin/commands/show.ts +69 -0
  40. package/bin/ima2.js +324 -310
  41. package/bin/ima2.ts +444 -0
  42. package/bin/lib/args.js +75 -66
  43. package/bin/lib/args.ts +73 -0
  44. package/bin/lib/browser-id.js +15 -0
  45. package/bin/lib/browser-id.ts +16 -0
  46. package/bin/lib/client.js +91 -83
  47. package/bin/lib/client.ts +109 -0
  48. package/bin/lib/error-hints.js +14 -17
  49. package/bin/lib/error-hints.ts +23 -0
  50. package/bin/lib/files.js +26 -28
  51. package/bin/lib/files.ts +39 -0
  52. package/bin/lib/output.js +44 -42
  53. package/bin/lib/output.ts +58 -0
  54. package/bin/lib/platform.js +60 -56
  55. package/bin/lib/platform.ts +97 -0
  56. package/bin/lib/sse.js +73 -0
  57. package/bin/lib/sse.ts +73 -0
  58. package/bin/lib/star-prompt.js +69 -76
  59. package/bin/lib/star-prompt.ts +97 -0
  60. package/bin/lib/storage-doctor.js +34 -35
  61. package/bin/lib/storage-doctor.ts +38 -0
  62. package/config.js +147 -243
  63. package/config.ts +331 -0
  64. package/docs/API.md +48 -8
  65. package/docs/CLI.md +190 -0
  66. package/docs/FAQ.ko.md +5 -5
  67. package/docs/FAQ.md +5 -5
  68. package/docs/README.ja.md +71 -25
  69. package/docs/README.ko.md +61 -24
  70. package/docs/README.zh-CN.md +73 -27
  71. package/lib/assetLifecycle.js +130 -130
  72. package/lib/assetLifecycle.ts +142 -0
  73. package/lib/canvasVersionStore.js +135 -153
  74. package/lib/canvasVersionStore.ts +181 -0
  75. package/lib/cardNewsGenerator.js +127 -142
  76. package/lib/cardNewsGenerator.ts +162 -0
  77. package/lib/cardNewsJobStore.js +78 -84
  78. package/lib/cardNewsJobStore.ts +107 -0
  79. package/lib/cardNewsManifestStore.js +88 -93
  80. package/lib/cardNewsManifestStore.ts +112 -0
  81. package/lib/cardNewsPlanner.js +157 -152
  82. package/lib/cardNewsPlanner.ts +180 -0
  83. package/lib/cardNewsPlannerClient.js +101 -98
  84. package/lib/cardNewsPlannerClient.ts +114 -0
  85. package/lib/cardNewsPlannerPrompt.js +56 -56
  86. package/lib/cardNewsPlannerPrompt.ts +60 -0
  87. package/lib/cardNewsPlannerSchema.js +231 -223
  88. package/lib/cardNewsPlannerSchema.ts +259 -0
  89. package/lib/cardNewsRoleTemplateStore.js +39 -41
  90. package/lib/cardNewsRoleTemplateStore.ts +47 -0
  91. package/lib/cardNewsTemplateStore.js +171 -175
  92. package/lib/cardNewsTemplateStore.ts +210 -0
  93. package/lib/codexDetect.js +44 -47
  94. package/lib/codexDetect.ts +69 -0
  95. package/lib/comfyBridge.js +164 -184
  96. package/lib/comfyBridge.ts +214 -0
  97. package/lib/db.js +41 -51
  98. package/lib/db.ts +166 -0
  99. package/lib/errorClassify.js +62 -78
  100. package/lib/errorClassify.ts +100 -0
  101. package/lib/generationErrors.js +140 -103
  102. package/lib/generationErrors.ts +125 -0
  103. package/lib/historyList.js +149 -147
  104. package/lib/historyList.ts +164 -0
  105. package/lib/imageMetadata.js +86 -89
  106. package/lib/imageMetadata.ts +111 -0
  107. package/lib/imageMetadataStore.js +46 -51
  108. package/lib/imageMetadataStore.ts +67 -0
  109. package/lib/imageModels.js +38 -45
  110. package/lib/imageModels.ts +52 -0
  111. package/lib/inflight.js +131 -150
  112. package/lib/inflight.ts +204 -0
  113. package/lib/localImportStore.js +87 -93
  114. package/lib/localImportStore.ts +111 -0
  115. package/lib/logger.js +105 -112
  116. package/lib/logger.ts +150 -0
  117. package/lib/nodeStore.js +65 -64
  118. package/lib/nodeStore.ts +81 -0
  119. package/lib/oauthLauncher.js +61 -59
  120. package/lib/oauthLauncher.ts +64 -0
  121. package/lib/oauthNormalize.js +15 -19
  122. package/lib/oauthNormalize.ts +30 -0
  123. package/lib/oauthProxy.js +834 -832
  124. package/lib/oauthProxy.ts +995 -0
  125. package/lib/openDirectory.js +41 -40
  126. package/lib/openDirectory.ts +45 -0
  127. package/lib/pngInfo.js +18 -20
  128. package/lib/pngInfo.ts +26 -0
  129. package/lib/promptImport/curatedSources.js +125 -129
  130. package/lib/promptImport/curatedSources.ts +139 -0
  131. package/lib/promptImport/discoveryRegistry.js +185 -203
  132. package/lib/promptImport/discoveryRegistry.ts +236 -0
  133. package/lib/promptImport/errors.js +10 -10
  134. package/lib/promptImport/errors.ts +18 -0
  135. package/lib/promptImport/githubDiscovery.js +209 -219
  136. package/lib/promptImport/githubDiscovery.ts +248 -0
  137. package/lib/promptImport/githubFolder.js +253 -259
  138. package/lib/promptImport/githubFolder.ts +308 -0
  139. package/lib/promptImport/githubSource.js +189 -200
  140. package/lib/promptImport/githubSource.ts +239 -0
  141. package/lib/promptImport/gptImageHints.js +49 -56
  142. package/lib/promptImport/gptImageHints.ts +68 -0
  143. package/lib/promptImport/parsePromptCandidates.js +108 -123
  144. package/lib/promptImport/parsePromptCandidates.ts +153 -0
  145. package/lib/promptImport/promptIndex.js +190 -208
  146. package/lib/promptImport/promptIndex.ts +248 -0
  147. package/lib/promptImport/rankPromptCandidates.js +46 -43
  148. package/lib/promptImport/rankPromptCandidates.ts +49 -0
  149. package/lib/providerOptions.js +31 -0
  150. package/lib/providerOptions.ts +41 -0
  151. package/lib/referenceImageCompress.js +51 -62
  152. package/lib/referenceImageCompress.ts +75 -0
  153. package/lib/refs.js +93 -81
  154. package/lib/refs.ts +117 -0
  155. package/lib/requestLogger.js +32 -38
  156. package/lib/requestLogger.ts +48 -0
  157. package/lib/responsesImageAdapter.js +351 -0
  158. package/lib/responsesImageAdapter.ts +352 -0
  159. package/lib/runtimePorts.js +71 -73
  160. package/lib/runtimePorts.ts +93 -0
  161. package/lib/sessionStore.js +179 -230
  162. package/lib/sessionStore.ts +272 -0
  163. package/lib/storageMigration.js +247 -245
  164. package/lib/storageMigration.ts +284 -0
  165. package/lib/styleSheet.js +86 -90
  166. package/lib/styleSheet.ts +128 -0
  167. package/lib/systemTrash.js +18 -0
  168. package/lib/systemTrash.ts +20 -0
  169. package/package.json +26 -10
  170. package/routes/annotations.js +76 -79
  171. package/routes/annotations.ts +95 -0
  172. package/routes/canvasVersions.js +50 -54
  173. package/routes/canvasVersions.ts +64 -0
  174. package/routes/cardNews.js +158 -171
  175. package/routes/cardNews.ts +183 -0
  176. package/routes/comfy.js +23 -31
  177. package/routes/comfy.ts +39 -0
  178. package/routes/edit.js +183 -214
  179. package/routes/edit.ts +230 -0
  180. package/routes/generate.js +269 -291
  181. package/routes/generate.ts +309 -0
  182. package/routes/health.js +102 -107
  183. package/routes/health.ts +114 -0
  184. package/routes/history.js +136 -144
  185. package/routes/history.ts +153 -0
  186. package/routes/imageImport.js +27 -27
  187. package/routes/imageImport.ts +33 -0
  188. package/routes/index.js +17 -17
  189. package/routes/index.ts +35 -0
  190. package/routes/metadata.js +60 -64
  191. package/routes/metadata.ts +71 -0
  192. package/routes/multimode.js +228 -263
  193. package/routes/multimode.ts +280 -0
  194. package/routes/nodes.js +378 -424
  195. package/routes/nodes.ts +455 -0
  196. package/routes/promptImport.js +284 -324
  197. package/routes/promptImport.ts +354 -0
  198. package/routes/prompts.js +333 -360
  199. package/routes/prompts.ts +379 -0
  200. package/routes/sessions.js +277 -285
  201. package/routes/sessions.ts +292 -0
  202. package/routes/storage.js +29 -31
  203. package/routes/storage.ts +39 -0
  204. package/server.js +189 -196
  205. package/server.ts +235 -0
  206. package/ui/dist/.vite/manifest.json +101 -0
  207. package/ui/dist/assets/CardNewsWorkspace-BJOCey7Z.js +2 -0
  208. package/ui/dist/assets/NodeCanvas-BZV40eAE.css +1 -0
  209. package/ui/dist/assets/NodeCanvas-C3dzYNsk.js +7 -0
  210. package/ui/dist/assets/PromptImportDialog-Dqu1VpUh.js +2 -0
  211. package/ui/dist/assets/PromptImportDiscoverySection-Dg8T9X0L.js +1 -0
  212. package/ui/dist/assets/PromptImportFolderSection-DBaqsFO4.js +1 -0
  213. package/ui/dist/assets/PromptLibraryPanel-p5QqR97M.js +2 -0
  214. package/ui/dist/assets/SettingsWorkspace-B5bSAZ6u.js +1 -0
  215. package/ui/dist/assets/index-C9cXwiWE.js +25 -0
  216. package/ui/dist/assets/index-CGMIkZXn.css +1 -0
  217. package/ui/dist/assets/index-Cvld7dUZ.js +1 -0
  218. package/ui/dist/index.html +2 -2
  219. package/assets/phase-a-bg-cleanup-test.png +0 -0
  220. package/assets/screenshot.png +0 -0
  221. package/assets/screenshots/classic-generate-light.png +0 -0
  222. package/assets/screenshots/node-graph-branching.png +0 -0
  223. package/assets/screenshots/settings-oauth-generation.png +0 -0
  224. package/assets/screenshots/settings-workspace.png +0 -0
  225. package/assets/screenshots/style-sheet-editor.png +0 -0
  226. package/integrations/comfyui/ima2_gen_bridge/__pycache__/__init__.cpython-313.pyc +0 -0
  227. package/integrations/comfyui/ima2_gen_bridge/__pycache__/nodes.cpython-313.pyc +0 -0
  228. package/ui/dist/assets/index-BDffwmLs.css +0 -1
  229. package/ui/dist/assets/index-D0fdHLkJ.js +0 -31
  230. package/ui/dist/assets/index-D0fdHLkJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.relative{position:relative}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.block{display:block}.hidden{display:none}.inline{display:inline}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.border{border-style:var(--tw-border-style);border-width:1px}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root,:root[data-theme=dark]{--bg:#0a0a0a;--surface:#141414;--surface-2:#1c1c1c;--surface-3:#2a2a2a;--border:#2a2a2a;--border-strong:#444;--text:#e8e8e8;--text-dim:#888;--text-muted:#888;--text-faint:#555;--canvas-muted:#333;--accent:#f0f0f0;--accent-bright:#fff;--accent-soft:#ffffff1a;--accent-ink:#0a0a0a;--accent-shadow:#ffffff1a;--focus-ring:#ffffff14;--hairline:#ffffff29;--hairline-soft:#ffffff0a;--control-bg:#ffffff08;--control-hover:#ffffff14;--scrim:#0009;--scrim-strong:#000000c7;--caption-scrim:#000000d9;--chip-scrim:#000000bf;--on-scrim:#f6f7fb;--shadow-soft:#0006;--shadow-strong:#00000080;--green:#22c55e;--amber:#f59e0b;--red:#ef4444;--blue:#4a9eff;--radius:10px;--font:"Outfit", sans-serif;--mono:"Geist Mono", monospace;color-scheme:dark}:root[data-theme=light]{--bg:#f6f7fb;--surface:#fff;--surface-2:#eef1f7;--surface-3:#e1e7f0;--border:#d9dee6;--border-strong:#b8c1cf;--text:#15181f;--text-dim:#5b6573;--text-muted:#5b6573;--text-faint:#8a94a3;--canvas-muted:#9ba4b1;--accent:#1f2430;--accent-bright:#0f131a;--accent-soft:#0f131a14;--accent-ink:#fff;--accent-shadow:#0f131a29;--focus-ring:#0f131a1f;--hairline:#0f131a29;--hairline-soft:#0f131a12;--control-bg:#0f131a09;--control-hover:#0f131a14;--scrim:#0f131a57;--scrim-strong:#0f131a6b;--caption-scrim:#0f131ac7;--chip-scrim:#0f131ab8;--on-scrim:#f8fafc;--shadow-soft:#1f243024;--shadow-strong:#1f243038;--green:#1a9a6c;--amber:#b65f00;--red:#d23333;--blue:#2563eb;color-scheme:light}:root,:root[data-theme=dark],:root[data-theme-mode=dark][data-theme-family=default]{--canvas-grid:#2a2a2a;--minimap-mask:#0a0a0ab3;--minimap-node-fill:#f0f0f0;--minimap-node-stroke:#1a1a1a;--minimap-bg:#141414;--minimap-border:#2a2a2a}:root[data-theme=light],:root[data-theme-mode=light][data-theme-family=default]{--canvas-grid:#d9dee6;--minimap-mask:#f6f7fbb8;--minimap-node-fill:#1f2430;--minimap-node-stroke:#fff;--minimap-bg:#fff;--minimap-border:#d9dee6}:root[data-theme-mode=dark][data-theme-family=gpt]{--bg:#212121;--surface:#2f2f2f;--surface-2:#383838;--surface-3:#444;--border:#4a4a4a;--border-strong:#5f5f5f;--text:#ececec;--text-dim:#b4b4b4;--text-muted:#9b9b9b;--text-faint:#7a7a7a;--canvas-muted:#5f5f5f;--accent:#fff;--accent-bright:#fff;--accent-soft:#ffffff1a;--accent-ink:#0d0d0d;--accent-shadow:#00000047;--focus-ring:#ffffff2e;--hairline:#ffffff24;--hairline-soft:#ffffff0d;--control-bg:#ffffff0f;--control-hover:#ffffff1a;--scrim:#0009;--scrim-strong:#000000c7;--caption-scrim:#000000d9;--chip-scrim:#000000bf;--on-scrim:#ececec;--shadow-soft:#00000038;--shadow-strong:#0000005c;--green:#22c55e;--amber:#f59e0b;--red:#ef4444;--blue:#4a9eff;--radius:10px;--font:"Söhne", "Inter", system-ui, sans-serif;--mono:"Geist Mono", "SFMono-Regular", monospace;--canvas-grid:#3a3a3a;--minimap-mask:#212121b8;--minimap-node-fill:#ececec;--minimap-node-stroke:#212121;--minimap-bg:#2f2f2f;--minimap-border:#4a4a4a;color-scheme:dark}:root[data-theme-mode=light][data-theme-family=gpt]{--bg:#fff;--surface:#f7f7f8;--surface-2:#ececec;--surface-3:#e3e3e3;--border:#e5e5e5;--border-strong:#ccc;--text:#0d0d0d;--text-dim:#5d5d5d;--text-muted:#737373;--text-faint:#8e8e8e;--canvas-muted:#b0b0b0;--accent:#0d0d0d;--accent-bright:#000;--accent-soft:#0d0d0d0f;--accent-ink:#fff;--accent-shadow:#0d0d0d1f;--focus-ring:#0d0d0d2e;--hairline:#0d0d0d24;--hairline-soft:#0d0d0d0d;--control-bg:#0d0d0d0a;--control-hover:#0d0d0d14;--scrim:#0d0d0d57;--scrim-strong:#0d0d0d75;--caption-scrim:#0d0d0dc7;--chip-scrim:#0d0d0db8;--on-scrim:#fff;--shadow-soft:#0d0d0d0f;--shadow-strong:#0d0d0d24;--green:#1a9a6c;--amber:#b65f00;--red:#d23333;--blue:#2563eb;--radius:10px;--font:"Söhne", "Inter", system-ui, sans-serif;--mono:"Geist Mono", "SFMono-Regular", monospace;--canvas-grid:#e3e3e3;--minimap-mask:#ffffffb8;--minimap-node-fill:#0d0d0d;--minimap-node-stroke:#fff;--minimap-bg:#fff;--minimap-border:#e5e5e5;color-scheme:light}:root[data-theme-mode=dark][data-theme-family=claude]{--bg:#262624;--surface:#2f2e2c;--surface-2:#3a3935;--surface-3:#46443f;--border:#4d4a44;--border-strong:#6c665b;--text:#f2eee6;--text-dim:#cfc7b8;--text-muted:#aaa191;--text-faint:#817869;--canvas-muted:#6c665b;--accent:#cc785c;--accent-bright:#d97757;--accent-soft:#cc785c2e;--accent-ink:#fff;--accent-shadow:#cc785c3d;--focus-ring:#cc785c52;--hairline:#f2eee624;--hairline-soft:#f2eee60d;--control-bg:#f2eee60d;--control-hover:#f2eee61a;--scrim:#0009;--scrim-strong:#000000c7;--caption-scrim:#000000d9;--chip-scrim:#000000bf;--on-scrim:#f2eee6;--shadow-soft:#0000003d;--shadow-strong:#00000061;--green:#5fa66f;--amber:#cc9b4f;--red:#d2654a;--blue:#6b8fa6;--radius:12px;--font:"Anthropic Sans", "Söhne", "Inter", system-ui, sans-serif;--mono:"Geist Mono", "SFMono-Regular", monospace;--canvas-grid:#3a3935;--minimap-mask:#262624b8;--minimap-node-fill:#f2eee6;--minimap-node-stroke:#262624;--minimap-bg:#2f2e2c;--minimap-border:#4d4a44;color-scheme:dark}:root[data-theme-mode=light][data-theme-family=claude]{--bg:#faf9f5;--surface:#fff;--surface-2:#f0eee6;--surface-3:#e7e4d8;--border:#e2dfd2;--border-strong:#c8c2b0;--text:#141413;--text-dim:#52514a;--text-muted:#7a7164;--text-faint:#9a907f;--canvas-muted:#b8b0a0;--accent:#cc785c;--accent-bright:#b85f45;--accent-soft:#cc785c24;--accent-ink:#fff;--accent-shadow:#85523a2e;--focus-ring:#cc785c47;--hairline:#14141324;--hairline-soft:#1414130d;--control-bg:#1414130b;--control-hover:#14141314;--scrim:#14141357;--scrim-strong:#14141375;--caption-scrim:#141413c7;--chip-scrim:#141413b8;--on-scrim:#faf9f5;--shadow-soft:#50412d1a;--shadow-strong:#50412d2e;--green:#1a9a6c;--amber:#b65f00;--red:#d23333;--blue:#2563eb;--radius:12px;--font:"Anthropic Sans", "Söhne", "Inter", system-ui, sans-serif;--mono:"Geist Mono", "SFMono-Regular", monospace;--canvas-grid:#e7e4d8;--minimap-mask:#faf9f5c7;--minimap-node-fill:#141413;--minimap-node-stroke:#fff;--minimap-bg:#fff;--minimap-border:#e2dfd2;color-scheme:light}:root[data-theme-mode=dark][data-theme-family=gemini]{--bg:#101418;--surface:#1b1f24;--surface-2:#232a31;--surface-3:#2d3640;--border:#3b4652;--border-strong:#526171;--text:#e9eef6;--text-dim:#c0c8d2;--text-muted:#9aa6b2;--text-faint:#74808d;--canvas-muted:#526171;--accent:#8ab4f8;--accent-bright:#a8c7fa;--accent-soft:#8ab4f82e;--accent-ink:#062e6f;--accent-shadow:#0b57d040;--focus-ring:#8ab4f852;--hairline:#e9eef624;--hairline-soft:#e9eef60d;--control-bg:#e9eef60f;--control-hover:#e9eef61a;--scrim:#0009;--scrim-strong:#000000c7;--caption-scrim:#000000d9;--chip-scrim:#000000bf;--on-scrim:#e9eef6;--shadow-soft:#00000042;--shadow-strong:#0000006b;--green:#4ade80;--amber:#fbbf24;--red:#f87171;--blue:#60a5fa;--radius:22px;--font:"Google Sans", "Google Sans Text", "Inter", system-ui, sans-serif;--mono:"Roboto Mono", "Geist Mono", monospace;--accent-gradient:linear-gradient(135deg, #4285f4 0%, #9168c0 52%, #d96570 100%);--canvas-grid:#2d3640;--minimap-mask:#101418b8;--minimap-node-fill:#e9eef6;--minimap-node-stroke:#101418;--minimap-bg:#1b1f24;--minimap-border:#3b4652;color-scheme:dark}:root[data-theme-mode=light][data-theme-family=gemini]{--bg:#f0f4f8;--surface:#fff;--surface-2:#e8edf3;--surface-3:#dde3ec;--border:#d5deea;--border-strong:#b8c5d6;--text:#1f1f1f;--text-dim:#475569;--text-muted:#64748b;--text-faint:#94a3b8;--canvas-muted:#94a3b8;--accent:#0b57d0;--accent-bright:#0842a0;--accent-soft:#0b57d01a;--accent-ink:#fff;--accent-shadow:#0b57d02e;--focus-ring:#0b57d047;--hairline:#1f1f1f24;--hairline-soft:#1f1f1f0d;--control-bg:#0b57d00d;--control-hover:#0b57d01a;--scrim:#1f1f1f57;--scrim-strong:#1f1f1f75;--caption-scrim:#1f1f1fc7;--chip-scrim:#1f1f1fb8;--on-scrim:#f0f4f8;--shadow-soft:#3c40431a;--shadow-strong:#3c404333;--green:#1a9a6c;--amber:#b65f00;--red:#d23333;--blue:#0b57d0;--radius:22px;--font:"Google Sans", "Google Sans Text", "Inter", system-ui, sans-serif;--mono:"Roboto Mono", "Geist Mono", monospace;--accent-gradient:linear-gradient(135deg, #4285f4 0%, #9168c0 52%, #d96570 100%);--canvas-grid:#dde3ec;--minimap-mask:#f0f4f8c7;--minimap-node-fill:#1f1f1f;--minimap-node-stroke:#fff;--minimap-bg:#fff;--minimap-border:#d5deea;color-scheme:light}:root[data-theme-mode=dark][data-theme-family=grok]{--bg:#050505;--surface:#0d0d0d;--surface-2:#161616;--surface-3:#1f1f1f;--border:#262626;--border-strong:#404040;--text:#fafafa;--text-dim:#b8b8b8;--text-muted:#8a8a8a;--text-faint:#5a5a5a;--canvas-muted:#5a5a5a;--accent:#fff;--accent-bright:#fff;--accent-soft:#ffffff1a;--accent-ink:#050505;--accent-shadow:#00000073;--focus-ring:#ffffff38;--hairline:#ffffff24;--hairline-soft:#ffffff0d;--control-bg:#ffffff0d;--control-hover:#ffffff1a;--scrim:#000000a8;--scrim-strong:#000000d1;--caption-scrim:#000000e0;--chip-scrim:#000000c7;--on-scrim:#fafafa;--shadow-soft:#0000008c;--shadow-strong:#000000bf;--green:#22c55e;--amber:#f59e0b;--red:#ef4444;--blue:#4a9eff;--radius:9999px;--font:"universalSans", "Inter", "Roboto", "Open Sans", system-ui, sans-serif;--mono:"Geist Mono", "SFMono-Regular", monospace;--canvas-grid:#1f1f1f;--minimap-mask:#050505c7;--minimap-node-fill:#fafafa;--minimap-node-stroke:#050505;--minimap-bg:#0d0d0d;--minimap-border:#262626;color-scheme:dark}:root[data-theme-mode=light][data-theme-family=grok]{--bg:#fcfcfc;--surface:#fff;--surface-2:#f4f4f4;--surface-3:#e9e9e9;--border:#e3e3e3;--border-strong:#c4c4c4;--text:#050505;--text-dim:#5a5a5a;--text-muted:#7a7a7a;--text-faint:#a0a0a0;--canvas-muted:#a0a0a0;--accent:#050505;--accent-bright:#000;--accent-soft:#0505050f;--accent-ink:#fff;--accent-shadow:#0505052e;--focus-ring:#05050538;--hairline:#05050524;--hairline-soft:#0505050d;--control-bg:#0505050a;--control-hover:#05050514;--scrim:#05050557;--scrim-strong:#05050575;--caption-scrim:#050505c7;--chip-scrim:#050505b8;--on-scrim:#fcfcfc;--shadow-soft:#0505050f;--shadow-strong:#05050524;--green:#1a9a6c;--amber:#b65f00;--red:#d23333;--blue:#2563eb;--radius:9999px;--font:"universalSans", "Inter", "Roboto", "Open Sans", system-ui, sans-serif;--mono:"Geist Mono", "SFMono-Regular", monospace;--canvas-grid:#e9e9e9;--minimap-mask:#fcfcfcc7;--minimap-node-fill:#050505;--minimap-node-stroke:#fff;--minimap-bg:#fff;--minimap-border:#e3e3e3;color-scheme:light}body{font-family:var(--font);background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;min-height:100dvh}.app{--gallery-rail-w:clamp(61px, 6vw, 95px);--history-strip-h:74px;grid-template-columns:260px var(--gallery-rail-w) minmax(0,1fr) auto;height:100dvh;display:grid;overflow:hidden}.app--history-horizontal{grid-template-columns:260px minmax(0,1fr) auto;grid-template-rows:var(--history-strip-h) minmax(0,1fr)}.app--history-horizontal .sidebar{grid-area:1/1/span 2}.app--history-horizontal .history-strip{grid-area:1/2}.app--history-horizontal .canvas,.app--history-horizontal .node-canvas,.app--history-horizontal .card-news-workspace,.app--history-horizontal .settings-workspace{height:calc(100dvh - var(--history-strip-h));grid-area:2/2;min-height:0}.app--history-horizontal .right-panel{grid-area:1/3/span 2}.app--history-horizontal .settings-shell{height:calc(100dvh - var(--history-strip-h) - 48px)}.app--history-sidebar{grid-template-columns:260px minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr) var(--history-strip-h)}.app--history-sidebar .sidebar{grid-area:1/1;height:auto}.app--history-sidebar .history-strip{grid-area:2/1}.app--history-sidebar .canvas,.app--history-sidebar .node-canvas,.app--history-sidebar .card-news-workspace,.app--history-sidebar .settings-workspace{grid-area:1/2/span 2}.app--history-sidebar .right-panel{grid-area:1/3/span 2}.sidebar{background:var(--surface);border-right:1px solid var(--border);flex-direction:column;height:100dvh;min-height:0;display:flex;overflow:hidden}.sidebar__scroll{flex-direction:column;flex:auto;gap:14px;min-height:0;padding:20px 16px 12px;display:flex;overflow-y:auto}.logo{align-items:center;gap:9px;min-width:0;display:flex}.logo-copy{flex:auto;min-width:0}.logo-actions{flex:none;align-items:center;gap:8px;margin-left:auto;display:inline-flex}.logo-title{color:var(--text);letter-spacing:-.04em;font-size:18px;font-weight:650;line-height:1.05}.logo-subtitle{color:var(--text-dim);font-family:var(--mono);letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;margin-top:4px;font-size:10px;font-weight:500;overflow:hidden}.lang-toggle{border:1px solid var(--hairline);background:var(--control-bg);border-radius:6px;flex:none;gap:2px;margin-left:auto;display:inline-flex;overflow:hidden}.lang-toggle__btn{letter-spacing:.08em;color:var(--text-dim);cursor:pointer;background:0 0;border:none;align-items:center;gap:4px;padding:3px 8px;font-size:11px;font-weight:500;transition:background .12s,color .12s,box-shadow .12s;display:inline-flex}.lang-toggle__btn:hover{color:var(--accent-bright);background:var(--control-hover)}.lang-toggle__btn.is-active{color:var(--accent-bright);background:var(--accent-soft);box-shadow:inset 0 0 0 1px var(--hairline)}.lang-toggle__label{font-family:var(--mono)}.logo-mark{border:1px solid var(--hairline);opacity:.9;border-radius:999px;flex:none;width:12px;height:18px;position:relative}.theme-toggle{flex-direction:column;gap:8px;min-width:220px;display:flex}.theme-toggle__row{justify-content:space-between;align-items:center;gap:12px;display:flex}.theme-toggle__label{font-family:var(--mono);letter-spacing:.04em;text-transform:uppercase;color:var(--text-muted);font-size:10px;font-weight:500}.theme-toggle__family{flex:none;position:relative}.theme-toggle__family-trigger{border:1px solid var(--border);background:var(--surface-2);color:var(--text);cursor:pointer;font-family:var(--font,"Outfit", sans-serif);border-radius:6px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;transition:background .14s,border-color .14s;display:inline-flex}.theme-toggle__family-trigger:hover{background:var(--control-hover);border-color:var(--border-strong)}.theme-toggle__family-trigger[aria-expanded=true]{border-color:var(--accent);background:var(--control-hover)}.theme-toggle__family-caret{color:var(--text-dim);font-size:9px}.theme-toggle__family-dot{border:1px solid var(--border-strong);background:linear-gradient(135deg,var(--theme-toggle-dot-light,#fff) 0 50%,var(--theme-toggle-dot-dark,#111) 50% 100%);border-radius:999px;flex:none;width:14px;height:14px}.theme-toggle__family-dot--default{--theme-toggle-dot-light:#f0f0f0;--theme-toggle-dot-dark:#1a1a1a}.theme-toggle__family-dot--gpt{--theme-toggle-dot-light:#f7f7f8;--theme-toggle-dot-dark:#212121}.theme-toggle__family-dot--claude{--theme-toggle-dot-light:#faf9f5;--theme-toggle-dot-dark:#cc785c}.theme-toggle__family-dot--gemini{--theme-toggle-dot-light:#f0f4f8;--theme-toggle-dot-dark:#0b57d0}.theme-toggle__family-dot--grok{--theme-toggle-dot-light:#fcfcfc;--theme-toggle-dot-dark:#050505}.theme-toggle__family-menu{z-index:30;background:var(--surface);border:1px solid var(--border);min-width:160px;box-shadow:0 8px 24px var(--shadow-soft);border-radius:8px;flex-direction:column;gap:2px;margin:0;padding:4px;list-style:none;display:flex;position:absolute;top:calc(100% + 4px);right:0}.theme-toggle__family-option{width:100%;color:var(--text);cursor:pointer;font-family:var(--font,"Outfit", sans-serif);text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:6px 8px;font-size:12px;transition:background .14s;display:inline-flex}.theme-toggle__family-option:hover{background:var(--control-hover)}.theme-toggle__family-option.is-active{background:var(--accent-soft);color:var(--text)}.theme-toggle__mode{background:var(--surface-2);border:1px solid var(--border);border-radius:8px;grid-template-columns:repeat(3,1fr);gap:3px;padding:3px;display:grid}.theme-toggle__btn{min-width:0;color:var(--text-dim);cursor:pointer;font-family:var(--mono);letter-spacing:.03em;background:0 0;border:0;border-radius:6px;padding:6px 8px;font-size:10px;font-weight:500;transition:background .14s,color .14s,transform .14s}.theme-toggle__btn:hover{color:var(--text);background:var(--control-hover)}.theme-toggle__btn:active{transform:translateY(1px)}.theme-toggle__btn.is-active{background:var(--accent-bright);color:var(--accent-ink)}.history-layout-toggle{background:var(--surface-2);border:1px solid var(--border);border-radius:8px;grid-template-columns:repeat(3,minmax(62px,1fr));gap:3px;padding:3px;display:grid}.history-layout-toggle__btn{min-width:0;color:var(--text-dim);cursor:pointer;font-family:var(--mono);letter-spacing:.03em;background:0 0;border:0;border-radius:6px;padding:6px 10px;font-size:10px;font-weight:500;transition:background .14s,color .14s,transform .14s}.history-layout-toggle__btn:hover{color:var(--text);background:var(--control-hover)}.history-layout-toggle__btn:active{transform:translateY(1px)}.history-layout-toggle__btn.is-active{background:var(--accent-bright);color:var(--accent-ink)}.web-search-toggle{border:1px solid var(--border);background:var(--control-bg);min-width:0;min-height:0;color:var(--text-dim);cursor:pointer;font-family:var(--mono);letter-spacing:.02em;border-radius:6px;padding:0 14px;font-size:11px;font-weight:600;transition:background .14s,color .14s,border-color .14s}.web-search-toggle--label{min-width:104px;min-height:36px}.web-search-toggle--compact{flex:none;justify-content:center;align-items:center;width:28px;height:28px;padding:0;display:inline-flex}.web-search-toggle:hover{color:var(--text);background:var(--control-hover)}.web-search-toggle.is-active{color:var(--accent-ink);border-color:var(--accent-bright);background:var(--accent-bright)}.logo-mark:after{content:"";background:var(--accent-bright);opacity:.72;border-radius:999px;width:4px;height:4px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.settings-button{border:1px solid var(--hairline);width:32px;height:32px;color:var(--text-dim);background:var(--control-bg);cursor:pointer;border-radius:9px;flex:none;justify-content:center;align-items:center;transition:background .14s,color .14s,transform .14s;display:inline-flex}.settings-button svg{fill:currentColor;width:17px;height:17px}.settings-button:hover,.settings-button.is-active{color:var(--accent-bright);background:var(--control-hover)}.settings-button:active{transform:translateY(1px)}.billing-bar{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius);font-family:var(--mono);flex-direction:column;gap:4px;padding:10px 12px;font-size:12px;display:flex}.billing-bar .label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;font-size:10px}.billing-bar .value{font-size:13px;font-weight:600}.section-title{text-transform:uppercase;letter-spacing:1px;color:var(--text-dim);margin-top:4px;font-size:11px;font-weight:500}.prompt-area{resize:vertical;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);width:100%;min-height:80px;max-height:200px;color:var(--text);font-family:var(--font);outline:none;padding:14px;font-size:14px;transition:border-color .2s}.prompt-area:focus-visible{border-color:var(--accent);box-shadow:0 0 0 2px var(--focus-ring)}.prompt-area:focus:not(:focus-visible){border-color:var(--border-strong)}.prompt-area::placeholder{color:var(--text-faint)}.option-group{flex-direction:column;gap:4px;display:flex}.option-help{color:var(--text-muted);margin:2px 0 8px;font-size:11px;line-height:1.45}.option-row{gap:4px;display:flex}.option-btn{background:var(--bg);border:1px solid var(--border);min-width:0;color:var(--text-dim);font-family:var(--mono);cursor:pointer;text-align:center;text-overflow:ellipsis;border-radius:6px;flex:1;padding:6px 4px;font-size:11px;line-height:1.3;transition:all .15s;overflow:hidden}.option-btn:hover{border-color:var(--border-strong);color:var(--text)}.option-btn.active{border-color:var(--accent);color:var(--accent-bright);background:var(--accent-soft)}.size-picker{gap:6px}.size-picker__quick-row,.size-picker__slot-row{margin-top:4px}.size-picker__slot{border-style:dashed}.size-picker__ratio-row{grid-template-columns:repeat(4,minmax(0,1fr));gap:4px;margin-top:8px;display:grid}.size-picker__ratio,.size-picker__replace,.count-picker__step,.size-picker__save{border:1px solid var(--border);background:var(--bg);color:var(--text-dim);font-family:var(--mono);cursor:pointer;border-radius:6px;font-size:11px}.size-picker__ratio{min-width:0;padding:6px 4px}.size-picker__ratio:hover,.size-picker__replace:hover,.count-picker__step:hover,.size-picker__save:hover{border-color:var(--border-strong);color:var(--text)}.size-picker__ratio.active,.size-picker__replace.active{border-color:var(--accent);color:var(--accent-bright);background:var(--accent-soft)}.size-picker__preview{border:1px solid var(--border);min-height:22px;color:var(--text-dim);font-family:var(--mono);border-radius:6px;justify-content:space-between;gap:8px;padding:6px 8px;font-size:11px;display:flex}.size-picker__preview strong{color:var(--text);font-weight:600}.size-picker__preview--reason{min-height:24px;display:block}.size-picker__preview--detail{border-color:var(--accent);background:var(--accent-soft);min-height:0;color:var(--text);white-space:normal;line-height:1.35;display:block}.size-picker__replace-row{color:var(--text-dim);grid-template-columns:1fr;gap:4px;font-size:11px;display:grid}.size-picker__replace{padding:6px 4px}.size-picker__save{width:100%;color:var(--accent-bright);padding:8px}.count-picker__custom{grid-template-columns:34px minmax(0,1fr) 34px;gap:4px;display:grid}.count-picker__step{min-height:34px;font-size:14px}.count-picker__input{background:var(--bg);border:1px solid var(--border);min-width:0;color:var(--text);font-family:var(--mono);text-align:center;border-radius:6px;outline:none;padding:8px;font-size:12px}.multimode-toggle__button{border:1px solid var(--border);background:var(--bg);width:100%;min-height:42px;color:var(--text-dim);font-family:var(--mono);cursor:pointer;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;font-size:11px;display:flex}.multimode-toggle__button span:first-child{color:var(--text);font-weight:600}.multimode-toggle__button:hover{border-color:var(--border-strong)}.multimode-toggle__button.active{border-color:var(--accent);background:var(--accent-soft)}.multimode-toggle__button:disabled{cursor:not-allowed;opacity:.55}.cost-estimate{font-family:var(--mono);color:var(--text-dim);justify-content:space-between;padding:8px 0;font-size:12px;display:flex}.cost-estimate .price{color:var(--green);font-weight:500}.generate-btn{background:var(--accent-bright);width:100%;color:var(--accent-ink);border-radius:var(--radius);font-family:var(--font);cursor:pointer;letter-spacing:-.3px;box-shadow:0 10px 28px var(--accent-shadow);border:none;padding:14px;font-size:15px;font-weight:600;transition:all .15s}.generate-btn:hover{background:var(--accent-bright);box-shadow:0 14px 36px var(--accent-shadow);transform:translateY(-1px)}.generate-btn:active{transform:translateY(1px)}.generate-btn:disabled{opacity:.3;cursor:not-allowed;transform:none}.generate-btn.loading{background:var(--surface-2);color:var(--text-dim);border:1px solid var(--border);box-shadow:none}.generate-btn.loading:before{content:none}@keyframes spin{to{transform:rotate(360deg)}}.canvas{justify-content:center;align-items:center;height:100dvh;padding:24px 24px 16px;display:flex;position:relative;overflow:auto}.app--settings-open .right-panel{opacity:.58}.settings-workspace{background:radial-gradient(circle at 14% 12%,var(--accent-soft),transparent 34%),linear-gradient(135deg,var(--bg),var(--surface-2));height:100dvh;padding:24px;overflow:hidden}.settings-shell{border:1px solid var(--border);background:var(--surface);border-radius:22px;flex-direction:column;height:calc(100dvh - 48px);min-height:0;display:flex}@supports (color:color-mix(in lab,red,red)){.settings-shell{background:color-mix(in srgb,var(--surface) 88%,transparent)}}.settings-shell{box-shadow:0 24px 80px var(--shadow-soft);overflow:hidden}.settings-header{border-bottom:1px solid var(--border);flex:none;justify-content:space-between;gap:24px;padding:22px 24px;display:flex}.settings-header h2{color:var(--text);letter-spacing:-.06em;font-size:clamp(30px,4vw,48px);font-weight:760;line-height:.98}.settings-header p{max-width:620px;color:var(--text-dim);margin-top:10px;line-height:1.55}.settings-eyebrow{color:var(--text-faint);font-family:var(--mono);letter-spacing:.12em;text-transform:uppercase;margin-bottom:8px;font-size:11px}.settings-close{border:1px solid var(--border);width:40px;height:40px;color:var(--text);background:var(--surface-2);cursor:pointer;font-family:var(--mono);border-radius:999px;font-size:13px;transition:background .14s,transform .14s}.settings-close:hover{background:var(--control-hover)}.settings-close:active{transform:scale(.96)}.settings-layout{flex:auto;grid-template-columns:168px minmax(0,1fr);gap:0;min-height:0;display:grid}.settings-nav{border-right:1px solid var(--border);min-height:0;padding:18px;overflow-y:auto}.settings-nav--mobile{display:none}.settings-nav__item{width:100%;color:var(--text-dim);cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;border-radius:14px;flex-direction:column;align-items:flex-start;gap:4px;padding:14px;transition:background .14s,border-color .14s,color .14s;display:flex}.settings-nav__item span{color:inherit;font-size:14px;font-weight:680}.settings-nav__item small{color:var(--text-faint);font-family:var(--mono);font-size:10px}.settings-nav__item:hover,.settings-nav__item.is-active{color:var(--text);border-color:var(--hairline);background:var(--control-bg)}.settings-content{align-content:start;gap:28px;min-height:0;padding:22px 28px 36px;display:grid;overflow-y:auto}.settings-section{scroll-margin-top:24px}.settings-section__header{justify-content:space-between;gap:16px;padding-bottom:10px;display:flex}.settings-section__header h3{color:var(--text);letter-spacing:-.035em;font-size:18px;font-weight:720}.settings-section__header p{color:var(--text-faint);font-family:var(--mono);margin-top:4px;font-size:11px}.settings-section__body{gap:10px;max-width:760px;display:grid}.settings-row{border:1px solid var(--border);background:var(--surface);border-radius:16px;grid-template-columns:minmax(0,1fr) auto;justify-content:space-between;align-items:center;gap:18px;padding:16px 18px;display:grid}.settings-row__copy{min-width:0}.settings-row__control{justify-content:flex-end;display:flex}.settings-row h4,.settings-note h4{color:var(--text);letter-spacing:-.035em;font-size:15px;font-weight:680}.settings-row p,.settings-note p{max-width:540px;color:var(--text-dim);margin-top:6px;line-height:1.5}.settings-note{border:1px dashed var(--border);background:var(--control-bg);border-radius:16px;padding:16px 18px}.settings-status{border:1px solid var(--border);color:var(--text-dim);background:var(--surface-2);font-family:var(--mono);border-radius:999px;flex:none;align-items:center;gap:8px;padding:8px 10px;font-size:11px;display:inline-flex}.settings-status span{background:var(--amber);border-radius:999px;width:7px;height:7px}.settings-status.is-ok span{background:var(--green)}.settings-status.is-muted span{background:var(--text-faint)}.image-model-select--sidebar{font-family:var(--mono);align-items:center;font-size:11px;display:inline-flex;position:relative}.image-model-select__trigger{min-width:34px;height:28px;color:var(--text-dim);font:inherit;letter-spacing:.01em;cursor:pointer;background:0 0;border:0;padding:0}.image-model-select__trigger:hover,.image-model-select__trigger:focus-visible{color:var(--accent-bright)}.image-model-select--settings select{color:inherit;font:inherit;background:0 0;border:0;outline:none}.image-model-select__menu{z-index:40;border:1px solid var(--border);background:var(--surface);border-radius:14px;min-width:150px;padding:6px;position:absolute;top:calc(100% + 7px);right:0;box-shadow:0 14px 38px #00000052}.image-model-select__item{width:100%;color:var(--text-dim);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:10px;grid-template-columns:36px 1fr;align-items:center;gap:8px;padding:8px 9px;display:grid}.image-model-select__item:hover,.image-model-select__item.is-active{color:var(--text);background:var(--control-hover)}.image-model-select__item small{color:var(--text-faint);font-family:var(--font);font-size:11px}.image-model-select--settings select{border:1px solid var(--border);min-width:190px;color:var(--text);background:var(--surface-2);border-radius:14px;padding:10px 12px}.settings-row__microcopy{color:var(--text-faint);margin-top:6px;font-size:12px}.right-panel{background:var(--surface);border-left:1px solid var(--border);flex-direction:column;width:266px;height:100dvh;transition:width .18s;display:flex;position:relative}.right-panel.collapsed{width:20px}.right-panel-body{flex-direction:column;flex:1;gap:10px;padding:16px 12px;display:flex;overflow-y:auto}.right-panel.collapsed .right-panel-body{display:none}.right-panel-toggle{background:var(--surface-2);border:1px solid var(--border);width:20px;height:40px;color:var(--text-dim);cursor:pointer;z-index:2;border-right:none;border-radius:6px 0 0 6px;justify-content:center;align-items:center;font-size:11px;display:flex;position:absolute;top:50%;left:-14px;transform:translateY(-50%)}.right-panel-toggle:hover{color:var(--text)}.right-panel-tabs{border:1px solid var(--border);background:var(--surface-2);border-radius:8px;grid-template-columns:1fr 1fr;gap:4px;padding:3px;display:grid}.right-panel-tabs__button{min-width:0;min-height:30px;color:var(--text-dim);font-family:var(--mono);cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;border-radius:6px;padding:6px 8px;font-size:11px;font-weight:700;overflow:hidden}.right-panel-tabs__button:hover,.right-panel-tabs__button:focus-visible{color:var(--text)}.right-panel-tabs__button.active{background:var(--control-bg);color:var(--text);box-shadow:0 1px 0 var(--hairline)}.right-panel-settings{flex-direction:column;gap:10px;display:flex}@media(prefers-reduced-motion:reduce){.right-panel{transition:none}}.canvas-empty{text-align:center;color:var(--canvas-muted);letter-spacing:-2px;-webkit-user-select:none;user-select:none;font-size:48px;font-weight:700}.canvas-empty span{color:var(--canvas-muted);letter-spacing:0;margin-top:12px;font-size:14px;font-weight:400;display:block}.canvas__blank-entry{width:min(340px,100vw - 48px);color:var(--text);text-align:center;flex-direction:column;align-items:center;gap:14px;display:flex}.canvas__blank-sheet{aspect-ratio:1;border:1px solid var(--border-strong);width:min(160px,44vw)}@supports (color:color-mix(in lab,red,red)){.canvas__blank-sheet{border:1px solid color-mix(in srgb,var(--border-strong) 42%,transparent)}}.canvas__blank-sheet{box-shadow:0 18px 48px var(--shadow-soft),inset 0 0 0 1px #ffffffe0;background:linear-gradient(#fff,#f8fafc),#fff;border-radius:4px}.canvas__blank-copy{flex-direction:column;gap:5px;display:flex}.canvas__blank-copy strong{font-size:16px;font-weight:700;line-height:1.2}.canvas__blank-copy span{color:var(--text-dim);font-size:13px;line-height:1.45}.canvas__blank-button{border:1px solid var(--border-strong);background:var(--accent);min-height:40px;color:var(--accent-ink);font:inherit;cursor:pointer;border-radius:8px;padding:0 16px;font-size:13px;font-weight:700;transition:background .15s,border-color .15s,opacity .15s}.canvas__blank-button:hover:not(:disabled){background:var(--accent-bright)}.canvas__blank-button:disabled{cursor:wait;opacity:.6}.result-container{flex-direction:column;align-items:center;gap:10px;max-width:100%;max-height:100%;display:none}.result-container.visible{display:flex}.result-container:focus,.result-container:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.result-img{max-width:100%;max-height:calc(100dvh - 260px);box-shadow:0 20px 60px var(--shadow-strong);object-fit:contain;cursor:pointer;border-radius:12px}.result-prompt{background:var(--surface);border:1px solid var(--border);max-width:600px;font-family:var(--mono);color:var(--text-dim);cursor:pointer;word-break:break-word;text-align:center;border-radius:8px;padding:10px 16px;font-size:12px;line-height:1.5;transition:all .15s}.result-prompt:hover{border-color:var(--border-strong);color:var(--text)}.result-meta{font-family:var(--mono);color:var(--text-dim);text-align:center;overflow-wrap:anywhere;max-width:min(100%,720px);font-size:12px;line-height:1.45}.result-actions{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.multimode-sequence{flex-direction:column;gap:12px;width:min(100%,1120px);max-height:calc(100dvh - 120px);display:flex}.multimode-sequence__header{color:var(--text);font-family:var(--mono);justify-content:space-between;align-items:center;gap:12px;display:flex}.multimode-sequence__title{font-size:13px;font-weight:700}.multimode-sequence__meta{color:var(--text-dim);margin-top:3px;font-size:11px}.multimode-sequence__grid{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;min-height:280px;display:grid;overflow:auto}.multimode-sequence__grid.count-1{grid-template-columns:minmax(0,1fr)}.multimode-sequence__slot{aspect-ratio:1;border:1px solid var(--border);background:var(--surface);border-radius:8px;place-items:center;min-height:180px;transition:border-color .12s,transform .12s,box-shadow .12s;display:grid;position:relative;overflow:hidden}.multimode-sequence__slot[role=button]{cursor:pointer}.multimode-sequence__slot[role=button]:hover{border-color:var(--accent,#2563eb);transform:translateY(-1px)}.multimode-sequence__slot[role=button]:focus-visible{outline:2px solid var(--accent,#2563eb);outline-offset:2px}.multimode-sequence__slot.active{border-color:var(--accent,#2563eb);box-shadow:0 0 0 2px var(--accent,#2563eb)}.multimode-sequence__slot img{object-fit:contain;width:100%;height:100%}.multimode-sequence__badge{z-index:1;background:var(--surface);border:1px solid var(--border);color:var(--text);font-family:var(--mono);border-radius:5px;padding:4px 6px;font-size:10px;position:absolute;top:8px;left:8px}.multimode-sequence__empty{color:var(--text-dim);font-family:var(--mono);text-align:center;font-size:12px}.action-btn{background:var(--surface);border:1px solid var(--border);color:var(--text);font-family:var(--mono);cursor:pointer;border-radius:8px;padding:8px 16px;font-size:12px;transition:all .15s}.action-btn:hover{border-color:var(--border-strong);background:var(--surface-2)}.action-btn--danger{border-color:var(--red)}@supports (color:color-mix(in lab,red,red)){.action-btn--danger{border-color:color-mix(in srgb,var(--red) 55%,var(--border))}}.action-btn--danger{color:var(--red)}.action-btn--danger:hover{border-color:var(--red);background:var(--red)}@supports (color:color-mix(in lab,red,red)){.action-btn--danger:hover{background:color-mix(in srgb,var(--red) 12%,var(--surface))}}.result-actions__more{position:relative}.result-actions__more summary{list-style:none;display:block}.result-actions__more summary::-webkit-details-marker{display:none}.result-actions__more[open] summary{border-color:var(--border-strong)}.result-actions__more[open] .result-actions__menu{display:grid}.result-actions__menu{z-index:20;border:1px solid var(--border);background:var(--surface);min-width:190px;box-shadow:0 12px 26px var(--shadow-soft);border-radius:8px;gap:2px;padding:4px;display:none;position:absolute;top:calc(100% + 6px);right:0}.result-actions__menu-item{color:var(--text);font-family:var(--mono);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;padding:9px 12px;font-size:12px}.result-actions__menu-item:hover{background:var(--surface-2)}.result-actions__menu-item:disabled{cursor:progress;opacity:.6}.result-actions__danger-item{color:var(--red)}.result-actions__danger-item:hover{background:var(--red)}@supports (color:color-mix(in lab,red,red)){.result-actions__danger-item:hover{background:color-mix(in srgb,var(--red) 12%,var(--surface))}}.secondary-btn{border:1px solid var(--border);background:var(--bg);color:var(--text);font-family:var(--mono);cursor:pointer;border-radius:6px;padding:8px 10px;font-size:11px}.secondary-btn:hover{border-color:var(--border-strong);background:var(--surface-2)}.progress-bar{background:var(--border);opacity:0;height:2px;transition:opacity .3s;position:absolute;top:0;left:0;right:0;overflow:hidden}.progress-bar.active{opacity:1}.progress-bar:after{content:"";background:var(--accent-bright);width:40%;height:100%;animation:1.2s ease-in-out infinite progress-slide;position:absolute;top:0;left:-40%}@keyframes progress-slide{0%{left:-40%}to{left:100%}}.history-strip{overscroll-behavior-block:contain;border-right:1px solid var(--border);background:var(--surface);flex-direction:column;flex:none;gap:6px;min-width:0;min-height:0;padding:10px;display:flex;overflow:hidden auto}.history-strip--horizontal{overscroll-behavior-inline:contain;border-right:none;border-bottom:1px solid var(--border);flex-direction:row;padding:10px 12px;overflow:auto hidden}.history-strip--sidebar{overscroll-behavior-inline:contain;border-top:1px solid var(--border);border-right:1px solid var(--border);border-bottom:none;flex-direction:row;padding:10px 16px;overflow:auto hidden}.history-strip::-webkit-scrollbar{width:4px}.history-strip--horizontal::-webkit-scrollbar{width:auto;height:4px}.history-strip--sidebar::-webkit-scrollbar{width:auto;height:4px}.history-strip::-webkit-scrollbar-track{background:0 0}.history-strip::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.history-thumb{aspect-ratio:1;object-fit:cover;cursor:pointer;opacity:.6;border:2px solid #0000;border-radius:6px;flex-shrink:0;width:100%;min-height:52px;max-height:84px;transition:all .15s}.history-strip--horizontal .history-thumb{width:52px;height:52px;min-height:52px;max-height:none}.history-strip--sidebar .history-thumb{width:48px;height:48px;min-height:48px;max-height:none}.history-thumb:hover{opacity:1}.history-thumb.active{border-color:var(--accent);opacity:1}.history-thumb--add{background:var(--surface-2);color:var(--text-dim);border:1px solid var(--border);opacity:1;z-index:2;box-shadow:0 6px 8px -6px var(--shadow-strong);flex:none;justify-content:center;align-items:center;display:flex;position:sticky;top:0}.history-strip--horizontal .history-thumb--add,.history-strip--sidebar .history-thumb--add{box-shadow:6px 0 8px -6px var(--shadow-strong);top:auto;left:0}.history-thumb--add:hover{color:var(--accent);border-color:var(--accent)}.composer{border-radius:var(--radius);border:1px solid var(--border);background:var(--surface);flex-direction:column;gap:8px;padding:10px;transition:border-color .15s,background .15s;display:flex;position:relative}.composer--drag{border-color:var(--accent);background:var(--control-bg)}.composer--direct{border-color:var(--green)}@supports (color:color-mix(in lab,red,red)){.composer--direct{border-color:color-mix(in srgb,var(--green) 64%,var(--border))}}.composer--direct{background:linear-gradient(180deg,var(--green),transparent 72%),var(--surface)}@supports (color:color-mix(in lab,red,red)){.composer--direct{background:linear-gradient(180deg,color-mix(in srgb,var(--green) 13%,transparent),transparent 72%),var(--surface)}}.composer--direct{box-shadow:inset 0 0 0 1px var(--green)}@supports (color:color-mix(in lab,red,red)){.composer--direct{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--green) 20%,transparent)}}.composer--multimode{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.composer--multimode{border-color:color-mix(in srgb,var(--accent) 72%,var(--amber))}}.composer--multimode{background:linear-gradient(180deg,var(--accent-soft),transparent 84%),var(--surface)}@supports (color:color-mix(in lab,red,red)){.composer--multimode{background:linear-gradient(180deg,color-mix(in srgb,var(--accent-soft) 62%,transparent),transparent 84%),var(--surface)}}.composer--multimode{box-shadow:inset 0 0 0 1px var(--accent)}@supports (color:color-mix(in lab,red,red)){.composer--multimode{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 22%,transparent)}}.composer--multimode .composer__textarea{color:var(--text)}.composer--multimode .composer__textarea::placeholder{color:var(--text-muted)}.composer__header{justify-content:space-between;align-items:center;gap:8px;display:flex}.composer__label{margin:0}.composer__header-meta{justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:inline-flex}.composer__mode-badge{border:1px solid var(--accent);align-items:center;max-width:170px;min-height:22px;padding:3px 7px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.composer__mode-badge{border:1px solid color-mix(in srgb,var(--accent) 52%,var(--border))}}.composer__mode-badge{background:var(--accent-soft);border-radius:999px}@supports (color:color-mix(in lab,red,red)){.composer__mode-badge{background:color-mix(in srgb,var(--accent-soft) 72%,var(--surface))}}.composer__mode-badge{color:var(--accent-bright);font-family:var(--mono);white-space:nowrap;text-overflow:ellipsis;font-size:10px;font-weight:700;line-height:1.2;overflow:hidden}.composer__direct-badge{border:1px solid var(--green);align-items:center;max-width:150px;min-height:22px;padding:3px 7px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.composer__direct-badge{border:1px solid color-mix(in srgb,var(--green) 58%,var(--border))}}.composer__direct-badge{background:var(--green);border-radius:999px}@supports (color:color-mix(in lab,red,red)){.composer__direct-badge{background:color-mix(in srgb,var(--green) 14%,var(--surface))}}.composer__direct-badge{color:var(--green);font-family:var(--mono);white-space:nowrap;text-overflow:ellipsis;font-size:10px;font-weight:800;line-height:1.2;overflow:hidden}.composer__count{font-family:var(--mono);color:var(--text-dim);font-size:11px}.composer__chips{flex-wrap:wrap;gap:6px;display:flex}.composer__chip{border:1px solid var(--border);background:var(--bg);border-radius:8px;flex-shrink:0;width:44px;height:44px;position:relative;overflow:hidden}.composer__chip img{object-fit:cover;width:100%;height:100%;display:block}.composer__chip-remove{background:var(--chip-scrim);color:#fff;cursor:pointer;opacity:0;border:none;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;padding:0;font-size:9px;line-height:1;transition:opacity .12s;display:flex;position:absolute;top:2px;right:2px}.composer__chip:hover .composer__chip-remove{opacity:1}.composer__chip-remove:hover,.composer__chip-remove:focus-visible{background:var(--red);opacity:1}.composer__prompt-chips{flex-direction:column;gap:6px;display:flex}.composer__prompt-chip{border:1px solid var(--border);background:var(--surface-2);min-height:32px;color:var(--text);border-radius:8px;grid-template-columns:18px minmax(0,1fr) 22px;align-items:center;gap:6px;padding:4px 5px 4px 8px;display:grid}.composer__prompt-chip-plus{border:1px solid var(--accent);background:var(--accent-soft);width:18px;height:18px;color:var(--text);border-radius:5px;justify-content:center;align-items:center;font-size:14px;line-height:1;display:inline-flex}.composer__prompt-chip-title{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.composer__prompt-chip-remove{width:22px;height:22px;color:var(--text-dim);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:0;font-size:13px;line-height:1}.composer__prompt-chip-remove:hover,.composer__prompt-chip-remove:focus-visible{background:var(--red);color:#fff}.composer__textarea{resize:none;background:0 0;border:none;min-height:80px;max-height:218px;padding:4px 2px;line-height:1.5;overflow-y:auto}.composer__textarea:focus,.composer__textarea:focus-visible{box-shadow:none;border:none}.composer__toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.composer__tool{font-family:var(--mono);color:var(--text-dim);background:var(--surface-2);border:1px solid var(--border);cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:5px 10px;font-size:11px;transition:border-color .12s,color .12s;display:inline-flex}.composer__tool:hover:not(:disabled),.composer__tool:focus-visible{border-color:var(--accent);color:var(--text)}.composer__tool--on{border-color:var(--green)}@supports (color:color-mix(in lab,red,red)){.composer__tool--on{border-color:color-mix(in srgb,var(--green) 72%,var(--border))}}.composer__tool--on{background:var(--green)}@supports (color:color-mix(in lab,red,red)){.composer__tool--on{background:color-mix(in srgb,var(--green) 13%,var(--surface-2))}}.composer__tool--on{color:var(--green)}.composer__tool:disabled{opacity:.4;cursor:not-allowed}.composer__tool svg{flex-shrink:0}.composer__hint{font-family:var(--mono);color:var(--text-dim);opacity:.7;margin-left:auto;font-size:10px}.composer__dropzone{border-radius:var(--radius);background:var(--control-bg);border:2px dashed var(--accent);font-family:var(--mono);color:var(--accent-bright);pointer-events:none;z-index:5;justify-content:center;align-items:center;font-size:12px;display:flex;position:absolute;inset:0}.gallery-backdrop{background:var(--scrim-strong);z-index:110;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);justify-content:center;align-items:center;animation:.15s ease-out fadeIn;display:flex;position:fixed;inset:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.gallery{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);width:min(1280px,94vw);height:min(860px,90vh);box-shadow:0 20px 60px var(--shadow-strong);flex-direction:column;display:flex;overflow:hidden}.gallery__header{border-bottom:1px solid var(--border);background:var(--surface);grid-template-columns:1fr minmax(200px,360px) auto;align-items:center;gap:12px;padding:14px 18px;display:grid}.gallery__title-row{align-items:baseline;gap:10px;display:flex}.gallery__title{letter-spacing:-.01em;font-size:16px;font-weight:600}.gallery__meta{font-family:var(--mono);color:var(--text-dim);font-size:11px}.gallery__search{background:var(--surface-2);border:1px solid var(--border);color:var(--text);border-radius:6px;outline:none;padding:7px 10px;font-size:13px;transition:border-color .12s}.gallery__search:focus-visible{border-color:var(--accent);box-shadow:0 0 0 2px var(--focus-ring)}.gallery__search:focus:not(:focus-visible){border-color:var(--accent)}.gallery__close{border:1px solid var(--border);color:var(--text);cursor:pointer;background:0 0;border-radius:6px;justify-content:center;align-items:center;width:32px;height:32px;font-size:14px;display:flex}.gallery__close:hover{border-color:var(--accent);color:var(--accent)}.gallery__storage-bar{border-bottom:1px solid var(--hairline-soft);background:var(--surface);justify-content:space-between;align-items:center;gap:14px;min-height:38px;padding:8px 18px;display:flex}.gallery__storage-bar--notice{background:linear-gradient(135deg,var(--accent),transparent 58%),var(--surface)}@supports (color:color-mix(in lab,red,red)){.gallery__storage-bar--notice{background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 10%,transparent),transparent 58%),var(--surface)}}.gallery__storage-copy{min-width:0;color:var(--text-dim);font-size:12px;line-height:1.45}.gallery__storage-copy--quiet{font-family:var(--mono);font-size:11px}.gallery__storage-title{color:var(--text);margin-bottom:2px;font-size:12px;font-weight:700}.gallery__storage-text{max-width:860px}.gallery__storage-actions{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.gallery__storage-button{border:1px solid var(--border);background:var(--surface-2);color:var(--text);cursor:pointer;border-radius:999px;padding:5px 10px;font-size:12px;font-weight:600}.gallery__storage-button:hover{border-color:var(--accent);color:var(--accent)}.gallery__storage-button--ghost{color:var(--text-dim);background:0 0}.gallery__scroll{flex:1;padding:8px 0 16px;overflow-y:auto}.gallery__group{padding:8px 18px 4px}.gallery__group-header{background:var(--surface);z-index:1;border-bottom:1px solid var(--hairline-soft);align-items:baseline;gap:8px;padding:10px 0 8px;display:flex;position:sticky;top:0}.gallery__group-label{color:var(--text);text-transform:uppercase;letter-spacing:.06em;font-size:12px;font-weight:600}.gallery__group-count{font-family:var(--mono);color:var(--text-dim);font-size:11px}.gallery__grid{grid-template-columns:repeat(auto-fill,minmax(170px,1fr));align-content:start;gap:10px;padding:10px 0 4px;display:grid}.gallery__tile{background:var(--surface-2);cursor:pointer;aspect-ratio:1;border:2px solid #0000;border-radius:8px;padding:0;transition:transform .12s,border-color .12s;position:relative;overflow:hidden}.gallery__tile:hover{border-color:var(--border-strong);transform:translateY(-1px)}.gallery__tile img{object-fit:cover;width:100%;height:100%;display:block}.gallery__tile--active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.gallery__caption{background:linear-gradient(to top,var(--caption-scrim) 30%,transparent);color:#fff;text-align:left;opacity:0;pointer-events:none;padding:18px 8px 6px;font-size:11px;line-height:1.3;transition:opacity .15s;position:absolute;bottom:0;left:0;right:0}.gallery__caption small{color:#ffffffb8;margin-bottom:2px;font-size:9px;display:block}.gallery__tile:hover .gallery__caption{opacity:1}.gallery__caption-text{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.gallery__empty{text-align:center;color:var(--text-dim);padding:80px 20px;font-size:14px}.gallery__tile-wrap{position:relative}.gallery__delete{background:var(--chip-scrim);color:#fff;cursor:pointer;opacity:0;z-index:2;border:none;border-radius:50%;width:24px;height:24px;font-size:13px;line-height:1;transition:opacity .15s,background .15s;position:absolute;top:6px;right:6px}.gallery__tile-wrap:hover .gallery__delete{opacity:1}.gallery__delete:hover{background:var(--red)}.gallery__favorite-filter,.gallery__group-toggle{background:var(--surface);border:1px solid var(--border);border-radius:8px;gap:4px;margin-left:auto;padding:2px;display:inline-flex}.gallery__favorite-filter{margin-left:0}.gallery__favorite-filter button,.gallery__group-toggle button{color:var(--text-dim);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px}.gallery__favorite-filter button.active,.gallery__group-toggle button.active{background:var(--accent);color:var(--accent-ink)}.gallery__undo{background:var(--surface);border:1px solid var(--border);box-shadow:0 4px 16px var(--shadow-soft);z-index:10;border-radius:8px;align-items:center;gap:12px;padding:8px 14px;font-size:13px;display:flex;position:absolute;bottom:16px;left:50%;transform:translate(-50%)}.gallery__undo button{background:var(--accent);color:var(--accent-ink);cursor:pointer;border:none;border-radius:4px;padding:4px 10px;font-size:12px;font-weight:600}.gallery__undo-timer{color:var(--text-dim);font-variant-numeric:tabular-nums;font-size:11px}.toast{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);font-family:var(--mono);color:var(--text);opacity:0;z-index:100;padding:12px 20px;font-size:13px;transition:all .3s;position:fixed;bottom:24px;right:24px;transform:translateY(100px)}.toast.visible{opacity:1;transform:translateY(0)}.toast.error{border-color:var(--red);color:var(--red)}.trash-undo-toast{z-index:101;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);max-width:min(420px,100vw - 48px);color:var(--text);font-family:var(--mono);box-shadow:0 12px 28px var(--shadow-soft);align-items:center;gap:12px;padding:10px 14px;font-size:12px;display:flex;position:fixed;bottom:74px;right:24px}.trash-undo-toast button{background:var(--accent);color:var(--accent-ink);font-family:var(--mono);cursor:pointer;border:none;border-radius:6px;padding:5px 10px;font-size:12px}.trash-undo-toast__timer{color:var(--text-dim);font-variant-numeric:tabular-nums}.custom-size-input{background:var(--bg);border:1px solid var(--border);min-width:0;color:var(--text);font-family:var(--mono);text-align:center;border-radius:8px;outline:none;flex:1;padding:8px;font-size:12px}.size-hint{font-family:var(--mono);color:var(--text-dim);font-size:10px}.oauth-status{font-family:var(--mono);color:var(--text-dim);padding:4px 0;font-size:11px}.provider-row{gap:8px;display:flex}.provider-pill{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);cursor:pointer;flex:1;align-items:center;gap:8px;padding:8px 10px;font-size:12px;transition:border-color .15s,background .15s;display:flex}.provider-pill:hover{border-color:var(--border-strong)}.provider-pill.selected{border-color:var(--accent);background:var(--surface-3)}.status-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px;display:inline-block}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.status-dot--ok{background:var(--green);box-shadow:0 0 6px var(--green)}.status-dot--bad{background:var(--red);box-shadow:0 0 6px var(--red)}.modal-backdrop{background:var(--scrim);z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);width:min(440px,90vw);box-shadow:0 20px 40px var(--shadow-strong);padding:20px 22px}.modal__title{color:var(--text);margin-bottom:10px;font-size:15px;font-weight:600}.modal__body p{color:var(--text);margin:0 0 8px;font-size:13px;line-height:1.5}.modal__hint{color:var(--text-dim);font-family:var(--mono);font-size:12px}.modal__actions{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.modal__btn{background:var(--accent);color:var(--accent-ink);cursor:pointer;border:none;border-radius:6px;padding:8px 16px;font-size:13px;font-weight:600}.modal__btn:hover{background:var(--accent-bright)}.modal__btn--secondary{background:var(--surface-2);color:var(--text);border:1px solid var(--border)}.modal__btn--secondary:hover{background:var(--surface-3)}.metadata-restore-backdrop{z-index:240}.metadata-restore{width:min(560px,92vw)}.metadata-restore__body{gap:12px;display:grid}.metadata-restore__preview{grid-template-columns:120px minmax(0,1fr);align-items:start;gap:14px;display:grid}.metadata-restore__preview img{aspect-ratio:1;object-fit:cover;border:1px solid var(--border);background:var(--surface-2);border-radius:6px;width:120px}.metadata-restore__details{gap:8px;min-width:0;display:grid}.metadata-restore__details div{grid-template-columns:76px minmax(0,1fr);align-items:baseline;gap:8px;font-size:12px;display:grid}.metadata-restore__details span{color:var(--text-dim)}.metadata-restore__details strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.custom-size-confirm-backdrop{z-index:230}.size-confirm__pairs{font-family:var(--mono);gap:8px;margin:12px 0;display:grid}.size-confirm__pair{border:1px solid var(--border);background:var(--bg);border-radius:6px;justify-content:space-between;gap:12px;padding:8px 10px;display:flex}.size-confirm__pair dt{color:var(--text-dim)}.size-confirm__pair dd{color:var(--text);margin:0}.size-confirm__reason{color:var(--text-dim);font-size:12px;line-height:1.45}.option-sub{color:var(--text-dim);font-size:10px;line-height:1.1}@media(max-width:800px){.app{grid-template-rows:auto auto 1fr;grid-template-columns:1fr;height:auto;overflow:visible}.app--history-horizontal .sidebar,.app--history-horizontal .history-strip,.app--history-horizontal .canvas,.app--history-horizontal .node-canvas,.app--history-horizontal .card-news-workspace,.app--history-horizontal .settings-workspace,.app--history-horizontal .right-panel,.app--history-sidebar .sidebar,.app--history-sidebar .history-strip,.app--history-sidebar .canvas,.app--history-sidebar .node-canvas,.app--history-sidebar .card-news-workspace,.app--history-sidebar .settings-workspace,.app--history-sidebar .right-panel{grid-area:auto}.sidebar{border-right:none;border-bottom:1px solid var(--border);height:auto;max-height:50dvh}.sidebar__scroll{padding:12px}.composer__textarea{min-height:96px}.history-strip{overscroll-behavior-inline:contain;border-right:none;border-bottom:1px solid var(--border);flex-direction:row;padding:10px 12px;overflow:auto hidden}.history-strip::-webkit-scrollbar{width:auto;height:4px}.history-thumb{width:48px;height:48px;min-height:48px;max-height:none}.history-thumb--add{box-shadow:6px 0 8px -6px var(--shadow-strong);top:auto;left:0}.canvas{height:auto;min-height:50dvh;padding:20px}.settings-workspace{height:100dvh;min-height:0;padding:12px}.settings-shell{border-radius:16px;height:calc(100dvh - 24px);min-height:0}.settings-header{padding:20px}.settings-layout{grid-template-columns:1fr}.settings-nav{z-index:10;border-right:none;border-bottom:1px solid var(--border);background:var(--surface);flex:none;gap:8px;display:flex;overflow:auto hidden}@supports (color:color-mix(in lab,red,red)){.settings-nav{background:color-mix(in srgb,var(--surface) 94%,transparent)}}.settings-nav--mobile{display:block}.settings-layout>.settings-nav:not(.settings-nav--mobile){display:none}.settings-nav--mobile select{border:1px solid var(--border);width:100%;min-height:44px;color:var(--text);background:var(--surface-2);font:inherit;border-radius:12px;padding:0 12px}.settings-nav__item{min-width:120px}.settings-content{min-height:0;padding:16px}.settings-row{grid-template-columns:1fr;align-items:flex-start}.settings-row__control{justify-content:flex-start}.right-panel{z-index:50;width:min(320px,85vw);height:100dvh;box-shadow:-4px 0 24px var(--shadow-soft);transition:transform .22s;position:fixed;top:0;right:0;transform:translate(100%)}.right-panel.drawer-open{transform:translate(0)}.right-panel.collapsed{width:min(320px,85vw)}.right-panel-toggle{border:1px solid var(--border);z-index:60;border-radius:8px;width:40px;height:40px;position:fixed;top:12px;left:auto;right:12px;transform:none}.right-panel-backdrop{pointer-events:none;z-index:40;background:0 0;position:fixed;inset:0}@keyframes drawer-fade{0%{opacity:0}to{opacity:1}}}.ui-mode-switch{background:var(--surface-2);border-radius:8px;gap:4px;margin:8px 0;padding:4px;display:flex}.ui-mode-switch__tab{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;padding:6px 10px;font-size:12px}.ui-mode-switch__tab.active{background:var(--accent-bright);color:var(--accent-ink);font-weight:600}.sidebar__node-hint{background:var(--surface-2);color:var(--text-muted);border-radius:8px;margin:8px 0;padding:12px;font-size:12px;line-height:1.5}.node-mode-ref-warning{border:1px solid var(--amber);border-radius:10px;flex-direction:column;gap:7px;margin:8px 0;padding:11px;display:flex}@supports (color:color-mix(in lab,red,red)){.node-mode-ref-warning{border:1px solid color-mix(in srgb,var(--amber) 50%,var(--border))}}.node-mode-ref-warning{background:var(--amber)}@supports (color:color-mix(in lab,red,red)){.node-mode-ref-warning{background:color-mix(in srgb,var(--amber) 13%,var(--surface-2))}}.node-mode-ref-warning{color:var(--text);font-size:12px;line-height:1.45}.node-mode-ref-warning strong{letter-spacing:.01em;font-size:12px}.node-mode-ref-warning span{color:var(--text-muted)}.node-mode-ref-warning button{border:1px solid var(--amber);align-self:flex-start}@supports (color:color-mix(in lab,red,red)){.node-mode-ref-warning button{border:1px solid color-mix(in srgb,var(--amber) 55%,var(--border))}}.node-mode-ref-warning button{background:var(--surface);color:var(--text);font-family:var(--mono);cursor:pointer;border-radius:7px;padding:5px 8px;font-size:11px}.node-mode-ref-warning button:hover,.node-mode-ref-warning button:focus-visible{border-color:var(--accent);color:var(--accent)}.node-canvas{background:var(--surface);flex:1;justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.node-canvas__plus{background:var(--accent);color:var(--accent-ink);cursor:pointer;border:none;border-radius:12px;padding:18px 28px;font-size:15px}.node-canvas__add-root{z-index:10;background:var(--accent);width:36px;height:36px;color:var(--accent-ink);cursor:pointer;box-shadow:0 4px 12px var(--shadow-soft);border:none;border-radius:50%;font-size:18px;position:absolute;top:16px;right:16px}.node-batch-bar{border:1px solid var(--border);background:var(--surface-2);border-radius:14px;align-items:center;gap:8px;max-width:min(920px,100vw - 320px);padding:8px 10px;display:flex}@supports (color:color-mix(in lab,red,red)){.node-batch-bar{background:color-mix(in srgb,var(--surface-2) 88%,transparent)}}.node-batch-bar{box-shadow:0 14px 36px var(--shadow-soft);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.node-batch-bar button{border:1px solid var(--border);background:var(--surface);min-height:30px;color:var(--text);white-space:nowrap;cursor:pointer;border-radius:10px;padding:0 10px;font-size:12px}.node-batch-bar__danger{border-color:var(--red)!important}@supports (color:color-mix(in lab,red,red)){.node-batch-bar__danger{border-color:color-mix(in srgb,var(--red) 62%,var(--border))!important}}.node-batch-bar__danger{color:var(--red)!important}.node-batch-bar__danger:hover:not(:disabled),.node-batch-bar__danger:focus-visible{background:var(--red)!important}@supports (color:color-mix(in lab,red,red)){.node-batch-bar__danger:hover:not(:disabled),.node-batch-bar__danger:focus-visible{background:color-mix(in srgb,var(--red) 10%,var(--surface))!important}}.node-batch-bar button[aria-pressed=true]{border-color:var(--accent-bright);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.node-batch-bar button[aria-pressed=true]{background:color-mix(in srgb,var(--accent) 18%,var(--surface))}}.node-batch-bar button:disabled{cursor:not-allowed;opacity:.5}.node-batch-bar__meta{font-family:var(--mono,monospace);color:var(--text-dim);white-space:nowrap;font-size:11px}.image-node{isolation:isolate;width:var(--node-preview-w,240px);background:var(--surface-2);border:1px solid var(--border);color:var(--text);border-radius:12px;flex-direction:column;gap:8px;padding:10px;font-size:12px;display:flex;position:relative}.image-node--pending,.image-node--reconciling{border-color:var(--amber)}@supports (color:color-mix(in lab,red,red)){.image-node--pending,.image-node--reconciling{border-color:color-mix(in srgb,var(--amber) 70%,var(--accent))}}.image-node--pending,.image-node--reconciling{box-shadow:0 0 0 1px var(--amber),0 0 26px var(--amber)}@supports (color:color-mix(in lab,red,red)){.image-node--pending,.image-node--reconciling{box-shadow:0 0 0 1px color-mix(in srgb,var(--amber) 16%,transparent),0 0 26px color-mix(in srgb,var(--amber) 20%,transparent)}}.image-node--pending:before,.image-node--reconciling:before{content:"";z-index:0;background:conic-gradient(from 0deg,transparent 0deg,var(--amber) 70deg,var(--accent) 145deg,transparent 220deg,transparent 360deg);border-radius:14px;padding:2px;position:absolute;inset:-2px}@supports (color:color-mix(in lab,red,red)){.image-node--pending:before,.image-node--reconciling:before{background:conic-gradient(from 0deg,transparent 0deg,color-mix(in srgb,var(--amber) 92%,white) 70deg,color-mix(in srgb,var(--accent) 88%,white) 145deg,transparent 220deg,transparent 360deg)}}.image-node--pending:before,.image-node--reconciling:before{-webkit-mask-composite:source-out;pointer-events:none;animation:1.45s linear infinite image-node-border-spin;-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.image-node--ready{border-color:var(--blue)}.image-node--error{border-color:var(--red)}.image-node__preview{width:100%;height:var(--node-preview-h,240px);background:var(--bg);border-radius:8px;justify-content:center;align-items:center;display:flex;overflow:hidden}.image-node__preview img{object-fit:contain;width:100%;height:100%}.image-node__partial{filter:saturate(1.04)contrast(1.03)}.image-node__placeholder,.image-node__skeleton{color:var(--text-faint);font-size:20px}.image-node__prompt{width:100%;color:var(--text);resize:vertical;background:0 0;border:none;border-radius:0;padding:2px 0;font-family:inherit;font-size:12px}@keyframes image-node-border-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.image-node--pending:before,.image-node--reconciling:before{animation:none}}.image-node__prompt:focus,.image-node__prompt:focus-visible{box-shadow:none;outline:none}.image-node__composer{border:1px solid var(--border);background:var(--bg);border-radius:8px;flex-direction:column;gap:7px;padding:7px 8px;transition:border-color .14s,background .14s;display:flex}.image-node__composer.is-dragging{border-color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.image-node__composer.is-dragging{background:color-mix(in srgb,var(--accent) 9%,var(--bg))}}.image-node__refs{flex-wrap:wrap;gap:5px;display:flex}.image-node__ref-chip{border:1px solid var(--border);background:var(--surface-2);border-radius:7px;width:34px;height:34px;position:relative;overflow:hidden}.image-node__ref-chip img{object-fit:cover;width:100%;height:100%;display:block}.image-node__ref-remove{background:var(--chip-scrim);color:#fff;opacity:0;cursor:pointer;border:none;border-radius:50%;width:15px;height:15px;padding:0;font-size:9px;line-height:1;position:absolute;top:2px;right:2px}.image-node__ref-chip:hover .image-node__ref-remove,.image-node__ref-remove:focus-visible{opacity:1}.image-node__ref-remove:hover{background:var(--red)}.image-node__composer-bar{justify-content:space-between;align-items:center;gap:6px;display:flex}.image-node__attach{border:1px solid var(--border);background:var(--surface-3);color:var(--text-dim);font-family:var(--mono);cursor:pointer;border-radius:6px;padding:4px 7px;font-size:10px}.image-node__attach:hover:not(:disabled),.image-node__attach:focus-visible{border-color:var(--accent);color:var(--text)}.image-node__attach:disabled{opacity:.45;cursor:not-allowed}.image-node__drop-hint,.image-node__ref-count{color:var(--text-faint);font-family:var(--mono);font-size:10px}.image-node__footer{flex-wrap:wrap;align-items:flex-start;gap:6px;min-width:0;display:flex}.image-node__status{min-width:0;color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:10px;line-height:1.2;overflow:hidden}.image-node__actions{flex-wrap:wrap;flex:0 auto;justify-content:flex-end;align-items:center;gap:4px;min-width:0;max-width:100%;display:flex}.image-node__actions button{background:var(--surface-3);width:auto;min-width:0;height:30px;color:var(--text);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;padding:0 7px;font-size:10px;line-height:1;display:inline-flex;overflow:hidden}.image-node__actions button:first-child:not(.image-node__generate),.image-node__del{width:30px;padding:0}.image-node__generate{text-transform:uppercase;min-width:44px!important;padding:0 9px!important}.image-node__actions button:disabled{opacity:.5;cursor:not-allowed}.image-node__del{color:var(--red)!important}.in-flight-list{flex-direction:column;gap:4px;margin:8px 0 0;padding:0;list-style:none;display:flex}.in-flight-item{background:var(--surface-2);border:1px solid var(--border);color:var(--text-dim);border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:flex}.in-flight-prompt{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.in-flight-phase{letter-spacing:.04em;text-transform:uppercase;color:var(--text-dim);opacity:.7;font-variant-numeric:tabular-nums;flex-shrink:0;font-size:10px}.in-flight-item[data-phase=streaming] .in-flight-phase{color:var(--accent);opacity:1}.in-flight-item[data-phase=decoding] .in-flight-phase{color:var(--green);opacity:1}.in-flight-spinner{border:2px solid var(--text-dim);border-top-color:#0000;border-radius:50%;flex-shrink:0;width:12px;height:12px;animation:.8s linear infinite spin}.image-node--selected{box-shadow:0 0 0 2px var(--hairline),0 8px 24px var(--shadow-strong);border-color:var(--accent-bright)!important}.image-node__handle{transition:background .12s,box-shadow .12s,height .12s,width .12s;position:absolute;background:var(--text-dim)!important;border:2px solid var(--surface-2)!important;width:10px!important;height:10px!important}.image-node__handle:before{content:"";border-radius:999px;position:absolute;inset:-9px}.image-node__handle--source{z-index:2;background:var(--accent-bright)!important}.image-node__handle--target{opacity:0;pointer-events:none;background:var(--text-dim)!important}.image-node__handle--top{top:0!important;left:50%!important;transform:translate(-50%,-50%)!important}.image-node__handle--right{top:50%!important;right:0!important;transform:translate(50%,-50%)!important}.image-node__handle--bottom{bottom:0!important;left:50%!important;transform:translate(-50%,50%)!important}.image-node__handle--left{top:50%!important;left:0!important;transform:translate(-50%,-50%)!important}.image-node:hover .image-node__handle,.image-node__handle:hover,.image-node__handle:focus-visible,.image-node__handle.connectingfrom,.image-node__handle.connectingto{box-shadow:0 0 0 5px var(--accent-bright);background:var(--accent-bright)!important;width:14px!important;height:14px!important}@supports (color:color-mix(in lab,red,red)){.image-node:hover .image-node__handle,.image-node__handle:hover,.image-node__handle:focus-visible,.image-node__handle.connectingfrom,.image-node__handle.connectingto{box-shadow:0 0 0 5px color-mix(in srgb,var(--accent-bright) 18%,transparent)}}.node-canvas__hint{font-family:var(--mono,monospace);color:var(--on-scrim);background:var(--chip-scrim);border:1px solid var(--on-scrim);border-radius:6px;padding:4px 10px;font-size:11px;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}@supports (color:color-mix(in lab,red,red)){.node-canvas__hint{border:1px solid color-mix(in srgb,var(--on-scrim) 16%,transparent)}}.node-canvas__hint{box-shadow:0 8px 24px var(--shadow-soft);pointer-events:none;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.react-flow__controls{border-radius:6px;overflow:hidden;background:var(--surface-2)!important;border:1px solid var(--border)!important}.react-flow__controls-button{border-bottom:1px solid var(--border)!important;color:var(--text)!important;fill:var(--text)!important;background:0 0!important}.react-flow__controls-button:hover{background:var(--surface)!important}.react-flow__controls-button svg{fill:currentColor!important}.react-flow__edge-path{stroke:var(--text-dim)!important;stroke-width:1.5px!important}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:hover .react-flow__edge-path{stroke:var(--accent-bright)!important;stroke-width:2px!important}.react-flow__connectionline{stroke-dasharray:4 4;stroke:var(--accent-bright)!important;stroke-width:2px!important}.session-picker{flex-direction:column;gap:4px;margin:10px 0 6px;display:flex}.session-picker-row{align-items:stretch;gap:4px;display:flex}.session-current{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius,6px);font:inherit;cursor:pointer;text-align:left;flex:1;justify-content:space-between;align-items:center;min-width:0;padding:7px 10px;font-size:12px;display:flex}.session-current:hover{border-color:var(--border-strong)}.session-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.session-caret{color:var(--text-dim);margin-left:6px}.session-btn{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius,6px);font:inherit;cursor:pointer;min-width:28px;padding:0 10px;font-size:13px}.session-btn:hover:not(:disabled){border-color:var(--border-strong)}.session-btn:disabled{opacity:.4;cursor:not-allowed}.session-list{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius,6px);max-height:220px;margin:0;padding:4px;list-style:none;overflow-y:auto}.session-list li{border-radius:4px;align-items:stretch;gap:2px;display:flex}.session-list li:hover{background:var(--control-bg)}.session-list li.is-active{background:var(--accent-soft)}.session-item{color:var(--text);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;flex:1;justify-content:space-between;align-items:center;min-width:0;padding:6px 8px;font-size:12px;display:flex}.session-item-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.session-item-count{color:var(--text-dim);font-size:10px;font-family:var(--mono,monospace);margin-left:8px}.session-del{color:var(--text-dim);cursor:pointer;background:0 0;border:0;padding:0 8px;font-size:14px}.session-del:hover{color:var(--red)}.session-empty{color:var(--text-dim);text-align:center;padding:8px;font-size:12px}.node-canvas__loading{background:var(--chip-scrim);z-index:20;color:var(--on-scrim);font-size:13px;font-family:var(--mono,monospace);pointer-events:auto;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.error-card-backdrop{background:var(--scrim);z-index:220;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.error-card{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--red);border-radius:var(--radius);width:100%;max-width:440px;box-shadow:0 18px 50px var(--shadow-strong);gap:16px;padding:20px 22px;display:flex}.error-card__icon{color:var(--red);flex-shrink:0;margin-top:2px}.error-card__content{flex:1;min-width:0}.error-card__title{color:var(--text);margin:0 0 6px;font-size:15px;font-weight:600}.error-card__body{color:var(--text-dim);margin:0 0 14px;font-size:13px;line-height:1.55}.error-card__details{color:var(--text-dim);margin-bottom:12px;font-size:12px}.error-card__details pre{background:var(--bg);border:1px solid var(--border);font-family:var(--mono);white-space:pre-wrap;word-break:break-word;border-radius:6px;max-height:120px;margin:6px 0 0;padding:8px 10px;font-size:11px;overflow-y:auto}.error-card__actions{justify-content:flex-end;gap:8px;display:flex}.card-news-composer{align-content:start;gap:12px;display:grid}.card-news-composer__head{padding-bottom:4px}.card-news-composer__head p{color:var(--text-muted);margin:5px 0 0;font-size:11px;line-height:1.45}.card-news-field{color:var(--text-dim);gap:5px;font-size:12px;display:grid}.card-news-field input,.card-news-field textarea{box-sizing:border-box;border:1px solid var(--border);background:var(--bg);width:100%;color:var(--text);font:inherit;border-radius:7px;padding:8px 9px;font-size:13px}.card-news-field textarea{resize:vertical;min-height:72px}.card-news-size-row{grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;display:grid}.card-news-custom-size{align-items:center;gap:6px;display:flex}.card-news-custom-size span{color:var(--text-dim);font-family:var(--mono);font-size:11px}.card-news-draft-btn{margin-top:2px}.card-news-generate-btn{justify-content:center;min-height:40px;font-size:12px}.card-news-workspace{background:var(--bg);grid-template-columns:minmax(160px,220px) minmax(0,1fr) minmax(200px,260px);min-width:0;height:100%;display:grid}.card-news-setup,.card-news-inspector{border-right:1px solid var(--border);padding:14px;overflow:auto}.card-news-inspector{border-right:0;border-left:1px solid var(--border)}.card-news-inspector-empty{align-content:start;gap:14px;display:grid}.card-news-inspector-empty__mock{border:1px solid var(--border);background:var(--surface);border-radius:8px;gap:9px;padding:12px;display:grid}.card-news-inspector-empty__mock span,.card-news-inspector-empty__mock strong,.card-news-inspector-empty__mock i{background:var(--text-dim);border-radius:5px;display:block}@supports (color:color-mix(in lab,red,red)){.card-news-inspector-empty__mock span,.card-news-inspector-empty__mock strong,.card-news-inspector-empty__mock i{background:color-mix(in srgb,var(--text-dim) 22%,transparent)}}.card-news-inspector-empty__mock span{width:54%;height:10px}.card-news-inspector-empty__mock strong{background:var(--accent);width:86%;height:18px}@supports (color:color-mix(in lab,red,red)){.card-news-inspector-empty__mock strong{background:color-mix(in srgb,var(--accent) 26%,transparent)}}.card-news-inspector-empty__mock i{height:8px}.card-news-inspector-empty__mock i:last-child{width:68%}.card-news-inspector-empty p{color:var(--text-dim);margin:0;font-size:12px}.card-news-main{grid-template-rows:minmax(0,1fr) 110px;min-width:0;display:grid;overflow:hidden}.card-news-panel{margin-bottom:16px}.card-news-panel__head{color:var(--text-dim);justify-content:space-between;align-items:center;margin-bottom:8px;font-size:12px;display:flex}.card-news-panel__head button{border:1px solid var(--border);background:var(--surface);width:28px;height:28px;color:var(--text-dim);border-radius:7px}.card-news-template-grid{gap:8px;display:grid}.card-news-template,.card-news-role-row button,.card-news-deck-card{border:1px solid var(--border);background:var(--surface);color:var(--text);border-radius:8px}.card-news-template{text-align:left;grid-template-columns:44px 1fr;align-items:center;gap:8px;padding:8px;display:grid}.card-news-template img{object-fit:cover;border-radius:6px;width:44px;height:44px}.card-news-template__body{gap:3px;min-width:0;display:grid}.card-news-template__name,.card-news-template__meta,.card-news-template__sizes{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.card-news-template__name{color:var(--text);font-size:12px}.card-news-template__meta,.card-news-template__sizes{color:var(--text-muted);font-size:10px}.card-news-template.selected,.card-news-role-row button.selected,.card-news-deck-card.selected{border-color:var(--accent)}.card-news-role-row{flex-wrap:wrap;gap:7px;display:flex}.card-news-role-row button{padding:7px 10px;font-size:12px}.card-news-stage,.card-news-empty{text-align:center;place-items:center;min-height:0;padding:18px;display:grid}.card-news-empty{align-content:center;gap:22px}.card-news-empty__deck{aspect-ratio:1/1.12;width:min(270px,62vw);position:relative}.card-news-empty__card{border:1px solid var(--border);background:linear-gradient(135deg,var(--surface),var(--surface));border-radius:8px;grid-template-rows:20px 1fr 28px;gap:18px;padding:22px;display:grid;position:absolute;inset:18px 28px}@supports (color:color-mix(in lab,red,red)){.card-news-empty__card{background:linear-gradient(135deg,color-mix(in srgb,var(--surface) 92%,var(--accent) 8%),var(--surface))}}.card-news-empty__card{box-shadow:0 20px 58px #00000047}.card-news-empty__card--back,.card-news-empty__card--mid{background:var(--surface);padding:0}@supports (color:color-mix(in lab,red,red)){.card-news-empty__card--back,.card-news-empty__card--mid{background:color-mix(in srgb,var(--surface) 88%,var(--text) 7%)}}.card-news-empty__card--back{opacity:.38;transform:translate(-24px,18px)rotate(-7deg)}.card-news-empty__card--mid{opacity:.58;transform:translate(22px,10px)rotate(5deg)}.card-news-empty__card span,.card-news-empty__card strong,.card-news-empty__card em{border-radius:6px;display:block}.card-news-empty__card span{border:1px solid var(--accent)}@supports (color:color-mix(in lab,red,red)){.card-news-empty__card span{border:1px solid color-mix(in srgb,var(--accent) 54%,var(--border))}}.card-news-empty__card span{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.card-news-empty__card span{background:color-mix(in srgb,var(--accent) 18%,transparent)}}.card-news-empty__card strong{border:1px dashed var(--border);background:linear-gradient(90deg,var(--text-dim) 44%,transparent 44%),linear-gradient(90deg,var(--text-dim) 64%,transparent 64%)}@supports (color:color-mix(in lab,red,red)){.card-news-empty__card strong{background:linear-gradient(90deg,color-mix(in srgb,var(--text-dim) 32%,transparent) 44%,transparent 44%),linear-gradient(90deg,color-mix(in srgb,var(--text-dim) 22%,transparent) 64%,transparent 64%)}}.card-news-empty__card strong{background-position:0 38%,0 56%;background-repeat:no-repeat;background-size:100% 12px,100% 12px}.card-news-empty__card em{background:var(--accent);justify-self:center;width:72%}@supports (color:color-mix(in lab,red,red)){.card-news-empty__card em{background:color-mix(in srgb,var(--accent) 68%,var(--surface))}}.card-news-empty__copy{gap:6px;max-width:340px;display:grid}.card-news-empty__copy span{color:var(--accent);letter-spacing:0;text-transform:uppercase;font-size:11px;font-weight:700}.card-news-empty__copy h2{margin:0;font-size:22px;line-height:1.16}.card-news-empty__copy p{color:var(--text-dim);margin:0;font-size:13px;line-height:1.45}.card-news-stage{grid-template-rows:auto auto 1fr auto;place-items:stretch stretch}.card-news-stage__header{justify-content:space-between;gap:16px;margin-bottom:14px;display:flex}.card-news-stage__header h2{margin:0;font-size:18px}.card-news-stage__header p,.card-news-stage__header span{color:var(--text-dim);margin:4px 0 0;font-size:12px}.card-news-preview{aspect-ratio:1;border:1px solid var(--border);background:var(--surface);border-radius:8px;grid-template-rows:1fr;place-self:center;width:min(420px,82%);padding:22px;display:grid;position:relative}.card-news-preview img,.card-news-preview__slot,.card-news-preview__loading,.card-news-preview__error{object-fit:cover;background:var(--bg);border:1px dashed var(--border);border-radius:7px;width:100%;height:100%}.card-news-preview__slot{position:relative;overflow:hidden}.card-news-preview__loading,.card-news-preview__error{color:var(--text-dim);place-items:center;font-size:12px;display:grid}.card-news-muted,.card-news-inspector-label{color:var(--text-dim);font-size:12px}.card-news-inspector-group{gap:10px;margin-bottom:14px;display:grid}.card-news-inspector-row,.card-news-text-field-card__header,.card-news-text-field-card__meta{justify-content:space-between;align-items:center;gap:8px;display:flex}.card-news-text-field-card{border:1px solid var(--border);background:var(--surface);border-radius:8px;gap:9px;padding:9px;display:grid}.card-news-text-field-card.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}@supports (color:color-mix(in lab,red,red)){.card-news-text-field-card.selected{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 48%,transparent)}}.card-news-advanced-prompt summary{cursor:pointer;color:var(--text-dim);font-size:12px}.card-news-text-field-card__grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.card-news-text-field-card__meta.over{color:var(--red)}.card-news-placement-chip,.card-news-render-mode{border:1px solid var(--border);min-height:22px;color:var(--text-dim);border-radius:999px;align-items:center;padding:2px 7px;font-size:11px;display:inline-flex}.card-news-stage-overlay{pointer-events:none;position:absolute;inset:22px}.card-news-stage-overlay__field{pointer-events:auto;border:1px solid var(--accent);background:var(--surface);border-radius:6px;max-width:70%;padding:5px 7px;position:absolute}@supports (color:color-mix(in lab,red,red)){.card-news-stage-overlay__field{background:color-mix(in srgb,var(--surface) 88%,var(--accent) 12%)}}.card-news-stage-overlay__field{color:var(--text);text-align:left;cursor:pointer;font-size:11px;line-height:1.25}.card-news-stage-overlay__field.selected{border-color:var(--green);box-shadow:0 0 0 2px var(--green)}@supports (color:color-mix(in lab,red,red)){.card-news-stage-overlay__field.selected{box-shadow:0 0 0 2px color-mix(in srgb,var(--green) 34%,transparent)}}.card-news-stage-overlay__field--top-left{top:0;left:0}.card-news-stage-overlay__field--top-center{top:0;left:50%;transform:translate(-50%)}.card-news-stage-overlay__field--top-right{top:0;right:0}.card-news-stage-overlay__field--center-left{top:50%;left:0;transform:translateY(-50%)}.card-news-stage-overlay__field--center{top:50%;left:50%;transform:translate(-50%,-50%)}.card-news-stage-overlay__field--center-right{top:50%;right:0;transform:translateY(-50%)}.card-news-stage-overlay__field--bottom-left{bottom:0;left:0}.card-news-stage-overlay__field--bottom-center{bottom:0;left:50%;transform:translate(-50%)}.card-news-stage-overlay__field--bottom-right{bottom:0;right:0}.card-news-stage-overlay__field--free{top:50%;left:50%;transform:translate(-50%,-50%)}.card-news-preview__error{color:var(--red);border-color:var(--red);gap:8px}.card-news-batch-bar,.card-news-result-actions,.card-news-generated-meta{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.card-news-batch-bar{color:var(--text-dim);justify-content:space-between;margin-bottom:12px;font-size:12px}.card-news-draft-btn,.card-news-generate-btn{justify-content:center;align-items:center;gap:7px;display:inline-flex}.card-news-inline-status{border:1px solid var(--border);background:var(--surface);min-height:28px;color:var(--text-dim);border-radius:7px;align-items:center;gap:8px;padding:6px 8px;font-size:12px;display:inline-flex}.card-news-result-actions{justify-content:center;margin-top:12px}.card-news-result-actions button,.card-news-result-actions a{border:1px solid var(--border);background:var(--surface);color:var(--text);border-radius:7px;padding:7px 9px;font-size:12px;text-decoration:none}.card-news-status-badge,.card-news-planner-badge{border:1px solid var(--border);width:fit-content;color:var(--text-dim);border-radius:6px;align-items:center;gap:5px;padding:3px 6px;font-size:11px;display:inline-flex}.card-news-status-badge--generated{border-color:var(--green);color:var(--green)}.card-news-status-badge--error{border-color:var(--red);color:var(--red)}.card-news-status-badge--locked,.card-news-status-badge--skipped{opacity:.72}.card-news-spinner{border:2px solid;border-right-color:#0000;border-radius:50%;width:8px;height:8px;animation:.9s linear infinite spin}.card-news-deck-card__thumb{object-fit:cover;border-radius:5px;width:100%;height:28px}.card-news-generated-meta{border:1px solid var(--border);color:var(--text-dim);border-radius:7px;justify-content:space-between;padding:8px;font-size:11px}.card-news-locked-help{color:var(--text-dim);margin:0;font-size:12px;line-height:1.4}.card-news-deck{border-top:1px solid var(--border);overscroll-behavior-inline:contain;gap:10px;padding:14px;display:flex;overflow-x:auto}.card-news-deck-card{text-align:left;flex:0 0 92px;align-content:space-between;height:78px;padding:8px;display:grid}.card-news-deck-card span,.card-news-deck-card em{color:var(--text-dim);font-size:11px;font-style:normal}.card-news-error{border:1px solid var(--red);color:var(--red);border-radius:8px;margin:12px;padding:10px}.gallery-card-news-set .gallery__tile{gap:8px;display:grid}.gallery-card-news-strip{gap:4px;padding:0 8px 8px;display:flex}.gallery-card-news-strip span{border:1px solid var(--border);min-width:18px;height:18px;color:var(--text-dim);text-align:center;border-radius:5px;font-size:10px;line-height:18px;position:relative;overflow:hidden}.gallery-card-news-strip img{object-fit:cover;width:100%;height:100%}.gallery-card-news-strip em{background:var(--bg);border-radius:4px;min-width:12px;position:absolute;inset:auto 1px 1px auto}@supports (color:color-mix(in lab,red,red)){.gallery-card-news-strip em{background:color-mix(in srgb,var(--bg) 74%,transparent)}}.gallery-card-news-strip em{color:var(--text);font-size:9px;font-style:normal;line-height:12px}.gallery-card-news-actions{flex-wrap:wrap;gap:5px;padding:0 8px 8px;display:flex}.gallery-card-news-actions span,.gallery-card-news-actions button{border:1px solid var(--border);background:var(--surface);min-height:22px;color:var(--text-dim);border-radius:6px;padding:3px 6px;font-size:10px}.gallery-card-news-actions button{color:var(--text);cursor:pointer}@media(max-width:1180px){.card-news-workspace{grid-template-columns:1fr;overflow:auto}.card-news-setup,.card-news-inspector{border:0;border-bottom:1px solid var(--border)}}.prompt-library-panel{min-height:0}.prompt-library-panel--overlay{z-index:50;justify-content:flex-end;display:flex;position:fixed;inset:0}.prompt-library-panel--embedded{flex:auto;min-height:0;display:flex;position:relative}.prompt-library-panel__backdrop{background:#0000004d;position:absolute;inset:0}.prompt-library-panel__drawer{background:var(--surface);border-left:1px solid var(--border);flex-direction:column;width:min(360px,100vw - 24px);height:100%;display:flex;position:relative}.prompt-library-panel--embedded .prompt-library-panel__drawer{background:0 0;border-left:0;width:100%;height:auto;min-height:0}.prompt-library-panel__header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:12px 16px;display:flex;position:relative}.prompt-library-panel--embedded .prompt-library-panel__header{padding:10px 0}.prompt-library-panel__header h3{margin:0;font-size:14px;font-weight:600}.prompt-library-panel__actions{align-items:center;gap:8px;display:flex}.prompt-library-panel__search{border-bottom:1px solid var(--border);flex-direction:column;gap:8px;padding:12px 16px;display:flex}.prompt-library-panel--embedded .prompt-library-panel__search{padding:10px 0}.prompt-library-panel__search input{border:1px solid var(--border);background:var(--bg);width:100%;color:var(--text);border-radius:6px;padding:6px 10px;font-size:13px}.prompt-library-panel__filter-toggle{border:1px solid var(--border);background:var(--surface);min-height:30px;color:var(--text-dim);cursor:pointer;white-space:nowrap;border-radius:999px;align-self:flex-start;align-items:center;gap:7px;padding:0 10px;font-size:12px;display:inline-flex}.prompt-library-panel__filter-toggle:hover{border-color:var(--border-strong);color:var(--text)}.prompt-library-panel__filter-toggle.active{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-library-panel__filter-toggle.active{border-color:color-mix(in srgb,var(--accent) 55%,var(--border))}}.prompt-library-panel__filter-toggle.active{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-library-panel__filter-toggle.active{background:color-mix(in srgb,var(--accent) 14%,var(--surface))}}.prompt-library-panel__filter-toggle.active{color:var(--text)}.prompt-library-panel__filter-toggle.active span[aria-hidden=true]{color:var(--accent)}.prompt-library-panel__list{flex:1;padding:8px;overflow-y:auto}.prompt-library-panel--embedded .prompt-library-panel__list{padding:6px 0}.prompt-library-panel__loading,.prompt-library-panel__empty{text-align:center;padding:24px}.prompt-library-panel__drop-overlay{z-index:10;background:#00000080;border-radius:8px;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.prompt-library-panel__drop-message{background:var(--bg-raised);border:2px dashed var(--accent);color:var(--text);text-align:center;border-radius:8px;padding:24px 32px;font-size:14px}.prompt-import-dialog{z-index:80;justify-content:center;align-items:center;padding:18px;display:flex;position:fixed;inset:0}.prompt-import-dialog__backdrop{background:#0000007a;position:absolute;inset:0}.prompt-import-dialog__panel{background:var(--surface);width:min(920px,100vw - 24px);max-height:min(760px,100dvh - 24px);color:var(--text);border:1px solid var(--border);border-radius:10px;flex-direction:column;display:flex;position:relative;overflow:hidden}.prompt-import-dialog__header,.prompt-import-dialog__footer{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:10px;padding:12px 14px;display:flex}.prompt-import-dialog__footer{border-bottom:0;border-top:1px solid var(--border);justify-content:flex-end}.prompt-import-dialog__header h3{margin:0;font-size:15px;font-weight:600}.prompt-import-dialog button{border:1px solid var(--border);background:var(--bg);color:var(--text);cursor:pointer;border-radius:7px;padding:7px 10px}.prompt-import-dialog button:disabled{opacity:.55;cursor:not-allowed}.prompt-import-dialog__dropzone{border:1px dashed var(--border-strong);text-align:center;background:var(--accent);border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:8px;min-height:118px;margin:14px;display:flex}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__dropzone{background:color-mix(in srgb,var(--accent) 8%,var(--surface))}}.prompt-import-dialog__dropzone.active{border-color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__dropzone.active{background:color-mix(in srgb,var(--accent) 16%,var(--surface))}}.prompt-import-dialog__dropzone strong{font-size:14px;font-weight:600}.prompt-import-dialog__dropzone span{color:var(--text-dim);font-size:12px}.prompt-import-dialog__github{flex-direction:column;gap:6px;padding:0 14px 12px;display:flex}.prompt-import-dialog__github label{color:var(--text-dim);font-size:12px}.prompt-import-dialog__github>div{gap:8px;display:flex}.prompt-import-dialog__github input{border:1px solid var(--border);background:var(--bg);min-width:0;color:var(--text);border-radius:7px;flex:1;padding:7px 10px;font-size:13px}.prompt-import-dialog__folder{flex-direction:column;gap:8px;padding:0 14px 12px;display:flex}.prompt-import-dialog__folder-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.prompt-import-dialog__folder-actions span{color:var(--text-dim);font-size:11px}.prompt-import-dialog__folder-list{grid-template-columns:1fr;gap:6px;max-height:148px;display:grid;overflow-y:auto}.prompt-import-dialog__folder-file{border:1px solid var(--border);background:var(--bg);border-radius:8px;grid-template-columns:20px minmax(0,1fr) auto;align-items:center;gap:8px;padding:8px;display:grid}.prompt-import-dialog__folder-file span{min-width:0}.prompt-import-dialog__folder-file strong,.prompt-import-dialog__folder-file small{text-overflow:ellipsis;white-space:nowrap;min-width:0;display:block;overflow:hidden}.prompt-import-dialog__folder-file strong{font-size:12px;font-weight:600}.prompt-import-dialog__folder-file small,.prompt-import-dialog__folder-file em{color:var(--text-dim);font-size:11px;font-style:normal}.prompt-import-dialog__folder-warning{border:1px solid var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__folder-warning{border:1px solid color-mix(in srgb,var(--accent) 42%,var(--border))}}.prompt-import-dialog__folder-warning{color:var(--text-dim);background:var(--accent);border-radius:7px;padding:7px 9px}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__folder-warning{background:color-mix(in srgb,var(--accent) 8%,var(--surface))}}.prompt-import-dialog__folder-warning{font-size:11px}.prompt-import-dialog__source-tabs{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;padding:0 14px 10px;display:grid}.prompt-import-dialog__source-tabs button{min-width:0}.prompt-import-dialog__curated{flex-direction:column;gap:8px;padding:0 14px 12px;display:flex}.prompt-import-dialog__section-title{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.prompt-import-dialog__section-title strong{font-size:12px;font-weight:600}.prompt-import-dialog__section-title span{color:var(--text-dim);font-size:11px}.prompt-import-dialog__source-list{grid-template-columns:1fr;gap:6px;display:grid}.prompt-import-dialog__source{border:1px solid var(--border);background:var(--bg);border-radius:8px;grid-template-columns:18px 1fr auto;align-items:center;gap:8px;padding:8px;display:grid}.prompt-import-dialog__source span,.prompt-import-dialog__source strong,.prompt-import-dialog__source small{display:block}.prompt-import-dialog__source strong{font-size:12px;font-weight:600}.prompt-import-dialog__source small{color:var(--text-dim);font-size:11px}.prompt-import-dialog__search-results{gap:8px;display:flex}.prompt-import-dialog__search-results input{border:1px solid var(--border);background:var(--bg);min-width:0;color:var(--text);border-radius:7px;flex:1;padding:7px 10px;font-size:13px}.prompt-import-dialog__warning{border:1px solid var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__warning{border:1px solid color-mix(in srgb,var(--accent) 42%,var(--border))}}.prompt-import-dialog__warning{color:var(--text-dim);background:var(--accent);border-radius:7px;padding:7px 9px}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__warning{background:color-mix(in srgb,var(--accent) 8%,var(--surface))}}.prompt-import-dialog__warning{font-size:11px}.prompt-import-dialog__discovery{flex-direction:column;gap:8px;padding:0 14px 12px;display:flex}.prompt-import-dialog__discovery-actions{gap:8px;display:flex}.prompt-import-dialog__discovery-actions input{border:1px solid var(--border);background:var(--bg);min-width:0;color:var(--text);border-radius:7px;flex:1;padding:7px 10px;font-size:13px}.prompt-import-dialog__discovery-list{grid-template-columns:1fr;gap:8px;max-height:188px;display:grid;overflow-y:auto}.prompt-import-dialog__discovery-candidate{border:1px solid var(--border);background:var(--bg);border-radius:8px;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:8px;padding:9px;display:grid}.prompt-import-dialog__discovery-candidate strong,.prompt-import-dialog__discovery-candidate small,.prompt-import-dialog__discovery-candidate em{text-overflow:ellipsis;white-space:nowrap;min-width:0;display:block;overflow:hidden}.prompt-import-dialog__discovery-candidate strong{font-size:12px;font-weight:600}.prompt-import-dialog__discovery-candidate small,.prompt-import-dialog__discovery-candidate em{color:var(--text-dim);font-size:11px;font-style:normal}.prompt-import-dialog__score{border:1px solid var(--accent);justify-self:end}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__score{border:1px solid color-mix(in srgb,var(--accent) 42%,var(--border))}}.prompt-import-dialog__score{color:var(--text-dim);background:var(--accent);border-radius:999px;padding:2px 7px}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__score{background:color-mix(in srgb,var(--accent) 8%,var(--surface))}}.prompt-import-dialog__score{font-size:10px;font-weight:600}.prompt-import-dialog__review-actions{flex-wrap:wrap;grid-column:1/-1;gap:6px;display:flex}.prompt-import-dialog__discovery-warning{color:var(--text-dim);grid-column:1/-1;font-size:11px}.prompt-import-dialog__error{border:1px solid var(--red);border-radius:7px;margin:0 14px 12px;padding:8px 10px}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__error{border:1px solid color-mix(in srgb,var(--red) 45%,var(--border))}}.prompt-import-dialog__error{color:var(--red);background:var(--red)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__error{background:color-mix(in srgb,var(--red) 10%,var(--surface))}}.prompt-import-dialog__error{font-size:12px}.prompt-import-dialog__workspace{flex:auto;grid-template-columns:minmax(0,1.05fr) minmax(280px,.95fr);gap:14px;min-height:0;padding:0 14px 14px;display:grid;overflow:hidden}.prompt-import-dialog__results,.prompt-import-dialog__candidate-preview{border:1px solid var(--border);background:var(--bg);border-radius:8px;min-height:0;max-height:min(44vh,520px);overflow-y:auto}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__results,.prompt-import-dialog__candidate-preview{background:color-mix(in srgb,var(--bg) 86%,var(--surface))}}.prompt-import-dialog__results-header{z-index:1;background:var(--bg);justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;display:flex;position:sticky;top:0}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__results-header{background:color-mix(in srgb,var(--bg) 86%,var(--surface))}}.prompt-import-dialog__results-header{border-bottom:1px solid var(--border);font-size:12px}.prompt-import-dialog__results-header strong{color:var(--text);font-size:12px;font-weight:600}.prompt-import-dialog__results-header-actions{gap:6px;display:flex}.prompt-import-dialog__add-source-toggle{color:var(--text-dim);align-self:flex-start;margin:0 14px 8px;font-size:12px}.prompt-import-dialog__results{grid-template-columns:1fr;align-content:start;gap:8px;padding:8px;display:grid}.prompt-import-dialog__result-card{border:1px solid var(--border);background:var(--surface);border-radius:8px;grid-template-columns:minmax(0,1fr);gap:8px;padding:9px;display:grid}.prompt-import-dialog__result-card.active{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__result-card.active{border-color:color-mix(in srgb,var(--accent) 58%,var(--border))}}.prompt-import-dialog__result-card.active{box-shadow:0 0 0 1px var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__result-card.active{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 24%,transparent)}}.prompt-import-dialog__result-main{text-align:left;background:0 0;border:0;grid-template-columns:1fr;gap:4px;padding:0;display:grid}.prompt-import-dialog__result-main strong,.prompt-import-dialog__result-main span,.prompt-import-dialog__result-main small{overflow-wrap:anywhere;min-width:0}.prompt-import-dialog__result-main strong{font-size:13px;font-weight:600}.prompt-import-dialog__result-main span{color:var(--text);font-size:12px;line-height:1.45}.prompt-import-dialog__result-main small{color:var(--text-dim);font-size:11px}.prompt-import-dialog__result-meta,.prompt-import-dialog__preview-chips{flex-wrap:wrap;gap:5px;display:flex}.prompt-import-dialog__result-meta em,.prompt-import-dialog__preview-chips em,.prompt-import-dialog__preview-chips b{border:1px solid var(--border);width:fit-content;color:var(--text-dim);background:var(--bg);border-radius:999px;padding:2px 6px;font-size:10px;font-style:normal;font-weight:500;display:inline-flex}.prompt-import-dialog__preview-chips b{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__preview-chips b{border-color:color-mix(in srgb,var(--accent) 45%,var(--border))}}.prompt-import-dialog__preview-chips b{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__preview-chips b{background:color-mix(in srgb,var(--accent) 10%,var(--bg))}}.prompt-import-dialog__result-actions{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.prompt-import-dialog__result-actions label,.prompt-import-dialog__preview-select{color:var(--text-dim);align-items:center;gap:6px;font-size:12px;display:inline-flex}.prompt-import-dialog__candidate-preview{flex-direction:column;gap:12px;padding:12px;display:flex}.prompt-import-dialog__preview-header{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.prompt-import-dialog__preview-header span{color:var(--text-dim);font-size:11px}.prompt-import-dialog__preview-header h4{overflow-wrap:anywhere;margin:2px 0 0;font-size:15px;font-weight:600}.prompt-import-dialog__preview-field{grid-template-columns:1fr;gap:6px;display:grid}.prompt-import-dialog__preview-field strong{font-size:12px;font-weight:600}.prompt-import-dialog__preview-field p{color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12px;line-height:1.5}.prompt-import-dialog__preview-field small{color:var(--text-dim);overflow-wrap:anywhere;font-size:11px}.prompt-import-dialog__preview{flex:1;min-height:130px;padding:0 14px 14px;overflow-y:auto}.prompt-import-dialog__empty{border:1px solid var(--border);color:var(--text-dim);text-align:center;border-radius:8px;padding:22px 12px;font-size:13px}.prompt-import-dialog__candidate{border:1px solid var(--border);background:var(--bg);cursor:pointer;border-radius:8px;grid-template-columns:24px 1fr;gap:8px;margin-bottom:8px;padding:10px;display:grid}.prompt-import-dialog__candidate input{margin-top:2px}.prompt-import-dialog__candidate strong,.prompt-import-dialog__candidate small,.prompt-import-dialog__candidate em{display:block}.prompt-import-dialog__candidate strong{margin-bottom:4px;font-size:13px;font-weight:600}.prompt-import-dialog__candidate small{color:var(--text);font-size:12px;line-height:1.45}.prompt-import-dialog__candidate em{color:var(--text-dim);margin-top:6px;font-size:11px;font-style:normal}.prompt-import-dialog__hint-chip{border:1px solid var(--accent);width:fit-content;margin-top:6px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__hint-chip{border:1px solid color-mix(in srgb,var(--accent) 45%,var(--border))}}.prompt-import-dialog__hint-chip{color:var(--text-dim);background:var(--accent);border-radius:999px;padding:2px 6px;font-size:10px;font-weight:500}@supports (color:color-mix(in lab,red,red)){.prompt-import-dialog__hint-chip{background:color-mix(in srgb,var(--accent) 10%,var(--bg))}}@media(max-width:760px){.prompt-import-dialog__workspace{grid-template-columns:1fr}.prompt-import-dialog__results,.prompt-import-dialog__candidate-preview{min-height:220px;max-height:32vh}}.prompt-library-row{border:1px solid var(--border);background:var(--bg);border-radius:8px;margin-bottom:8px;padding:10px 12px}.prompt-library-row__header{align-items:center;gap:8px;margin-bottom:6px;display:flex}.prompt-library-row__name{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;overflow:hidden}.prompt-library-row__load,.prompt-library-row__delete{cursor:pointer;color:var(--text-dim);background:0 0;border:none;border-radius:4px;padding:2px 6px;font-size:12px}.prompt-library-row__load:hover,.prompt-library-row__delete:hover{background:var(--surface)}.prompt-library-row__text{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;margin-bottom:6px;font-size:12px;overflow:hidden}.prompt-library-row__tags{flex-wrap:wrap;gap:4px;margin-bottom:4px;display:flex}.prompt-library-row__tag{background:var(--surface);color:var(--text-dim);border-radius:4px;padding:2px 6px;font-size:10px}.prompt-library-row__folder{color:var(--text-dim);font-size:10px}.save-prompt-popover{background:var(--surface);border:1px solid var(--border);z-index:100;border-radius:12px;width:min(360px,90vw);padding:20px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 20px 60px #0006}.save-prompt-popover__header{justify-content:space-between;align-items:center;margin-bottom:10px;font-size:13px;font-weight:600;display:flex}.save-prompt-popover__close{cursor:pointer;color:var(--text-dim);background:0 0;border:none;padding:0;font-size:16px}.save-prompt-popover__body{flex-direction:column;gap:10px;margin-bottom:12px;display:flex}.save-prompt-popover__body label{color:var(--text-dim);flex-direction:column;gap:4px;font-size:12px;display:flex}.save-prompt-popover__body input,.save-prompt-popover__body textarea{border:1px solid var(--border);background:var(--bg);color:var(--text);resize:vertical;border-radius:6px;padding:6px 8px;font-size:13px}.save-prompt-popover__footer{justify-content:flex-end;display:flex}.save-prompt-popover__save{background:var(--accent);color:var(--accent-ink);cursor:pointer;border:none;border-radius:6px;padding:6px 12px;font-size:12px}.save-prompt-popover__save:disabled{opacity:.6;cursor:not-allowed}.gallery__favorite{color:#fff;cursor:pointer;z-index:3;opacity:.55;background:#0000008c;border:none;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;font-size:16px;transition:opacity .15s,background .15s,transform .12s;display:flex;position:absolute;top:6px;left:6px}.gallery__favorite:hover{opacity:1;background:#000000bf;transform:scale(1.08)}.gallery__tile-wrap:hover .gallery__favorite{opacity:1}.gallery__favorite:focus-visible{outline:2px solid var(--accent,#2563eb);outline-offset:2px;opacity:1}.gallery__favorite--on{opacity:1;color:#f59e0b}.gallery__tile-wrap--favorite .gallery__tile{box-shadow:inset 0 0 0 2px #f59e0b}.prompt-library-row{border-bottom:1px solid var(--border);cursor:pointer;justify-content:space-between;align-items:center;min-height:44px;padding:10px 16px;transition:background .1s;display:flex}.prompt-library-row:hover{background:var(--bg)}.prompt-library-row__main{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.prompt-library-row__title{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;overflow:hidden}.prompt-library-row__preview{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.prompt-library-row__actions{flex-shrink:0;align-items:center;gap:8px;margin-left:12px;display:flex}.prompt-library-row__insert{border:1px solid var(--border);background:var(--bg);width:24px;height:24px;color:var(--text);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;padding:0;font-size:16px;line-height:1;display:flex}.prompt-library-row__insert:hover{border-color:var(--accent);background:var(--accent-soft)}.prompt-library-row__star{cursor:pointer;color:var(--text-dim);background:0 0;border:none;padding:0;font-size:14px;line-height:1}.prompt-library-row__star--on{color:#f59e0b}.prompt-library-row__chevron{color:var(--text-dim);font-size:14px}.prompt-detail-modal{z-index:60;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.prompt-detail-modal__backdrop{background:#00000080;position:absolute;inset:0}.prompt-detail-modal__content{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:12px;width:min(400px,90vw);max-height:70vh;padding:20px;display:flex;position:relative}.prompt-detail-modal__header{justify-content:space-between;align-items:center;display:flex}.prompt-detail-modal__header h4{margin:0;font-size:14px;font-weight:600}.prompt-detail-modal__close{cursor:pointer;color:var(--text-dim);background:0 0;border:none;padding:0;font-size:18px}.prompt-detail-modal__body{flex-direction:column;gap:10px;display:flex}.prompt-detail-modal__label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;font-size:11px}.prompt-detail-modal__prompt{background:var(--bg);white-space:pre-wrap;word-break:break-word;max-height:200px;color:var(--text);border:1px solid var(--border);border-radius:8px;padding:12px;font-size:13px;line-height:1.5;overflow-y:auto}.prompt-detail-modal__tag-list{flex-wrap:wrap;gap:6px;display:flex}.prompt-detail-modal__tag{background:var(--bg);color:var(--text-dim);border:1px solid var(--border);border-radius:4px;padding:3px 8px;font-size:11px}.prompt-detail-modal__footer{border-top:1px solid var(--border);flex-wrap:wrap;gap:8px;padding-top:8px;display:flex}.prompt-detail-modal__load,.prompt-detail-modal__copy,.prompt-detail-modal__insert,.prompt-detail-modal__favorite,.prompt-detail-modal__delete{cursor:pointer;border:none;border-radius:6px;padding:6px 12px;font-size:12px}.prompt-detail-modal__load{background:var(--accent);color:var(--accent-ink)}.prompt-detail-modal__copy{background:var(--bg);color:var(--text);border:1px solid var(--border)}.prompt-detail-modal__insert{background:var(--bg);color:var(--text);border:1px solid var(--accent)}.prompt-detail-modal__favorite{background:var(--bg);color:var(--text-dim);border:1px solid var(--border)}.prompt-detail-modal__favorite--on{color:#f59e0b;border-color:#f59e0b}.prompt-detail-modal__delete{color:var(--text-dim);background:0 0;margin-left:auto}.prompt-library-panel__add,.prompt-library-panel__import{border:1px solid var(--border);background:var(--bg);width:28px;height:28px;color:var(--text);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;padding:0;font-size:18px;line-height:1;display:flex}.prompt-library-panel__import{white-space:nowrap;width:auto;min-width:64px;padding:0 10px;font-size:12px}.prompt-library-panel__add:hover,.prompt-library-panel__import:hover{background:var(--surface);border-color:var(--accent)}.prompt-library-panel__file-input{display:none}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}.canvas--mode-open{position:relative;background-color:#0d0d0d;background-image:radial-gradient(rgba(100,200,255,.25) 1.5px,transparent 1.5px);background-size:20px 20px}.canvas--mode-open:before{content:"";position:absolute;top:0;left:0;right:0;height:60px;background:linear-gradient(to bottom,rgba(0,0,0,.7),transparent);z-index:10;pointer-events:none}.canvas-mode-topbar{position:absolute;top:0;left:0;right:0;z-index:11;display:flex;align-items:center;justify-content:space-between;padding:12px 20px;pointer-events:none}.canvas-mode-topbar__label{color:#ffffff80;font-size:13px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.canvas-mode-topbar__center{position:absolute;top:12px;left:50%;transform:translate(-50%);pointer-events:auto}.canvas-mode-blank{display:inline-flex;align-items:center;gap:8px;min-height:38px;padding:0 12px;border:1px solid rgba(255,255,255,.22);border-radius:8px;background:#ffffff1a;color:#fff;font:inherit;font-size:13px;font-weight:700;cursor:pointer;white-space:nowrap;transition:background .15s ease,border-color .15s ease,opacity .15s ease}.canvas-mode-blank:hover:not(:disabled){background:#ffffff2e;border-color:#ffffff57}.canvas-mode-blank:disabled{cursor:wait;opacity:.58}.canvas-mode-blank kbd{padding:2px 6px;border-radius:4px;background:#00000052;border:1px solid rgba(255,255,255,.24);font-family:var(--font-mono, monospace);font-size:11px;font-weight:600}.canvas-mode-close{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:8px;background:#ffffff1a;border:1px solid rgba(255,255,255,.2);color:#fff;font-size:14px;cursor:pointer;pointer-events:auto;transition:background .15s}.canvas-mode-close:hover{background:#fff3}.canvas-mode-close kbd{padding:2px 8px;border-radius:4px;background:#0006;border:1px solid rgba(255,255,255,.3);font-family:var(--font-mono, monospace);font-size:12px}@media(max-width:760px){.canvas-mode-topbar__center{top:78px}.canvas-mode-blank kbd{display:none}}.canvas--mode-open{overscroll-behavior:contain}.canvas-annotation-frame{position:relative;display:inline-block;line-height:0;transform-origin:center center}.canvas-annotation-frame .result-img{display:block}.canvas-annotation-layer{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:2}.canvas-memo-overlay{position:absolute;inset:0;z-index:3;pointer-events:none}.canvas-memo{position:absolute;z-index:4;min-width:160px;max-width:260px;min-height:72px;padding:10px 12px;border:1px solid rgba(44,37,12,.28);border-radius:8px;background:#fff6b3f5;box-shadow:0 14px 28px #0000003d;color:#2f2a13;font:500 14px/1.35 var(--font-ui, sans-serif);line-height:1.35;pointer-events:auto;resize:both;transform:translate(-8px,-8px)}.canvas-save-state{position:absolute;left:50%;bottom:76px;z-index:11;transform:translate(-50%);padding:6px 10px;border-radius:6px;background:#0c0e11e0;border:1px solid rgba(255,255,255,.12);color:#ffffffd1;font-size:12px;font-weight:600;pointer-events:none}.canvas-save-state--error{border-color:#f8717180;color:#fecaca}.canvas-memo:focus{outline:2px solid rgba(100,200,255,.72);outline-offset:2px}.canvas-toolbar{position:absolute;left:50%;bottom:24px;z-index:12;display:flex;align-items:center;gap:4px;padding:5px;border-radius:8px;transform:translate(-50%);background:#0c0e11f0;border:1px solid rgba(255,255,255,.14);box-shadow:0 12px 32px #00000057;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.canvas-toolbar__button{position:relative;display:inline-flex;width:38px;height:38px;align-items:center;justify-content:center;border:0;border-radius:6px;background:transparent;color:#ffffffb8;cursor:pointer;transition:background .15s ease,color .15s ease,transform .15s ease}.canvas-toolbar__button:hover{background:#ffffff1a;color:#fff}.canvas-toolbar__button:active{transform:translateY(1px) scale(.98)}.canvas-toolbar__button--active{background:#64c8ff33;color:#fff;box-shadow:inset 0 0 0 1px #64c8ff6b}.canvas-toolbar__button--primary{background:#64c8ff29;color:#fff}.canvas-toolbar__split-button{position:relative;display:inline-flex;align-items:stretch;flex:0 0 auto;overflow:visible;border-radius:6px}.canvas-toolbar__split-button--active{background:#f871711f}.canvas-toolbar__button--split-main{width:38px;border-radius:6px 0 0 6px}.canvas-toolbar__button--split-menu{width:26px;border-left:1px solid rgba(255,255,255,.1);border-radius:0 6px 6px 0;background:#ffffff0a;color:#ffffffdb}.canvas-toolbar__button--split-menu:hover{background:#ffffff24;color:#fff}.canvas-toolbar__split-button--active .canvas-toolbar__button--split-menu{background:#f8717129;color:#fff}.canvas-toolbar__divider{width:1px;height:26px;flex:0 0 auto;margin:0 4px;background:#ffffff24}.canvas-toolbar__button--mask:disabled{background:#ffffff05;color:#ffffff42;box-shadow:none}.canvas-toolbar__icon--small{width:14px;height:14px}.canvas-toolbar__eraser-menu{position:absolute;left:0;bottom:calc(100% + 8px);z-index:14;display:grid;min-width:148px;gap:2px;padding:5px;border:1px solid rgba(255,255,255,.16);border-radius:8px;background:#0c0e11f7;box-shadow:0 12px 28px #00000052}.canvas-toolbar__eraser-menu-item{min-height:34px;border:0;border-radius:6px;background:transparent;color:#ffffffc7;cursor:pointer;font-size:13px;text-align:left}.canvas-toolbar__eraser-menu-item:hover,.canvas-toolbar__eraser-menu-item--active{background:#f871712e;color:#fff}.canvas-toolbar__button--busy{cursor:progress}.canvas-toolbar__style-trigger{flex-direction:column;gap:3px}.canvas-style-trigger__swatch{display:block;width:18px;height:12px;border-radius:4px;border:1px solid rgba(255,255,255,.32)}.canvas-style-trigger__width{display:block;width:18px;border-radius:2px;background:#ffffffb8}.canvas-style-popover{position:absolute;bottom:calc(100% + 8px);left:0;z-index:14;display:grid;gap:8px;padding:8px;border-radius:8px;background:#0c0e11f7;border:1px solid rgba(255,255,255,.16);box-shadow:0 12px 28px #00000052}.canvas-style-popover__row{display:flex;align-items:center;gap:6px}.canvas-style-swatch{width:22px;height:22px;border-radius:999px;border:2px solid rgba(255,255,255,.18);cursor:pointer;padding:0;transition:transform .12s ease,box-shadow .12s ease,border-color .12s ease}.canvas-style-swatch:hover{transform:scale(1.06)}.canvas-style-swatch--active{border-color:#fff;box-shadow:0 0 0 2px #64c8ff8c}.canvas-style-width{width:32px;height:22px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:#ffffff0f;cursor:pointer;padding:0}.canvas-style-width:hover{background:#ffffff1f}.canvas-style-width span{display:block;width:18px;border-radius:2px}.canvas-style-width--active{background:#64c8ff38;box-shadow:inset 0 0 0 1px #64c8ff80}.canvas-toolbar__button:disabled{opacity:.4;cursor:not-allowed}.canvas-toolbar__icon{width:18px;height:18px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.8}.canvas-toolbar__shortcut{position:absolute;right:4px;bottom:3px;font-family:var(--font-mono, monospace);font-size:9px;font-weight:600;line-height:1;color:#ffffff75}@media(max-width:720px){.canvas-toolbar{left:max(12px,env(safe-area-inset-left));right:max(12px,env(safe-area-inset-right));bottom:max(12px,env(safe-area-inset-bottom));justify-content:center;flex-wrap:wrap;transform:none}.canvas-memo{min-width:140px;max-width:min(220px,70vw)}.canvas-save-state{left:max(12px,env(safe-area-inset-left));right:max(12px,env(safe-area-inset-right));bottom:calc(max(12px,env(safe-area-inset-bottom)) + 54px);transform:none;text-align:center}}.canvas__drop-overlay{position:absolute;inset:0;pointer-events:none;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--accent, #2563eb) 12%,transparent);border:2px dashed var(--accent, #2563eb);border-radius:var(--radius-lg, 14px);z-index:12;animation:canvas-drop-pulse 1.4s ease-in-out infinite}.canvas__drop-hint{font-size:15px;font-weight:600;color:var(--accent-fg, #fff);background:var(--accent, #2563eb);padding:10px 18px;border-radius:999px;box-shadow:0 12px 32px -12px #0000004d}@keyframes canvas-drop-pulse{0%,to{background:color-mix(in srgb,var(--accent, #2563eb) 10%,transparent)}50%{background:color-mix(in srgb,var(--accent, #2563eb) 18%,transparent)}}.canvas--space-held .canvas-annotation-frame,.canvas--zoom-hand .canvas-annotation-frame{cursor:grab}.canvas--pan-active .canvas-annotation-frame{cursor:grabbing!important}.canvas-annotation-frame--alpha{background-image:linear-gradient(45deg,rgba(127,127,127,.18) 25%,transparent 25%),linear-gradient(-45deg,rgba(127,127,127,.18) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(127,127,127,.18) 75%),linear-gradient(-45deg,transparent 75%,rgba(127,127,127,.18) 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0;background-color:var(--surface)}.canvas-toolbar__bg{display:inline-flex;align-items:center;gap:4px;padding:0 4px;border-left:1px solid var(--border);border-right:1px solid var(--border);margin:0 4px}.canvas-toolbar__bg-tab{font-size:11px;padding:4px 7px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--text-dim);cursor:pointer}.canvas-toolbar__bg-tab.active{background:var(--surface-2, var(--surface));color:var(--text);border-color:var(--border)}.canvas-toolbar__bg input[type=color]{width:22px;height:22px;padding:0;border:1px solid var(--border);border-radius:5px;background:transparent;cursor:pointer}.canvas-mode-topbar__stack{display:inline-flex;flex-direction:column;align-items:flex-start;gap:6px;pointer-events:auto}.canvas-mode-topbar__stack .canvas-toolbar__zoom{padding:3px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:#0c0e11c7;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.canvas-mode-topbar__shortcuts{color:#ffffff7a;font-size:11px;font-weight:650}.canvas-viewport-minimap{position:absolute;right:18px;bottom:78px;z-index:8;width:118px;height:86px;overflow:hidden;padding:0;border:1px solid var(--minimap-border, rgba(255, 255, 255, .18));border-radius:8px;background:var(--minimap-bg, rgba(12, 14, 17, .92));box-shadow:0 16px 34px #00000057;cursor:pointer}.canvas-viewport-minimap img{width:100%;height:100%;object-fit:contain;opacity:.74}.canvas-viewport-minimap__window{position:absolute;border:2px solid rgba(100,200,255,.95);background:#64c8ff1f;box-shadow:0 0 0 999px var(--minimap-mask, rgba(10, 10, 10, .58));transform:translate(-50%,-50%)}.canvas-tool-picker{position:relative;display:inline-flex}.canvas-tool-picker__menu{position:absolute;left:0;bottom:46px;display:flex;flex-direction:column;min-width:150px;padding:5px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:#0c0e11f7;box-shadow:0 14px 34px #00000061;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.canvas-tool-picker__item{display:grid;grid-template-columns:22px 1fr auto;align-items:center;gap:9px;min-height:34px;padding:0 8px;border:0;border-radius:6px;background:transparent;color:#ffffffb8;font-size:12px;font-weight:700;text-align:left;cursor:pointer}.canvas-tool-picker__item:hover,.canvas-tool-picker__item.active{background:#64c8ff29;color:#fff}.canvas-tool-picker__item .canvas-toolbar__icon{width:18px;height:18px}.canvas-tool-picker__item kbd{min-width:18px;color:#ffffff80;font:700 11px/1 var(--font-mono, monospace);text-align:right}.canvas-background-cleanup-mask{position:absolute;inset:0;z-index:1;width:100%;height:100%;pointer-events:none;opacity:.9}.canvas-annotation-frame--cleanup-picking{cursor:crosshair!important}.canvas-annotation-frame--cleanup-mask{box-shadow:0 0 0 1px #a855f742}.canvas-toolbar__zoom{display:inline-flex;align-items:center;gap:3px;padding:0 4px;border-left:1px solid var(--border)}.canvas-toolbar__zoom-button,.canvas-toolbar__zoom-value{display:inline-flex;height:30px;align-items:center;justify-content:center;border:1px solid transparent;border-radius:6px;background:transparent;color:#ffffffbd;font-weight:750;cursor:pointer}.canvas-toolbar__zoom-button{width:30px}.canvas-toolbar__zoom-value{min-width:52px;padding:0 7px;font-size:11px}.canvas-toolbar__zoom-button:hover,.canvas-toolbar__zoom-value:hover{border-color:#ffffff1f;background:#ffffff17;color:#fff}.canvas-toolbar__cleanup{position:relative;display:inline-flex}.canvas-toolbar__cleanup-panel{position:absolute;right:0;bottom:48px;width:278px;padding:10px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:#0c0e11f7;box-shadow:0 16px 36px #00000061;color:#ffffffd6;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.canvas-toolbar__cleanup-row,.canvas-toolbar__cleanup-actions,.canvas-toolbar__cleanup-slider,.canvas-toolbar__segmented-row{display:flex;align-items:center;gap:8px}.canvas-toolbar__cleanup-row{justify-content:space-between;margin-bottom:8px}.canvas-toolbar__cleanup-title{font-size:12px;font-weight:700}.canvas-toolbar__cleanup-meta,.canvas-toolbar__cleanup-status{color:#ffffff94;font-size:11px;font-weight:600}.canvas-toolbar__cleanup-slider{margin-bottom:9px}.canvas-toolbar__cleanup-slider span,.canvas-toolbar__cleanup-slider output,.canvas-toolbar__segmented-label{min-width:34px;font-size:11px;font-weight:650;color:#ffffffad}.canvas-toolbar__cleanup-slider input{flex:1;min-width:0;accent-color:rgba(100,200,255,.9)}.canvas-toolbar__cleanup-actions{margin-top:7px}.canvas-toolbar__cleanup-actions button{min-height:28px;padding:0 8px;border:1px solid rgba(255,255,255,.12);border-radius:6px;background:#ffffff0f;color:#ffffffc7;font-size:11px;font-weight:700;cursor:pointer}.canvas-toolbar__cleanup-actions button:hover:not(:disabled),.canvas-toolbar__cleanup-actions button.active{background:#64c8ff2e;color:#fff}.canvas-toolbar__cleanup-actions button:disabled{opacity:.44;cursor:not-allowed}.canvas-toolbar__cleanup-status{margin-top:8px}.canvas-toolbar__cleanup-status--active{color:#d8b4fe}.canvas-toolbar__segmented-row{margin-bottom:8px}.canvas-toolbar__segmented{display:grid;flex:1;grid-template-columns:repeat(2,minmax(0,1fr));min-width:0;padding:2px;border:1px solid rgba(255,255,255,.12);border-radius:7px;background:#ffffff0d}.canvas-toolbar__segmented-button{min-height:26px;border:0;border-radius:5px;background:transparent;color:#ffffffa8;font-size:11px;font-weight:750;cursor:pointer}.canvas-toolbar__segmented-button[aria-pressed=true]{background:#ffffff24;color:#fff}.canvas-toolbar__segmented-button[data-value=remove][aria-pressed=true]{background:#ff575740}.canvas-toolbar__segmented-button[data-value=preserve][aria-pressed=true]{background:#40d27d3d}.canvas-cleanup-overlay{position:absolute;inset:0;z-index:3;width:100%;height:100%;overflow:visible;pointer-events:none}.canvas-cleanup-overlay__stroke{fill:none;stroke-linecap:round;stroke-linejoin:round;opacity:.74}.canvas-cleanup-overlay__stroke--remove{stroke:#ff4a4af2}.canvas-cleanup-overlay__stroke--preserve{stroke:#3ad677f2}.canvas-cleanup-cursor{fill:#ffffff0d;stroke:#ffffffe6;stroke-width:1.4;pointer-events:none}
@@ -0,0 +1 @@
1
+ import{b as c,j as o,u as ke,p as tn,q as St,s as me,t as nn,v as Bt,w as an,c as j,x as rn,d as on,y as sn,z as ln,M as cn,A as un}from"./index-C9cXwiWE.js";const Ae=2,Oe=1e-6;function dn({paths:e,points:t,radius:n,makeId:a=()=>crypto.randomUUID()}){if(e.length===0||t.length===0||n<=0)return{paths:e,changed:!1};let r=!1;const l=[];for(const s of e){const d=hn(s,t,n,a);(d.length!==1||d[0]!==s)&&(r=!0),l.push(...d)}return{paths:l,changed:r}}function hn(e,t,n,a=()=>crypto.randomUUID()){if(e.points.length<Ae||t.length===0||n<=0)return[e];const r=[];let l=Te(e.points[0],t,n)?[]:[e.points[0]];for(let d=1;d<e.points.length;d+=1){const u=e.points[d-1],i=e.points[d],v=Te(i,t,n),f=fn(u,i,t,n);if(f){l.length===0&&!Te(u,t,n)&&(l=[u]),l.length>0&&f.leftT>Oe&&ft(l,Pe(u,i,f.leftT)),l.length>=Ae&&r.push(l),l=[],f.rightT<1-Oe&&!v&&(l=[Pe(u,i,f.rightT),i]);continue}if(v){l.length>=Ae&&r.push(l),l=[];continue}l.length===0&&!Te(u,t,n)&&(l=[u]),ft(l,i)}if(l.length>=Ae&&r.push(l),r.length===0)return[];if(r.length===1&&r[0].length===e.points.length)return[e];const s=e.tool==="arrow"?r.length-1:-1;return r.map((d,u)=>({...e,id:u===0?e.id:a(),tool:e.tool==="arrow"&&u!==s?"pen":e.tool,points:d}))}function Te(e,t,n){if(t.length===1)return ye(e,t[0])<=n;for(let a=1;a<t.length;a+=1)if(pn(e,t[a-1],t[a])<=n)return!0;return!1}function ye(e,t){const n=e.x-t.x,a=e.y-t.y;return Math.sqrt(n*n+a*a)}function fn(e,t,n,a){const r=ye(e,t);if(r<=Oe)return Te(e,n,a)?{leftT:0,rightT:1}:null;let l=null,s=Number.POSITIVE_INFINITY;for(const u of n){const i=ht(u,e,t),v=Pe(e,t,i),f=ye(u,v);f<s&&(s=f,l=i)}for(let u=1;u<n.length;u+=1){const i=[0,.25,.5,.75,1];for(const v of i){const f=Pe(n[u-1],n[u],v),_=ht(f,e,t),B=Pe(e,t,_),A=ye(f,B);A<s&&(s=A,l=_)}}if(l===null||s>a)return null;const d=Math.max(a/r,.01);return{leftT:Math.max(0,l-d),rightT:Math.min(1,l+d)}}function ht(e,t,n){const a=n.x-t.x,r=n.y-t.y,l=e.x-t.x,s=e.y-t.y,d=a*a+r*r;return d===0?0:Math.max(0,Math.min(1,(l*a+s*r)/d))}function Pe(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function ft(e,t){const n=e.at(-1);(!n||ye(n,t)>Oe)&&e.push(t)}function pn(e,t,n){const a=n.x-t.x,r=n.y-t.y,l=e.x-t.x,s=e.y-t.y,d=a*a+r*r;if(d===0)return ye(e,t);const u=Math.max(0,Math.min(1,(l*a+s*r)/d));return ye(e,{x:t.x+u*a,y:t.y+u*r})}function st(e,t){return`${e}:${t}`}function lt(e){const t=e.indexOf(":");if(t<=0)return null;const n=e.slice(0,t),a=e.slice(t+1);return!a||n!=="path"&&n!=="box"&&n!=="memo"?null:{kind:n,id:a}}function jt(e){return st("path",e.id)}function Tt(e){return st("box",e.id)}function Pt(e){return st("memo",e.id)}function pe(e,t,n){const a=lt(e);return a?.kind===t&&a.id===n}const Dt="ima2.canvas.annotationStyle.v1",At=["#ef4444","#f97316","#eab308","#22c55e","#38bdf8","#6366f1","#a855f7","#111827","#ffffff"],It=[2,3,5,8],Se={color:"#ef4444",strokeWidth:3};function mn(){if(typeof window>"u")return Se;try{const e=window.localStorage.getItem(Dt);if(!e)return Se;const t=JSON.parse(e),n=typeof t.color=="string"&&At.includes(t.color)?t.color:Se.color,a=typeof t.strokeWidth=="number"&&It.includes(t.strokeWidth)?t.strokeWidth:Se.strokeWidth;return{color:n,strokeWidth:a}}catch{return Se}}function vn(e){if(!(typeof window>"u"))try{window.localStorage.setItem(Dt,JSON.stringify(e))}catch{}}const pt=mn(),tt={activeTool:"select",toolColor:pt.color,strokeWidth:pt.strokeWidth,paths:[],boxes:[],memos:[],activeMemoId:null,activePath:null,activeBox:null,eraserMode:"object",activeEraserStroke:null,eraserBaseline:null,selectionBox:null,selectedIds:[],past:[],future:[],memoBaseline:null,moveBaseline:null,isDirty:!1};function xe(e){return{paths:e.paths,boxes:e.boxes,memos:e.memos}}function ge(e){return{...e,past:[...e.past.slice(-49),xe(e)],future:[]}}function Ge(e,t){return{...e,past:[...e.past.slice(-49),t],future:[]}}function bn(e,t){return JSON.stringify(e)===JSON.stringify(t)}function mt(e,t){return{...e,...t,activeMemoId:null,activePath:null,activeBox:null,selectionBox:null,selectedIds:[],isDirty:!0}}function gn(e,t,n){const{start:a,current:r}=e,l=Math.min(a.x,r.x),s=Math.min(a.y,r.y),d=Math.abs(r.x-a.x),u=Math.abs(r.y-a.y);return d<.01||u<.01?null:{id:crypto.randomUUID(),x:l,y:s,width:d,height:u,color:t,strokeWidth:n}}function xn(e,t){return{...e,x:Math.min(1-e.width,Math.max(0,e.x+t.x)),y:Math.min(1-e.height,Math.max(0,e.y+t.y))}}function Ze(e,t){return{x:Math.min(1,Math.max(0,e.x+t.x)),y:Math.min(1,Math.max(0,e.y+t.y))}}function yn(e,t){switch(t.type){case"SET_TOOL":return{...e,activeTool:t.tool};case"SET_ERASER_MODE":return{...e,eraserMode:t.mode};case"SET_STYLE":return{...e,toolColor:t.style.color,strokeWidth:t.style.strokeWidth};case"START_PATH":return{...e,isDirty:!0,activePath:{id:crypto.randomUUID(),tool:e.activeTool,points:[t.point],color:e.toolColor,strokeWidth:e.strokeWidth}};case"ADD_POINT":return e.activePath?{...e,activePath:{...e.activePath,points:[...e.activePath.points,t.point]}}:e;case"END_PATH":return!e.activePath||e.activePath.points.length<2?{...e,activePath:null}:{...ge(e),isDirty:!0,paths:[...e.paths,e.activePath],activePath:null};case"START_BOX":return{...e,isDirty:!0,activeBox:{start:t.point,current:t.point}};case"UPDATE_BOX":return e.activeBox?{...e,activeBox:{...e.activeBox,current:t.point}}:e;case"END_BOX":{if(!e.activeBox)return e;const n=gn(e.activeBox,e.toolColor,e.strokeWidth);return n?{...ge(e),isDirty:!0,boxes:[...e.boxes,n],activeBox:null}:{...e,activeBox:null}}case"CREATE_MEMO":{const n=crypto.randomUUID(),a={id:n,x:t.point.x,y:t.point.y,text:"",color:e.toolColor};return{...ge(e),isDirty:!0,memos:[...e.memos,a],activeMemoId:n}}case"UPDATE_MEMO":return{...e,isDirty:!0,memos:e.memos.map(n=>n.id===t.id?{...n,text:t.text}:n)};case"COMMIT_MEMO_EDIT":return e.memoBaseline?bn(e.memoBaseline,xe(e))?{...e,memoBaseline:null,activeMemoId:null}:{...Ge(e,e.memoBaseline),memoBaseline:null,activeMemoId:null,isDirty:!0}:{...e,activeMemoId:null};case"DELETE_MEMO":return{...ge(e),isDirty:!0,memos:e.memos.filter(n=>n.id!==t.id),activeMemoId:e.activeMemoId===t.id?null:e.activeMemoId,selectedIds:e.selectedIds.filter(n=>!pe(n,"memo",t.id))};case"FOCUS_MEMO":return{...e,activeMemoId:t.id,memoBaseline:t.id&&e.activeMemoId!==t.id&&!e.memoBaseline?xe(e):e.memoBaseline};case"CLEAR":return{...ge(e),isDirty:!0,paths:[],boxes:[],memos:[],activeMemoId:null,activePath:null,activeBox:null,selectionBox:null,selectedIds:[]};case"LOAD":return{...tt,activeTool:e.activeTool,eraserMode:e.eraserMode,toolColor:e.toolColor,strokeWidth:e.strokeWidth,...t.payload};case"MARK_SAVED":return{...e,isDirty:!1};case"RESET_LOCAL":return{...tt,activeTool:e.activeTool,eraserMode:e.eraserMode,toolColor:e.toolColor,strokeWidth:e.strokeWidth};case"UNDO":{const n=e.past.at(-1);return n?{...mt(e,n),past:e.past.slice(0,-1),future:[xe(e),...e.future]}:e}case"REDO":{const n=e.future[0];return n?{...mt(e,n),past:[...e.past.slice(-49),xe(e)],future:e.future.slice(1)}:e}case"SELECT_ONE":return{...e,selectedIds:[t.id],selectionBox:null};case"TOGGLE_SELECTED":return{...e,selectedIds:e.selectedIds.includes(t.id)?e.selectedIds.filter(n=>n!==t.id):[...e.selectedIds,t.id],selectionBox:null};case"CLEAR_SELECTION":return{...e,selectedIds:[],selectionBox:null};case"DELETE_SELECTED":return e.selectedIds.length===0?e:{...ge(e),isDirty:!0,paths:e.paths.filter(n=>!e.selectedIds.some(a=>pe(a,"path",n.id))),boxes:e.boxes.filter(n=>!e.selectedIds.some(a=>pe(a,"box",n.id))),memos:e.memos.filter(n=>!e.selectedIds.some(a=>pe(a,"memo",n.id))),selectedIds:[]};case"MOVE_SELECTED":return e.selectedIds.length===0?e:{...e,isDirty:!0,paths:e.paths.map(n=>e.selectedIds.some(a=>pe(a,"path",n.id))?{...n,points:n.points.map(a=>Ze(a,t.delta))}:n),boxes:e.boxes.map(n=>e.selectedIds.some(a=>pe(a,"box",n.id))?xn(n,t.delta):n),memos:e.memos.map(n=>e.selectedIds.some(a=>pe(a,"memo",n.id))?{...n,x:Ze(n,t.delta).x,y:Ze(n,t.delta).y}:n)};case"START_SELECTED_MOVE":return{...e,moveBaseline:xe(e)};case"COMMIT_SELECTED_MOVE":return e.moveBaseline?{...Ge(e,e.moveBaseline),moveBaseline:null,isDirty:!0}:e;case"START_SELECTION_BOX":return{...e,selectionBox:{start:t.point,current:t.point},selectedIds:[]};case"UPDATE_SELECTION_BOX":return e.selectionBox?{...e,selectionBox:{...e.selectionBox,current:t.point}}:e;case"END_SELECTION_BOX":return{...e,selectionBox:null,selectedIds:t.ids};case"ERASE_OBJECT":{const n=lt(t.id);return!n||!(n.kind==="path"?e.paths.some(r=>r.id===n.id):n.kind==="box"?e.boxes.some(r=>r.id===n.id):e.memos.some(r=>r.id===n.id))?e:{...ge(e),isDirty:!0,paths:n.kind==="path"?e.paths.filter(r=>r.id!==n.id):e.paths,boxes:n.kind==="box"?e.boxes.filter(r=>r.id!==n.id):e.boxes,memos:n.kind==="memo"?e.memos.filter(r=>r.id!==n.id):e.memos,selectedIds:e.selectedIds.filter(r=>r!==t.id)}}case"START_ERASER_STROKE":return{...e,activeEraserStroke:{points:[t.point],radius:.018},eraserBaseline:xe(e)};case"UPDATE_ERASER_STROKE":return e.activeEraserStroke?{...e,activeEraserStroke:{...e.activeEraserStroke,points:[...e.activeEraserStroke.points,t.point]}}:e;case"END_ERASER_STROKE":{if(!e.activeEraserStroke||!e.eraserBaseline)return{...e,activeEraserStroke:null,eraserBaseline:null};const n=dn({paths:e.paths,points:e.activeEraserStroke.points,radius:e.activeEraserStroke.radius});return n.changed?{...Ge(e,e.eraserBaseline),paths:n.paths,activeEraserStroke:null,eraserBaseline:null,selectedIds:[],isDirty:!0}:{...e,activeEraserStroke:null,eraserBaseline:null}}default:return e}}function kn(){const[e,t]=c.useReducer(yn,tt),n=c.useMemo(()=>e.paths.length>0||e.boxes.length>0||e.memos.length>0,[e.paths.length,e.boxes.length,e.memos.length]),a=e.past.length>0,r=e.future.length>0,l=c.useCallback(g=>t({type:"SET_TOOL",tool:g}),[]),s=c.useCallback(g=>{vn(g),t({type:"SET_STYLE",style:g})},[]),d=c.useCallback(()=>t({type:"CLEAR"}),[]),u=c.useCallback(g=>t({type:"LOAD",payload:g}),[]),i=c.useCallback(()=>t({type:"MARK_SAVED"}),[]),v=c.useCallback(()=>t({type:"RESET_LOCAL"}),[]),f=c.useCallback(()=>t({type:"UNDO"}),[]),_=c.useCallback(()=>t({type:"REDO"}),[]),B=c.useCallback(()=>t({type:"COMMIT_MEMO_EDIT"}),[]),A=c.useCallback(()=>t({type:"START_SELECTED_MOVE"}),[]),U=c.useCallback(()=>t({type:"COMMIT_SELECTED_MOVE"}),[]),T=c.useCallback(g=>{e.activeTool==="pen"||e.activeTool==="arrow"?t({type:"START_PATH",point:g}):e.activeTool==="box"&&t({type:"START_BOX",point:g})},[e.activeTool]),N=c.useCallback(g=>{e.activePath?t({type:"ADD_POINT",point:g}):e.activeBox&&t({type:"UPDATE_BOX",point:g})},[e.activePath,e.activeBox]),p=c.useCallback(()=>{e.activePath?t({type:"END_PATH"}):e.activeBox&&t({type:"END_BOX"})},[e.activePath,e.activeBox]),C=c.useCallback(g=>t({type:"CREATE_MEMO",point:g}),[]),M=c.useCallback((g,D)=>t({type:"UPDATE_MEMO",id:g,text:D}),[]),k=c.useCallback(g=>t({type:"DELETE_MEMO",id:g}),[]),m=c.useCallback(g=>t({type:"FOCUS_MEMO",id:g}),[]),X=c.useCallback(g=>t({type:"SET_ERASER_MODE",mode:g}),[]),R=c.useCallback(g=>t({type:"SELECT_ONE",id:g}),[]),W=c.useCallback(g=>t({type:"TOGGLE_SELECTED",id:g}),[]),x=c.useCallback(()=>t({type:"CLEAR_SELECTION"}),[]),E=c.useCallback(()=>t({type:"DELETE_SELECTED"}),[]),S=c.useCallback(g=>t({type:"MOVE_SELECTED",delta:g}),[]),P=c.useCallback(g=>t({type:"START_SELECTION_BOX",point:g}),[]),G=c.useCallback(g=>t({type:"UPDATE_SELECTION_BOX",point:g}),[]),Q=c.useCallback(g=>t({type:"END_SELECTION_BOX",ids:g}),[]),ee=c.useCallback(g=>t({type:"ERASE_OBJECT",id:g}),[]),te=c.useCallback(g=>t({type:"START_ERASER_STROKE",point:g}),[]),le=c.useCallback(g=>t({type:"UPDATE_ERASER_STROKE",point:g}),[]),I=c.useCallback(()=>t({type:"END_ERASER_STROKE"}),[]),F=c.useCallback(()=>({paths:e.paths,boxes:e.boxes,memos:e.memos}),[e.paths,e.boxes,e.memos]);return{...e,canUndo:a,canRedo:r,hasAnnotations:n,setTool:l,setStyle:s,setEraserMode:X,startDrawing:T,moveDrawing:N,endDrawing:p,createMemo:C,updateMemo:M,commitMemoEdit:B,deleteMemo:k,focusMemo:m,clear:d,load:u,toPayload:F,markSaved:i,resetLocal:v,undo:f,redo:_,selectOne:R,toggleSelected:W,clearSelection:x,deleteSelected:E,moveSelected:S,startSelectedMove:A,commitSelectedMove:U,startSelectionBox:P,updateSelectionBox:G,endSelectionBox:Q,eraseObjectAtPoint:ee,startEraserStroke:te,updateEraserStroke:le,endEraserStroke:I}}function Ie(e,t){return{x:e.x*t.width,y:e.y*t.height}}function nt(e,t,n){if(t.points.length<2)return;const a=Ie(t.points[0],n);e.save(),e.beginPath(),e.strokeStyle=t.color,e.lineWidth=t.strokeWidth,e.lineCap="round",e.lineJoin="round",e.moveTo(a.x,a.y);for(const r of t.points.slice(1)){const l=Ie(r,n);e.lineTo(l.x,l.y)}if(e.stroke(),t.tool==="arrow"){const r=Ie(t.points[t.points.length-1],n),l=Ie(t.points[t.points.length-2],n);_n(e,l,r,t.color,t.strokeWidth)}e.restore()}function at(e,t,n,a){const r="start"in t?{x:Math.min(t.start.x,t.current.x),y:Math.min(t.start.y,t.current.y),width:Math.abs(t.current.x-t.start.x),height:Math.abs(t.current.y-t.start.y),color:"#64c8ff",strokeWidth:2}:t;e.save(),e.strokeStyle=r.color,e.lineWidth=a==="active"?Math.max(2,r.strokeWidth):r.strokeWidth,a==="active"&&e.setLineDash([8,6]),e.strokeRect(r.x*n.width,r.y*n.height,r.width*n.width,r.height*n.height),e.restore()}function Cn(e,t,n){const a=t.x*n.width,r=t.y*n.height,l=Math.min(260,Math.max(150,n.width*.22)),s=12,d=18;e.save(),e.font="14px sans-serif";const u=Mn(e,t.text.trim()||" ",l-s*2),i=Math.max(52,s*2+u.length*d);e.fillStyle="rgba(255, 246, 179, 0.96)",e.strokeStyle="rgba(44, 37, 12, 0.28)",e.lineWidth=1,En(e,a,r,l,i,8),e.fill(),e.stroke(),e.fillStyle="#2f2a13",e.textBaseline="top",u.forEach((v,f)=>{e.fillText(v,a+s,r+s+f*d)}),e.restore()}function wn(e,t){const n=lt(e);if(!n)return null;if(n.kind==="box")return t.boxes.find(i=>i.id===n.id)??null;const a=n.kind==="memo"?t.memos.find(i=>i.id===n.id):null;if(a)return{id:a.id,x:a.x,y:a.y,width:.18,height:.12,color:a.color,strokeWidth:1};if(n.kind!=="path")return null;const r=t.paths.find(i=>i.id===n.id);if(!r||r.points.length===0)return null;const l=r.points.map(i=>i.x),s=r.points.map(i=>i.y),d=Math.min(...l),u=Math.min(...s);return{id:r.id,x:d,y:u,width:Math.max(.01,Math.max(...l)-d),height:Math.max(.01,Math.max(...s)-u),color:r.color,strokeWidth:r.strokeWidth}}function vt(e,t,n){const a="start"in t?{x:Math.min(t.start.x,t.current.x),y:Math.min(t.start.y,t.current.y),width:Math.abs(t.current.x-t.start.x),height:Math.abs(t.current.y-t.start.y)}:t;e.save(),e.strokeStyle="#64c8ff",e.lineWidth=2,e.setLineDash([5,5]),e.strokeRect(a.x*n.width,a.y*n.height,a.width*n.width,a.height*n.height),e.restore()}function _n(e,t,n,a,r){const l=Math.atan2(n.y-t.y,n.x-t.x),s=Math.max(12,r*4),d=Math.PI/7;e.save(),e.fillStyle=a,e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-s*Math.cos(l-d),n.y-s*Math.sin(l-d)),e.lineTo(n.x-s*Math.cos(l+d),n.y-s*Math.sin(l+d)),e.closePath(),e.fill(),e.restore()}function Mn(e,t,n){const a=t.split(/\s+/).filter(Boolean);if(a.length===0)return[""];const r=[];let l="";for(const s of a){const d=l?`${l} ${s}`:s;if(e.measureText(d).width<=n||l===""){l=d;continue}r.push(l),l=s}return l&&r.push(l),r}function En(e,t,n,a,r,l){const s=Math.min(l,a/2,r/2);e.beginPath(),e.moveTo(t+s,n),e.lineTo(t+a-s,n),e.quadraticCurveTo(t+a,n,t+a,n+s),e.lineTo(t+a,n+r-s),e.quadraticCurveTo(t+a,n+r,t+a-s,n+r),e.lineTo(t+s,n+r),e.quadraticCurveTo(t,n+r,t,n+r-s),e.lineTo(t,n+s),e.quadraticCurveTo(t,n,t+s,n),e.closePath()}function Sn({paths:e,boxes:t,memos:n=[],selectedIds:a=[],selectionBox:r=null,activePath:l,activeBox:s}){const d=c.useRef(null);return c.useEffect(()=>{const u=d.current;if(!u)return;const i=u.getBoundingClientRect(),v=window.devicePixelRatio||1;u.width=Math.max(1,Math.round(i.width*v)),u.height=Math.max(1,Math.round(i.height*v));const f=u.getContext("2d");if(!f)return;f.setTransform(v,0,0,v,0,0),f.clearRect(0,0,i.width,i.height);const _={width:i.width,height:i.height};for(const B of e)nt(f,B,_);for(const B of t)at(f,B,_,"committed");for(const B of a){const A=wn(B,{paths:e,boxes:t,memos:n});A&&vt(f,A,_)}r&&vt(f,r,_),l&&nt(f,l,_),s&&at(f,s,_,"active")},[e,t,n,a,r,l,s]),o.jsx("canvas",{ref:d,className:"canvas-annotation-layer","aria-hidden":"true"})}function Ne(e){e.stopPropagation()}function Bn({memos:e,activeMemoId:t,onUpdate:n,onDelete:a,onFocus:r,onCommit:l}){return o.jsx("div",{className:"canvas-memo-overlay",children:e.map(s=>o.jsx("textarea",{className:`canvas-memo${t===s.id?" canvas-memo--active":""}`,value:s.text,style:{left:`${s.x*100}%`,top:`${s.y*100}%`},autoFocus:t===s.id,onFocus:()=>r(s.id),onPointerDown:Ne,onPointerMove:Ne,onPointerUp:Ne,onPointerCancel:Ne,onChange:d=>n(s.id,d.currentTarget.value),onBlur:()=>{l?.(),s.text.trim()===""&&a(s.id)},"aria-label":"Canvas memo"},s.id))})}function jn({annotationFrameRef:e,imageElementRef:t,frameClassName:n,frameStyle:a,imageKey:r,imageSrc:l,fallbackImage:s,alt:d,canvasOpen:u,maskOverlayUrl:i,cleanupLayer:v,annotations:f,onOpenCanvas:_,onPointerDown:B,onPointerMove:A,onPointerUp:U,onPointerLeave:T}){return o.jsxs("div",{ref:e,className:n,onPointerDown:B,onPointerMove:A,onPointerUp:U,onPointerCancel:U,onPointerLeave:T,style:a,children:[o.jsx("img",{ref:t,className:"result-img",src:l??s,alt:d,onDoubleClick:N=>{N.stopPropagation(),_()}},r),u&&i?o.jsx("img",{className:"canvas-background-cleanup-mask",src:i,alt:"","aria-hidden":"true"}):null,u?v:null,u&&o.jsxs(o.Fragment,{children:[o.jsx(Sn,{paths:f.paths,boxes:f.boxes,memos:f.memos,selectedIds:f.selectedIds,selectionBox:f.selectionBox,activePath:f.activePath,activeBox:f.activeBox}),o.jsx(Bn,{memos:f.memos,activeMemoId:f.activeMemoId,onUpdate:f.updateMemo,onDelete:f.deleteMemo,onFocus:f.focusMemo,onCommit:f.commitMemoEdit})]})]})}function Tn(e){return`${e.x*100} ${e.y*100}`}function Pn(e){return e.map(Tn).join(" ")}function Dn({seeds:e,brushStrokes:t,brushCursor:n,brushRadius:a,active:r}){if(!r&&e.length===0&&t.length===0)return null;const l=a*100;return o.jsxs("svg",{className:"canvas-cleanup-overlay",viewBox:"0 0 100 100",preserveAspectRatio:"none","aria-hidden":"true",children:[t.map(s=>o.jsx("polyline",{className:`canvas-cleanup-overlay__stroke canvas-cleanup-overlay__stroke--${s.intent}`,points:Pn(s.points),strokeWidth:Math.max(.3,s.radius*200),vectorEffect:"non-scaling-stroke"},s.id)),r&&n?o.jsx("circle",{className:"canvas-cleanup-cursor",cx:n.x*100,cy:n.y*100,r:Math.max(.6,l),vectorEffect:"non-scaling-stroke"}):null]})}function An({mode:e,matteColor:t,onModeChange:n,onMatteColorChange:a}){const{t:r}=ke();return o.jsxs("div",{className:"canvas-toolbar__bg",role:"group","aria-label":r("canvas.toolbar.bgGroup"),children:[o.jsx("button",{type:"button",className:`canvas-toolbar__bg-tab${e==="alpha"?" active":""}`,onClick:()=>n("alpha"),children:r("canvas.toolbar.bgAlpha")}),o.jsx("button",{type:"button",className:`canvas-toolbar__bg-tab${e==="matte"?" active":""}`,onClick:()=>n("matte"),children:r("canvas.toolbar.bgMatte")}),e==="matte"?o.jsx("input",{type:"color","aria-label":r("canvas.toolbar.bgMatteColor"),value:t,onChange:l=>a(l.target.value)}):null]})}function bt({label:e,value:t,options:n,onChange:a}){return o.jsxs("div",{className:"canvas-toolbar__segmented-row",children:[o.jsx("span",{className:"canvas-toolbar__segmented-label",children:e}),o.jsx("div",{className:"canvas-toolbar__segmented",role:"group","aria-label":e,children:n.map(r=>o.jsx("button",{type:"button",className:"canvas-toolbar__segmented-button","data-value":r.value,"aria-pressed":t===r.value,onClick:()=>a(r.value),children:r.label},r.value))})]})}function In({seedCount:e,tolerance:t,stats:n,hasPreview:a,isPickingSeed:r,intent:l,tool:s,brushRadius:d,isPreviewing:u,isApplying:i,keepOpen:v,disabled:f,onAutoSample:_,onPickSeed:B,onIntentChange:A,onToolChange:U,onBrushRadiusChange:T,onToleranceChange:N,onPreview:p,onApply:C,onReset:M}){const{t:k}=ke(),[m,X]=c.useState(!1),R=c.useRef(null),W=n?Math.round(n.removedPercent*1e3)/10:0,x=r||s==="brush";return c.useEffect(()=>{if(!m)return;const E=S=>{v||R.current?.contains(S.target)||X(!1)};return window.addEventListener("pointerdown",E),()=>window.removeEventListener("pointerdown",E)},[v,m]),o.jsxs("div",{className:"canvas-toolbar__cleanup",ref:R,children:[o.jsx("button",{type:"button",className:`canvas-toolbar__button${m||a?" canvas-toolbar__button--active":""}`,onClick:()=>X(E=>!E),disabled:f,"aria-expanded":m,"aria-label":k("canvas.toolbar.cleanup"),title:k("canvas.toolbar.cleanup"),children:o.jsx(Nn,{})}),m?o.jsxs("div",{className:"canvas-toolbar__cleanup-panel",role:"group","aria-label":k("canvas.toolbar.cleanup"),children:[o.jsxs("div",{className:"canvas-toolbar__cleanup-row",children:[o.jsx("span",{className:"canvas-toolbar__cleanup-title",children:k("canvas.toolbar.cleanup")}),o.jsx("span",{className:"canvas-toolbar__cleanup-meta",children:k("canvas.toolbar.cleanupSeedCount",{n:e})})]}),o.jsx(bt,{label:k("canvas.toolbar.cleanupMark"),value:l,options:[{value:"remove",label:k("canvas.toolbar.cleanupRemove")},{value:"preserve",label:k("canvas.toolbar.cleanupPreserve")}],onChange:A}),o.jsx(bt,{label:k("canvas.toolbar.cleanupInput"),value:s,options:[{value:"click",label:k("canvas.toolbar.cleanupClick")},{value:"brush",label:k("canvas.toolbar.cleanupBrush")}],onChange:U}),o.jsxs("label",{className:"canvas-toolbar__cleanup-slider",children:[o.jsx("span",{children:k("canvas.toolbar.cleanupTolerance")}),o.jsx("input",{type:"range",min:"0",max:"96",value:t,onChange:E=>N(Number(E.target.value))}),o.jsx("output",{children:t})]}),s==="brush"?o.jsxs("label",{className:"canvas-toolbar__cleanup-slider",children:[o.jsx("span",{children:k("canvas.toolbar.cleanupBrushSize")}),o.jsx("input",{type:"range",min:"0.006",max:"0.06",step:"0.002",value:d,onChange:E=>T(Number(E.target.value))}),o.jsx("output",{children:Math.round(d*1e3)})]}):null,o.jsxs("div",{className:"canvas-toolbar__cleanup-actions",children:[o.jsx("button",{type:"button",onClick:_,children:k("canvas.toolbar.cleanupAutoSample")}),o.jsx("button",{type:"button",className:r?"active":"",onClick:B,children:k(x?"canvas.toolbar.cleanupActive":"canvas.toolbar.cleanupPickSeed")})]}),o.jsxs("div",{className:"canvas-toolbar__cleanup-actions",children:[o.jsx("button",{type:"button",onClick:p,disabled:u||e===0,children:k(u?"canvas.toolbar.cleanupPreviewing":"canvas.toolbar.cleanupPreview")}),o.jsx("button",{type:"button",onClick:C,disabled:i||!a&&e===0,children:k(i?"canvas.toolbar.cleanupApplying":"canvas.toolbar.cleanupApply")}),o.jsx("button",{type:"button",onClick:M,disabled:!a&&e===0,children:k("canvas.toolbar.cleanupReset")})]}),x?o.jsx("div",{className:"canvas-toolbar__cleanup-status canvas-toolbar__cleanup-status--active",children:k(s==="brush"?"canvas.toolbar.cleanupBrushHint":"canvas.toolbar.cleanupPickHint")}):n&&!a?o.jsx("div",{className:"canvas-toolbar__cleanup-status canvas-toolbar__cleanup-status--active",children:k("canvas.toolbar.cleanupMaskHint")}):null,n?o.jsx("div",{className:"canvas-toolbar__cleanup-status",children:k("canvas.toolbar.cleanupRemoved",{n:W})}):null]}):null]})}function Nn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M5 7.5h14"}),o.jsx("path",{d:"M7 12h10"}),o.jsx("path",{d:"M10 16.5h4"}),o.jsx("path",{d:"M7.5 5.5 9 4l1.5 1.5L9 7 7.5 5.5Z"}),o.jsx("path",{d:"M13.5 11 15 9.5l1.5 1.5L15 12.5 13.5 11Z"}),o.jsx("path",{d:"M4.5 15.5 6 14l1.5 1.5L6 17 4.5 15.5Z"})]})}function Rn({style:e,onStyleChange:t}){const{t:n}=ke(),[a,r]=c.useState(!1),l=c.useRef(null);return c.useEffect(()=>{if(!a)return;const s=d=>{l.current?.contains(d.target)||r(!1)};return window.addEventListener("pointerdown",s),()=>window.removeEventListener("pointerdown",s)},[a]),o.jsxs("div",{ref:l,className:`canvas-toolbar__split-button${a?" canvas-toolbar__split-button--active":""}`,onKeyDown:s=>{s.key==="Escape"&&a&&(s.preventDefault(),s.stopPropagation(),r(!1))},children:[o.jsxs("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__style-trigger",onClick:()=>r(s=>!s),"aria-haspopup":"dialog","aria-expanded":a,"aria-label":n("canvas.toolbar.style"),title:n("canvas.toolbar.style"),children:[o.jsx("span",{className:"canvas-style-trigger__swatch",style:{background:e.color},"aria-hidden":"true"}),o.jsx("span",{className:"canvas-style-trigger__width",style:{height:`${Math.min(8,Math.max(2,e.strokeWidth))}px`},"aria-hidden":"true"})]}),a?o.jsxs("div",{className:"canvas-style-popover",role:"dialog","aria-label":n("canvas.toolbar.style"),children:[o.jsx("div",{className:"canvas-style-popover__row",role:"group","aria-label":n("canvas.toolbar.color"),children:At.map(s=>o.jsx("button",{type:"button",className:`canvas-style-swatch${e.color===s?" canvas-style-swatch--active":""}`,style:{background:s},onClick:()=>t({...e,color:s}),"aria-pressed":e.color===s,"aria-label":s,title:s},s))}),o.jsx("div",{className:"canvas-style-popover__row",role:"group","aria-label":n("canvas.toolbar.strokeWidth"),children:It.map(s=>o.jsx("button",{type:"button",className:`canvas-style-width${e.strokeWidth===s?" canvas-style-width--active":""}`,onClick:()=>t({...e,strokeWidth:s}),"aria-pressed":e.strokeWidth===s,"aria-label":`${s}px`,title:`${s}px`,children:o.jsx("span",{style:{height:`${s}px`,background:e.color}})},s))})]}):null]})}function Ln({tools:e,activeTool:t,onToolChange:n}){const[a,r]=c.useState(!1),l=c.useRef(null),s=e.find(u=>u.id===t)??e[0],d=s.icon;return c.useEffect(()=>{if(!a)return;const u=i=>{l.current?.contains(i.target)||r(!1)};return window.addEventListener("pointerdown",u),()=>window.removeEventListener("pointerdown",u)},[a]),o.jsxs("div",{ref:l,className:"canvas-tool-picker",children:[o.jsxs("button",{type:"button",className:`canvas-toolbar__button canvas-tool-picker__trigger${t!=="eraser"?" canvas-toolbar__button--active":""}`,onClick:()=>r(u=>!u),"aria-label":`${s.label} (${s.shortcut})`,"aria-pressed":t===s.id,"aria-haspopup":"menu","aria-expanded":a,title:`${s.label} (${s.shortcut})`,children:[o.jsx(d,{}),o.jsx("span",{className:"canvas-toolbar__shortcut","aria-hidden":"true",children:s.shortcut})]}),a?o.jsx("div",{className:"canvas-tool-picker__menu",role:"menu",children:e.map(u=>{const i=u.icon,v=t===u.id;return o.jsxs("button",{type:"button",className:`canvas-tool-picker__item${v?" active":""}`,role:"menuitemradio","aria-checked":v,onClick:()=>{n(u.id),r(!1)},children:[o.jsx(i,{}),o.jsx("span",{children:u.label}),o.jsx("kbd",{children:u.shortcut})]},u.id)})}):null]})}function On({activeTool:e,hasAnnotations:t,hasExportableContent:n,onToolChange:a,eraserMode:r="object",onEraserModeChange:l,style:s,onStyleChange:d,onClear:u,onApply:i,onExport:v,onUndo:f,onRedo:_,canUndo:B,canRedo:A,onDeleteSelected:U,selectedCount:T=0,onEditWithMask:N,canEditWithMask:p,isEditingWithMask:C,isApplying:M,isExporting:k,exportBackground:m="alpha",exportMatteColor:X="#ffffff",onExportBackgroundChange:R,onExportMatteColorChange:W,cleanupTolerance:x=28,cleanupSeedCount:E=0,cleanupStats:S=null,cleanupHasPreview:P=!1,isCleanupPickingSeed:G=!1,isCleanupActive:Q=!1,cleanupIntent:ee="remove",cleanupTool:te="click",cleanupBrushRadius:le=.018,isCleanupPreviewing:I=!1,isCleanupApplying:F=!1,onCleanupAutoSample:g,onCleanupPickSeed:D,onCleanupIntentChange:J,onCleanupToolChange:de,onCleanupBrushRadiusChange:ce,onCleanupToleranceChange:Z,onCleanupPreview:V,onCleanupApply:ne,onCleanupReset:$}){const{t:w}=ke(),[q,ae]=c.useState(!1),O=c.useRef(null),re=n??t??!1,Y=w(r==="object"?"canvas.toolbar.objectEraser":"canvas.toolbar.brushEraser"),K=[{id:"select",shortcut:"1",label:w("canvas.toolbar.select"),icon:$n},{id:"pen",shortcut:"2",label:w("canvas.toolbar.pen"),icon:Un},{id:"box",shortcut:"3",label:w("canvas.toolbar.box"),icon:Wn},{id:"arrow",shortcut:"4",label:w("canvas.toolbar.arrow"),icon:Hn},{id:"memo",shortcut:"5",label:w("canvas.toolbar.memo"),icon:Fn}];c.useEffect(()=>{if(!q)return;const oe=Ce=>{O.current?.contains(Ce.target)||ae(!1)};return window.addEventListener("pointerdown",oe),()=>window.removeEventListener("pointerdown",oe)},[q]);const he=oe=>{l?.(oe),a("eraser"),ae(!1)};return o.jsxs("div",{className:"canvas-toolbar","aria-label":w("canvas.toolbar.label"),children:[o.jsx(Ln,{tools:K,activeTool:e,onToolChange:a}),o.jsx(Rn,{style:s,onStyleChange:d}),o.jsxs("div",{ref:O,className:`canvas-toolbar__split-button${e==="eraser"?" canvas-toolbar__split-button--active":""}`,onKeyDown:oe=>{oe.key==="Escape"&&q&&(oe.preventDefault(),ae(!1))},children:[o.jsxs("button",{type:"button",className:`canvas-toolbar__button canvas-toolbar__button--split-main${e==="eraser"?" canvas-toolbar__button--active":""}`,onClick:()=>a("eraser"),"aria-label":`${Y} (6)`,"aria-pressed":e==="eraser",title:`${Y} (6)`,children:[o.jsx(Vn,{}),o.jsx("span",{className:"canvas-toolbar__shortcut","aria-hidden":"true",children:"6"})]}),o.jsx("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__button--split-menu",onClick:()=>ae(oe=>!oe),"aria-label":w("canvas.toolbar.eraserMenu"),"aria-haspopup":"menu","aria-expanded":q,"aria-controls":"canvas-eraser-menu",title:w("canvas.toolbar.eraserMenu"),children:o.jsx(Kn,{})}),q?o.jsxs("div",{id:"canvas-eraser-menu",className:"canvas-toolbar__eraser-menu",role:"menu",children:[o.jsx("button",{type:"button",className:`canvas-toolbar__eraser-menu-item${r==="object"?" canvas-toolbar__eraser-menu-item--active":""}`,role:"menuitemradio","aria-checked":r==="object",onClick:()=>he("object"),children:w("canvas.toolbar.objectEraser")}),o.jsx("button",{type:"button",className:`canvas-toolbar__eraser-menu-item${r==="brush"?" canvas-toolbar__eraser-menu-item--active":""}`,role:"menuitemradio","aria-checked":r==="brush",onClick:()=>he("brush"),children:w("canvas.toolbar.brushEraser")})]}):null]}),o.jsx("span",{className:"canvas-toolbar__divider","aria-hidden":"true"}),i?o.jsx("button",{type:"button",className:`canvas-toolbar__button canvas-toolbar__button--primary${M?" canvas-toolbar__button--busy":""}`,onClick:i,disabled:!re||M,"aria-label":w("canvas.toolbar.apply"),title:w("canvas.toolbar.apply"),children:o.jsx(zn,{})}):null,N?o.jsx("button",{type:"button",className:`canvas-toolbar__button canvas-toolbar__button--primary canvas-toolbar__button--mask${C?" canvas-toolbar__button--busy":""}`,onClick:N,disabled:!p||C,"aria-label":w(p?"canvas.toolbar.editMask":"canvas.toolbar.editMaskDisabled"),title:w(p?"canvas.toolbar.editMask":"canvas.toolbar.editMaskDisabled"),children:o.jsx(Gn,{})}):null,f?o.jsx("button",{type:"button",className:"canvas-toolbar__button",onClick:f,disabled:!B,"aria-label":w("canvas.toolbar.undo"),title:w("canvas.toolbar.undo"),children:o.jsx(qn,{})}):null,_?o.jsx("button",{type:"button",className:"canvas-toolbar__button",onClick:_,disabled:!A,"aria-label":w("canvas.toolbar.redo"),title:w("canvas.toolbar.redo"),children:o.jsx(Yn,{})}):null,U?o.jsx("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__button--danger",onClick:U,disabled:T===0,"aria-label":w("canvas.toolbar.deleteSelected"),title:w("canvas.toolbar.deleteSelected"),children:o.jsx(gt,{})}):null,v&&R&&W?o.jsx(An,{mode:m,matteColor:X,onModeChange:R,onMatteColorChange:W}):null,g&&D&&J&&de&&ce&&Z&&V&&ne&&$?o.jsx(In,{seedCount:E,tolerance:x,stats:S,hasPreview:P,isPickingSeed:G,intent:ee,tool:te,brushRadius:le,isPreviewing:I,isApplying:F,keepOpen:Q,disabled:M||k,onAutoSample:g,onPickSeed:D,onIntentChange:J,onToolChange:de,onBrushRadiusChange:ce,onToleranceChange:Z,onPreview:V,onApply:ne,onReset:$}):null,v?o.jsx("button",{type:"button",className:`canvas-toolbar__button${k?" canvas-toolbar__button--busy":""}`,onClick:v,disabled:!re||k,"aria-label":w("canvas.toolbar.export"),title:w("canvas.toolbar.export"),children:o.jsx(Xn,{})}):null,o.jsx("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__button--danger",onClick:u,disabled:!re,"aria-label":w("canvas.toolbar.clear"),title:w("canvas.toolbar.clear"),children:o.jsx(gt,{})})]})}function $n(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M8 12.5V7a2 2 0 0 1 4 0v4"}),o.jsx("path",{d:"M12 11V5a2 2 0 0 1 4 0v7"}),o.jsx("path",{d:"M16 12V8a2 2 0 0 1 4 0v5.5A6.5 6.5 0 0 1 13.5 20H12a6 6 0 0 1-4.24-1.76L4.7 15.18a1.7 1.7 0 0 1 2.4-2.4L9 14.68"})]})}function Un(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"m4 20 4.2-1.1L19.5 7.6a2.2 2.2 0 0 0-3.1-3.1L5.1 15.8 4 20Z"}),o.jsx("path",{d:"m14.5 6.5 3 3"})]})}function Wn(){return o.jsx("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("rect",{x:"5",y:"5",width:"14",height:"14",rx:"2"})})}function Hn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M5 19 19 5"}),o.jsx("path",{d:"M10 5h9v9"})]})}function Fn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M6 4h12v16H6z"}),o.jsx("path",{d:"M9 8h6"}),o.jsx("path",{d:"M9 12h5"}),o.jsx("path",{d:"M9 16h3"})]})}function Vn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"m4 15 8.5-8.5a2.1 2.1 0 0 1 3 0l2 2a2.1 2.1 0 0 1 0 3L10 19H6.5L4 16.5V15Z"}),o.jsx("path",{d:"M10 19h10"}),o.jsx("path",{d:"m8.5 10.5 5 5"})]})}function Kn(){return o.jsx("svg",{className:"canvas-toolbar__icon canvas-toolbar__icon--small",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("path",{d:"m7 14 5-5 5 5"})})}function zn(){return o.jsx("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("path",{d:"M5 12.5 10 17 19 7"})})}function Xn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M12 4v11"}),o.jsx("path",{d:"m8 11 4 4 4-4"}),o.jsx("path",{d:"M5 20h14"})]})}function gt(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M4 7h16"}),o.jsx("path",{d:"M9 7V5h6v2"}),o.jsx("path",{d:"M7 7l1 13h8l1-13"}),o.jsx("path",{d:"M10 11v5"}),o.jsx("path",{d:"M14 11v5"})]})}function qn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M9 7 5 11l4 4"}),o.jsx("path",{d:"M5 11h9a5 5 0 0 1 0 10h-2"})]})}function Yn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"m15 7 4 4-4 4"}),o.jsx("path",{d:"M19 11h-9a5 5 0 0 0 0 10h2"})]})}function Gn(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("rect",{x:"5",y:"5",width:"14",height:"14",rx:"2"}),o.jsx("path",{d:"M9 9h6v6H9z"})]})}function Zn({annotations:e,backgroundCleanup:t,backgroundCleanupPreview:n,canvasState:a,actions:r}){return o.jsx(On,{activeTool:e.activeTool,eraserMode:e.eraserMode,onEraserModeChange:e.setEraserMode,style:{color:e.toolColor,strokeWidth:e.strokeWidth},onStyleChange:e.setStyle,hasExportableContent:e.hasAnnotations,onToolChange:e.setTool,onClear:e.clear,onApply:()=>{r.handleApplyCanvas()},onExport:()=>{r.handleExportCanvas()},onUndo:e.undo,onRedo:e.redo,canUndo:e.canUndo,canRedo:e.canRedo,onDeleteSelected:e.deleteSelected,selectedCount:e.selectedIds.length,onEditWithMask:()=>{r.handleEditWithMask()},canEditWithMask:e.boxes.length>0,isEditingWithMask:a.isEditingWithMask,isApplying:a.isApplying,isExporting:a.isExporting,exportBackground:a.exportBackground,exportMatteColor:a.exportMatteColor,onExportBackgroundChange:r.setExportBackground,onExportMatteColorChange:r.setExportMatteColor,cleanupTolerance:t.backgroundCleanupTolerance,cleanupSeedCount:t.backgroundCleanupSeeds.length,cleanupStats:t.backgroundCleanupStats,cleanupHasPreview:!!n,isCleanupPickingSeed:t.isBackgroundCleanupPickingSeed,isCleanupActive:t.isBackgroundCleanupActive,cleanupIntent:t.cleanupIntent,cleanupTool:t.cleanupTool,cleanupBrushRadius:t.cleanupBrushRadius,isCleanupPreviewing:t.isBackgroundCleanupPreviewing,isCleanupApplying:t.isBackgroundCleanupApplying,onCleanupAutoSample:t.handleBackgroundCleanupAutoSample,onCleanupPickSeed:t.handleBackgroundCleanupPickSeed,onCleanupIntentChange:t.setCleanupIntent,onCleanupToolChange:l=>{t.setCleanupTool(l),t.setIsBackgroundCleanupActive(!0)},onCleanupBrushRadiusChange:t.setCleanupBrushRadius,onCleanupToleranceChange:t.handleBackgroundCleanupToleranceChange,onCleanupPreview:()=>{t.runBackgroundCleanupPreview()},onCleanupApply:()=>{t.handleBackgroundCleanupApply()},onCleanupReset:t.handleBackgroundCleanupReset})}function Jn({zoom:e,onZoomIn:t,onZoomOut:n,onZoomReset:a}){const{t:r}=ke(),l=Math.round(e*100);return o.jsxs("div",{className:"canvas-toolbar__zoom",role:"group","aria-label":r("canvas.toolbar.zoomGroup"),children:[o.jsx("button",{type:"button",className:"canvas-toolbar__zoom-button",onClick:n,"aria-label":r("canvas.toolbar.zoomOut"),title:r("canvas.toolbar.zoomOut"),children:o.jsx(Qn,{})}),o.jsxs("button",{type:"button",className:"canvas-toolbar__zoom-value",onClick:a,"aria-label":r("canvas.toolbar.zoomReset"),title:r("canvas.toolbar.zoomReset"),children:[l,"%"]}),o.jsx("button",{type:"button",className:"canvas-toolbar__zoom-button",onClick:t,"aria-label":r("canvas.toolbar.zoomIn"),title:r("canvas.toolbar.zoomIn"),children:o.jsx(ea,{})})]})}function Qn(){return o.jsx("svg",{className:"canvas-toolbar__icon canvas-toolbar__icon--small",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("path",{d:"M5 12h14"})})}function ea(){return o.jsxs("svg",{className:"canvas-toolbar__icon canvas-toolbar__icon--small",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M12 5v14"}),o.jsx("path",{d:"M5 12h14"})]})}function ta({zoom:e,closeLabel:t,blankCanvasLabel:n,blankCanvasAriaLabel:a,blankCanvasShortcut:r,blankCanvasBusy:l,shortcutHint:s,onZoomIn:d,onZoomOut:u,onZoomReset:i,onCreateBlankCanvas:v,onClose:f}){return o.jsxs("div",{className:"canvas-mode-topbar",children:[o.jsxs("div",{className:"canvas-mode-topbar__stack",children:[o.jsx("span",{className:"canvas-mode-topbar__label",children:"Canvas Mode"}),o.jsx(Jn,{zoom:e,onZoomIn:d,onZoomOut:u,onZoomReset:i}),o.jsx("span",{className:"canvas-mode-topbar__shortcuts",children:s})]}),o.jsx("div",{className:"canvas-mode-topbar__center",children:o.jsxs("button",{type:"button",className:"canvas-mode-blank",onClick:v,disabled:l,"aria-label":a,title:a,children:[o.jsx("span",{"aria-hidden":"true",children:"+"}),o.jsx("span",{children:n}),o.jsx("kbd",{children:r})]})}),o.jsxs("button",{type:"button",className:"canvas-mode-close",onClick:f,"aria-label":t,children:[o.jsx("kbd",{children:"ESC"}),o.jsx("span",{children:t})]})]})}function Je(e,t,n){return Math.max(t,Math.min(n,e))}function na({zoom:e,panX:t,panY:n}){const a=Je(100/Math.max(1,e),18,100),r=a/2,l=Je(50-t/40,r,100-r),s=Je(50-n/40,r,100-r);return{width:`${a}%`,height:`${a}%`,left:`${l}%`,top:`${s}%`}}function aa({imageSrc:e,zoom:t,panX:n,panY:a,resetLabel:r,onReset:l}){return o.jsxs("button",{type:"button",className:"canvas-viewport-minimap",onClick:l,"aria-label":r,title:r,children:[o.jsx("img",{src:e,alt:"","aria-hidden":"true"}),o.jsx("span",{className:"canvas-viewport-minimap__window",style:na({zoom:t,panX:n,panY:a}),"aria-hidden":"true"})]})}const ra=`url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Ccircle cx='14' cy='14' r='8' fill='white' fill-opacity='0.16' stroke='black' stroke-width='3'/%3E%3Ccircle cx='14' cy='14' r='8' fill='none' stroke='white' stroke-width='1.5'/%3E%3Ccircle cx='14' cy='14' r='2' fill='white' stroke='black' stroke-width='1'/%3E%3C/svg%3E") 14 14, auto`,oa=`url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Ccircle cx='14' cy='14' r='8' fill='white' fill-opacity='0.18' stroke='black' stroke-width='3'/%3E%3Ccircle cx='14' cy='14' r='8' fill='none' stroke='white' stroke-width='1.5'/%3E%3C/svg%3E") 14 14, auto`;function sa(e){return e==="low"?"l":e==="medium"?"m":e==="high"?"h":e??null}function la(e){if(!e)return null;const t=e.match(/^(\d+)x\1$/);return t?`${t[1]}²`:e.replace("x","×")}function ca(e){const t=e.url??e.image;if(!e.canvasVersion||!e.canvasMergedAt||t.startsWith("data:"))return t;const n=t.includes("?")?"&":"?";return`${t}${n}canvasMergedAt=${e.canvasMergedAt}`}function ct(e,t){return!e.canvasVersion||e.prompt||!t?.prompt?e:{...e,prompt:t.prompt}}function ia(e,t){if(!t?.filename)return null;const n=e.find(a=>a.canvasVersion&&(a.canvasSourceFilename===t.filename||a.canvasEditableFilename===t.filename))??null;return n?ct(n,t):null}function ua(e,t){if(tn(e)){const n=e.images[0];if(!n)throw new Error("edit_empty_response");return{...n,prompt:t,provider:e.provider,quality:e.quality,size:e.size,moderation:e.moderation,model:e.model,usage:e.usage,kind:"edit",createdAt:Date.now()}}return{image:e.image,url:e.filename?`/generated/${e.filename}`:e.image,thumb:e.image,filename:e.filename,prompt:t,elapsed:e.elapsed,provider:e.provider,quality:e.quality,size:e.size,moderation:e.moderation,model:e.model,usage:e.usage,revisedPrompt:e.revisedPrompt??null,promptMode:e.promptMode??null,kind:"edit",createdAt:Date.now()}}const Qe=new WeakMap;function da(e){if(!e.complete||!e.naturalWidth||!e.naturalHeight)return!1;const t=Qe.get(e);if(t&&t.src===e.currentSrc&&t.width===e.naturalWidth&&t.height===e.naturalHeight)return t.result;const n=64,a=Math.min(n,e.naturalWidth),r=Math.min(n,e.naturalHeight),l=document.createElement("canvas");l.width=a,l.height=r;const s=l.getContext("2d",{willReadFrequently:!0});if(!s)return!1;try{s.drawImage(e,0,0,a,r);const d=s.getImageData(0,0,a,r).data;for(let u=3;u<d.length;u+=4)if(d[u]<250)return Qe.set(e,{src:e.currentSrc,width:e.naturalWidth,height:e.naturalHeight,result:!0}),!0;return Qe.set(e,{src:e.currentSrc,width:e.naturalWidth,height:e.naturalHeight,result:!1}),!1}catch{return!1}}function ha(e,t){if(e.width!==t.width||e.height!==t.height||e.data.length!==t.data.length)throw new Error("cleanup_mask_size_mismatch")}function xt(e,t){return{width:e,height:t,data:new Uint8Array(e*t)}}function rt(e){return{width:e.width,height:e.height,data:new Uint8Array(e.data)}}function fa(e,t){ha(e,t);for(let n=0;n<e.data.length;n+=1)(t.data[n]??0)>0&&(e.data[n]=0)}function Be(e,t){if(!e)return null;const n=rt(e);return t&&fa(n,t),n}function pa(e,t){if(e.width!==t.width||e.height!==t.height)throw new Error("cleanup_mask_size_mismatch");const n=new ImageData(new Uint8ClampedArray(e.data),e.width,e.height);for(let a=0;a<t.data.length;a+=1)(t.data[a]??0)>0&&(n.data[a*4+3]=0);return n}function Re(e){return Math.min(1,Math.max(0,e))}function ma(e){return new Promise((t,n)=>{e.toBlob(a=>{a?t(a):n(new Error("mask_blob_unavailable"))},"image/png")})}async function va(e){const t=e.imageElement.naturalWidth,n=e.imageElement.naturalHeight;if(!t||!n)throw new Error("mask_source_size_unavailable");if(e.boxes.length===0)throw new Error("mask_boxes_required");const a=document.createElement("canvas");a.width=t,a.height=n;const r=a.getContext("2d");if(!r)throw new Error("mask_context_unavailable");r.fillStyle="rgba(0, 0, 0, 1)",r.fillRect(0,0,t,n),r.globalCompositeOperation="destination-out";for(const l of e.boxes){const s=Re(l.x)*t,d=Re(l.y)*n,u=Re(l.width)*t,i=Re(l.height)*n;u>0&&i>0&&r.fillRect(s,d,u,i)}return ma(a)}async function ba(e){const t=e.naturalWidth,n=e.naturalHeight;if(!t||!n)throw new Error("image_source_size_unavailable");const a=document.createElement("canvas");a.width=t,a.height=n;const r=a.getContext("2d");if(!r)throw new Error("image_context_unavailable");return r.drawImage(e,0,0,t,n),a.toDataURL("image/png")}function it(e){return new Promise((t,n)=>{const a=new FileReader;a.onerror=()=>n(new Error("mask_blob_read_failed")),a.onload=()=>t(String(a.result)),a.readAsDataURL(e)})}const ut=[{x:0,y:0},{x:1,y:0},{x:0,y:1},{x:1,y:1}],ga=1024;function xa(e){return Math.max(0,Math.min(255,Math.round(e)))}function Nt(e,t,n){const a=Math.max(0,Math.min(t-1,Math.round(e.x*(t-1))));return Math.max(0,Math.min(n-1,Math.round(e.y*(n-1))))*t+a}function ya(e,t){return(t.length>0?t:ut).map(a=>{const r=Nt(a,e.width,e.height)*4;return{r:e.data[r]??0,g:e.data[r+1]??0,b:e.data[r+2]??0}})}function ka(e,t,n,a){for(const r of n)if(Math.max(Math.abs((e[t]??0)-r.r),Math.abs((e[t+1]??0)-r.g),Math.abs((e[t+2]??0)-r.b))<=a)return!0;return!1}function je(e,t,n,a,r,l,s){if(e<0||e>=a.length||a[e])return r;const d=e*4;return(t.data[d+3]??0)===0?(a[e]=1,r):ka(t.data,d,l,s)?(a[e]=1,n[r]=e,r+1):r}function et(){return ut.map(e=>({...e}))}function yt(e,t,n,a){if(e.width!==t.width||e.height!==t.height)throw new Error("cleanup_mask_size_mismatch");const{width:r,height:l}=t,s=r*l,d=new Uint8Array(s),u=new Int32Array(s),i=ya(t,n),v=xa(a);let f=0;for(const _ of n.length>0?n:ut)f=je(Nt(_,r,l),t,u,d,f,i,v);for(;f>0;){const _=u[--f];e.data[_]=255;const B=_%r;B>0&&(f=je(_-1,t,u,d,f,i,v)),B<r-1&&(f=je(_+1,t,u,d,f,i,v)),_>=r&&(f=je(_-r,t,u,d,f,i,v)),_<s-r&&(f=je(_+r,t,u,d,f,i,v))}}function Ca(e,t){const n=new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),a=pa(n,t),r=t.data.reduce((l,s)=>l+(s>0?1:0),0);return{imageData:{width:e.width,height:e.height,data:a.data},stats:{width:e.width,height:e.height,removedPixels:r,removedPercent:t.data.length>0?r/t.data.length:0}}}function Rt(e){return new Promise((t,n)=>{e.toBlob(a=>{a?t(a):n(new Error("background_cleanup_blob_failed"))},"image/png")})}function Lt(e,t){const n=e.naturalWidth,a=e.naturalHeight;if(n<=0||a<=0)throw new Error("background_cleanup_image_not_ready");const r=t&&t>0?Math.min(1,t/Math.max(n,a)):1,l=Math.max(1,Math.round(n*r)),s=Math.max(1,Math.round(a*r)),d=document.createElement("canvas");d.width=l,d.height=s;const u=d.getContext("2d",{willReadFrequently:!0});if(!u)throw new Error("background_cleanup_context_failed");return u.drawImage(e,0,0,l,s),{canvas:d,context:u,width:l,height:s}}async function kt({imageElement:e,mask:t}){try{const{canvas:n,context:a,width:r,height:l}=Lt(e),s=a.getImageData(0,0,r,l),d=Ca({width:r,height:l,data:s.data},t),u=a.createImageData(r,l);u.data.set(d.imageData.data),a.putImageData(u,0,0);const i=await Rt(n);return{blob:i,dataUrl:await it(i),stats:d.stats}}catch(n){throw n instanceof Error?n:new Error("background_cleanup_failed")}}async function wa({imageElement:e,mask:t}){try{const{width:n,height:a}=Lt(e,ga),r=document.createElement("canvas");r.width=n,r.height=a;const l=r.getContext("2d");if(!l)throw new Error("background_cleanup_context_failed");const s=l.createImageData(n,a);let d=0;for(let i=0;i<a;i+=1)for(let v=0;v<n;v+=1){const f=Math.min(t.width-1,Math.floor(v/n*t.width)),_=Math.min(t.height-1,Math.floor(i/a*t.height));if((t.data[_*t.width+f]??0)===0)continue;const B=(i*n+v)*4;s.data[B]=168,s.data[B+1]=85,s.data[B+2]=247,s.data[B+3]=150,d+=1}l.putImageData(s,0,0);const u=await Rt(r);return{dataUrl:await it(u),stats:{width:t.width,height:t.height,removedPixels:t.data.reduce((i,v)=>i+(v>0?1:0),0),removedPercent:t.data.length>0?d/(n*a):0}}}catch(n){throw n instanceof Error?n:new Error("background_cleanup_failed")}}function Ct(e){return{...e,seeds:e.seeds.map(t=>({intent:t.intent,point:{...t.point}})),brushStrokes:e.brushStrokes.map(t=>({...t,points:t.points.map(n=>({...n}))})),brushCursor:e.brushCursor?{...e.brushCursor}:null,removeMask:e.removeMask?rt(e.removeMask):null,preserveMask:e.preserveMask?rt(e.preserveMask):null}}function _a(){return`cleanup_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function Le(e){return Math.max(0,Math.min(1,e))}function Ma(e){const t=[],n=Math.max(0,e.radius*.55);for(const a of e.points)t.push({...a}),!(n<=0)&&t.push({x:Le(a.x-n),y:a.y},{x:Le(a.x+n),y:a.y},{x:a.x,y:Le(a.y-n)},{x:a.x,y:Le(a.y+n)});return t}function Ea(e){const t=e.naturalWidth,n=e.naturalHeight;if(t<=0||n<=0)throw new Error("background_cleanup_image_not_ready");const a=document.createElement("canvas");a.width=t,a.height=n;const r=a.getContext("2d",{willReadFrequently:!0});if(!r)throw new Error("background_cleanup_context_failed");r.drawImage(e,0,0,t,n);const l=r.getImageData(0,0,t,n);return{width:t,height:n,data:l.data}}function Sa({canvasOpen:e,currentImage:t,canvasDisplayImage:n,imageElementRef:a,canvasSourceImageRef:r,lastMergedDataUrlRef:l,setCanvasSaveState:s,setCanvasVersionItem:d,applyMergedCanvasImage:u,attachCanvasVersionReference:i,showToast:v,t:f}){const[_,B]=c.useState(!1),[A,U]=c.useState("remove"),[T,N]=c.useState("click"),[p,C]=c.useState("flat-flood-fill"),[M,k]=c.useState([]),[m,X]=c.useState([]),[R,W]=c.useState(28),[x,E]=c.useState(null),[S,P]=c.useState(null),[G,Q]=c.useState(null),[ee,te]=c.useState(!1),[le,I]=c.useState(.018),[F,g]=c.useState(null),[D,J]=c.useState(!1),[de,ce]=c.useState(!1),Z=c.useRef(null),V=c.useRef(null),ne=c.useRef(null),$=c.useRef({past:[],future:[]}),w=c.useRef(0),q=c.useRef(null),ae=c.useCallback(()=>Ct({intent:A,tool:T,engine:p,seeds:M,brushStrokes:m,brushRadius:le,tolerance:R,removeMask:Z.current,preserveMask:V.current,preview:x,maskOverlay:S,stats:G,active:ee,brushCursor:F}),[m,S,x,M,G,R,F,le,p,A,T,ee]),O=c.useCallback(()=>{$.current={past:[...$.current.past.slice(-19),ae()],future:[]}},[ae]),re=c.useCallback(b=>{const y=Ct(b);Z.current=y.removeMask,V.current=y.preserveMask,ne.current=null,U(y.intent),N(y.tool),C(y.engine),k(y.seeds),X(y.brushStrokes),I(y.brushRadius),W(y.tolerance),E(y.preview),P(y.maskOverlay),Q(y.stats),te(y.active),g(y.brushCursor),J(!1),ce(!1)},[]),Y=c.useCallback(async()=>{if(!a.current||!t)return;const b=Be(Z.current,V.current);if(!b){P(null),Q(null);return}const y=w.current+1;w.current=y,J(!0);try{const L=await wa({imageElement:a.current,mask:b});if(w.current!==y)return;P(L),Q(L.stats)}catch{if(w.current!==y)return;v(f("canvas.toolbar.cleanupFailed"),!0)}finally{w.current===y&&J(!1)}},[t,a,v,f]),K=c.useCallback(async(b,y,L)=>{if(!a.current)return;const z=Ea(a.current),ie=xt(z.width,z.height),we=xt(z.width,z.height);for(const be of b){const _e=be.intent==="remove"?ie:we;yt(_e,z,[be.point],L)}for(const be of y){const _e=be.intent==="remove"?ie:we;yt(_e,z,Ma(be),L)}Z.current=ie,V.current=we},[a]),he=c.useCallback(()=>{w.current+=1,q.current!=null&&(window.clearTimeout(q.current),q.current=null),Z.current=null,V.current=null,ne.current=null,$.current={past:[],future:[]},k([]),X([]),E(null),P(null),Q(null),te(!1),g(null),J(!1),ce(!1)},[]),oe=c.useCallback(()=>{const b=$.current.past.pop();return b?($.current.future=[ae(),...$.current.future.slice(0,19)],re(b),!0):!1},[ae,re]),Ce=c.useCallback(()=>{const b=$.current.future.shift();return b?($.current.past=[...$.current.past.slice(-19),ae()],re(b),!0):!1},[ae,re]),De=c.useCallback(b=>{O();const y=[...M,{point:b,intent:A}];k(y),E(null),K(y,m,R).then(Y)},[m,M,R,A,O,K,Y]),$e=c.useCallback(()=>{O();const b=et().map(y=>({point:y,intent:"remove"}));k(b),E(null),te(!1),K(b,m,R).then(Y)},[m,R,O,K,Y]),H=c.useCallback(()=>{O(),N("click"),te(b=>!b)},[O]),Ue=c.useCallback(b=>{O(),q.current!=null&&window.clearTimeout(q.current),W(b),E(null),q.current=window.setTimeout(()=>{q.current=null,K(M,m,b).then(Y)},180)},[m,M,O,K,Y]),We=c.useCallback(async()=>{if(!a.current||!t)return null;let b=Be(Z.current,V.current);if(!b){const L=et().map(z=>({point:z,intent:"remove"}));k(L),await K(L,m,R),b=Be(Z.current,V.current)}if(!b)return null;O();const y=w.current+1;w.current=y,J(!0);try{const L=await kt({imageElement:a.current,mask:b});return w.current!==y?null:(E(L),P(null),Q(L.stats),L)}catch{return w.current!==y||v(f("canvas.toolbar.cleanupFailed"),!0),null}finally{w.current===y&&J(!1)}},[m,R,t,a,O,K,v,f]),He=c.useCallback(()=>{O(),he()},[O,he]),Fe=c.useCallback(b=>{O();const y={id:_a(),intent:A,points:[{...b}],radius:le};ne.current=y,g(b),X(L=>[...L,y])},[le,A,O]),ve=c.useCallback(b=>{const y=ne.current;if(!y){g(b);return}y.points=[...y.points,{...b}],g(b),X(L=>L.map(z=>z.id===y.id?{...y,points:y.points.map(ie=>({...ie}))}:z)),K(M,m.map(L=>L.id===y.id?y:L),R).then(Y)},[m,M,R,K,Y]),fe=c.useCallback(()=>{ne.current=null,K(M,m,R).then(Y)},[m,M,R,K,Y]),ue=c.useCallback(async()=>{if(!t||!a.current)return;const b=r.current??t;if(!b?.filename){v(f("canvas.toolbar.cleanupFailed"),!0);return}let y=Be(Z.current,V.current);if(!y){const L=et().map(z=>({point:z,intent:"remove"}));k(L),await K(L,m,R),y=Be(Z.current,V.current)}if(y){ce(!0),s("saving");try{O();const L=await kt({imageElement:a.current,mask:y}),z=await St({sourceFilename:b.canvasSourceFilename??b.filename,image:L.blob,prompt:b.prompt}),ie=ct(z.item,b);l.current=L.dataUrl,d(ie),u(ie),await i(ie),s("saved"),E(null),P(null),Q(L.stats),te(!1),v(f("canvas.toolbar.cleanupApplied"))}catch{s("error"),v(f("canvas.toolbar.cleanupFailed"),!0)}finally{ce(!1)}}},[u,i,m,R,r,t,a,l,O,K,s,d,v,f]),Ve=c.useCallback(()=>ee?(ne.current=null,te(!1),g(null),!0):!1,[ee]);return c.useEffect(()=>{const b=a.current;if(!b||!e){B(!1);return}const y=()=>B(da(b));if(b.complete)y();else return b.addEventListener("load",y),()=>b.removeEventListener("load",y)},[e,n?.canvasMergedAt,n?.filename,n?.image,n?.url,x?.dataUrl,a]),{imageHasAlpha:_,backgroundCleanupSeeds:M,backgroundCleanupBrushStrokes:m,backgroundCleanupTolerance:R,backgroundCleanupPreview:x,backgroundCleanupMaskOverlay:S,backgroundCleanupStats:G,cleanupIntent:A,setCleanupIntent:U,cleanupTool:T,setCleanupTool:N,cleanupClickEngine:p,setCleanupClickEngine:C,cleanupBrushRadius:le,setCleanupBrushRadius:I,cleanupBrushCursor:F,setCleanupBrushCursor:g,isBackgroundCleanupActive:ee,setIsBackgroundCleanupActive:te,isBackgroundCleanupPickingSeed:ee&&T==="click",isBackgroundCleanupPreviewing:D,isBackgroundCleanupApplying:de,hasActiveCleanupStroke:!!ne.current,canUndoBackgroundCleanup:$.current.past.length>0,canRedoBackgroundCleanup:$.current.future.length>0,resetBackgroundCleanup:he,undoBackgroundCleanup:oe,redoBackgroundCleanup:Ce,addBackgroundCleanupClick:De,addBackgroundCleanupSeed:De,runBackgroundCleanupPreview:We,handleBackgroundCleanupAutoSample:$e,handleBackgroundCleanupPickSeed:H,handleBackgroundCleanupToleranceChange:Ue,handleBackgroundCleanupReset:He,handleBackgroundCleanupApply:ue,handleBackgroundCleanupEscape:Ve,startBackgroundCleanupBrushStroke:Fe,updateBackgroundCleanupBrushStroke:ve,endBackgroundCleanupBrushStroke:fe}}function wt(e){return Math.min(1,Math.max(0,e))}function _t(e,t){const n=t.getBoundingClientRect();return{x:wt((e.clientX-n.left)/n.width),y:wt((e.clientY-n.top)/n.height)}}const Ba=.18,ja=.12;function Ta(e){return{id:"selection-box",x:Math.min(e.start.x,e.current.x),y:Math.min(e.start.y,e.current.y),width:Math.abs(e.current.x-e.start.x),height:Math.abs(e.current.y-e.start.y),color:"#64c8ff",strokeWidth:2}}function ot(e,t,n=0){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}function Ot(e){return{id:e.id,x:e.x,y:e.y,width:Ba,height:ja,color:e.color,strokeWidth:1}}function Pa(e,t,n){const a=n.x-t.x,r=n.y-t.y,l=e.x-t.x,s=e.y-t.y,d=a*a+r*r;if(d===0)return Math.hypot(e.x-t.x,e.y-t.y);const u=Math.max(0,Math.min(1,(l*a+s*r)/d));return Math.hypot(e.x-(t.x+u*a),e.y-(t.y+u*r))}function Da(e,t,n){for(let a=1;a<t.points.length;a+=1)if(Pa(e,t.points[a-1],t.points[a])<=n)return!0;return!1}function Mt(e,t){return e.x<=t.x+t.width&&e.x+e.width>=t.x&&e.y<=t.y+t.height&&e.y+e.height>=t.y}function Aa(e,t){return e.points.some(n=>ot(n,t))}function Et(e){const t=e.tolerance??.015;for(const n of[...e.memos].reverse())if(ot(e.point,Ot(n),t))return Pt(n);for(const n of[...e.boxes].reverse())if(ot(e.point,n,t))return Tt(n);for(const n of[...e.paths].reverse())if(Da(e.point,n,t))return jt(n);return null}function Ia(e){const t=[];for(const n of e.annotations.paths)Aa(n,e.box)&&t.push(jt(n));for(const n of e.annotations.boxes)Mt(n,e.box)&&t.push(Tt(n));for(const n of e.annotations.memos)Mt(Ot(n),e.box)&&t.push(Pt(n));return t}function Na({canvasOpen:e,canvasZoom:t,canvasPanX:n,canvasPanY:a,spaceHeld:r,canDragViewportWithSelect:l,isBackgroundCleanupActive:s,cleanupTool:d,annotationFrameRef:u,annotations:i,setCanvasPan:v,addBackgroundCleanupClick:f,startBackgroundCleanupBrushStroke:_,updateBackgroundCleanupBrushStroke:B,endBackgroundCleanupBrushStroke:A,setCleanupBrushCursor:U}){const T=c.useRef({mode:null,lastPoint:null,didMove:!1}),N=c.useRef({active:!1,startX:0,startY:0,basePanX:0,basePanY:0,pointerId:null}),[p,C]=c.useState(!1),M=x=>{x.currentTarget.setPointerCapture(x.pointerId),N.current={active:!0,startX:x.clientX,startY:x.clientY,basePanX:n,basePanY:a,pointerId:x.pointerId},C(!0)};return{viewportPanActive:p,resetPointerSession:()=>{T.current={mode:null,lastPoint:null,didMove:!1},N.current={active:!1,startX:0,startY:0,basePanX:0,basePanY:0,pointerId:null},C(!1)},handleAnnotationPointerDown:x=>{if(!e||me(x.target)||!u.current)return;const E=x.button===1;if(r||E){x.preventDefault(),M(x);return}x.preventDefault();const S=_t(x,u.current);if(s){d==="click"?f(S):(x.currentTarget.setPointerCapture(x.pointerId),_(S));return}if(i.activeTool==="select"){const P=Et({point:S,paths:i.paths,boxes:i.boxes,memos:i.memos});if(P)x.shiftKey?i.toggleSelected(P):i.selectOne(P),i.startSelectedMove(),T.current={mode:"move",lastPoint:S,didMove:!1};else if(l&&t>1.01){M(x);return}else i.clearSelection(),i.startSelectionBox(S),T.current={mode:"box",lastPoint:S,didMove:!1};x.currentTarget.setPointerCapture(x.pointerId);return}if(i.activeTool==="memo"){i.createMemo(S),requestAnimationFrame(()=>{u.current?.querySelector(".canvas-memo--active")?.focus()});return}if(i.activeTool==="eraser"){if(i.eraserMode==="object"){const P=Et({point:S,paths:i.paths,boxes:i.boxes,memos:i.memos});P&&i.eraseObjectAtPoint(P);return}x.currentTarget.setPointerCapture(x.pointerId),i.startEraserStroke(S);return}x.currentTarget.setPointerCapture(x.pointerId),i.startDrawing(S)},handleAnnotationPointerMove:x=>{if(!e||me(x.target)||!u.current)return;if(N.current.active){const S=x.clientX-N.current.startX,P=x.clientY-N.current.startY;v(N.current.basePanX+S,N.current.basePanY+P);return}const E=_t(x,u.current);if(s){d==="brush"?B(E):U(E);return}if(i.activeTool==="select"){if(T.current.mode==="move"&&T.current.lastPoint){const S={x:E.x-T.current.lastPoint.x,y:E.y-T.current.lastPoint.y};(Math.abs(S.x)>5e-4||Math.abs(S.y)>5e-4)&&(i.moveSelected(S),T.current.didMove=!0),T.current.lastPoint=E}else T.current.mode==="box"&&i.updateSelectionBox(E);return}if(i.activeTool!=="memo"){if(i.activeTool==="eraser"){i.eraserMode==="brush"&&i.updateEraserStroke(E);return}i.moveDrawing(E)}},handleAnnotationPointerUp:x=>{if(e&&!me(x.target)){if(N.current.active&&N.current.pointerId===x.pointerId){x.currentTarget.hasPointerCapture(x.pointerId)&&x.currentTarget.releasePointerCapture(x.pointerId),N.current={active:!1,startX:0,startY:0,basePanX:0,basePanY:0,pointerId:null},C(!1);return}if(x.currentTarget.hasPointerCapture(x.pointerId)&&x.currentTarget.releasePointerCapture(x.pointerId),s){d==="brush"&&A();return}if(i.activeTool==="select"){T.current.mode==="move"&&T.current.didMove&&i.commitSelectedMove(),T.current.mode==="box"&&i.selectionBox&&i.endSelectionBox(Ia({box:Ta(i.selectionBox),annotations:i.toPayload()})),T.current={mode:null,lastPoint:null,didMove:!1};return}if(i.activeTool!=="memo"){if(i.activeTool==="eraser"){i.eraserMode==="brush"&&i.endEraserStroke();return}i.endDrawing()}}},handleAnnotationPointerLeave:()=>{s&&U(null)}}}function Ra({canvasOpen:e,canvasZoom:t,currentImage:n,annotations:a,undoBackgroundCleanup:r,redoBackgroundCleanup:l,handleBackgroundCleanupEscape:s,handleCloseCanvas:d,selectHistoryShortcutTarget:u,trashHistoryItem:i,permanentlyDeleteHistoryItemByShortcut:v,setCanvasZoom:f,resetCanvasZoom:_,onCreateBlankCanvas:B,isCreatingBlankCanvas:A}){const[U,T]=c.useState(!1);return c.useEffect(()=>{if(!e)return;const p=m=>{m.preventDefault()},C=m=>{m.ctrlKey&&m.preventDefault()},M={passive:!1,capture:!0},k={passive:!1};return window.addEventListener("wheel",C,M),window.addEventListener("gesturestart",p,k),window.addEventListener("gesturechange",p,k),window.addEventListener("gestureend",p,k),()=>{window.removeEventListener("wheel",C,M),window.removeEventListener("gesturestart",p,k),window.removeEventListener("gesturechange",p,k),window.removeEventListener("gestureend",p,k)}},[e]),c.useEffect(()=>{if(!e)return;const p=M=>{M.code==="Space"&&(me(M.target)||(U||T(!0),M.preventDefault()))},C=M=>{M.code==="Space"&&T(!1)};return window.addEventListener("keydown",p),window.addEventListener("keyup",C),()=>{window.removeEventListener("keydown",p),window.removeEventListener("keyup",C)}},[e,U]),c.useEffect(()=>{if(!e)return;const p=C=>{if(!C.defaultPrevented){if(me(C.target)){C.key==="Escape"&&(C.preventDefault(),C.target.blur(),a.focusMemo(null));return}if(C.key==="Escape"){if(C.preventDefault(),s())return;d();return}if(C.shiftKey&&!C.metaKey&&!C.ctrlKey&&!C.altKey&&C.key.toLowerCase()==="b"){C.preventDefault(),!A&&!C.repeat&&B();return}if((C.metaKey||C.ctrlKey)&&C.key.toLowerCase()==="z"){if(C.preventDefault(),C.shiftKey){if(l())return;a.redo();return}if(r())return;a.undo()}}};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[a,a.focusMemo,a.redo,a.undo,e,d,s,A,B,l,r]),{spaceHeld:U,handleViewerKeyDown:p=>{if(me(p.target)){p.key==="Escape"&&(p.preventDefault(),p.target.blur(),a.focusMemo(null));return}if(e&&["1","2","3","4","5","6"].includes(p.key)){p.preventDefault();const C=["select","pen","box","arrow","memo","eraser"];a.setTool(C[Number(p.key)-1]);return}if(e&&p.key==="Escape"){if(p.preventDefault(),p.stopPropagation(),s())return;d();return}if(e&&p.key==="]"){p.preventDefault(),f(t+.1);return}if(e&&p.key==="["){p.preventDefault(),f(t-.1);return}if(e&&p.key==="0"){p.preventDefault(),_();return}if(p.key==="Delete"||p.key==="Backspace"){if(!n||p.target!==p.currentTarget)return;if(p.preventDefault(),p.shiftKey){v(n);return}i(n);return}p.key!=="ArrowLeft"&&p.key!=="ArrowRight"&&p.key!=="Home"&&p.key!=="End"||p.target===p.currentTarget&&(me(p.target)||(p.preventDefault(),p.key==="ArrowLeft"?u("previous"):p.key==="ArrowRight"?u("next"):p.key==="Home"?u("first"):p.key==="End"&&u("last")))}}}function La(e,t){return new Promise((n,a)=>{e.toBlob(r=>{if(r){n(r);return}a(new Error("canvas_blob_unavailable"))},t)})}async function $t(e){const t=document.createElement("canvas");t.width=e.imageElement.naturalWidth,t.height=e.imageElement.naturalHeight;const n=t.getContext("2d");if(!n)throw new Error("canvas_context_unavailable");e.background?.mode==="matte"&&(n.fillStyle=e.background.color,n.fillRect(0,0,t.width,t.height)),n.drawImage(e.imageElement,0,0,t.width,t.height);const a={width:t.width,height:t.height};for(const l of e.paths)nt(n,l,a);for(const l of e.boxes)at(n,l,a,"committed");for(const l of e.memos)Cn(n,l,a);return{blob:await La(t,"image/png"),dataUrl:t.toDataURL("image/png")}}async function Oa(e){return(await $t(e)).blob}function $a(e={},t=new Date){const n=t.toISOString().slice(0,19).replace(/[-:T]/g,""),a=e.matte?"-flat":"";return`canvas-export-${n}${a}.png`}function Ua(e,t){const n=URL.createObjectURL(e);try{const a=document.createElement("a");a.href=n,a.download=t,a.click()}finally{URL.revokeObjectURL(n)}}function Wa({imageElementRef:e,currentImage:t,canvasDisplayImage:n,canvasSourceImageRef:a,lastMergedDataUrlRef:r,canvasVersionItem:l,annotations:s,exportBackground:d,exportMatteColor:u,quality:i,format:v,moderation:f,provider:_,imageModel:B,reasoningEffort:A,promptMode:U,webSearchEnabled:T,getResolvedSize:N,setCanvasVersionItem:p,setCanvasSaveState:C,setIsApplying:M,setIsExporting:k,setIsEditingWithMask:m,applyMergedCanvasImage:X,addGeneratedHistoryItem:R,attachCanvasVersionReference:W,closeCanvas:x,resetCanvasSession:E,showToast:S,t:P}){const G=c.useCallback(async()=>{if(!e.current||!t)return null;const I=a.current??t;if(!I?.filename)return S(P("canvas.version.failed"),!0),null;M(!0),C("saving");try{const F=await $t({imageElement:e.current,paths:s.paths,boxes:s.boxes,memos:s.memos});r.current=F.dataUrl;const g=l?.filename?await nn(l.filename,{image:F.blob,sourceFilename:I.canvasSourceFilename??I.filename,prompt:I.prompt}):await St({sourceFilename:I.filename,image:F.blob,prompt:I.prompt}),D=ct(g.item,I);return p(D),X(D),await W(D),await Bt(I.filename).catch(()=>{}),s.resetLocal(),s.markSaved(),C("saved"),S(P("canvas.version.saved")),D}catch{return C("error"),S(P("canvas.version.failed"),!0),null}finally{M(!1)}},[s,X,W,a,l?.filename,t,e,r,C,p,M,S,P]);return{saveCanvasVersionAndUseReference:G,handleApplyCanvas:async()=>{await G()},handleCloseCanvas:async()=>{(s.hasAnnotations||s.isDirty)&&!await G()||(x(),E())},handleExportCanvas:async()=>{if(!(!e.current||!t)){k(!0);try{const I=d==="matte",F=await Oa({imageElement:e.current,paths:s.paths,boxes:s.boxes,memos:s.memos,background:I?{mode:"matte",color:u}:{mode:"alpha"}});Ua(F,$a({matte:I}))}catch{S(P("canvas.toolbar.exportFailed"),!0)}finally{k(!1)}}},handleEditWithMask:async()=>{if(!(!e.current||!n||s.boxes.length===0)){m(!0);try{let I=r.current;if(s.isDirty||s.hasAnnotations){if(!await G())return;I=r.current}I||(I=await ba(e.current));const F=s.boxes.filter(de=>s.selectedIds.some(ce=>pe(ce,"box",de.id))),g=await va({imageElement:e.current,boxes:F.length>0?F:s.boxes}),D=n.prompt??t?.prompt??"";if(!D.trim()){S(P("toast.noPromptToFork"),!0);return}const J=await an({image:I,mask:await it(g),prompt:D,quality:i,size:n.size??t?.size??N(),format:v,moderation:f,provider:_,n:1,model:B,reasoningEffort:A,mode:U,webSearchEnabled:T});await R(ua(J,D))}catch(I){const F=I.code;S(P(F==="EDIT_MASK_NOT_SUPPORTED"?"canvas.toolbar.editMaskUnsupported":"canvas.toolbar.editMaskFailed"),!0)}finally{m(!1)}}}}}function Fa(e){const t=j(h=>h.currentImage),n=j(h=>h.history),a=j(h=>h.importLocalImageToHistory),[r,l]=c.useState(!1),s=j(h=>{const se=h.multimodePreviewFlightId;return se?h.multimodeSequences[se]??null:null}),d=j(h=>h.selectHistoryShortcutTarget),u=j(h=>h.trashHistoryItem),i=j(h=>h.permanentlyDeleteHistoryItemByShortcut),v=j(h=>h.markGeneratedResultsSeen),f=j(h=>h.activeGenerations),_=j(h=>h.quality),B=j(h=>h.format),A=j(h=>h.moderation),U=j(h=>h.provider),T=j(h=>h.imageModel),N=j(h=>h.reasoningEffort),p=j(h=>h.promptMode),C=j(h=>h.webSearchEnabled),M=j(h=>h.getResolvedSize),k=j(h=>h.showToast),m=j(h=>h.canvasOpen),X=j(h=>h.openCanvas),R=j(h=>h.closeCanvas),W=j(h=>h.canvasZoom),x=j(h=>h.canvasPanX),E=j(h=>h.canvasPanY),S=j(h=>h.setCanvasPan),P=j(h=>h.setCanvasZoom),G=j(h=>h.resetCanvasZoom),Q=j(h=>h.canvasExportBackground),ee=j(h=>h.canvasExportMatteColor),te=j(h=>h.setCanvasExportBackground),le=j(h=>h.setCanvasExportMatteColor),I=j(h=>h.applyMergedCanvasImage),F=j(h=>h.addGeneratedHistoryItem),g=j(h=>h.attachCanvasVersionReference),{t:D}=ke(),{creatingBlankCanvas:J,createBlankCanvas:de}=rn(),ce=c.useRef(null),Z=c.useRef(null),V=c.useRef(null),ne=c.useRef(null),$=c.useRef(null),w=c.useRef(null),q=c.useRef(null),[ae,O]=c.useState(null),[re,Y]=c.useState("idle"),[K,he]=c.useState(!1),[oe,Ce]=c.useState(!1),[De,$e]=c.useState(!1),H=kn(),Ue=()=>{t?.prompt&&(navigator.clipboard.writeText(t.prompt),k(D("toast.promptCopied")))},We=sa(t?.quality??_),He=la(t?.size??M()),Fe=on(t?.model),ve=t?.filename??t?.url??t?.image??null,fe=ia(n,t),ue=m?ae??fe??t:t,Ve=ue?ca(ue):null,b=Sa({canvasOpen:m,currentImage:t,canvasDisplayImage:ue,imageElementRef:Z,canvasSourceImageRef:w,lastMergedDataUrlRef:q,setCanvasSaveState:Y,setCanvasVersionItem:O,applyMergedCanvasImage:I,attachCanvasVersionReference:g,showToast:k,t:D}),{imageHasAlpha:y,backgroundCleanupSeeds:L,backgroundCleanupPreview:z,backgroundCleanupMaskOverlay:ie,backgroundCleanupBrushStrokes:we,cleanupTool:be,cleanupBrushRadius:_e,cleanupBrushCursor:Ut,isBackgroundCleanupActive:Me}=b,Ke=b.backgroundCleanupPreview?.dataUrl??Ve,ze=()=>{w.current=null,ne.current=null,$.current!=null&&(window.clearTimeout($.current),$.current=null),O(null),Y("idle"),b.resetBackgroundCleanup(),q.current=null,Gt()};c.useEffect(()=>{if(!m){V.current=ve,ze();return}if(V.current===null){V.current=ve,w.current=t,O(fe);return}V.current!==ve&&(H.resetLocal(),ze(),w.current=t,O(fe),V.current=ve)},[H.resetLocal,m,t,ve,fe]),c.useEffect(()=>{!m||!t||w.current||(w.current=t,O(fe))},[m,t,fe]),c.useEffect(()=>{if(!m||!t?.filename||t.canvasVersion)return;const h=t.filename;if(ne.current===h)return;ne.current=h;let se=!1;return sn(h).then(Ee=>{!se&&Ee.annotations&&H.load(Ee.annotations)}).catch(()=>{}),()=>{se=!0}},[H.load,m,t?.canvasVersion,t?.filename]),c.useEffect(()=>{if(!m||!t?.filename||t.canvasVersion||!H.isDirty)return;const h=t.filename;return $.current!=null&&window.clearTimeout($.current),$.current=window.setTimeout(()=>{const se=H.toPayload();(H.hasAnnotations?ln(h,se):Bt(h)).then(()=>H.markSaved()).catch(()=>{})},500),()=>{$.current!=null&&(window.clearTimeout($.current),$.current=null)}},[H,H.hasAnnotations,H.isDirty,m,t?.canvasVersion,t?.filename]);const Wt=h=>{me(h.target)||(v(),h.currentTarget.focus())},Ht=h=>{if(m){if(h.preventDefault(),h.ctrlKey){P(W-h.deltaY*.01);return}S(x-h.deltaX,E-h.deltaY)}},Ft=c.useCallback(h=>{Array.from(h.dataTransfer.types).includes("Files")&&(h.preventDefault(),l(se=>se||!0))},[]),Vt=c.useCallback(h=>{h.currentTarget.contains(h.relatedTarget)||l(!1)},[]),Kt=c.useCallback(async h=>{if(!Array.from(h.dataTransfer.types).includes("Files"))return;h.preventDefault(),l(!1);const se=Array.from(h.dataTransfer.files).filter(Ee=>/^image\/(png|jpeg|webp)$/.test(Ee.type));se.length!==0&&await a(se[0])},[a]),{handleApplyCanvas:zt,handleCloseCanvas:dt,handleExportCanvas:Xt,handleEditWithMask:qt}=Wa({imageElementRef:Z,currentImage:t,canvasDisplayImage:ue,canvasSourceImageRef:w,lastMergedDataUrlRef:q,canvasVersionItem:ae,annotations:H,exportBackground:Q,exportMatteColor:ee,quality:_,format:B,moderation:A,provider:U,imageModel:T,reasoningEffort:N,promptMode:p,webSearchEnabled:C,getResolvedSize:M,setCanvasVersionItem:O,setCanvasSaveState:Y,setIsApplying:he,setIsExporting:Ce,setIsEditingWithMask:$e,applyMergedCanvasImage:I,addGeneratedHistoryItem:F,attachCanvasVersionReference:g,closeCanvas:R,resetCanvasSession:ze,showToast:k,t:D}),{spaceHeld:Xe,handleViewerKeyDown:Yt}=Ra({canvasOpen:m,canvasZoom:W,currentImage:t,annotations:H,undoBackgroundCleanup:b.undoBackgroundCleanup,redoBackgroundCleanup:b.redoBackgroundCleanup,handleBackgroundCleanupEscape:b.handleBackgroundCleanupEscape,handleCloseCanvas:dt,selectHistoryShortcutTarget:d,trashHistoryItem:u,permanentlyDeleteHistoryItemByShortcut:i,setCanvasZoom:P,resetCanvasZoom:G,onCreateBlankCanvas:de,isCreatingBlankCanvas:J}),qe=m&&W>1.01&&H.activeTool==="select"&&!Me,{viewportPanActive:Ye,resetPointerSession:Gt,handleAnnotationPointerDown:Zt,handleAnnotationPointerMove:Jt,handleAnnotationPointerUp:Qt,handleAnnotationPointerLeave:en}=Na({canvasOpen:m,canvasZoom:W,canvasPanX:x,canvasPanY:E,spaceHeld:Xe,canDragViewportWithSelect:qe,isBackgroundCleanupActive:Me,cleanupTool:be,annotationFrameRef:ce,annotations:H,setCanvasPan:S,addBackgroundCleanupClick:b.addBackgroundCleanupClick,startBackgroundCleanupBrushStroke:b.startBackgroundCleanupBrushStroke,updateBackgroundCleanupBrushStroke:b.updateBackgroundCleanupBrushStroke,endBackgroundCleanupBrushStroke:b.endBackgroundCleanupBrushStroke,setCleanupBrushCursor:b.setCleanupBrushCursor});return o.jsxs("main",{className:`canvas${m?" canvas--mode-open":""}${r?" canvas--drop-active":""}${Xe?" canvas--space-held":""}${Ye?" canvas--pan-active":""}${qe?" canvas--zoom-hand":""}`,onDragOver:Ft,onDragLeave:Vt,onDrop:Kt,children:[r?o.jsx("div",{className:"canvas__drop-overlay","aria-hidden":!0,children:o.jsx("span",{className:"canvas__drop-hint",children:D("canvas.drop.hint")})}):null,m&&o.jsx(ta,{zoom:W,closeLabel:D("canvas.close"),blankCanvasLabel:D("canvas.blank.title"),blankCanvasAriaLabel:`${D(J?"canvas.blank.creating":"canvas.blank.create")} (Shift+B)`,blankCanvasShortcut:"Shift+B",blankCanvasBusy:J,shortcutHint:D("canvas.toolbar.zoomShortcutHint"),onZoomIn:()=>P(W+.1),onZoomOut:()=>P(W-.1),onZoomReset:G,onCreateBlankCanvas:()=>{de()},onClose:()=>{dt()}}),o.jsx("div",{className:`progress-bar${f>0?" active":""}`}),s?o.jsx(cn,{}):t?o.jsxs("div",{className:"result-container visible",tabIndex:0,onMouseDown:Wt,onWheel:Ht,onKeyDown:Yt,"aria-label":D("canvas.imageViewerAria"),children:[o.jsx(jn,{annotationFrameRef:ce,imageElementRef:Z,frameClassName:`canvas-annotation-frame${(y||z)&&m?" canvas-annotation-frame--alpha":""}${Me&&m?" canvas-annotation-frame--cleanup-picking":""}${ie&&m?" canvas-annotation-frame--cleanup-mask":""}`,frameStyle:{cursor:Ye?"grabbing":Xe||qe?"grab":m?Me?"crosshair":H.activeTool==="select"?"default":H.activeTool==="eraser"?H.eraserMode==="object"?ra:oa:"crosshair":"zoom-in",transform:m?`translate(${x}px, ${E}px) scale(${W})`:void 0,transition:m&&!Ye?"transform 0.2s ease":void 0},imageKey:`${ue?.filename??ue?.url??ue?.image}:${ue?.canvasMergedAt??""}`,imageSrc:Ke??t.image,fallbackImage:t.image,alt:D("canvas.resultAlt"),canvasOpen:m,maskOverlayUrl:ie?.dataUrl??null,cleanupLayer:o.jsx(Dn,{seeds:L,brushStrokes:we,brushCursor:Ut,brushRadius:_e,active:Me}),annotations:H,onOpenCanvas:X,onPointerDown:Zt,onPointerMove:Jt,onPointerUp:Qt,onPointerLeave:en}),m&&Ke?o.jsx(aa,{imageSrc:Ke,zoom:W,panX:x,panY:E,resetLabel:D("canvas.toolbar.zoomReset"),onReset:G}):null,m&&o.jsx(Zn,{annotations:H,backgroundCleanup:b,backgroundCleanupPreview:z,canvasState:{exportBackground:Q,exportMatteColor:ee,isApplying:K,isExporting:oe,isEditingWithMask:De},actions:{handleApplyCanvas:zt,handleExportCanvas:Xt,handleEditWithMask:qt,setExportBackground:te,setExportMatteColor:le}}),m&&re!=="idle"?o.jsx("div",{className:`canvas-save-state canvas-save-state--${re}`,children:D(re==="saving"?"canvas.version.saving":re==="saved"?"canvas.version.saved":"canvas.version.failed")}):null,o.jsx("div",{className:"result-meta",children:[t.elapsed!=null?`${t.elapsed}s`:null,t.usage?D("canvas.tokens",{n:t.usage.total_tokens??"?"}):null,We,He,Fe,t.provider??null].filter(h=>!!h).join(" · ")}),o.jsx(un,{imageOverride:m?ue:null}),t.prompt?o.jsx("div",{className:"result-prompt",onClick:Ue,children:t.prompt}):null]}):null]})}export{Fa as CanvasModeWorkspace};
@@ -34,8 +34,8 @@
34
34
  }
35
35
  })();
36
36
  </script>
37
- <script type="module" crossorigin src="/assets/index-D0fdHLkJ.js"></script>
38
- <link rel="stylesheet" crossorigin href="/assets/index-BDffwmLs.css">
37
+ <script type="module" crossorigin src="/assets/index-C9cXwiWE.js"></script>
38
+ <link rel="stylesheet" crossorigin href="/assets/index-CGMIkZXn.css">
39
39
  </head>
40
40
  <body>
41
41
  <div id="root"></div>
Binary file
Binary file