@mokuyoaxis/dsh-iris 0.2.7 → 0.3.0-alpha.1

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 (160) hide show
  1. package/CHANGELOG.md +81 -1
  2. package/README.en.md +103 -312
  3. package/README.md +100 -310
  4. package/bin/dsh-iris.js +333 -65
  5. package/docs/AGENT_CORE_QUICKSTART.md +64 -0
  6. package/docs/AGENT_QUICKSTART.md +2 -0
  7. package/docs/ARCHITECTURE.md +13 -3
  8. package/docs/AUDIO_FLOWS.md +71 -0
  9. package/docs/CONTACT_SHEET.md +62 -0
  10. package/docs/CORE_CONNECTIONS.md +99 -0
  11. package/docs/CORE_QUICKSTART.md +108 -0
  12. package/docs/CORE_RUNTIME_CONTRACT.md +7 -2
  13. package/docs/CORE_SERVICE.md +97 -0
  14. package/docs/CORE_SKILLS.md +35 -3
  15. package/docs/DSH_COMPATIBILITY.md +10 -0
  16. package/docs/DSH_RC2_ADAPTATION.md +1 -1
  17. package/docs/DSH_RUNTIME.md +6 -2
  18. package/docs/HEADLESS_CLI.md +2 -2
  19. package/docs/IMAGE_FLOW.md +4 -0
  20. package/docs/IMAGE_GENERATION.md +127 -0
  21. package/docs/LOCAL_API.md +4 -2
  22. package/docs/LOCAL_API_CONTRACT.md +39 -14
  23. package/docs/LOCAL_CREATION.md +7 -1
  24. package/docs/LOCAL_OPERATIONS.md +46 -0
  25. package/docs/LOCAL_SELECTION.md +57 -0
  26. package/docs/LOCAL_WEB.md +201 -0
  27. package/docs/MCP.md +191 -0
  28. package/docs/MUSIC.md +2 -0
  29. package/docs/PANEL_EXTENSIONS.md +64 -0
  30. package/docs/PLUGINS.md +189 -0
  31. package/docs/PLUGIN_STARTUP.md +100 -0
  32. package/docs/PROVIDER_ADAPTER_CONTRACT.md +1 -1
  33. package/docs/PROVIDER_EXTENSIONS.md +78 -0
  34. package/docs/PROVIDER_HEALTH.md +3 -1
  35. package/docs/PROVIDER_SETTINGS.md +85 -0
  36. package/docs/PROVIDER_SUBMISSION_CONTRACT.md +6 -0
  37. package/docs/ROADMAP.md +17 -7
  38. package/docs/VISION_CLI.md +1 -1
  39. package/docs/WEB_PROTOTYPE.md +21 -6
  40. package/docs/WEB_RECOVERY.md +46 -0
  41. package/docs/WORKBENCH_LOGIN.md +63 -0
  42. package/docs/assets/screenshots/core-connections-preview.webp +0 -0
  43. package/docs/assets/screenshots/core-model-pools-preview.webp +0 -0
  44. package/docs/assets/screenshots/core-overview-preview.webp +0 -0
  45. package/docs/assets/screenshots/core-spectrum-preview.webp +0 -0
  46. package/docs/assets/screenshots/core-studio-dark-preview.webp +0 -0
  47. package/docs/assets/screenshots/core-studio-mobile-preview.webp +0 -0
  48. package/docs/assets/screenshots/core-studio-preview.webp +0 -0
  49. package/docs/releases/0.3.0-alpha.1.md +51 -0
  50. package/docs/screenshots.md +41 -1
  51. package/lib/actions.js +53 -2
  52. package/lib/adapters.js +20 -11
  53. package/lib/application-runtime.js +34 -7
  54. package/lib/audio-flow-input.js +37 -0
  55. package/lib/client.js +346 -53
  56. package/lib/comfyui-adapter.js +94 -0
  57. package/lib/comfyui-client.js +51 -0
  58. package/lib/comfyui-inspection.js +73 -0
  59. package/lib/comfyui-workflow.js +94 -0
  60. package/lib/config.js +36 -1
  61. package/lib/configured-image-runtime.js +50 -0
  62. package/lib/connection-skill.js +89 -0
  63. package/lib/connection-template.js +23 -0
  64. package/lib/core-artifact-store.js +16 -2
  65. package/lib/core-bridge-selection.js +31 -0
  66. package/lib/core-bridge-tools.js +83 -0
  67. package/lib/core-capability-catalog.js +182 -0
  68. package/lib/core-connection-diagnostics.js +49 -0
  69. package/lib/core-connection-store.js +277 -0
  70. package/lib/core-connections.js +225 -0
  71. package/lib/core-maintenance.js +9 -3
  72. package/lib/core-runtime.js +2 -1
  73. package/lib/core-service-client.js +170 -0
  74. package/lib/core-tasks.js +29 -12
  75. package/lib/core-writer-lease.js +16 -0
  76. package/lib/creation-request-store.js +38 -64
  77. package/lib/dsh-host-adapter.js +4 -1
  78. package/lib/dsh-service-bridge.js +66 -0
  79. package/lib/execution-ownership.js +43 -0
  80. package/lib/flow-store.js +105 -10
  81. package/lib/generation-input.js +10 -1
  82. package/lib/headless-vision.js +7 -7
  83. package/lib/image-edit-input.js +1 -1
  84. package/lib/image-flow.js +73 -29
  85. package/lib/index.js +37 -17
  86. package/lib/local-api-projection.js +10 -5
  87. package/lib/local-api-token-directory.js +31 -0
  88. package/lib/local-api.js +769 -67
  89. package/lib/local-creation.js +89 -24
  90. package/lib/local-operations.js +36 -0
  91. package/lib/local-request-root.js +86 -0
  92. package/lib/local-web-assets.js +37 -0
  93. package/lib/mcp-bridge.js +58 -0
  94. package/lib/mcp-check.js +26 -0
  95. package/lib/mcp-config.js +42 -0
  96. package/lib/mcp-delivery.js +46 -0
  97. package/lib/mcp-http.js +101 -0
  98. package/lib/mcp-server.js +47 -0
  99. package/lib/model-directory-service.js +16 -6
  100. package/lib/model-directory.js +3 -3
  101. package/lib/models.js +2 -2
  102. package/lib/music-transport.js +2 -1
  103. package/lib/operation-runner.js +236 -0
  104. package/lib/operation-store.js +216 -0
  105. package/lib/panel-extension.js +36 -0
  106. package/lib/plugin-contract.js +194 -0
  107. package/lib/plugin-execution.js +51 -0
  108. package/lib/plugin-launch.js +86 -0
  109. package/lib/plugin-operation-store.js +101 -0
  110. package/lib/plugin-operations.js +28 -0
  111. package/lib/plugin-registry.js +109 -0
  112. package/lib/plugin-selection.js +15 -0
  113. package/lib/plugin-source-image.js +5 -0
  114. package/lib/plugin-web-assets.js +54 -0
  115. package/lib/plugins.d.ts +288 -0
  116. package/lib/plugins.js +58 -0
  117. package/lib/provider-adapter.js +5 -1
  118. package/lib/provider-adapters.js +56 -18
  119. package/lib/provider-catalog.js +40 -29
  120. package/lib/provider-config-service.js +105 -23
  121. package/lib/provider-diagnostics.js +56 -0
  122. package/lib/provider-extensions.js +29 -0
  123. package/lib/provider-health.js +8 -1
  124. package/lib/provider-monitor.js +79 -0
  125. package/lib/provider-protocol.js +70 -20
  126. package/lib/provider-registry.js +118 -0
  127. package/lib/provider-response.js +28 -0
  128. package/lib/provider-settings.js +134 -0
  129. package/lib/provider-task-runner.js +22 -9
  130. package/lib/skill-installation.js +23 -11
  131. package/lib/vision-model-routing.js +3 -0
  132. package/lib/web/app.js +642 -0
  133. package/lib/web/appearance.js +111 -0
  134. package/lib/web/comfyui.js +146 -0
  135. package/lib/web/connections.js +377 -0
  136. package/lib/web/creation.js +355 -0
  137. package/lib/web/flow-view.js +33 -0
  138. package/lib/web/gallery.js +132 -0
  139. package/lib/web/index.html +291 -0
  140. package/lib/web/media-client.js +204 -0
  141. package/lib/web/plugin-panel.js +221 -0
  142. package/lib/web/plugin-surface.css +17 -0
  143. package/lib/web/providers.js +492 -0
  144. package/lib/web/recovery.js +105 -0
  145. package/lib/web/startup.js +18 -0
  146. package/lib/web/styles.css +518 -0
  147. package/lib/web/transport.js +96 -0
  148. package/lib/web/workbench-login.js +165 -0
  149. package/lib/workbench-auth-cli.js +47 -0
  150. package/lib/workbench-auth.js +200 -0
  151. package/package.json +20 -5
  152. package/plugins/contact-sheet/index.d.mts +4 -0
  153. package/plugins/contact-sheet/index.mjs +33 -0
  154. package/plugins/contact-sheet/web/board.css +14 -0
  155. package/plugins/contact-sheet/web/board.mjs +93 -0
  156. package/skills/iris-core/SKILL.md +8 -4
  157. package/skills/iris-core/references/cli.md +2 -2
  158. package/skills/iris-core/references/comfyui.md +69 -0
  159. package/skills/iris-core/references/tasks.md +2 -0
  160. package/user_guide.md +5 -1
