@imenam/mcp-design 1.0.12 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -313,6 +313,13 @@ mark_feedback_processed { round: 1, remark_ids: ["rm_…"], note: "…" } ←
313
313
 
314
314
  Trois colonnes : la liste des planches, le canvas, l'inspecteur et les calques.
315
315
 
316
+ - **Pages** — la barre de gauche présente l'arbre des groupes : chevron, dossier ouvert ou fermé et nombre de pages par groupe, avec un trait vertical qui relie chaque niveau à son parent. À chaque niveau, les sous-groupes viennent d'abord, puis les pages, chacun par ordre alphabétique ; les pages hors groupe sont regroupées en bas sous « Hors groupe ». À l'ouverture, l'interface rouvre la dernière page consultée dans ce navigateur (mémorisée localement, propre à chaque poste) ; à défaut, la première page de la liste.
317
+ - **Groupe affiché** — le sélecteur en tête montre « Tous les groupes » ou un seul groupe de premier niveau, avec son nombre de pages et de pages à synchroniser. Le choix est mémorisé dans le navigateur.
318
+ - **Recherche et filtres** — le champ de recherche porte sur les noms de pages et de dossiers, à toute profondeur, sans tenir compte des accents ni de la casse (`Échap` le vide) : un dossier dont le nom correspond reste affiché en entier, sinon seules ses pages et sous-dossiers qui correspondent restent. Les filtres « Toutes », « À synchroniser » et « Remarques » (remarques non transmises) portent leur compteur. Une recherche ou un filtre actif déplie tous les groupes.
319
+ - **Tout replier** — le bouton à droite de la recherche replie tous les dossiers du groupe affiché ; quand ils le sont déjà tous, il les déplie. Il est inactif pendant une recherche ou un filtre, qui gardent tout déplié.
320
+ - **Cartes de page** — un aperçu aux proportions de la planche, le nom, le format et la date de dernière modification ; à droite, la bulle violette des remarques non transmises et le point ambre des modifications à synchroniser. Le menu « … », visible au survol, propose **Déplacer vers…** (vide : hors groupe), **Dupliquer** (la copie s'ouvre aussitôt) et **Supprimer**. Une page se range aussi par glisser-déposer sur un groupe.
321
+ - **Nouvelle page** — le bouton en pied ouvre le formulaire de création ; le groupe est prérempli avec le groupe affiché.
322
+
316
323
  - **Outils** — sélection, rectangle, ellipse, ligne, texte, icône. Glisser pour dimensionner, cliquer pour poser à la taille par défaut. L'outil icône ouvre d'abord son sélecteur : poser une icône suppose d'avoir choisi laquelle.
317
324
  - **Édition** — déplacement au glisser, 8 poignées de redimensionnement (2 extrémités pour une ligne), sélection multiple au rectangle d'encadrement ou au Maj+clic.
318
325
  - **Groupes** — `Ctrl+G` groupe la sélection, `Ctrl+Maj+G` la dissout. Un clic dans le canvas sélectionne le **groupe le plus haut** ; `Alt+clic` vise l'élément exact à l'intérieur. Déplacer un groupe déplace tout son contenu.
@@ -330,7 +337,7 @@ Raccourcis : `V` `R` `O` `L` `T` `I` (outils), `Ctrl+Z` / `Ctrl+Y` (annuler/rét
330
337
 
331
338
  La sauvegarde est automatique et différée. Une modification faite par l'agent pendant que la GUI est ouverte y apparaît en direct, via SSE ; une modification faite dans la GUI est enregistrée comme venant de l'utilisateur, et c'est ce que `get_changes` restitue.
332
339
 
333
- Le badge « n à synchroniser » d'une planche indique le nombre de modifications que l'agent n'a pas encore acquittées.
340
+ Le point ambre d'une page indique qu'elle porte des modifications que l'agent n'a pas encore acquittées avec `mark_synced` ; leur nombre s'affiche au survol.
334
341
 
335
342
  ### Mode Remarques
336
343
 
@@ -264,6 +264,19 @@ app.put("/api/designs/:id/group", async (c) => {
264
264
  return c.json({ error: result.error }, 400);
265
265
  return c.json(result.data);
266
266
  });
267
+ app.post("/api/designs/:id/duplicate", async (c) => {
268
+ let body = {};
269
+ try {
270
+ body = await c.req.json();
271
+ }
272
+ catch {
273
+ return c.json({ error: "Invalid JSON body" }, 400);
274
+ }
275
+ const result = await ipcRequest("DUPLICATE_DESIGN", { id: c.req.param("id"), name: body?.name }, 10000);
276
+ if (result.error)
277
+ return c.json({ error: result.error }, 400);
278
+ return c.json(result.data);
279
+ });
267
280
  app.delete("/api/designs/:id", async (c) => {
268
281
  const result = await ipcRequest("DELETE_DESIGN", { id: c.req.param("id") }, 10000);
269
282
  if (result.error)
package/dist/src/index.js CHANGED
@@ -190,6 +190,16 @@ function handleIPCMessage(msg) {
190
190
  replyError(msg, "DELETE_DESIGN_RESPONSE", err.message);
191
191
  }
192
192
  return;
193
+ case "DUPLICATE_DESIGN":
194
+ try {
195
+ const name = typeof msg.data?.name === "string" ? msg.data.name : undefined;
196
+ const design = store.duplicate(String(msg.data?.id), { name });
197
+ reply(msg, "DUPLICATE_DESIGN_RESPONSE", { design, designs: store.list() });
198
+ }
199
+ catch (err) {
200
+ replyError(msg, "DUPLICATE_DESIGN_RESPONSE", err.message);
201
+ }
202
+ return;
193
203
  case "SET_DESIGN_GROUP":
194
204
  try {
195
205
  store.mutate(String(msg.data?.id), "user", (draft) => {
@@ -0,0 +1 @@
1
+ :root{--ink:#16161a;--ink-soft:#5c5c66;--ink-faint:#8e8e99;--paper:#fff;--shell:#f4f4f2;--line:#e0e0dc;--line-strong:#c9c9c3;--accent:#1b4dd6;--accent-soft:#e8edfc;--danger:#b4231f;--ok:#1f7a45;--pending:#e2a21a;color:var(--ink);-webkit-font-smoothing:antialiased;font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif;font-size:14px}*{box-sizing:border-box}body,html,#root{height:100%;margin:0}body{background:var(--shell)}button{font:inherit;color:inherit;cursor:pointer}input,select,textarea{font:inherit;color:inherit}h1,h2{letter-spacing:.02em;margin:0;font-size:13px;font-weight:600}code{background:var(--shell);border-radius:3px;padding:0 3px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.app{grid-template-columns:232px 5px minmax(0,1fr) 5px 268px;height:100%;display:grid}.panel-resizer{background:var(--line);cursor:col-resize;touch-action:none;position:relative}.panel-resizer:after{content:"";position:absolute;inset:0 -3px}.panel-resizer:hover,.panel-resizer:active{background:var(--accent)}.sidebar,.right-rail{background:var(--paper);overflow-y:auto}.sidebar{border-right:1px solid var(--line);flex-direction:column;display:flex;overflow:hidden}.right-rail{border-left:1px solid var(--line);flex-direction:column;display:flex}.workspace{flex-direction:column;min-width:0;display:flex;position:relative}.workspace-empty{color:var(--ink-faint);flex:1;place-items:center;display:grid}.toolbar{background:var(--paper);border-bottom:1px solid var(--line);align-items:center;gap:16px;padding:8px 14px;display:flex}.tool-grid{grid-template-columns:repeat(2,auto);align-content:center;justify-items:stretch;gap:4px;display:grid}.tool-row{align-items:center;gap:4px;display:flex}.tool-button{background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;width:30px;height:30px;padding:0;line-height:1;display:inline-flex}.tool-button:hover:not(:disabled){background:var(--shell)}.tool-button[data-active]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.tool-button:disabled{opacity:.35;cursor:default}.tool-glyph{text-align:center;flex-shrink:0;width:15px;font-size:15px}.zoom-control{color:var(--ink-soft);align-items:center;gap:6px;font-size:12px;display:inline-flex}.zoom-control select{border:1px solid var(--line);background:var(--paper);border-radius:6px;padding:4px 6px}.toolbar-status{align-items:center;gap:8px;min-width:0;margin-left:auto;font-size:12px;display:flex}.status-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:260px;font-weight:600;overflow:hidden}.status-chip{white-space:nowrap;background:var(--shell);color:var(--ink-soft);border-radius:999px;padding:3px 8px}.status-chip[data-state=saved]{color:var(--ok)}.status-chip[data-state=error]{color:var(--danger)}.tool-palette{z-index:10;background:var(--paper);border:1px solid var(--line);border-radius:10px;flex-direction:column;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;bottom:12px;left:12px;box-shadow:0 2px 10px #00000014}.tool-palette[data-collapsed]{opacity:.7}.tool-palette[data-collapsed]:hover,.tool-palette[data-collapsed]:focus-within{opacity:1}.tool-palette-collapse{width:100%;color:var(--ink-faint);background:0 0;border:none;border-radius:4px;padding:0;font-size:12px;line-height:14px}.tool-palette-collapse:hover{background:var(--shell);color:var(--ink)}.tool-palette .icon-picker{top:auto;bottom:calc(100% + 6px)}.canvas-viewport{touch-action:none;overscroll-behavior:contain;flex:1;position:relative;overflow:hidden}.canvas-viewport[data-pan],.canvas-viewport[data-pan] .canvas-surface,.canvas-viewport[data-pan] .canvas-node{cursor:grab}.canvas-stage{transform-origin:0 0;position:absolute;top:0;left:0;box-shadow:0 1px 2px #00000014,0 12px 32px #00000014}.canvas-surface{transform-origin:0 0;position:absolute;top:0;left:0;overflow:hidden}.canvas-surface[data-tool=select]{cursor:default}.canvas-surface:not([data-tool=select]){cursor:crosshair}.canvas-svg{display:block}.canvas-node[data-hidden]{visibility:hidden}.canvas-group{pointer-events:none}.canvas-group .canvas-node{pointer-events:auto}.canvas-surface[data-tool=select] .canvas-node{cursor:move}.selection-frame{fill:none;stroke:var(--accent);stroke-width:1px;pointer-events:none}.creation-preview{fill:#1b4dd614;stroke:var(--accent);stroke-width:1px;stroke-dasharray:4 3;pointer-events:none}.marquee{fill:#1b4dd60f;stroke:var(--accent);stroke-width:1px;pointer-events:none}.handle{background:var(--paper);border:1px solid var(--accent);border-radius:2px;width:9px;height:9px;margin:-5px 0 0 -5px;position:absolute}.text-editor{border:1px solid var(--accent);resize:none;white-space:pre-wrap;background:#ffffffeb;outline:none;margin:0;padding:0;position:absolute;overflow:hidden}.sidebar-top{gap:10px;padding:12px 12px 10px;display:grid}.scope-picker{position:relative}.scope-button{background:var(--paper);border:1px solid var(--line);text-align:left;border-radius:10px;align-items:center;gap:10px;width:100%;padding:9px 10px;display:flex}.scope-button:hover,.scope-button[aria-expanded=true]{border-color:var(--line-strong)}.scope-button>.ui-icon{color:var(--ink-faint)}.scope-text{flex:1;gap:1px;min-width:0;display:grid}.scope-name{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:700;overflow:hidden}.scope-summary{color:var(--ink-faint);text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;overflow:hidden}.group-avatar{color:#fff;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;font-size:12px;font-weight:700;display:inline-flex}.group-avatar[data-small]{border-radius:6px;width:24px;height:24px;font-size:10px}.scope-menu{z-index:20;background:var(--paper);border:1px solid var(--line);border-radius:10px;max-height:360px;margin:0;padding:6px;list-style:none;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto;box-shadow:0 8px 24px #0000001a}.scope-option{text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:10px;width:100%;padding:6px 8px;font-size:13px;display:flex}.scope-option:hover{background:var(--shell)}.scope-option>.ui-icon{color:var(--accent)}.scope-option-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.scope-option-count{color:var(--ink-faint);font-size:11px}.sidebar-search-row{gap:6px;display:flex}.collapse-all-button{background:var(--shell);width:36px;color:var(--ink-soft);border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.collapse-all-button:hover:not(:disabled){background:var(--line);color:var(--ink)}.collapse-all-button:disabled{opacity:.4;cursor:default}.sidebar-search{background:var(--shell);min-width:0;color:var(--ink-faint);border:1px solid #0000;border-radius:8px;flex:1;align-items:center;gap:8px;padding:0 10px;display:flex}.sidebar-search:focus-within{background:var(--paper);border-color:var(--accent)}.sidebar-search input{min-width:0;font:inherit;color:var(--ink);background:0 0;border:none;outline:none;flex:1;padding:8px 0;font-size:12.5px}.sidebar-filters{gap:5px;display:flex}.filter-chip{background:var(--shell);white-space:nowrap;color:var(--ink-soft);border:none;border-radius:999px;align-items:center;gap:5px;padding:4px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.filter-chip:hover{background:var(--line)}.filter-chip[data-kind=remarks] .ui-icon{color:var(--remark)}.filter-chip[data-active]{background:var(--ink);color:#fff;font-weight:600}.filter-chip[data-active] .ui-icon{color:#fff}.filter-chip-count{font-variant-numeric:tabular-nums}.pending-dot{background:var(--pending);border-radius:50%;flex-shrink:0;width:8px;height:8px;display:inline-block}.design-tree{flex:1;min-height:60px;padding:2px 8px 12px;overflow-y:auto}.design-tree[data-drop]{box-shadow:inset 0 0 0 1px var(--accent)}.design-group{border-radius:8px;gap:2px;display:grid}.design-group-header{width:100%;height:30px;color:var(--ink);text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:6px;padding:0 4px;font-size:13px;font-weight:500;display:flex}.design-group-header:hover{background:var(--shell)}.design-group-header>.ui-icon:first-child{color:var(--ink-faint)}.design-group-header>.ui-icon:nth-child(2){color:var(--ink-soft);margin-left:2px}.design-group-header[aria-expanded=true]{font-weight:600}.design-group-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;margin-left:2px;overflow:hidden}.design-group-count{color:var(--ink-faint);font-size:11px;font-weight:400}.design-group-body{border-left:1px solid var(--line);gap:2px;margin-left:11px;padding-left:1px;display:grid}.design-group[data-drop]{background:var(--accent-soft);box-shadow:inset 0 0 0 1px var(--accent)}.design-group[data-drop]>.design-group-header,.design-group[data-drop]>.design-group-header>.ui-icon{color:var(--accent)}.design-tree-label{color:var(--ink-faint);margin:12px 0 4px;padding:0 8px;font-size:11px;font-weight:600}.design-list{gap:4px;margin:0;padding:0;list-style:none;display:grid}.design-group-body>.design-list{padding-left:6px}.design-card{border-radius:8px;align-items:center;gap:4px;padding-right:6px;display:flex;position:relative}.design-card:hover,.design-card[data-menu]{background:var(--shell)}.design-card[data-active]{background:var(--accent-soft)}.design-card-main{text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:10px;min-width:0;padding:7px 0 7px 8px;display:flex}.design-thumb{flex-shrink:0;justify-content:center;align-items:center;width:36px;height:26px;display:inline-flex}.design-thumb-page{background:var(--paper) linear-gradient(var(--line-strong), var(--line-strong)) 4px 4px / 40% 3px no-repeat;border:1px solid var(--line-strong);border-radius:3px;display:block}.design-card-text{gap:1px;min-width:0;display:grid}.design-card-name{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.design-card[data-active] .design-card-name{color:var(--accent);font-weight:600}.design-card-meta{color:var(--ink-faint);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.design-card[data-active] .design-card-meta{color:var(--ink-soft)}.design-card-status{flex-shrink:0;align-items:center;gap:6px;display:inline-flex}.design-card-status .remark-badge{margin-left:0}.design-card-more{width:26px;height:26px;color:var(--ink-soft);background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:none}.design-card:hover .design-card-more,.design-card:focus-within .design-card-more,.design-card[data-menu] .design-card-more{display:inline-flex}.design-card-more:hover,.design-card[data-menu] .design-card-more{background:var(--line);color:var(--ink)}.card-menu{z-index:20;background:var(--paper);border:1px solid var(--line);border-radius:10px;width:190px;padding:6px;display:grid;position:absolute;top:calc(100% + 2px);right:0;box-shadow:0 8px 24px #0000001a}.card-menu>button{text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:10px;padding:7px 10px;font-size:13px;display:flex}.card-menu>button>.ui-icon{color:var(--ink-soft)}.card-menu>button:hover{background:var(--shell)}.card-menu>button[data-danger],.card-menu>button[data-danger]>.ui-icon{color:var(--danger)}.card-menu>hr{border:none;border-top:1px solid var(--line);margin:4px 2px}.card-move{gap:6px;width:230px;padding:10px}.card-move label{color:var(--ink-soft);font-size:11px;font-weight:600}.card-move input{border:1px solid var(--line);background:var(--paper);border-radius:6px;padding:6px 8px}.card-move-actions{justify-content:flex-end;gap:6px;display:flex}.sidebar-foot{border-top:1px solid var(--line);gap:8px;padding:10px 12px 12px;display:grid}.new-page-button{background:var(--accent);color:#fff;border:none;border-radius:10px;justify-content:center;align-items:center;gap:8px;height:38px;font-size:13px;font-weight:600;display:inline-flex}.new-page-button[data-open]{border:1px solid var(--line-strong);color:var(--ink);background:0 0;font-weight:500}.ghost-button{border:1px solid var(--line-strong);background:0 0;border-radius:6px;padding:4px 8px;font-size:12px}.ghost-button:hover{background:var(--shell)}.primary-button{background:var(--accent);color:#fff;border:none;border-radius:6px;padding:6px 10px;font-size:12px}.primary-button:disabled{opacity:.4;cursor:default}.create-form{background:var(--shell);border-radius:8px;gap:6px;padding:10px;display:grid}.create-form input,.create-form select{border:1px solid var(--line);background:var(--paper);border-radius:6px;padding:6px 8px}.icon-button{color:var(--ink-faint);background:0 0;border:none;border-radius:4px;padding:4px 6px;line-height:1}.icon-button:hover:not(:disabled){background:var(--shell);color:var(--ink)}.icon-button:disabled{opacity:.3;cursor:default}.empty-hint{color:var(--ink-faint);margin:12px 0 0;font-size:12px;line-height:1.5}.inspector{border-bottom:1px solid var(--line);align-content:start;gap:10px;padding:14px;display:grid}.inspector h2{justify-content:space-between;align-items:baseline;gap:8px;display:flex;overflow:hidden}.inspector-type{color:var(--ink-faint);flex-shrink:0;font-size:11px;font-weight:400}.field{gap:4px;min-width:0;display:grid}.field>span{color:var(--ink-soft);font-size:11px}.field input,.field select,.field textarea{border:1px solid var(--line);background:var(--paper);border-radius:6px;width:100%;padding:5px 7px}.field textarea{resize:vertical;font-family:inherit}.field-row{grid-template-columns:1fr 1fr;gap:8px;display:grid}.color-input{align-items:center;gap:6px;display:flex}.color-input input[type=color]{flex-shrink:0;width:30px;height:28px;padding:2px}.toggle-button{border:1px solid var(--line);background:var(--paper);border-radius:6px;padding:5px 7px}.toggle-button[data-active]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.segmented{grid-template-columns:repeat(3,1fr);gap:4px;display:grid}.segmented button{border:1px solid var(--line);background:var(--paper);border-radius:6px;padding:5px 0}.segmented button[data-active]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.inspector-actions{grid-template-columns:1fr 1fr;gap:6px;margin-top:4px;display:grid}.inspector-actions button{border:1px solid var(--line-strong);background:var(--paper);border-radius:6px;padding:6px 4px;font-size:12px}.inspector-actions button:hover{background:var(--shell)}.inspector-actions .danger{color:var(--danger);border-color:#e8c4c3}.layers{flex-direction:column;min-height:0;padding:14px;display:flex}.layers-header{justify-content:space-between;align-items:center;margin-bottom:8px;display:flex}.layers-actions{gap:2px;display:flex}.layers ul{align-content:start;gap:1px;margin:0;padding:0;list-style:none;display:grid;overflow-y:auto}.layer-row{align-items:center;gap:2px;display:flex}.layer-twisty{width:14px;color:var(--ink-faint);text-align:center;background:0 0;border:none;flex-shrink:0;padding:0;font-size:10px;line-height:1}.layer-twisty:hover{color:var(--ink)}.layer-count{color:var(--ink-faint);background:var(--shell);border-radius:999px;flex-shrink:0;margin-left:auto;padding:0 5px;font-size:10px}.layer-item[data-group] .layer-name{font-weight:600}.layer-item{text-align:left;background:0 0;border:1px solid #0000;border-radius:5px;align-items:baseline;gap:8px;width:100%;min-width:0;padding:5px 7px;display:flex}.layer-item:hover{background:var(--shell)}.layer-item[data-active]{background:var(--accent-soft);border-color:var(--accent)}.layer-kind{color:var(--ink-faint);flex-shrink:0;width:58px;font-size:10px}.layer-name{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.error-toast{background:var(--ink);color:#fff;border-radius:8px;align-items:center;gap:12px;padding:10px 14px;font-size:12px;display:flex;position:fixed;bottom:20px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #0003}.error-toast button{color:inherit;opacity:.7;background:0 0;border:none}.tool-popover-anchor{display:inline-flex;position:relative}.tool-grid>.tool-popover-anchor{display:flex}.icon-picker{z-index:20;background:var(--paper);border:1px solid var(--line-strong);border-radius:8px;width:320px;padding:10px;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 12px 32px #16161a2e}.inspector .icon-picker{left:auto;right:0}.icon-picker-search{border:1px solid var(--line);background:var(--paper);border-radius:6px;width:100%;padding:6px 8px;font-size:12px}.icon-picker-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:2px;max-height:300px;margin-top:8px;display:grid;overflow-y:auto}.icon-picker-cell{color:var(--ink);background:0 0;border:1px solid #0000;border-radius:6px;flex-direction:column;align-items:center;gap:4px;padding:8px 2px;display:flex}.icon-picker-cell:hover{background:var(--shell)}.icon-picker-cell[data-active]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.icon-picker-cell span{text-overflow:ellipsis;white-space:nowrap;max-width:100%;color:var(--ink-faint);font-size:10px;overflow:hidden}.icon-field .toggle-button{justify-content:center;width:100%}:root{--remark:#6d3fd8;--remark-strong:#8b5cf6;--remark-soft:#efe7ff;--remark-line:#cdb8f5;--remark-sent:#a99bc9}.ui-icon{vertical-align:middle;flex-shrink:0;display:inline-block}.mode-switch{background:var(--shell);border:1px solid var(--line);border-radius:7px;gap:2px;padding:2px;display:inline-flex}.mode-switch button{color:var(--ink-soft);background:0 0;border:1px solid #0000;border-radius:5px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;display:inline-flex}.mode-switch button:disabled{opacity:.4;cursor:default}.mode-switch button[data-active]{background:var(--paper);border-color:var(--line-strong);color:var(--ink);font-weight:600}.mode-switch button[data-mode=remarks][data-active]{border-color:var(--remark-line);color:var(--remark)}.mode-count{background:var(--remark);color:#fff;text-align:center;border-radius:999px;min-width:18px;padding:0 5px;font-size:10px;font-weight:700;line-height:16px}.remark-badge{background:var(--remark-soft);color:var(--remark);vertical-align:1px;border-radius:999px;align-items:center;gap:3px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-flex}.canvas-surface[data-mode=remarks]{cursor:crosshair}.canvas-surface[data-mode=remarks] .canvas-node{cursor:pointer}.remark-shapes rect{pointer-events:none}.remark-frame{fill:#6d3fd80d;stroke:var(--remark-strong);stroke-width:1.5px}.remark-frame[data-status=sent]{fill:none;stroke:var(--remark-sent);stroke-dasharray:5 4}.remark-frame[data-highlighted]{fill:#6d3fd81a;stroke:var(--remark);stroke-width:2px;stroke-dasharray:none}.remark-hover{fill:none;stroke:var(--remark-strong);stroke-width:1.5px}.remark-aim{fill:#6d3fd812;stroke:var(--remark);stroke-width:2px}.remark-area-draft{fill:#8b5cf624;stroke:var(--remark-strong);stroke-width:1.5px;stroke-dasharray:5 3;pointer-events:none}.remark-hover-tag{background:var(--remark);color:#fff;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;border-radius:4px;max-width:320px;padding:2px 7px;font-size:11px;font-weight:500;position:absolute;overflow:hidden;transform:translateY(calc(-100% - 2px))}.remark-pin{z-index:2;background:var(--remark);color:#fff;border:2px solid #fff;border-radius:50%;width:24px;height:24px;margin:-12px 0 0 -12px;padding:0;font-size:11px;font-weight:700;line-height:20px;position:absolute;box-shadow:0 1px 4px #00000040}.remark-pin[data-status=sent]{border-color:var(--remark-sent);color:var(--remark-sent);background:#fff}.remark-pin[data-missing]{border-style:dashed}.remark-pin[data-highlighted]{box-shadow:0 0 0 3px #6d3fd859,0 1px 4px #00000040}.remark-page-chip{border:1px solid var(--remark-line);background:var(--remark-soft);color:var(--remark);border-radius:999px;align-items:center;gap:6px;padding:3px 10px;font-size:11px;font-weight:500;display:inline-flex;position:absolute;top:-30px;left:0}.remark-help{z-index:10;background:var(--ink);color:#fff;white-space:nowrap;pointer-events:none;border-radius:999px;padding:7px 16px;font-size:11.5px;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.remark-composer{z-index:15;background:var(--paper);border:1px solid var(--line);cursor:default;border-radius:8px;gap:10px;width:340px;padding:0 14px 14px;display:grid;position:absolute;box-shadow:0 12px 32px #16161a2e}.remark-composer-head{border-bottom:1px solid var(--line);color:var(--remark);align-items:center;gap:8px;margin:0 -14px;padding:8px 8px 8px 14px;display:flex}.remark-composer-head h2{color:var(--ink);flex:1}.remark-composer-section{gap:6px;display:grid}.remark-breadcrumb{flex-wrap:wrap;align-items:center;gap:4px;font-size:12px;display:flex}.remark-breadcrumb-sep{color:var(--ink-faint);margin-left:4px}.link-button{color:var(--accent);background:0 0;border:none;padding:0}.link-button:hover{text-decoration:underline}.remark-chip{white-space:nowrap;background:var(--remark-soft);color:var(--remark);border-radius:999px;flex-shrink:0;align-items:center;gap:5px;padding:2px 9px;font-size:11.5px;font-weight:600;display:inline-flex}.remark-hint{color:var(--ink-faint);margin:0;font-size:11px}.section-label{letter-spacing:.04em;text-transform:uppercase;color:var(--ink-faint);font-size:10.5px;font-weight:600}.remark-preview{background:var(--shell);border:1px solid var(--line);border-radius:6px;width:100%;height:140px;display:block;overflow:hidden}.remark-preview svg{width:100%;height:100%;display:block}.remark-hits-head{justify-content:space-between;align-items:baseline;margin-top:4px;display:flex}.remark-hits{gap:2px;max-height:140px;margin:0;padding:0;list-style:none;display:grid;overflow-y:auto}.remark-hits label,.remark-check{align-items:center;gap:8px;font-size:12px;display:flex}.remark-hits label[data-off]{color:var(--ink-faint)}.remark-hit-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.remark-hit-kind{color:var(--ink-faint);flex-shrink:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px}.remark-textarea{border:1px solid var(--line-strong);background:var(--paper);resize:vertical;border-radius:6px;width:100%;padding:7px 9px;font-size:12.5px;line-height:1.45}.remark-textarea:focus{border-color:var(--accent);outline:none}.remark-composer-foot{align-items:center;gap:6px;display:flex}.remark-composer-foot .remark-hint{flex:1}.remarks-panel{flex-direction:column;flex:1;min-height:0;display:flex}.remarks-header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:baseline;padding:14px;display:flex}.remarks-body{flex:1;align-content:start;gap:10px;min-height:0;padding:14px;display:grid;overflow-y:auto}.remark-add-page{border:1px solid var(--line-strong);background:var(--paper);text-align:left;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:12.5px;display:flex}.remark-add-page:hover{background:var(--shell)}.remark-card{border:1px solid var(--line);background:var(--paper);border-radius:8px;gap:8px;padding:10px 12px;display:grid}.remark-card[data-status=sent]{background:#fafaf9}.remark-card[data-status=sent] .remark-text{color:var(--ink-soft)}.remark-card[data-highlighted]{border-color:var(--remark-strong);box-shadow:inset 0 0 0 1px var(--remark-strong);background:#faf7ff}.remark-card[data-editing]{border-color:var(--accent)}.remark-card-head{align-items:center;gap:8px;min-width:0;display:flex}.remark-number{background:var(--remark);color:#fff;text-align:center;border-radius:50%;flex-shrink:0;width:20px;height:20px;font-size:10.5px;font-weight:700;line-height:20px}.remark-number[data-status=sent]{box-shadow:inset 0 0 0 1.5px var(--remark-sent);color:var(--remark-sent);background:#fff}.remark-target{min-width:0;color:var(--ink-soft);flex:1;align-items:center;gap:5px;font-size:11.5px;font-weight:500;display:flex}.remark-target span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.remark-card-tools{flex-shrink:0;align-items:center;gap:2px;margin-left:auto;display:flex}.remark-status{background:var(--shell);color:var(--ink-soft);white-space:nowrap;border-radius:999px;justify-self:start;padding:1px 7px;font-size:10.5px}.remark-text{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12.5px;line-height:1.45}.remark-area-info{align-items:flex-start;gap:10px;display:flex}.remark-area-info img{object-fit:contain;background:var(--shell);border:1px solid var(--line);border-radius:4px;flex-shrink:0;width:112px;max-height:64px}.remark-card-actions{justify-content:flex-end;gap:6px;display:flex}.remarks-footer{border-top:1px solid var(--line);text-align:center;gap:8px;padding:14px;display:grid}.remarks-footer .primary-button{justify-content:center;align-items:center;gap:8px;padding:9px 10px;font-size:13px;font-weight:600;display:inline-flex}.dialog-backdrop{z-index:50;background:#16161a6b;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.dialog{background:var(--paper);border-radius:10px;grid-template-columns:minmax(0,1fr);gap:10px;width:min(680px,100%);max-height:100%;padding:24px 28px;display:grid;overflow-y:auto;box-shadow:0 24px 64px #00000040}.dialog-head{justify-content:space-between;align-items:center;display:flex}.dialog-head h2{letter-spacing:0;font-size:18px}.dialog-intro{color:var(--ink-soft);margin:0 0 6px;font-size:12.5px}.scope-choice{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:6px;display:grid}.scope-choice button{border:1px solid var(--line);background:var(--paper);color:var(--ink-faint);text-align:left;border-radius:8px;align-items:center;gap:12px;padding:10px 14px;display:flex}.scope-choice button span{gap:2px;display:grid}.scope-choice strong{color:var(--ink);font-weight:500}.scope-choice button[data-active]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.scope-choice button:disabled{opacity:.4;cursor:default}.dialog-row-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.dialog-row-head .section-label{flex-shrink:0}.finish-list{border:1px solid var(--line);border-radius:8px;max-height:240px;margin:0 0 6px;padding:0;list-style:none;overflow-y:auto}.finish-list li+li{border-top:1px solid #efefeb}.finish-list label{color:var(--ink-faint);align-items:center;gap:12px;padding:11px 14px;font-size:12.5px;display:flex}.finish-list .empty-hint{margin:0;padding:12px 14px}.kind-pill{background:var(--remark-soft);min-width:80px;color:var(--remark);text-align:center;border-radius:999px;flex-shrink:0;padding:2px 8px;font-size:11px;font-weight:500}.kind-pill[data-kind=node]{background:var(--accent-soft);color:var(--accent)}.kind-pill[data-kind=area]{color:#8a5a00;background:#fdf1d6}.finish-list label[data-off] .kind-pill{background:var(--shell);color:var(--ink-faint)}.finish-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--ink);flex:1;overflow:hidden}.finish-list label[data-off] .finish-text{color:var(--ink-faint)}.finish-where{text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;max-width:200px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.finish-file{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden}.finish-preview{border:1px solid var(--line);background:var(--shell);white-space:pre-wrap;border-radius:8px;max-height:180px;margin:0;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.6;overflow:auto}.dialog-foot{justify-content:flex-end;align-items:center;gap:8px;margin-top:8px;display:flex}.dialog-foot>.remark-hint{flex:1;align-items:center;gap:6px;display:inline-flex}.dialog-foot .primary-button,.dialog-foot .ghost-button{align-items:center;gap:8px;padding:8px 14px;font-size:12.5px;display:inline-flex}.dialog-done{color:var(--ok);justify-items:start;gap:8px;display:grid}.dialog-done p{color:var(--ink);margin:0}.dialog-done .dialog-foot{justify-self:stretch}.round-title-field{gap:6px;margin-bottom:6px;display:grid}.round-title-field input{border:1px solid var(--line-strong);border-radius:6px;padding:8px 10px;font-size:13px}.round-title-field input:focus{border-color:var(--accent);outline:none}.remark-status[data-processed]{color:var(--ok);background:#e6f3ec}.rounds-button{border:1px solid var(--line);background:var(--paper);color:var(--ink-soft);border-radius:7px;align-items:center;gap:6px;padding:5px 10px;font-size:12px;display:inline-flex}.rounds-button:hover{background:var(--shell);color:var(--ink)}.rounds-count{color:#8a5a00;text-align:center;background:#fdf1d6;border-radius:999px;min-width:18px;padding:0 5px;font-size:10px;font-weight:700;line-height:16px}.feedback-page{z-index:40;background:var(--shell);flex-direction:column;display:flex;position:fixed;inset:0}.feedback-page-head{background:var(--paper);border-bottom:1px solid var(--line);align-items:center;gap:16px;padding:10px 16px;display:flex}.feedback-page-head h1{letter-spacing:0;font-size:15px}.feedback-empty{max-width:480px;color:var(--ink-faint);text-align:center;margin:48px auto}.feedback-page-body{flex:1;grid-template-columns:320px minmax(0,1fr);min-height:0;display:grid}.round-list{background:var(--paper);border-right:1px solid var(--line);align-content:start;gap:8px;margin:0;padding:14px;list-style:none;display:grid;overflow-y:auto}.round-row{border:1px solid var(--line);background:var(--paper);text-align:left;border-radius:8px;gap:6px;width:100%;padding:10px 12px;display:grid}.round-row:hover{background:var(--shell)}.round-row[data-active]{background:var(--accent-soft);border-color:var(--accent)}.round-row-title{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.round-progress{align-items:center;gap:8px;display:flex}.round-status{color:#8a5a00;background:#fdf1d6;border-radius:999px;flex-shrink:0;padding:1px 8px;font-size:10.5px;font-weight:600}.round-status[data-status=in_progress]{background:var(--accent-soft);color:var(--accent)}.round-status[data-status=done]{color:var(--ok);background:#e6f3ec}.round-bar{background:var(--line);border-radius:2px;flex:1;height:4px;overflow:hidden}.round-bar span{background:var(--ok);height:100%;display:block}.round-detail{align-content:start;gap:10px;padding:20px 28px 40px;display:grid;overflow-y:auto}.round-title-input{background:0 0;border:1px solid #0000;border-radius:6px;width:100%;max-width:640px;margin-left:-8px;padding:4px 8px;font-size:20px;font-weight:600}.round-title-input:hover{border-color:var(--line)}.round-title-input:focus{border-color:var(--accent);background:var(--paper);outline:none}.round-detail-progress{align-items:center;gap:16px;display:flex}.round-detail-progress .round-progress{flex:1;max-width:420px}.round-detail-progress button,.feedback-page-all{align-items:center;gap:6px;display:inline-flex}.feedback-page-all{margin-left:auto}.round-page{gap:8px;margin-top:12px;display:grid}.round-page-head{align-items:baseline;gap:12px;display:flex}.round-remarks{gap:8px;margin:0;padding:0;list-style:none;display:grid}.round-remark{border:1px solid var(--line);background:var(--paper);border-radius:8px;align-items:flex-start;gap:12px;padding:12px 14px;display:flex}.round-remark[data-processed]{background:#fafaf9}.round-remark[data-processed] .remark-text{color:var(--ink-soft)}.round-remark-check input{cursor:pointer;width:16px;height:16px;margin:2px 0 0}.round-remark-body{flex:1;gap:6px;min-width:0;display:grid}.round-remark-head{align-items:center;gap:10px;min-width:0;display:flex}.round-remark-target{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--ink-soft);font-size:11.5px;overflow:hidden}.round-remark-state{color:#8a5a00;align-items:center;gap:6px;margin:0;font-size:11.5px;display:flex}.round-remark[data-processed] .round-remark-state{color:var(--ok)}.round-remark-note{color:var(--ink-soft)}.round-remark-capture img{object-fit:contain;background:var(--shell);border:1px solid var(--line);border-radius:6px;width:160px;max-height:90px;display:block}