@@ -0,0 +1,18 @@
1
+ // Render-blocking and dependency-free: restore only the saved colour mode before the first paint.
2
+ (() => {
3
+ const root = document.documentElement;
4
+ let theme = 'light';
5
+ try {
6
+ const saved = JSON.parse(localStorage.getItem('iris.panel.appearance.v0'));
7
+ if (saved?.contractVersion === 0 && ['light', 'dark', 'system'].includes(saved.theme)) theme = saved.theme;
8
+ } catch (error) {
9
+ if (!['SyntaxError', 'SecurityError', 'QuotaExceededError', 'InvalidStateError'].includes(error.name)) throw error;
10
+ }
11
+ root.dataset.theme = theme === 'dark' || theme === 'system' && matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
12
+ // A failed entry module/stylesheet must leave a useful screen, rather than an endless loading message.
13
+ window.addEventListener('error', event => {
14
+ if (root.dataset.startup !== 'pending') return;
15
+ if (event instanceof ErrorEvent || event.target instanceof HTMLScriptElement
16
+ || event.target instanceof HTMLLinkElement && event.target.rel === 'stylesheet') root.dataset.startup = 'failed';
17
+ }, true);
18
+ })();
@@ -0,0 +1,518 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --iris-gradient:linear-gradient(105deg,#45317D,#6F69B8,#BB78AD,#E59B76,#ED9C91,#F0D09C);
4
+ --page:#fdfcfe; --panel:#fff; --rail:#f8f7fb; --ink:#302a3d; --muted:#70697b;
5
+ --line:#e7e3ec; --soft:#f7f6fa; --accent:#45317D; --on-accent:#fff; --tint:#f0edf8;
6
+ --purple:#6F69B8; --warning:#7c5b1a; --error:#a3332d;
7
+ font:14px/1.6 Inter,-apple-system,BlinkMacSystemFont,"Noto Sans CJK SC","PingFang SC","Microsoft YaHei",sans-serif;
8
+ background:var(--page); color:var(--ink);
9
+ }
10
+ :root[data-theme="dark"] {
11
+ color-scheme:dark; --page:#1d1a24; --panel:#26222e; --rail:#211e29; --ink:#eeeaf5; --muted:#b7aec6;
12
+ --line:#40394c; --soft:#2e2838; --accent:#c5b8ee; --on-accent:#2a1d48; --tint:#382d4c;
13
+ --purple:#b8b2ef; --warning:#edc981; --error:#ffb4ab;
14
+ }
15
+ * { box-sizing:border-box; }
16
+ [hidden] { display:none!important; }
17
+ body,h1,h2,h3,p,figure { margin:0; }
18
+ button,input,select,textarea { font:inherit; min-width:0; }
19
+ button { cursor:pointer; touch-action:manipulation; }
20
+ button,.file-button { border:1px solid transparent; border-radius:8px; min-height:42px; padding:8px 14px; font-weight:550; background:var(--accent); color:var(--on-accent); }
21
+ button:hover:not(:disabled) { filter:brightness(.94); }
22
+ button:disabled { opacity:.5; cursor:default; }
23
+ button.quiet,.secondary { color:var(--ink); background:transparent; }
24
+ .secondary { border-color:var(--line); background:var(--panel); }
25
+ input:not([type="file"]):not([type="checkbox"]):not([type="range"]),select,textarea { color:var(--ink); background:var(--panel); border:1px solid var(--line); border-radius:8px; padding:9px 11px; max-width:100%; min-height:42px; }
26
+ input,select,textarea { accent-color:var(--accent); }
27
+ textarea { width:100%; resize:vertical; line-height:1.7; }
28
+ a { color:var(--accent); }
29
+ :focus-visible { outline:2px solid var(--purple); outline-offset:3px; }
30
+ #main-content:focus-visible { outline:none; }
31
+ button,input,textarea,select,summary { -webkit-tap-highlight-color:transparent; }
32
+ h1 { font-size:25px; font-weight:650; letter-spacing:-.6px; line-height:1.4; }
33
+ h2 { font-size:16px; font-weight:650; } h3 { font-size:14px; }
34
+ .muted,.field-note,.meta { color:var(--muted); }
35
+ .field-note { font-size:12px; margin-top:8px; overflow-wrap:anywhere; }
36
+ .skip-link { position:fixed; top:-90px; left:12px; z-index:10; padding:12px; background:var(--panel); }
37
+ .skip-link:focus { top:8px; }
38
+ .app-shell { display:grid; grid-template-columns:192px minmax(0,1fr); min-height:100dvh; }
39
+ .startup-screen { display:none; }
40
+ :root:is([data-startup="pending"],[data-startup="failed"]) .startup-screen { display:flex; position:fixed; inset:0; flex-direction:column; align-items:center; justify-content:center; gap:10px; background:var(--page); color:var(--muted); }
41
+ :root:is([data-startup="pending"],[data-startup="failed"]) .app-shell { display:none; }
42
+ .startup-brand { color:var(--ink); font-size:34px; font-weight:650; letter-spacing:-1px; }
43
+ .startup-brand span { background:var(--iris-gradient); background-clip:text; color:transparent; }
44
+ .startup-message,.startup-failure { font-size:13px; }
45
+ .startup-failure { display:none; text-align:center; }
46
+ .startup-failure a { display:inline-block; margin-top:12px; }
47
+ :root[data-startup="failed"] .startup-message { display:none; }
48
+ :root[data-startup="failed"] .startup-failure { display:block; }
49
+ body:not(.connected) .app-shell { grid-template-columns:minmax(0,1fr); }
50
+ body.connected .site-header { position:sticky; top:0; z-index:8; }
51
+ .provider-sections { margin-bottom:20px; }
52
+ .provider-pool-panel { padding:20px; max-width:1000px; }
53
+ .provider-pool-panel fieldset { border:0; padding:0; margin:0; min-width:0; }
54
+ .provider-footer { display:flex; align-items:center; flex-wrap:wrap; gap:10px; margin-top:18px; }
55
+ .provider-footer .field-note { flex-basis:100%; }
56
+ .provider-spectrum { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; margin:18px 0; }
57
+ .provider-spectrum-card { --spectrum-tone:#45317D; min-width:0; text-align:left; padding:16px; color:var(--ink); background:linear-gradient(125deg,color-mix(in srgb,var(--spectrum-tone) 7%,var(--panel)),var(--panel)); border:1px solid var(--line); border-top:3px solid color-mix(in srgb,var(--spectrum-tone) 65%,var(--line)); border-radius:12px; }
58
+ .provider-spectrum-card[data-tone="1"] { --spectrum-tone:#6F69B8; }.provider-spectrum-card[data-tone="2"] { --spectrum-tone:#BB78AD; }.provider-spectrum-card[data-tone="3"] { --spectrum-tone:#E59B76; }.provider-spectrum-card[data-tone="4"] { --spectrum-tone:#ED9C91; }.provider-spectrum-card[data-tone="5"] { --spectrum-tone:#F0D09C; }
59
+ .provider-spectrum-card strong,.provider-spectrum-card small { display:block; }.provider-spectrum-card small { font-size:11px; color:var(--muted); font-weight:400; margin-top:7px; }
60
+ .provider-health-details { padding:16px 20px; }.provider-health-details>summary { display:flex; justify-content:space-between; cursor:pointer; }
61
+ .provider-health-model { margin-top:14px; padding-top:14px; border-top:1px solid var(--line); min-width:0; }.provider-health-model strong { overflow-wrap:anywhere; }
62
+ .provider-check-heading { margin:26px 0 8px; }
63
+ .provider-monitor { padding:18px; min-width:0; }.provider-monitor h3 { overflow-wrap:anywhere; }.provider-monitor .field-note { margin:10px 0; }
64
+ .provider-monitor-options { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-top:12px; font-size:12px; }.provider-monitor-options label { display:flex; align-items:center; gap:6px; }
65
+ .provider-rank-row { display:flex; align-items:center; flex-wrap:wrap; gap:6px; }.provider-rank-row label { flex:1; }.provider-rank-row button { font-size:11px; min-height:30px; padding:3px 9px; }
66
+ @media(max-width:640px) { .provider-spectrum { grid-template-columns:repeat(2,minmax(0,1fr)); gap:9px; }.provider-spectrum-card { padding:13px; }.provider-pool-panel { padding:16px; }.provider-sections { gap:3px; }.provider-sections button { padding-inline:9px; } }
67
+ .app-sidebar { position:sticky; top:0; height:100dvh; padding:28px 14px 18px; background:var(--rail); border-right:1px solid var(--line); display:flex; flex-direction:column; min-width:0; }
68
+ .brand { display:flex; align-items:center; gap:9px; color:var(--ink); text-decoration:none; padding:0 9px; font-size:30px; font-weight:700; letter-spacing:-1px; }
69
+ .brand-dot { color:var(--purple); }
70
+ .sidebar-label { color:var(--muted); font-size:12px; margin:32px 12px 9px; }
71
+ .workspace-nav { display:grid; gap:5px; }
72
+ .plugin-navigation { display:grid; gap:5px; border-top:1px solid var(--line); padding-top:8px; margin-top:5px; }
73
+ .plugin-slot { min-width:0; }
74
+ .plugin-slot.card { padding:20px; }
75
+ .plugin-settings-card { margin-bottom:12px; padding:16px; }
76
+ .plugin-history-item { padding:20px; margin:14px 0; }
77
+ .plugin-history-item h2 { overflow-wrap:anywhere; }
78
+ .plugin-history-item img { display:block; max-width:100%; max-height:500px; object-fit:contain; margin:16px 0; }
79
+ .plugin-settings-card>summary { display:flex; justify-content:space-between; align-items:center; cursor:pointer; }
80
+ .plugin-settings-card>.plugin-slot { padding-top:14px; }
81
+ .plugin-preview { margin-top:16px; border-top:1px solid var(--line); padding-top:12px; }
82
+ .plugin-preview-options { display:flex; flex-wrap:wrap; gap:12px; margin:12px 0; }
83
+ .plugin-preview-options label { display:grid; gap:5px; min-width:150px; flex:1; color:var(--muted); font-size:12px; }
84
+ @media(max-width:850px) { .workspace-nav .plugin-navigation { display:contents; } }
85
+ .nav-item { display:flex; align-items:center; gap:10px; width:100%; text-align:left; color:var(--muted); background:transparent; font-size:14px; min-height:44px; }
86
+ .nav-item svg { width:19px; height:19px; flex-shrink:0; fill:none; stroke:currentColor; stroke-width:1.65; stroke-linecap:round; stroke-linejoin:round; }
87
+ .nav-item>span:first-child { color:var(--purple); font-size:20px; min-width:21px; text-align:center; }
88
+ .nav-item[aria-current="page"] { color:var(--ink); background:var(--panel); border-color:var(--line); }
89
+ .count { font-size:12px; font-weight:400; color:var(--muted); }
90
+ .recent-panel { margin-top:26px; min-height:0; overflow:auto; }
91
+ .recent-panel>summary { padding-inline:8px; font-size:12px; }
92
+ #history-list { display:grid; gap:4px; }
93
+ .history-item { display:grid; grid-template-columns:18px minmax(0,1fr); gap:2px 6px; text-align:left; width:100%; background:transparent; color:var(--ink); padding:9px 8px; }
94
+ .history-item strong { font-size:12px; font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
95
+ .history-item small { grid-row:span 2; font-size:12px; color:var(--muted); }
96
+ .history-item span { grid-column:2; font-size:12px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
97
+ .history-item[aria-current="true"] { background:var(--panel); border-color:var(--line); }
98
+ #history-empty { padding:10px 8px; font-size:12px; }
99
+ .sidebar-bottom { margin-top:auto; padding-top:18px; border-top:1px solid var(--line); display:flex; gap:9px; font-size:12px; }
100
+ .sidebar-bottom small { display:block; color:var(--muted); font-size:12px; }
101
+ .workspace-avatar { display:grid; place-items:center; width:32px; height:36px; background:var(--tint); color:var(--accent); border-radius:8px; font:italic 27px Georgia,serif; }
102
+ .main-area { min-width:0; position:relative; isolation:isolate; }
103
+ .main-area::before { content:""; position:fixed; z-index:-1; inset:0; pointer-events:none; background-image:var(--workspace-image,none); background-position:var(--background-position,center); background-size:cover; opacity:var(--background-opacity,.14); filter:blur(var(--background-blur,0px)); }
104
+ .site-header { min-height:60px; border-bottom:1px solid var(--line); display:flex; align-items:center; justify-content:space-between; gap:12px; padding:8px 26px; background:var(--panel); }
105
+ .breadcrumb { color:var(--muted); font-size:12px; } .breadcrumb>span { padding:0 10px; opacity:.6; } .breadcrumb strong { color:var(--ink); font-weight:500; }
106
+ .header-actions { display:flex; gap:4px; align-items:center; }
107
+ .badge { font-size:12px; font-weight:550; padding:4px 9px; border-radius:20px; background:var(--tint); color:var(--accent); }
108
+ main { padding:24px 26px 0; max-width:1600px; margin:auto; min-width:0; }
109
+ .card { background:var(--panel); border:1px solid var(--line); border-radius:13px; min-width:0; }
110
+ .eyebrow { font-size:12px; letter-spacing:1.5px; font-weight:500; color:var(--muted); margin-bottom:5px; }
111
+ .page-heading { display:flex; justify-content:space-between; align-items:center; gap:16px; margin:2px 0 22px; }
112
+ .page-heading>.secondary { flex-shrink:0; } .page-heading p.muted { font-size:13px; margin-top:7px; }
113
+ .page-heading>button { flex-shrink:0; white-space:nowrap; }
114
+ .overview-panel { max-width:1120px; margin:0 auto 32px; }
115
+ .overview-welcome { display:flex; justify-content:space-between; align-items:center; gap:24px; padding:26px 28px; position:relative; overflow:hidden; background:linear-gradient(115deg,var(--panel) 65%,var(--soft)); }
116
+ .overview-welcome::before { content:""; position:absolute; top:0; left:0; right:0; height:3px; background:var(--iris-gradient); }
117
+ .overview-welcome h1 { font-size:27px; letter-spacing:-.6px; }
118
+ .overview-welcome .muted { margin-top:8px; font-size:13px; }
119
+ .overview-welcome-actions { display:flex; flex-shrink:0; gap:8px; }
120
+ .overview-stats { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:16px; margin:18px 0 26px; }
121
+ .overview-stats>div { min-width:0; padding:4px 0 4px 16px; border-left:2px solid var(--line); }
122
+ .overview-stats dt { color:var(--muted); font-size:12px; }.overview-stats dd { margin:3px 0 0; font-size:21px; font-weight:600; line-height:1.5; }
123
+ .overview-stat-note { display:block; color:var(--muted); font-size:11px; margin-top:3px; }
124
+ .overview-section-heading { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:14px; }
125
+ .overview-section-heading h2 { font-size:17px; }.overview-section-heading p { font-size:12px; margin-top:3px; }
126
+ .overview-section-heading button { flex-shrink:0; font-size:12px; }
127
+ .overview-capabilities { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:14px; }
128
+ .overview-capability { --cap-tone:#45317D; padding:18px; display:flex; flex-direction:column; border-top-color:color-mix(in srgb,var(--cap-tone) 25%,var(--line)); }
129
+ .overview-capability[data-provider-tone="1"] { --cap-tone:#6F69B8; }.overview-capability[data-provider-tone="2"] { --cap-tone:#BB78AD; }
130
+ .overview-capability[data-provider-tone="3"] { --cap-tone:#E59B76; }.overview-capability[data-provider-tone="4"] { --cap-tone:#ED9C91; }.overview-capability[data-provider-tone="5"] { --cap-tone:#F0D09C; }
131
+ .overview-capability-heading { display:flex; gap:9px; align-items:center; }.overview-capability-heading h3 { font-size:15px; font-weight:600; }
132
+ .overview-capability-icon { display:grid; place-items:center; width:34px; height:34px; flex-shrink:0; border-radius:10px; background:color-mix(in srgb,var(--cap-tone) 10%,var(--panel)); color:color-mix(in srgb,var(--cap-tone) 50%,var(--ink)); }
133
+ .overview-capability-icon svg { width:19px; height:19px; fill:none; stroke:currentColor; stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round; }
134
+ .overview-entry { margin-left:auto; font-size:10px; color:var(--muted); background:var(--soft); padding:2px 7px; border-radius:5px; white-space:nowrap; }
135
+ .overview-capability-description { font-size:12px; color:var(--muted); margin:12px 0 14px; }
136
+ .overview-capability-facts { display:grid; grid-template-columns:auto minmax(0,1fr); gap:6px 12px; margin:0 0 14px; font-size:11px; }
137
+ .overview-capability-facts dt { color:var(--muted); }.overview-capability-facts dd { margin:0; overflow-wrap:anywhere; }
138
+ .overview-capability-actions { display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-top:auto; min-height:36px; }
139
+ .overview-capability-actions button { font-size:11px; padding:5px 10px; min-height:34px; }.overview-capability-actions .quiet { color:var(--accent); }
140
+ .overview-action-note { font-size:11px; color:var(--muted); }
141
+ .overview-capability-more { margin-top:12px; border-top:1px solid var(--line); padding-top:10px; }
142
+ .overview-capability-more summary { color:var(--muted); font-size:11px; font-weight:400; }.overview-capability-more p { font-size:11px; margin-top:9px; color:var(--muted); overflow-wrap:anywhere; }
143
+ .overview-command { font-family:ui-monospace,SFMono-Regular,Consolas,monospace; }.overview-evidence-time { display:block; font-size:10px; color:var(--muted); margin-top:9px; }
144
+ .overview-tools { margin-top:18px; padding:15px 18px; }.overview-tools>summary { font-size:13px; font-weight:500; }.overview-tools>summary small { font-size:11px; font-weight:400; color:var(--muted); margin-left:7px; }
145
+ .overview-tool-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:20px; padding:20px 0 3px; }
146
+ .overview-tool-grid h3 { font-size:12px; }.overview-tool-grid p,.overview-tool-grid code { display:block; font-size:11px; color:var(--muted); margin-top:6px; overflow-wrap:anywhere; }
147
+ .overview-notes { margin:16px 3px; }.overview-notes summary { font-size:11px; color:var(--muted); font-weight:400; }.overview-notes p { font-size:11px; color:var(--muted); margin-top:8px; max-width:760px; }
148
+ @media(max-width:1100px) { .overview-capabilities { grid-template-columns:repeat(2,minmax(0,1fr)); }.overview-welcome { padding:22px; flex-wrap:wrap; } }
149
+ @media(max-width:640px) {
150
+ .overview-welcome { padding:22px 18px; gap:18px; }.overview-welcome h1 { font-size:23px; }.overview-welcome-actions { width:100%; }.overview-welcome-actions button { flex:1; font-size:12px; }
151
+ .overview-stats { gap:9px; margin-bottom:22px; }.overview-stats>div { padding-left:9px; }.overview-stats dd { font-size:16px; }.overview-stat-note { font-size:10px; }
152
+ .overview-capabilities { grid-template-columns:1fr; gap:12px; }.overview-capability { padding:16px; }.overview-capability-actions button { min-height:40px; padding-inline:12px; }
153
+ .overview-tool-grid { grid-template-columns:1fr; gap:18px; }.overview-tools>summary small { display:none; }
154
+ }
155
+ .connection { max-width:500px; margin:7vh auto 12vh; padding:36px; position:relative; overflow:hidden; }
156
+ .connection::before { content:""; position:absolute; inset:0 0 auto; height:4px; background:var(--iris-gradient); }
157
+ .brand-dot { background:var(--iris-gradient); background-clip:text; color:transparent; }
158
+ .nav-item[aria-current="page"] { box-shadow:inset 3px 0 var(--accent); }
159
+ .eyebrow::before { content:""; display:inline-block; width:20px; height:3px; vertical-align:middle; margin-right:8px; border-radius:2px; background:var(--iris-gradient); }
160
+ .connection .eyebrow { color:var(--purple); } .connection h1 { font-size:29px; }
161
+ html[data-auth="password"] #login-help,html[data-auth="password"] #paste-panel { display:none; }
162
+ #password-form { display:grid; gap:9px; margin-top:22px; }
163
+ #password-form>label,#password-confirm-row>label { color:var(--ink); font-size:13px; font-weight:550; }
164
+ .password-row { display:flex; align-items:stretch; gap:6px; border:1px solid var(--line); border-radius:10px; padding-right:4px; background:var(--panel); }
165
+ .password-row:focus-within { outline:2px solid var(--purple); outline-offset:2px; }
166
+ .password-row input { min-width:0; flex:1; border:0; background:transparent; box-shadow:none; outline:0; }
167
+ .password-row button { font-size:12px; min-width:46px; }
168
+ #password-confirm-row { display:grid; gap:9px; margin-top:5px; }
169
+ #password-confirm { width:100%; }
170
+ #password-form .password-remember { display:flex; align-items:center; gap:9px; margin:8px 0 9px; font-weight:400; cursor:pointer; }
171
+ .password-remember input { width:16px; height:16px; accent-color:var(--accent); }
172
+ .password-remember small { color:var(--muted); margin-left:5px; font-weight:400; }
173
+ .password-help { margin-top:18px; color:var(--muted); font-size:12px; }
174
+ .password-help p { line-height:1.8; margin:6px 0 10px; }
175
+ .password-help code { display:block; overflow-wrap:anywhere; font-size:11px; }
176
+ .intro { margin:12px 0 24px; color:var(--muted); }
177
+ .file-button { display:block; text-align:center; position:relative; cursor:pointer; }
178
+ .file-button:focus-within,.image-drop:focus-within { outline:2px solid var(--purple); outline-offset:3px; }
179
+ .file-button input,.image-drop input { position:absolute; inset:0; width:100%; opacity:0; cursor:pointer; }
180
+ #token-help { font-size:12px; margin:12px 0 18px; }
181
+ summary { list-style:none; cursor:pointer; min-height:42px; display:flex; align-items:center; justify-content:space-between; gap:10px; font-size:13px; font-weight:550; }
182
+ summary::-webkit-details-marker { display:none; } .disclosure { color:var(--muted); font-size:12px; font-weight:400; white-space:nowrap; }
183
+ #connect-form { margin-top:8px; } #connect-form label { font-size:12px; color:var(--muted); }
184
+ .token-row { display:flex; gap:8px; margin-top:6px; } .token-row input { flex:1; }
185
+ .scope-note { font-size:12px; color:var(--muted); padding-top:18px; margin-top:12px; border-top:1px solid var(--line); }
186
+ #feedback,#creation-feedback,#connections-feedback { padding:10px 14px; border-radius:8px; background:var(--tint); overflow-wrap:anywhere; font-size:13px; }
187
+ #feedback,#connections-feedback { margin-bottom:16px; }
188
+ .error { color:var(--error)!important; }
189
+ .compact-details { padding:4px 15px; }
190
+ .compact-details summary small,.composer summary small { display:block; font-weight:400; color:var(--muted); font-size:12px; }
191
+ .compact-details p,.compact-details ul { font-size:12px; margin:10px 0; overflow-wrap:anywhere; }
192
+ .compact-details ul { padding-left:16px; max-height:180px; overflow:auto; }
193
+ #recovery-panel { margin-bottom:18px; }
194
+ #recovery-list { list-style:none; padding:0; max-height:300px; }
195
+ #recovery-list li { display:flex; flex-wrap:wrap; align-items:center; gap:8px; padding:8px 0; border-top:1px solid var(--line); }
196
+ .full { width:100%; margin-top:12px; }
197
+ .studio-grid { display:grid; grid-template-columns:minmax(0,1fr) 306px; gap:20px; align-items:start; }
198
+ .composer { grid-column:2; grid-row:1; padding-bottom:14px; }
199
+ .composer>summary { padding:14px 18px; border-bottom:1px solid var(--line); min-height:64px; font-size:14px; }
200
+ #edit-form { padding:0 18px; } fieldset { padding:0; margin:0; min-width:0; border:0; }
201
+ .field-label { display:flex; justify-content:space-between; gap:8px; margin:17px 0 8px; font-size:13px; font-weight:550; }
202
+ .field-label small { font-size:12px; font-weight:400; color:var(--muted); }
203
+ #model,#edit-size { width:100%; }
204
+ .comfy-studio,.comfy-preview { margin-top:14px; padding:12px; border:1px solid var(--line); border-radius:12px; background:var(--panel); min-width:0; }
205
+ .comfy-studio { position:relative; overflow:hidden; border-top:3px solid var(--purple); }
206
+ .comfy-studio::before { content:""; position:absolute; inset:0; pointer-events:none; background:var(--iris-gradient); opacity:0; animation:comfy-arrive .65s ease-out; }
207
+ @keyframes comfy-arrive { 0% { opacity:.14; transform:translateX(-75%); } 100% { opacity:0; transform:translateX(75%); } }
208
+ .comfy-studio h3,.comfy-preview h3 { font-size:13px; }
209
+ .comfy-group { margin-top:10px; border-top:1px solid var(--line); padding-top:3px; min-width:0; }
210
+ .comfy-group>summary { min-height:36px; gap:8px; font-size:12px; overflow-wrap:anywhere; }
211
+ .comfy-group>summary>span:first-child { min-width:0; overflow:hidden; text-overflow:ellipsis; }
212
+ .comfy-common,.comfy-parameter-grid { display:grid; gap:10px; margin-top:10px; }
213
+ .comfy-parameter-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
214
+ .comfy-parameter-grid .comfy-parameter:has(select),.comfy-parameter-grid .comfy-parameter:has(input[type=text]) { grid-column:1/-1; }
215
+ .comfy-parameter { display:grid; gap:4px; font-size:12px; min-width:0; margin-top:8px; overflow-wrap:anywhere; }
216
+ .comfy-parameter input:not([type=checkbox]),.comfy-parameter select,.comfy-parameter textarea { width:100%; min-height:36px; padding:6px 8px; font-size:13px; }
217
+ .comfy-parameter:has(input[type=checkbox]) { display:flex; align-items:center; justify-content:space-between; }
218
+ .comfy-lora { padding:5px 9px; border:1px solid var(--line); border-radius:9px; background:color-mix(in srgb,var(--purple) 5%,var(--panel)); }
219
+ .comfy-slot { display:grid; grid-template-columns:minmax(0,1fr) minmax(100px,1fr) 72px; gap:8px; align-items:center; padding:8px 0; border-bottom:1px solid var(--line); }
220
+ .comfy-slot .mini-check { overflow-wrap:anywhere; font-size:11px; }
221
+ .comfy-slot input:not([type=checkbox]),.comfy-slot select { width:100%; min-height:34px; padding:5px 7px; font-size:12px; }
222
+ .comfy-confirm { padding:12px; margin-top:12px; border:1px solid var(--line); border-radius:9px; background:var(--tint); font-size:12px; }
223
+ .comfy-record { padding-block:12px; border-bottom:1px solid var(--line); }
224
+ .comfy-record dl { display:grid; grid-template-columns:minmax(80px,1fr) minmax(0,2fr); gap:5px 14px; margin:10px 0; font-size:12px; }
225
+ .comfy-record dt { color:var(--muted); overflow-wrap:anywhere; }.comfy-record dd { margin:0; overflow-wrap:anywhere; white-space:pre-wrap; }
226
+ @media(max-width:640px) { .comfy-slot { grid-template-columns:minmax(0,1fr) 72px; }.comfy-slot .mini-check { grid-column:1/-1; } }
227
+ @media(prefers-reduced-motion:reduce) { .comfy-studio::before { animation:none; } }
228
+ .image-drop { display:flex; align-items:center; gap:10px; position:relative; border:1px dashed var(--line); border-radius:9px; padding:10px; background:var(--soft); min-height:73px; cursor:pointer; overflow:hidden; }
229
+ .image-drop.dragging { border-color:var(--purple); background:var(--tint); }
230
+ .image-drop>span:nth-of-type(1) { min-width:0; flex:1; }
231
+ .image-drop strong { display:block; font-size:13px; font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
232
+ .image-drop small { display:block; font-size:12px; color:var(--muted); margin-top:3px; }
233
+ .image-drop img { width:44px; height:52px; object-fit:cover; border-radius:5px; }
234
+ .upload-arrow { font-size:24px; color:var(--purple); }
235
+ #creation-help { text-align:center; min-height:38px; } #creation-feedback { margin-top:12px; }
236
+ .composer-note { font-size:12px; color:var(--muted); margin:14px 18px 0; border-top:1px solid var(--line); padding-top:12px; }
237
+ .tool-details { border-block:1px solid var(--line); padding:3px 0; margin-top:14px; }
238
+ .tool-details small { font-size:12px; color:var(--muted); font-weight:400; margin-left:6px; }
239
+ .viewer { grid-column:1; grid-row:1; padding:0 16px 12px; min-width:0; overflow:hidden; }
240
+ .canvas-toolbar { display:flex; flex-wrap:wrap; align-items:center; gap:8px; min-height:66px; }
241
+ .canvas-label { font-size:13px; font-weight:550; margin-right:auto; }
242
+ .view-switch { display:inline-flex; gap:2px; max-width:100%; border:1px solid var(--line); background:var(--soft); border-radius:8px; padding:3px; }
243
+ .view-switch button { min-height:36px; padding:5px 10px; font-size:12px; background:transparent; color:var(--muted); }
244
+ .view-switch button[aria-pressed="true"] { background:var(--panel); color:var(--ink); border-color:var(--line); }
245
+ .viewer-empty { min-height:440px; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:12px; text-align:center; padding:24px; border-radius:9px; background:var(--soft); }
246
+ .viewer-empty h2 { font-size:20px; } .viewer-empty p { max-width:290px; font-size:13px; }
247
+ .empty-mark { font-size:50px; color:var(--purple); font-weight:300; }
248
+ #draft-preview { width:100%; max-height:420px; object-fit:contain; }
249
+ .viewer-empty:has(#draft-preview:not([hidden]))>:not(img) { display:none; }
250
+ .image-pair { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }
251
+ #run-view[data-has-output="false"] .image-pair { grid-template-columns:minmax(0,1fr); }
252
+ #run-view[data-has-output="false"] #output-card { display:none; }
253
+ .image-card { min-width:0; border:1px solid var(--line); border-radius:9px; overflow:hidden; background:var(--soft); }
254
+ .image-card.is-selected { border-color:var(--accent); }
255
+ figcaption { display:flex; justify-content:space-between; align-items:center; gap:6px; padding:9px 10px; font-size:12px; }
256
+ .selected-label { font-size:12px; color:var(--accent); }
257
+ .image-stage { display:grid; place-items:center; position:relative; min-height:0; height:clamp(230px,28vw,380px); width:100%; padding:10px; background:radial-gradient(#d9d9dc .7px,transparent .7px) 0 0/10px 10px #f5f5f6; border:0; color:#64646a; border-radius:0; cursor:zoom-in; }
258
+ .image-stage img { width:100%; height:100%; min-height:0; object-fit:contain; border-radius:3px; }
259
+ .image-stage span { font-size:12px; overflow-wrap:anywhere; font-weight:400; }
260
+ #run-view[data-has-output="false"] .image-stage { height:clamp(300px,32vw,430px); }
261
+ .image-dimensions { text-align:center; font-size:12px; color:var(--muted); min-height:25px; padding:2px 0 6px; }
262
+ .choice-button { width:100%; border:0; border-top:1px solid var(--line); color:var(--ink); background:var(--panel); border-radius:0; min-height:44px; font-size:13px; }
263
+ .choice-button[aria-pressed="true"] { color:var(--accent); background:var(--tint); }
264
+ .run-heading { margin-top:14px; padding:12px; background:var(--soft); border-radius:9px; display:flex; align-items:center; justify-content:space-between; gap:12px; }
265
+ .run-heading h2 { font-size:15px; } #status-message { margin-top:3px; font-size:13px; }
266
+ #run-view[data-tone="warning"] #status-title { color:var(--warning); }
267
+ .result-actions { display:flex; gap:14px; justify-content:space-between; align-items:center; margin:14px 0 8px; }
268
+ .result-actions p { font-size:12px; color:var(--muted); } .result-actions button { flex-shrink:0; font-size:13px; }
269
+ .reuse-actions { display:flex; justify-content:space-between; align-items:center; gap:8px; flex-wrap:wrap; }
270
+ .meta { font-size:12px; overflow-wrap:anywhere; }
271
+ .run-details { margin-top:9px; padding-top:5px; border-top:1px solid var(--line); }
272
+ #prompt { font-size:13px; white-space:pre-wrap; overflow-wrap:anywhere; max-height:180px; overflow:auto; margin-top:7px; }
273
+ dl { display:grid; grid-template-columns:74px minmax(0,1fr); gap:8px 12px; font-size:12px; margin:12px 0; }
274
+ dt { color:var(--muted); } dd { margin:0; overflow-wrap:anywhere; } .run-details>p { font-size:12px; }
275
+ .overlay-stage { position:relative; height:clamp(300px,33vw,430px); background:#f5f5f6; border-radius:9px; overflow:hidden; }
276
+ :root[data-theme="dark"] .image-stage,:root[data-theme="dark"] .overlay-stage { background-color:#262628; }
277
+ .overlay-stage img { position:absolute; inset:0; width:100%; height:100%; object-fit:contain; }
278
+ #overlay-output { clip-path:inset(0 0 0 var(--split,50%)); }
279
+ .overlay-view label { display:flex; gap:12px; align-items:center; font-size:12px; padding:12px 0 0; } #compare-split { min-width:0; flex:1; min-height:32px; }
280
+ .gallery-toolbar { display:flex; gap:10px; align-items:center; justify-content:space-between; margin-bottom:15px; }
281
+ .gallery-filters span { font-size:12px; }
282
+ .gallery-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:18px; }
283
+ .gallery-card { display:block; width:100%; text-align:left; padding:0; border:1px solid var(--line); border-radius:12px; overflow:hidden; color:var(--ink); background:var(--panel); }
284
+ .gallery-cover { display:grid; place-items:center; height:clamp(180px,19vw,280px); background:var(--soft); position:relative; }
285
+ .gallery-cover img { width:100%; height:100%; object-fit:cover; }
286
+ .gallery-cover>span { font-size:13px; font-weight:400; color:var(--muted); position:absolute; }
287
+ .gallery-info { padding:12px 14px; } .gallery-info strong { display:block; font-size:13px; font-weight:550; }
288
+ .gallery-info p { color:var(--muted); font-size:12px; margin-top:5px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
289
+ .empty-collection { border:1px dashed var(--line); text-align:center; padding:70px 24px; border-radius:12px; }
290
+ .empty-collection>span { font-size:44px; color:var(--purple); } .empty-collection p { font-size:13px; margin-top:8px; }
291
+ #gallery-feedback { font-size:13px; margin-bottom:12px; } #gallery-more { display:block; margin:22px auto; }
292
+ .connections-heading { margin:2px 0 22px; } .connections-heading h1 { font-size:25px; } .connections-heading p.muted { font-size:13px; margin-top:7px; }
293
+ .connections-workspace { display:block; }
294
+ .connection-sidebar { padding:12px; } .section-heading { display:flex; justify-content:space-between; align-items:center; gap:8px; margin-bottom:8px; }
295
+ #connections-list { display:grid; gap:5px; max-height:480px; overflow:auto; }
296
+ .connection-item { display:grid; gap:2px; text-align:left; color:var(--ink); background:transparent; padding:10px 12px; }
297
+ .connection-item strong { font-size:13px; font-weight:550; overflow-wrap:anywhere; }
298
+ .connection-item small { font-size:12px; color:var(--muted); font-weight:400; }
299
+ .connection-item[aria-current="true"] { background:var(--tint); border-color:var(--line); }
300
+ #connections-empty { font-size:13px; padding:12px; }
301
+ .connection-editor { padding:22px; } .connection-editor>.section-heading { margin-bottom:12px; }
302
+ .connection-guide { margin:0 0 18px; padding:12px 16px; border:1px solid var(--line); border-radius:12px; background:var(--panel); }
303
+ .connection-guide ol { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); list-style:none; padding:0; margin:0; gap:12px; }
304
+ .connection-guide li { display:grid; gap:3px; font-size:12px; color:var(--muted); }
305
+ .connection-guide strong { color:var(--ink); font-size:13px; font-weight:550; }
306
+ .connection-guide .field-note { margin:10px 0 0; overflow-wrap:anywhere; }
307
+ .connection-editor h3 { margin:18px 0 9px; } .connection-editor fieldset>label { font-size:13px; display:block; margin-bottom:7px; }
308
+ .media-options { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; }
309
+ .check-option { display:flex; gap:9px; align-items:center; font-size:13px; cursor:pointer; padding:10px; border:1px solid var(--line); border-radius:9px; min-width:0; min-height:44px; }
310
+ .check-option:has(input:checked) { background:var(--tint); border-color:var(--accent); }
311
+ .check-option:has(input:disabled):not(:has(input:checked)) { opacity:.65; cursor:default; }
312
+ .check-option input { width:15px; height:15px; margin:0; flex-shrink:0; } .check-option span { overflow-wrap:anywhere; min-width:0; }
313
+ .check-option small { font-size:12px; display:block; color:var(--muted); font-weight:400; }
314
+ .scope-options,.connection-form-actions,.export-options,.export-actions { display:flex; flex-wrap:wrap; gap:8px; }
315
+ .connection-form-actions { align-items:center; margin-top:18px; } .connection-form-actions span { font-size:12px; }
316
+ #connection-tools { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:6px; padding:6px 0 12px; }
317
+ .connection-section { border-top:1px solid var(--line); margin-top:22px; padding-top:3px; }
318
+ .export-options { align-items:end; margin:13px 0; } .export-options label { font-size:12px; color:var(--muted); }
319
+ .export-options select { display:block; margin-top:5px; } .export-actions { margin-top:5px; gap:3px; }
320
+ .export-actions button { font-size:13px; }
321
+ #connection-configuration,#connection-skill-preview { width:100%; font:12px/1.7 ui-monospace,monospace; margin-top:10px; }
322
+ .template-choice { display:flex; flex-wrap:wrap; align-items:center; gap:10px; font-size:12px; color:var(--muted); margin:12px 0; }
323
+ .template-choice select { max-width:100%; min-width:0; } .skill-install-command { display:block; font-size:12px; line-height:1.7; overflow-wrap:anywhere; }
324
+ #connection-template-note { overflow-wrap:anywhere; } #connection-facts { padding:12px 0; border-bottom:1px solid var(--line); }
325
+ #connection-revoke-confirm,#connection-delete-confirm { padding:12px 0; font-size:13px; } button.danger { color:var(--error); }
326
+ dialog { border:1px solid var(--line); border-radius:13px; padding:18px; width:min(1000px,94vw); max-height:92dvh; background:var(--panel); color:var(--ink); }
327
+ dialog::backdrop { background:#111b15bb; } dialog img { width:100%; height:68dvh; object-fit:contain; }
328
+ .appearance-dialog { width:min(480px,94vw); padding:24px; }
329
+ .appearance-dialog select,.provider-editor input:not([type="checkbox"]),.provider-editor select { width:100%; }
330
+ .appearance-dialog input[type="range"] { width:100%; min-height:32px; }
331
+ .iris-swatch { height:5px; border-radius:4px; background:var(--iris-gradient); margin:18px 0 12px; }
332
+ .appearance-dialog .file-button { font-size:13px; margin:10px 0; }
333
+ .providers-workspace { display:block; }
334
+ .provider-sidebar { padding:14px; }
335
+ #providers-list { display:grid; }
336
+ #providers-panel [data-provider-tone="0"] { --provider-color:#45317D; }
337
+ #providers-panel [data-provider-tone="1"] { --provider-color:#6F69B8; }
338
+ #providers-panel [data-provider-tone="2"] { --provider-color:#BB78AD; }
339
+ #providers-panel [data-provider-tone="3"] { --provider-color:#E59B76; }
340
+ #providers-panel [data-provider-tone="4"] { --provider-color:#ED9C91; }
341
+ #providers-panel [data-provider-tone="5"] { --provider-color:#F0D09C; }
342
+ #providers-list .provider-item { background:color-mix(in srgb,var(--provider-color) 6%,var(--panel)); border-color:color-mix(in srgb,var(--provider-color) 12%,var(--panel)); }
343
+ #providers-list .provider-item:hover:not(:disabled) { background:color-mix(in srgb,var(--provider-color) 9%,var(--panel)); filter:none; }
344
+ #providers-list .provider-item[aria-current="true"] { background:color-mix(in srgb,var(--provider-color) 12%,var(--panel)); border-color:color-mix(in srgb,var(--provider-color) 30%,var(--panel)); box-shadow:inset 3px 0 color-mix(in srgb,var(--provider-color) 55%,var(--panel)); }
345
+ #providers-empty { font-size:13px; padding:12px 0; }
346
+ .provider-editor { position:relative; overflow:hidden; padding:22px 24px; background:linear-gradient(180deg,color-mix(in srgb,var(--provider-color,var(--accent)) 5%,var(--panel)),var(--panel)) 0 0/100% 140px no-repeat,var(--panel); box-shadow:inset 0 3px color-mix(in srgb,var(--provider-color,var(--accent)) 25%,var(--panel)); }
347
+ .provider-heading { display:flex; align-items:center; flex-wrap:wrap; gap:8px; min-width:0; }
348
+ .provider-mode-pill { display:inline-flex; align-items:center; gap:5px; padding:4px 8px; border:1px solid color-mix(in srgb,var(--purple) 28%,var(--line)); border-radius:20px; color:var(--ink); background:color-mix(in srgb,var(--purple) 9%,var(--panel)); font-size:11px; font-weight:550; white-space:nowrap; }
349
+ .provider-mode-pill>span { color:var(--purple); }
350
+ .provider-editor.comfy-mode::before { content:""; position:absolute; inset:0 0 auto; height:3px; background:var(--iris-gradient); pointer-events:none; }
351
+ .provider-editor.comfy-mode::after { content:""; position:absolute; top:0; left:0; width:80%; height:240px; background:var(--iris-gradient); filter:blur(22px); opacity:0; pointer-events:none; animation:comfy-provider-sweep 1.25s ease-out; }
352
+ @keyframes comfy-provider-sweep { 0% { transform:translateX(-120%) skewX(-18deg); opacity:0; } 25% { opacity:.24; } 100% { transform:translateX(160%) skewX(-18deg); opacity:0; } }
353
+ .provider-editor #provider-state { background:color-mix(in srgb,var(--provider-color,var(--accent)) 10%,var(--panel)); color:var(--ink); }
354
+ .provider-two-fields { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; }
355
+ .provider-enabled { display:flex; align-items:center; gap:8px; margin-top:16px; font-size:13px; }
356
+ .provider-section { margin-top:24px; }
357
+ .provider-section h3 { font-size:14px; }
358
+ .provider-model-add { display:flex; gap:8px; margin:12px 0; }
359
+ .provider-model-add input { flex:1; }
360
+ .provider-model-add button { flex-shrink:0; }
361
+ .provider-model { border:1px solid var(--line); border-radius:10px; padding:12px; margin-top:12px; }
362
+ .provider-model h3 { overflow-wrap:anywhere; font-size:13px; }
363
+ .model-capabilities { display:flex; flex-wrap:wrap; gap:6px 14px; }
364
+ .mini-check { display:flex; align-items:center; gap:6px; font-size:12px; min-height:32px; cursor:pointer; overflow-wrap:anywhere; }
365
+ .mini-check input { flex-shrink:0; accent-color:var(--accent); }
366
+ .model-routing { border-top:1px solid var(--line); margin-top:8px; }
367
+ .model-routing summary { min-height:34px; font-size:12px; color:var(--muted); }
368
+ .model-routing .field-label { display:block; font-size:12px; margin:8px 0; }
369
+ .model-routing select { display:block; margin-top:5px; }
370
+ .inline-button { min-height:26px; padding:0 3px; font-size:12px; font-weight:400; }
371
+ .field-label:has(.inline-button) { align-items:center; }
372
+ .model-management { display:flex; justify-content:end; margin-top:5px; }
373
+ .function-policy { padding:12px 0; border-top:1px solid var(--line); }
374
+ .function-policy select { width:auto; min-height:36px; padding:5px 9px; font-size:12px; }
375
+ .provider-save-area { position:relative; border-top:1px solid var(--line); margin-top:22px; padding-top:12px; }
376
+ .provider-save-area::before { content:""; width:72px; height:3px; border-radius:3px; position:absolute; top:-2px; background:var(--iris-gradient); }
377
+ #provider-save { margin-top:16px; margin-right:10px; }
378
+ #provider-save-note { display:inline-block; }
379
+ .management-heading,.connections-workspace,.providers-workspace,#providers-feedback,#connections-feedback,#providers-reload-confirm { max-width:1120px; margin-left:auto; margin-right:auto; }
380
+ .management-heading { margin-bottom:26px; align-items:center; }
381
+ .management-heading h1 { font-size:24px; font-weight:600; letter-spacing:-.5px; }
382
+ .management-heading h1 .count { vertical-align:middle; margin-left:5px; }
383
+ .page-actions { display:flex; align-items:center; gap:6px; flex-shrink:0; }
384
+ .page-actions .secondary { background:var(--accent); color:var(--on-accent); border-color:transparent; }
385
+ #connections-list.service-grid,#providers-list.service-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(min(100%,285px),1fr)); gap:14px; max-height:none; overflow:visible; }
386
+ .service-card { display:flex; flex-direction:column; gap:8px; width:100%; min-height:195px; padding:20px; text-align:left; border:1px solid var(--line); border-radius:12px; color:var(--ink); background:var(--panel); font-weight:400; }
387
+ .service-card:hover:not(:disabled) { border-color:color-mix(in srgb,var(--accent) 40%,var(--line)); filter:none; box-shadow:0 4px 18px #302a3d08; }
388
+ .service-card[aria-current="true"] { border-color:color-mix(in srgb,var(--accent) 35%,var(--line)); background:var(--panel); }
389
+ .service-card-heading { display:flex; width:100%; align-items:center; justify-content:space-between; gap:10px; margin-bottom:3px; }
390
+ .service-mark { display:grid; place-items:center; min-width:38px; height:34px; border:1px solid var(--line); border-radius:8px; font:600 11px/1 ui-monospace,monospace; letter-spacing:.2px; background:var(--panel); color:var(--accent); }
391
+ .service-card strong { font-size:16px; font-weight:600; line-height:1.45; overflow-wrap:anywhere; }
392
+ .service-status { font-size:11px; font-weight:400; color:var(--muted); }
393
+ .service-endpoint { max-width:100%; font-size:12px; color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
394
+ .service-meta { font-size:12px; color:var(--muted); }
395
+ .service-action { margin-top:auto; padding-top:8px; font-size:12px; color:var(--accent); }
396
+ .management-empty { min-height:325px; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:12px; text-align:center; border:1px dashed var(--line); border-radius:14px; padding:30px 20px; background:var(--panel); }
397
+ .management-empty h2 { font-size:18px; font-weight:550; } .management-empty p { color:var(--muted); font-size:13px; max-width:360px; }
398
+ .empty-mark { display:grid; place-items:center; width:56px; height:56px; border-radius:14px; background:var(--tint); color:var(--accent); font:600 13px ui-monospace,monospace; margin-bottom:4px; }
399
+ .management-help { margin:20px 0; padding:0 4px; max-width:680px; }
400
+ .management-help summary { color:var(--muted); font-weight:400; font-size:12px; }
401
+ .management-help .connection-guide { margin:6px 0 0; }
402
+ .management-editor { max-width:840px; margin:0 auto; padding:24px 28px; }
403
+ .editor-heading { margin-bottom:18px; } .editor-heading>.section-heading { margin:12px 0 0; }
404
+ .back-button { min-height:30px; padding:3px 0; font-size:12px; font-weight:400; color:var(--muted)!important; }
405
+ .editor-tabs { display:flex; gap:18px; border-bottom:1px solid var(--line); margin-bottom:22px; }
406
+ .editor-tabs button { position:relative; min-height:40px; padding:8px 1px; border-radius:0; background:transparent; color:var(--muted); font-size:13px; font-weight:400; }
407
+ .editor-tabs button[aria-pressed="true"] { color:var(--ink); font-weight:550; }
408
+ .editor-tabs button[aria-pressed="true"]::after { content:""; position:absolute; bottom:-1px; left:0; right:0; height:2px; background:var(--accent); }
409
+ .management-editor .connection-section { margin-top:0; padding-top:0; border-top:0; }
410
+ .management-editor .provider-section { margin-top:0; }
411
+ .management-editor input:not([type="checkbox"]):not([type="file"]),.management-editor select { min-height:38px; }
412
+ .management-editor .field-label:first-child { margin-top:0; }
413
+ .management-editor .provider-two-fields { margin-top:16px; }
414
+ .management-editor .provider-save-area { padding:12px 0 0; }
415
+ .management-editor #provider-save-note { display:none; }
416
+ .inline-confirm { padding:12px 14px; margin-bottom:16px; border:1px solid var(--line); border-radius:8px; background:var(--soft); font-size:13px; }
417
+ #connection-view-settings #connection-name { width:100%; }
418
+ #connection-future { margin-top:10px; } #connection-future .media-options { padding-bottom:12px; }
419
+ #provider-directory { padding:12px; border-radius:9px; background:var(--soft); }
420
+ #provider-directory-list { max-height:235px; overflow:auto; margin-top:8px; }
421
+ .directory-item { display:flex; align-items:center; justify-content:space-between; gap:8px; font-size:12px; border-bottom:1px solid var(--line); }
422
+ .directory-item span { overflow-wrap:anywhere; min-width:0; }
423
+ .directory-item button { flex-shrink:0; font-size:12px; }
424
+ #providers-feedback { padding:10px 14px; margin-bottom:16px; border-radius:8px; background:var(--tint); overflow-wrap:anywhere; font-size:13px; }
425
+ .reload-confirm { padding:14px; margin-bottom:16px; font-size:13px; }
426
+ .reload-confirm p { margin-bottom:8px; }
427
+ :root[data-density="compact"] .site-header { min-height:50px; }
428
+ :root[data-density="compact"] main { padding-top:16px; }
429
+ :root[data-density="compact"] .page-heading { margin-bottom:14px; }
430
+ :root[data-density="compact"] .provider-editor { padding:16px 18px; }
431
+ :root[data-density="compact"] .field-label { margin-top:12px; }
432
+ :root[data-density="compact"] .provider-model { margin-top:8px; padding:10px; }
433
+ :root[data-density="compact"] .composer>summary { min-height:52px; }
434
+ footer { display:flex; justify-content:space-between; gap:12px; padding:24px 0; font-size:12px; color:var(--muted); }
435
+ @media (max-width:1100px) {
436
+ .app-shell { grid-template-columns:174px minmax(0,1fr); } main { padding:20px 20px 0; } .site-header { padding-inline:20px; }
437
+ .studio-grid { grid-template-columns:minmax(0,1fr) 288px; gap:14px; } .viewer { padding-inline:12px; }
438
+ .canvas-toolbar { gap:3px; } .canvas-label { flex-basis:100%; padding-top:10px; }
439
+ .gallery-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
440
+ }
441
+ @media (max-width:850px) {
442
+ .app-shell { grid-template-columns:minmax(0,1fr); grid-template-rows:auto 1fr; }
443
+ .app-sidebar { position:static; height:auto; border-right:0; border-bottom:1px solid var(--line); padding:12px 16px; flex-direction:row; gap:16px; flex-wrap:wrap; align-items:center; }
444
+ .brand { font-size:25px; padding:0; } .brand img { width:26px; height:26px; } .sidebar-label,.sidebar-bottom { display:none; }
445
+ .workspace-nav { display:flex; flex:1; justify-content:end; gap:3px; }
446
+ .nav-item { width:auto; justify-content:center; padding:8px 12px; }
447
+ .nav-item>span:first-child { display:none; }
448
+ .workspace-nav { flex-wrap:wrap; }
449
+ .recent-panel { width:100%; margin:0; } .recent-panel:not([open]) { max-height:44px; } #history-list { max-height:190px; overflow:auto; }
450
+ body[data-page="overview"] .recent-panel,body[data-page="connections"] .recent-panel,body[data-page="providers"] .recent-panel { display:none; }
451
+ .site-header { min-height:54px; } .breadcrumb { font-size:12px; }
452
+ }
453
+ @media (max-width:640px) {
454
+ .app-sidebar { gap:8px; padding:8px 14px; }
455
+ .brand>span,.nav-item svg { display:none; } .brand img { width:24px; height:24px; }
456
+ .workspace-nav { flex-wrap:wrap; gap:2px; min-width:0; }
457
+ .nav-item { font-size:12px; padding:6px 7px; gap:4px; white-space:nowrap; }
458
+ main { padding:18px 14px 0; } .site-header { padding:6px 14px; gap:6px; } .header-actions { gap:0; }
459
+ .header-actions button { padding-inline:9px; font-size:12px; } .badge { padding:4px 7px; }
460
+ .breadcrumb>span { padding:0 4px; } .page-heading { margin-bottom:16px; gap:12px; } h1 { font-size:23px; }
461
+ .page-heading p.muted { font-size:12px; } .page-heading button { font-size:12px; padding-inline:10px; }
462
+ .studio-grid { grid-template-columns:minmax(0,1fr); gap:14px; }
463
+ .composer { grid-column:1; grid-row:1; } .viewer { grid-column:1; grid-row:2; padding:0 12px 12px; }
464
+ .composer>summary { min-height:54px; padding:9px 16px; } #edit-form { padding-inline:16px; }
465
+ .canvas-toolbar { gap:6px; min-height:60px; } .canvas-label { flex-basis:auto; padding:0; font-size:12px; }
466
+ .viewer-empty { min-height:290px; } .viewer-empty h2 { font-size:18px; }
467
+ .image-pair { gap:8px; } .image-stage { height:240px; padding:5px; }
468
+ #run-view[data-has-output="false"] .image-stage { height:300px; } figcaption { padding:8px; gap:3px; }
469
+ .run-heading { flex-wrap:wrap; } .run-heading h2 { font-size:14px; } #status-message { font-size:12px; }
470
+ .result-actions { flex-wrap:wrap; gap:10px; } .result-actions p { width:100%; } .result-actions button { width:100%; }
471
+ .reuse-actions { gap:3px; } .reuse-actions .quiet { padding-inline:0; }
472
+ .gallery-grid { gap:12px; } .gallery-cover { height:190px; } .gallery-info { padding:10px; }
473
+ .gallery-toolbar { align-items:start; gap:5px; } #gallery-filters button { padding-inline:8px; }
474
+ .management-heading { gap:12px; align-items:flex-start; flex-direction:column; margin-bottom:20px; }
475
+ .management-heading h1 { font-size:22px; } .page-actions { align-self:stretch; justify-content:flex-end; }
476
+ .page-actions button { min-height:44px; } .management-editor { padding:18px 16px; }
477
+ .management-empty { min-height:260px; } .service-card { min-height:180px; padding:18px; }
478
+ .editor-tabs { gap:14px; } .editor-tabs button { min-height:44px; font-size:12px; }
479
+ .back-button { min-height:44px; } .management-editor input:not([type="checkbox"]):not([type="file"]),.management-editor select { min-height:44px; }
480
+ .connection-editor { padding:18px 16px; } .connections-heading h1 { font-size:23px; }
481
+ .connection-guide ol { grid-template-columns:1fr; gap:9px; } .connection-guide li { grid-template-columns:115px 1fr; align-items:baseline; gap:6px; }
482
+ .check-option { padding:8px; gap:6px; } .media-options { gap:6px; } .connection-form-actions { align-items:start; flex-direction:column; }
483
+ .connection-form-actions button { width:100%; } .connection { padding:26px 22px; margin-top:4vh; }
484
+ .connection h1 { font-size:25px; } footer span { display:none; }
485
+ .provider-editor { padding:18px 16px; }
486
+ .provider-two-fields { gap:10px; }
487
+ .provider-save-area>button { width:100%; }
488
+ .appearance-dialog { padding:20px; }
489
+ .site-header { flex-wrap:wrap; }
490
+ }
491
+ @media (max-width:360px) {
492
+ .app-sidebar { gap:10px; padding-inline:14px; } .nav-item { padding-inline:9px; }
493
+ .brand { font-size:23px; } .site-header .breadcrumb { display:none; } .header-actions { width:100%; justify-content:end; }
494
+ .gallery-grid { grid-template-columns:minmax(0,1fr); } .gallery-cover { height:260px; }
495
+ .image-pair { grid-template-columns:minmax(0,1fr); } .image-stage { height:260px; }
496
+ .token-row { flex-wrap:wrap; } .token-row button { width:100%; }
497
+ .page-heading { align-items:start; flex-direction:column; gap:10px; }
498
+ }
499
+ @media (prefers-reduced-motion:reduce) { *,*::before,*::after { animation:none!important; scroll-behavior:auto!important; } }
500
+ /* Generation shares the canvas, with no empty source or comparison column. */
501
+ .creation-modes { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); margin-bottom:12px }
502
+ .creation-modes button { flex:1 }
503
+ #run-view[data-recipe="image-generate/v0"] .image-pair { grid-template-columns:minmax(0,1fr) }
504
+ /* Audio keeps the same workspace, with native controls and a quiet Iris accent. */
505
+ audio { display:block; width:100%; max-width:100%; min-width:0; margin-block:10px; }
506
+ .audio-result { margin:4px 0 22px; padding:clamp(16px,3vw,30px); border:1px solid var(--line); border-radius:12px; background:var(--panel); }
507
+ .audio-result-header { display:flex; align-items:center; gap:16px; margin-bottom:24px; }
508
+ .audio-result-header h3 { font-size:20px; font-weight:600; }
509
+ .audio-result-icon { display:grid; place-items:center; flex-shrink:0; width:62px; height:62px; color:var(--accent); background:var(--tint); border-radius:17px; font:36px Georgia,serif; }
510
+ .audio-result .field-label { margin-top:20px; }
511
+ .transcript-result { max-height:420px; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere; font:inherit; line-height:1.9; padding:18px; border:1px solid var(--line); border-radius:10px; background:var(--soft); }
512
+ .gallery-types { display:inline-flex; margin-bottom:18px; }
513
+ .gallery-audio-cover { height:138px; display:flex; align-items:center; justify-content:center; flex-direction:column; gap:6px; color:var(--accent); background:var(--tint); }
514
+ .gallery-audio-icon { font:40px Georgia,serif; }
515
+ .gallery-audio .export-actions { margin-top:12px; gap:4px; }
516
+ .gallery-audio .export-actions button { padding-inline:9px; font-size:12px; }
517
+ .gallery-audio .field-note { white-space:normal; }
518
+ @media(max-width:480px) { .audio-result-header { gap:12px; } .audio-result-header h3 { font-size:17px; } .audio-result-icon { width:48px; height:48px; } .transcript-result { padding:12px; } }