pmx-canvas 0.8.2 → 0.9.0
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/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/.github/extensions/pmx-canvas/tools.json +601 -22
- package/CHANGELOG.md +49 -0
- package/Readme.md +131 -532
- package/dist/canvas/global.css +2724 -476
- package/dist/canvas/index.js +168 -107
- package/dist/canvas/mcp-app.html +2899 -596
- package/dist/json-render/index.js +20 -20
- package/dist/types/client/canvas/BarHint.d.ts +12 -2
- package/dist/types/client/canvas/BoardLinkDialog.d.ts +3 -1
- package/dist/types/client/canvas/BoardPinButton.d.ts +10 -0
- package/dist/types/client/canvas/BoardSwitcher.d.ts +1 -1
- package/dist/types/client/canvas/CanvasViewport.d.ts +1 -1
- package/dist/types/client/canvas/CommandBar.d.ts +3 -4
- package/dist/types/client/canvas/ConnectionBanner.d.ts +2 -1
- package/dist/types/client/canvas/ContextChip.d.ts +3 -0
- package/dist/types/client/canvas/CrossBoardReferences.d.ts +5 -0
- package/dist/types/client/canvas/EdgeLayer.d.ts +14 -3
- package/dist/types/client/canvas/EmptyState.d.ts +4 -4
- package/dist/types/client/canvas/HomeGraphView.d.ts +2 -0
- package/dist/types/client/canvas/HomeMapView.d.ts +1 -0
- package/dist/types/client/canvas/HomeReviewView.d.ts +6 -0
- package/dist/types/client/canvas/HomeView.d.ts +9 -7
- package/dist/types/client/canvas/KnowledgeDialog.d.ts +4 -0
- package/dist/types/client/canvas/LifecycleChrome.d.ts +5 -0
- package/dist/types/client/canvas/LifecycleFields.d.ts +7 -0
- package/dist/types/client/canvas/LifecyclePanel.d.ts +1 -0
- package/dist/types/client/canvas/MemoryInspector.d.ts +7 -0
- package/dist/types/client/canvas/NearPinLayer.d.ts +14 -0
- package/dist/types/client/canvas/NodeContextMark.d.ts +40 -7
- package/dist/types/client/canvas/RelationPresetsDialog.d.ts +4 -0
- package/dist/types/client/canvas/RelationsPanel.d.ts +4 -0
- package/dist/types/client/canvas/SessionPanel.d.ts +2 -0
- package/dist/types/client/canvas/canvas-area.d.ts +1 -1
- package/dist/types/client/canvas/graph-geometry.d.ts +27 -0
- package/dist/types/client/canvas/graph-model.d.ts +37 -0
- package/dist/types/client/canvas/memory-layout.d.ts +23 -0
- package/dist/types/client/canvas/use-chrome-height.d.ts +2 -0
- package/dist/types/client/canvas/use-focus-trap.d.ts +1 -0
- package/dist/types/client/canvas/use-memory-graph.d.ts +8 -0
- package/dist/types/client/canvas/use-pan-zoom.d.ts +4 -1
- package/dist/types/client/icons.d.ts +0 -10
- package/dist/types/client/nodes/AxStepControls.d.ts +1 -1
- package/dist/types/client/nodes/InlineMarkdownEditor.d.ts +4 -4
- package/dist/types/client/nodes/MarkdownNode.d.ts +5 -1
- package/dist/types/client/nodes/McpAppNode.d.ts +4 -4
- package/dist/types/client/nodes/viewer-runtime-state.d.ts +1 -1
- package/dist/types/client/state/boards-store.d.ts +81 -9
- package/dist/types/client/state/canvas-store.d.ts +14 -1
- package/dist/types/client/state/context-chip-store.d.ts +22 -0
- package/dist/types/client/state/context-status-store.d.ts +35 -0
- package/dist/types/client/state/intent-bridge.d.ts +11 -8
- package/dist/types/client/state/knowledge-store.d.ts +22 -0
- package/dist/types/client/state/near-pin-store.d.ts +44 -1
- package/dist/types/client/state/presence-store.d.ts +4 -4
- package/dist/types/client/state/presentation.d.ts +28 -0
- package/dist/types/client/state/relation-store.d.ts +10 -0
- package/dist/types/client/state/session-store.d.ts +41 -2
- package/dist/types/client/state/workspace-settings.d.ts +7 -0
- package/dist/types/client/types.d.ts +13 -1
- package/dist/types/client/utils/keyboard.d.ts +2 -0
- package/dist/types/client/utils/time-ago.d.ts +4 -0
- package/dist/types/mcp/context-uri-template.d.ts +3 -1
- package/dist/types/server/agent-presence.d.ts +10 -3
- package/dist/types/server/ax-context.d.ts +1 -1
- package/dist/types/server/canvas-db.d.ts +30 -7
- package/dist/types/server/canvas-operations.d.ts +24 -2
- package/dist/types/server/canvas-provenance.d.ts +22 -2
- package/dist/types/server/canvas-serialization.d.ts +2 -0
- package/dist/types/server/canvas-state.d.ts +93 -15
- package/dist/types/server/canvas-validation.d.ts +1 -1
- package/dist/types/server/context-brief.d.ts +94 -6
- package/dist/types/server/context-reads.d.ts +33 -7
- package/dist/types/server/edit-summary.d.ts +20 -0
- package/dist/types/server/index.d.ts +71 -10
- package/dist/types/server/knowledge-lifecycle.d.ts +221 -0
- package/dist/types/server/lifecycle-status.d.ts +10 -0
- package/dist/types/server/memory-graph.d.ts +9 -0
- package/dist/types/server/mutation-history.d.ts +2 -0
- package/dist/types/server/operations/ops/ax-shared.d.ts +1 -1
- package/dist/types/server/operations/ops/boards.d.ts +2 -1
- package/dist/types/server/operations/ops/lifecycle.d.ts +2 -0
- package/dist/types/server/operations/ops/memory-graph.d.ts +2 -0
- package/dist/types/server/operations/ops/nodes.d.ts +5 -0
- package/dist/types/server/operations/ops/query.d.ts +23 -0
- package/dist/types/server/operations/registry.d.ts +1 -0
- package/dist/types/server/placement.d.ts +7 -0
- package/dist/types/server/scope-fence.d.ts +2 -1
- package/dist/types/server/spatial-analysis.d.ts +6 -3
- package/dist/types/server/tour-control.d.ts +32 -0
- package/dist/types/server/wiki-links.d.ts +14 -0
- package/dist/types/server/workbench-auth.d.ts +2 -0
- package/dist/types/shared/agent-context.d.ts +2 -0
- package/dist/types/shared/agent-presence.d.ts +15 -12
- package/dist/types/shared/auto-arrange.d.ts +1 -0
- package/dist/types/shared/boards.d.ts +4 -4
- package/dist/types/shared/knowledge-lifecycle.d.ts +41 -0
- package/dist/types/shared/knowledge-presets.d.ts +6 -0
- package/dist/types/shared/lifecycle-status.d.ts +24 -0
- package/dist/types/shared/memory-graph.d.ts +53 -0
- package/dist/types/shared/relations.d.ts +68 -0
- package/dist/types/shared/semantic-attention.d.ts +2 -0
- package/dist/types/shared/tour.d.ts +38 -0
- package/dist/types/shared/workspace-settings.d.ts +11 -0
- package/docs/RELEASE.md +21 -3
- package/docs/adr-001-bun-only-runtime.md +7 -1
- package/docs/adr-002-shared-product-separate-runtimes.md +93 -0
- package/docs/api-reference.md +109 -0
- package/docs/ax-host-adapter-contract.md +1 -1
- package/docs/ax-state-contract.md +5 -4
- package/docs/cli.md +153 -15
- package/docs/demos/pmx-canvas-demo.mp4 +0 -0
- package/docs/design/AgentContext.dc.html +3 -3
- package/docs/design/BoardPins.dc.html +37 -22
- package/docs/design/Categories.dc.html +208 -0
- package/docs/design/CategoryEditor.dc.html +33 -0
- package/docs/design/Chrome.dc.html +52 -9
- package/docs/design/ContextChip.dc.html +224 -0
- package/docs/design/ContextChip600.dc.html +136 -0
- package/docs/design/EmptyState.dc.html +45 -0
- package/docs/design/Flows.dc.html +23 -1
- package/docs/design/HeaderMarks.dc.html +183 -0
- package/docs/design/Home.dc.html +19 -1
- package/docs/design/HomeGraph.dc.html +86 -202
- package/docs/design/HomeMap.dc.html +23 -1
- package/docs/design/HomeTeam.dc.html +32 -14
- package/docs/design/Lifecycle.dc.html +22 -0
- package/docs/design/Lifecycle600.dc.html +18 -0
- package/docs/design/LifecycleVariants.dc.html +157 -0
- package/docs/design/LinkAuthorship.dc.html +139 -0
- package/docs/design/LinksChanged.dc.html +203 -0
- package/docs/design/LinksOptions.dc.html +137 -0
- package/docs/design/LinksOptions600.dc.html +134 -0
- package/docs/design/NearPin.dc.html +9 -10
- package/docs/design/Pane600.dc.html +4 -3
- package/docs/design/Relations.dc.html +3 -2
- package/docs/design/Restore.dc.html +152 -0
- package/docs/design/SeeChange.dc.html +267 -0
- package/docs/design/Uses.dc.html +12 -6
- package/docs/design/canvas.json +146 -19
- package/docs/design.md +449 -16
- package/docs/environment.md +0 -1
- package/docs/evals/curation-effect.md +128 -0
- package/docs/http-api.md +459 -37
- package/docs/mcp.md +146 -18
- package/docs/node-types.md +58 -3
- package/docs/plans/design-gaps-2026-10-08.md +53 -0
- package/docs/plans/plan-009-tech-debt-backlog.md +379 -0
- package/docs/plans/plan-016-context-made-visible-wave-1.md +150 -5
- package/docs/plans/plan-017-knowledge-categories-and-lifecycle.md +175 -0
- package/docs/plans/plan-018-connected-memory-wave-2.md +594 -0
- package/docs/plans/plan-019-post-0.9-roadmap.md +198 -0
- package/docs/product-context-vision-2026-09.md +17 -1
- package/docs/product-vision-2026-09.md +1082 -43
- package/docs/product-vision-review-2026-09.md +13 -1
- package/docs/screenshots/workbench-live-dark.png +0 -0
- package/docs/screenshots/workbench-live-light.png +0 -0
- package/docs/sdk.md +62 -2
- package/package.json +1 -1
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/plugin.json +1 -1
- package/plugins/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/tools.json +601 -22
- package/skills/pmx-canvas/SKILL.md +216 -42
- package/skills/pmx-canvas/references/full-reference.md +120 -21
- package/skills/pmx-canvas/references/github-copilot-app-adapter.md +2 -2
- package/skills/pmx-canvas/references/importing-context.md +132 -0
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
- package/skills/pmx-canvas/references/tours-and-recording.md +16 -1
- package/skills/pmx-canvas-testing/SKILL.md +20 -0
- package/src/cli/agent.ts +2 -0
- package/src/cli/commands/ax.ts +12 -0
- package/src/cli/commands/boards.ts +87 -11
- package/src/cli/commands/edges.ts +28 -0
- package/src/cli/commands/groups.ts +7 -0
- package/src/cli/commands/nodes.ts +1 -0
- package/src/cli/commands/query.ts +34 -2
- package/src/cli/commands/record.ts +199 -48
- package/src/cli/index.ts +6 -1
- package/src/client/App.tsx +177 -70
- package/src/client/canvas/AttentionHistory.tsx +0 -2
- package/src/client/canvas/BarHint.tsx +40 -2
- package/src/client/canvas/BoardCopyDialog.tsx +1 -1
- package/src/client/canvas/BoardFolderDialog.tsx +7 -7
- package/src/client/canvas/BoardLinkDialog.tsx +138 -33
- package/src/client/canvas/BoardPinButton.tsx +33 -0
- package/src/client/canvas/BoardSwitcher.tsx +26 -40
- package/src/client/canvas/CanvasNode.tsx +360 -237
- package/src/client/canvas/CanvasViewport.tsx +45 -7
- package/src/client/canvas/CommandBar.tsx +29 -23
- package/src/client/canvas/CommandPalette.tsx +5 -12
- package/src/client/canvas/ConnectionBanner.tsx +3 -3
- package/src/client/canvas/ContextChip.tsx +296 -0
- package/src/client/canvas/ContextMenu.tsx +63 -5
- package/src/client/canvas/CrossBoardReferences.tsx +60 -0
- package/src/client/canvas/EdgeLayer.tsx +339 -76
- package/src/client/canvas/EmptyState.tsx +33 -18
- package/src/client/canvas/ExpandedNodeOverlay.tsx +72 -40
- package/src/client/canvas/ExternalWriters.tsx +57 -42
- package/src/client/canvas/HomeGraphView.tsx +942 -0
- package/src/client/canvas/HomeMapView.tsx +641 -0
- package/src/client/canvas/HomeReviewView.tsx +167 -0
- package/src/client/canvas/HomeView.tsx +687 -160
- package/src/client/canvas/IntentLayer.tsx +19 -12
- package/src/client/canvas/KnowledgeDialog.tsx +488 -0
- package/src/client/canvas/LifecycleChrome.tsx +133 -0
- package/src/client/canvas/LifecycleFields.tsx +91 -0
- package/src/client/canvas/LifecyclePanel.tsx +533 -0
- package/src/client/canvas/MemoryInspector.tsx +104 -0
- package/src/client/canvas/Minimap.tsx +3 -3
- package/src/client/canvas/NearPinLayer.tsx +187 -0
- package/src/client/canvas/NodeContextMark.tsx +175 -97
- package/src/client/canvas/Presentation.tsx +23 -57
- package/src/client/canvas/RelationPresetsDialog.tsx +413 -0
- package/src/client/canvas/RelationsPanel.tsx +82 -0
- package/src/client/canvas/SelectionBar.tsx +3 -6
- package/src/client/canvas/SessionPanel.tsx +90 -50
- package/src/client/canvas/SessionReceipt.tsx +311 -39
- package/src/client/canvas/ShortcutOverlay.tsx +1 -1
- package/src/client/canvas/SnapshotPanel.tsx +27 -36
- package/src/client/canvas/ToolRail.tsx +367 -192
- package/src/client/canvas/TopBar.tsx +354 -124
- package/src/client/canvas/canvas-area.ts +10 -3
- package/src/client/canvas/graph-geometry.ts +195 -0
- package/src/client/canvas/graph-model.ts +254 -0
- package/src/client/canvas/memory-layout.ts +106 -0
- package/src/client/canvas/use-chrome-height.ts +20 -0
- package/src/client/canvas/use-focus-trap.ts +31 -5
- package/src/client/canvas/use-memory-graph.ts +58 -0
- package/src/client/canvas/use-node-drag.ts +2 -1
- package/src/client/canvas/use-pan-zoom.ts +64 -7
- package/src/client/icons.tsx +0 -63
- package/src/client/mcp-app/style.css +0 -6
- package/src/client/nodes/AxStepControls.tsx +74 -50
- package/src/client/nodes/BoardNode.tsx +5 -1
- package/src/client/nodes/ContextNode.tsx +18 -11
- package/src/client/nodes/ExtAppFrame.tsx +0 -1
- package/src/client/nodes/FileNode.tsx +46 -42
- package/src/client/nodes/HtmlNode.tsx +32 -0
- package/src/client/nodes/ImageNode.tsx +1 -1
- package/src/client/nodes/InlineFormatBar.tsx +6 -9
- package/src/client/nodes/InlineMarkdownEditor.tsx +56 -17
- package/src/client/nodes/MarkdownNode.tsx +377 -109
- package/src/client/nodes/McpAppNode.tsx +50 -20
- package/src/client/nodes/MdFormatBar.tsx +21 -18
- package/src/client/nodes/PromptNode.tsx +1 -1
- package/src/client/nodes/ResponseNode.tsx +1 -1
- package/src/client/nodes/viewer-runtime-state.ts +54 -22
- package/src/client/state/attention-bridge.ts +64 -15
- package/src/client/state/boards-store.ts +193 -39
- package/src/client/state/canvas-store.ts +99 -12
- package/src/client/state/context-chip-store.ts +70 -0
- package/src/client/state/context-status-store.ts +53 -0
- package/src/client/state/intent-bridge.ts +51 -30
- package/src/client/state/knowledge-store.ts +43 -0
- package/src/client/state/near-pin-store.ts +115 -6
- package/src/client/state/presence-store.ts +7 -10
- package/src/client/state/presentation.ts +91 -0
- package/src/client/state/relation-store.ts +81 -0
- package/src/client/state/session-store.ts +144 -18
- package/src/client/state/sse-bridge.ts +206 -29
- package/src/client/state/workspace-settings.ts +11 -0
- package/src/client/theme/global.css +2724 -476
- package/src/client/types.ts +12 -0
- package/src/client/utils/keyboard.ts +10 -0
- package/src/client/utils/time-ago.ts +14 -0
- package/src/json-render/renderer/index.tsx +31 -0
- package/src/mcp/canvas-app.ts +12 -2
- package/src/mcp/context-uri-template.ts +7 -4
- package/src/mcp/server.ts +63 -41
- package/src/mcp/workbench-app.ts +39 -6
- package/src/server/agent-presence.ts +128 -28
- package/src/server/ax-context.ts +27 -13
- package/src/server/board-export.ts +12 -1
- package/src/server/canvas-db.ts +331 -42
- package/src/server/canvas-operations.ts +195 -83
- package/src/server/canvas-provenance.ts +53 -22
- package/src/server/canvas-serialization.ts +2 -0
- package/src/server/canvas-state.ts +950 -122
- package/src/server/canvas-validation.ts +9 -2
- package/src/server/context-brief.ts +345 -38
- package/src/server/context-reads.ts +178 -30
- package/src/server/demo-state.json +355 -24
- package/src/server/edit-summary.ts +74 -0
- package/src/server/html-surface.ts +8 -1
- package/src/server/index.ts +181 -11
- package/src/server/knowledge-lifecycle.ts +304 -0
- package/src/server/lifecycle-status.ts +232 -0
- package/src/server/memory-graph.ts +166 -0
- package/src/server/mutation-history.ts +18 -6
- package/src/server/operations/composites.ts +32 -11
- package/src/server/operations/http.ts +7 -2
- package/src/server/operations/index.ts +4 -0
- package/src/server/operations/mcp.ts +26 -1
- package/src/server/operations/ops/ax-presence.ts +1 -1
- package/src/server/operations/ops/ax-read.ts +57 -6
- package/src/server/operations/ops/ax-timeline.ts +28 -2
- package/src/server/operations/ops/backup.ts +5 -3
- package/src/server/operations/ops/batch.ts +35 -4
- package/src/server/operations/ops/boards.ts +188 -47
- package/src/server/operations/ops/canvas-wire.ts +31 -1
- package/src/server/operations/ops/edges.ts +36 -2
- package/src/server/operations/ops/groups.ts +6 -1
- package/src/server/operations/ops/lifecycle.ts +262 -0
- package/src/server/operations/ops/memory-graph.ts +45 -0
- package/src/server/operations/ops/nodes.ts +107 -24
- package/src/server/operations/ops/query.ts +281 -68
- package/src/server/operations/ops/snapshots.ts +73 -1
- package/src/server/operations/ops/validate.ts +5 -1
- package/src/server/operations/ops/viewport.ts +97 -3
- package/src/server/operations/registry.ts +74 -25
- package/src/server/placement.ts +29 -0
- package/src/server/scope-fence.ts +78 -6
- package/src/server/server.ts +115 -16
- package/src/server/spatial-analysis.ts +48 -23
- package/src/server/tour-control.ts +82 -0
- package/src/server/wiki-links.ts +137 -0
- package/src/server/workbench-auth.ts +11 -0
- package/src/shared/agent-context.ts +3 -0
- package/src/shared/agent-presence.ts +15 -15
- package/src/shared/auto-arrange.ts +2 -0
- package/src/shared/boards.ts +4 -4
- package/src/shared/knowledge-lifecycle.ts +22 -0
- package/src/shared/knowledge-presets.ts +80 -0
- package/src/shared/lifecycle-status.ts +26 -0
- package/src/shared/memory-graph.ts +74 -0
- package/src/shared/relations.ts +98 -0
- package/src/shared/semantic-attention.ts +15 -1
- package/src/shared/tour.ts +23 -5
- package/src/shared/workspace-settings.ts +13 -0
- package/dist/types/client/canvas/ContextPinBar.d.ts +0 -1
- package/dist/types/client/canvas/FocusFieldLayer.d.ts +0 -1
- package/dist/types/client/canvas/kind-colors.d.ts +0 -3
- package/dist/types/server/agent-context.d.ts +0 -22
- package/src/client/canvas/ContextPinBar.tsx +0 -25
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
body{margin:0}
|
|
14
14
|
</style>
|
|
15
15
|
</helmet>
|
|
16
|
-
<div style="width: 1440px; height:
|
|
16
|
+
<div style="width: 1440px; height: 1040px; box-sizing: border-box; padding: 40px 56px; background: #050d17; color: #e6eef7; font-family: 'IBM Plex Sans', system-ui, sans-serif; font-size: 13px; line-height: 1.5; display: flex; flex-direction: column; gap: 16px">
|
|
17
17
|
<div><h1 style="margin: 0; font-size: 28px; font-weight: 600; letter-spacing: -0.015em">At 600 px — the narrow end</h1><p style="margin: 4px 0 0; font-size: 13px; color: #8ea3bd">The narrow end of the reference widths (600, 1024, 1920 px): an agent-host pane or a narrow side browser. One column, panels become drawers and sheets, nothing important hides behind a scrollbar. Every board above is the full-window end.</p></div>
|
|
18
18
|
<div style="display: flex; gap: 64px">
|
|
19
19
|
|
|
@@ -70,7 +70,8 @@ body{margin:0}
|
|
|
70
70
|
<div style="{{p.node}} left: 64px; top: 330px; width: 250px"><div style="{{p.head}}"><span style="{{p.title}}">Churn flat after raise</span><span style="{{p.mark}}"><svg width="11" height="11" viewBox="0 0 24 24" style="fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round"><path d="M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z"></path></svg>by Claude</span><button aria-label="Expand (Enter)" style="width: 22px; height: 22px; border: 0; border-radius: 6px; padding: 0; background: transparent; color: #b9c6d6; display: flex; align-items: center; justify-content: center; flex-shrink: 0"><svg width="13" height="13" viewBox="0 0 24 24" style="fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round"><path d="M14 4h6v6M20 4l-7 7M10 20H4v-6M4 20l7-7"></path></svg></button><button aria-label="Add to context (P)" style="width: 18px; height: 18px; box-sizing: border-box; border: 1.5px solid #6b7d94; border-radius: 999px; padding: 0; background: transparent; color: #b9c6d6; display: flex; align-items: center; justify-content: center; flex-shrink: 0"><svg width="10" height="10" viewBox="0 0 24 24" style="fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round"><path d="M9 4h6l-.8 5.5 2.8 3H7l2.8-3zM12 12.5V20"></path></svg></button></div><div style="{{p.body}}">Pro churn 2.1% → 2.2%.</div></div>
|
|
71
71
|
<div style="{{p.node}} left: 330px; top: 330px; width: 250px"><div style="position: absolute; left: 0; right: 0; top: 0; height: 2.5px; background: #B388FF"></div><div style="{{p.head}}"><span style="{{p.title}}">SMB is price-sensitive</span><span style="{{p.mark}}"><svg width="11" height="11" viewBox="0 0 24 24" style="fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round"><path d="M4 20l4.2-1L19 8.2 15.8 5 5 15.8z"></path></svg>edited</span><button aria-label="Expand (Enter)" style="width: 22px; height: 22px; border: 0; border-radius: 6px; padding: 0; background: transparent; color: #b9c6d6; display: flex; align-items: center; justify-content: center; flex-shrink: 0"><svg width="13" height="13" viewBox="0 0 24 24" style="fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round"><path d="M14 4h6v6M20 4l-7 7M10 20H4v-6M4 20l7-7"></path></svg></button><button aria-label="Add to context (P)" style="width: 18px; height: 18px; box-sizing: border-box; border: 1.5px solid #6b7d94; border-radius: 999px; padding: 0; background: transparent; color: #b9c6d6; display: flex; align-items: center; justify-content: center; flex-shrink: 0"><svg width="10" height="10" viewBox="0 0 24 24" style="fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round"><path d="M9 4h6l-.8 5.5 2.8 3H7l2.8-3zM12 12.5V20"></path></svg></button></div><div style="{{p.body}}">6 of 9 would downgrade.</div></div>
|
|
72
72
|
<div style="position: absolute; left: 56px; right: 12px; bottom: 12px; display: flex; flex-direction: column; gap: 8px">
|
|
73
|
-
<
|
|
73
|
+
<span style="font-size: 11px; color: #b9c6d6">Superseded 2026-10-10: these two floating chips moved to the top bar — the context summary (ContextChip600) and the agent’s initial, whose popover holds the live counts and the lens switch (SeeChange).</span>
|
|
74
|
+
<div style="display: flex; gap: 8px; flex-wrap: wrap; opacity: 0.45">
|
|
74
75
|
<span style="display: flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px; border-radius: 999px; border: 1px solid rgba(75,188,255,0.3); background: #0f1d31; color: #4BBCFF; font-size: 12px; font-weight: 500">4 in context <span style="color: #f4c542">· 1 out of date</span></span>
|
|
75
76
|
<span style="display: flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px; border-radius: 999px; border: 1px solid rgba(179,136,255,0.35); background: #0f1d31; color: #B388FF; font-size: 12px; font-weight: 500"><span style="width: 7px; height: 7px; border-radius: 999px; background: #B388FF"></span>Claude · 4 read · 1 edited</span>
|
|
76
77
|
</div>
|
|
@@ -82,7 +83,7 @@ body{margin:0}
|
|
|
82
83
|
</div>
|
|
83
84
|
</div>
|
|
84
85
|
</x-dc>
|
|
85
|
-
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1440,"height":
|
|
86
|
+
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1440,"height":1040}}'>
|
|
86
87
|
class Component extends DCLogic {
|
|
87
88
|
renderVals() {
|
|
88
89
|
var p = {
|
|
@@ -18,6 +18,7 @@ body{margin:0}
|
|
|
18
18
|
<div>
|
|
19
19
|
<h1 style="margin: 0; font-size: 28px; font-weight: 600; letter-spacing: -0.015em">Relations</h1>
|
|
20
20
|
<p style="margin: 4px 0 0; font-size: 13px; color: #8ea3bd">A research board: one question, two findings, the evidence and the data behind them. Relations should say what supports a claim, what contradicts it, and where each number came from.</p>
|
|
21
|
+
<p style="margin: 4px 0 0; font-size: 12px; color: #8ea3bd">Lifecycle off: relation filters sit 8px below the canvas top, including when sessions are off. Only visible lifecycle filters reserve a row above relations.</p>
|
|
21
22
|
</div>
|
|
22
23
|
|
|
23
24
|
<section style="display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 40px">
|
|
@@ -52,7 +53,7 @@ body{margin:0}
|
|
|
52
53
|
<div style="display: flex; flex-direction: column; gap: 8px">
|
|
53
54
|
<span style="font-size: 11px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase; color: #6b7d94">Proposed — hovering the question</span>
|
|
54
55
|
<div style="position: relative; width: 644px; height: 600px; border-radius: 10px; border: 1px solid #1b2c44; overflow: hidden; background-color: #081524; background-image: radial-gradient(rgba(142,163,189,0.14) 1px, transparent 1.2px); background-size: 24px 24px">
|
|
55
|
-
<div style="position: absolute; left: 14px; top:
|
|
56
|
+
<div style="position: absolute; left: 14px; top: 8px; right: 14px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap">
|
|
56
57
|
<sc-for list="{{legend}}" as="lg" hint-placeholder-count="6">
|
|
57
58
|
<button style="display: flex; align-items: center; gap: 6px; height: 24px; padding: 0 9px; border-radius: 999px; border: 1px solid #1b2c44; background: #0f1d31; color: #e6eef7; font-family: inherit; font-size: 11px; font-weight: 500"><svg width="18" height="6" viewBox="0 0 18 6" style="fill: none; stroke: {{lg.c}}; stroke-width: 2; stroke-dasharray: {{lg.dash}}; stroke-linecap: round"><path d="M1 3 H17"></path></svg>{{lg.name}}<span style="color: #6b7d94; font-variant-numeric: tabular-nums">{{lg.n}}</span></button>
|
|
58
59
|
</sc-for>
|
|
@@ -120,7 +121,7 @@ body{margin:0}
|
|
|
120
121
|
<div style="{{a.cell}}">
|
|
121
122
|
<svg width="220" height="110" viewBox="0 0 220 110" style="position: absolute; left: 0; top: 0; fill: none; stroke-linecap: round"><path d="M 60 55 L 158 55" style="stroke: #4BBCFF; stroke-width: 6; opacity: 0.25"></path><path d="M 60 55 L 158 55" style="stroke: #4BBCFF; stroke-width: 3"></path></svg>
|
|
122
123
|
<div style="{{a.box}} left: 14px; top: 41px">A</div><div style="{{a.box}} left: 160px; top: 41px">B</div>
|
|
123
|
-
<span style="position: absolute; left: 14px; bottom: 8px; font-size: 11px; color: #6b7d94">Delete or
|
|
124
|
+
<span style="position: absolute; left: 14px; bottom: 8px; font-size: 11px; color: #6b7d94">Delete or right-click for a menu.</span>
|
|
124
125
|
</div>
|
|
125
126
|
|
|
126
127
|
<span style="font-size: 12px; font-weight: 600">Proposed</span>
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Restore a retired card</title>
|
|
6
|
+
<script src="./support.js"></script>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<x-dc>
|
|
10
|
+
<helmet>
|
|
11
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500;600&display=swap">
|
|
12
|
+
<style>
|
|
13
|
+
body{margin:0}
|
|
14
|
+
</style>
|
|
15
|
+
</helmet>
|
|
16
|
+
<div style="width: 1440px; height: 820px; box-sizing: border-box; padding: 40px 48px; background: #081524; color: #e6eef7; font-family: 'IBM Plex Sans', system-ui, sans-serif; font-size: 13px; line-height: 1.5; display: flex; flex-direction: column; gap: 20px">
|
|
17
|
+
|
|
18
|
+
<div>
|
|
19
|
+
<h1 style="margin: 0; font-size: 28px; font-weight: 600; letter-spacing: -0.015em">Retired, and back again</h1>
|
|
20
|
+
<p style="margin: 4px 0 0; font-size: 13px; color: #8ea3bd">Retiring takes a card out of the brief and nothing else: the card, its content and its history stay on the board. If that was a mistake, anyone who can edit the board restores it, and the history says who and when.</p>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div style="flex: 1; display: grid; grid-template-columns: 440px 500px minmax(0, 1fr); gap: 24px; min-height: 0">
|
|
24
|
+
|
|
25
|
+
<section style="display: flex; flex-direction: column; gap: 10px; min-width: 0">
|
|
26
|
+
<span style="{{s.label}}">1 · Where a retired card is</span>
|
|
27
|
+
<div style="position: relative; height: 300px; border-radius: 10px; border: 1px solid #1b2c44; background-color: #081524; background-image: radial-gradient(rgba(142,163,189,0.14) 1px, transparent 1.2px); background-size: 24px 24px; overflow: hidden">
|
|
28
|
+
<div style="position: absolute; left: 0; right: 0; top: 0; height: 44px; display: flex; align-items: center; gap: 6px; padding: 0 12px; background: #0f1d31; border-bottom: 1px solid #1b2c44">
|
|
29
|
+
<span style="font-size: 13px; font-weight: 600; flex: 1">Pricing strategy 2027</span>
|
|
30
|
+
<span style="{{s.filterOff}}">All</span><span style="{{s.filterOff}}"><svg width="11" height="11" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.glass}}"></path></svg>To review 2</span><span style="{{s.filterOn}}"><svg width="11" height="11" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.retire}}"></path></svg>Retired 1</span>
|
|
31
|
+
</div>
|
|
32
|
+
<div style="{{s.cardFaded}} left: 16px; top: 64px; width: 200px; height: 96px"><div style="{{s.head}}"><span style="{{s.title}}">Positioning: premium SMB</span></div><div style="{{s.body}}">Lead with reliability…</div></div>
|
|
33
|
+
<div style="{{s.cardRetired}} left: 228px; top: 64px; width: 196px; height: 116px"><div style="{{s.head}}"><span style="{{s.title}}">Old tier names</span><span style="{{s.retiredTag}}"><svg width="11" height="11" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.retire}}"></path></svg>retired</span></div><div style="{{s.body}}">Starter / Team / Business naming from 2025.</div></div>
|
|
34
|
+
<div style="{{s.cardFaded}} left: 16px; top: 176px; width: 200px; height: 96px"><div style="{{s.head}}"><span style="{{s.title}}">Competitor price list</span></div><div style="{{s.body}}">Six competitors…</div></div>
|
|
35
|
+
</div>
|
|
36
|
+
<span style="font-size: 11px; color: #8ea3bd">On the board a retired card is always drawn dimmed, in place. The <b style="font-weight: 600; color: #b9c6d6">Retired</b> filter fades everything else and adds the word, so it is found without hunting.</span>
|
|
37
|
+
|
|
38
|
+
<div style="{{s.panel}} padding: 10px; gap: 6px">
|
|
39
|
+
<div style="display: flex; align-items: center; gap: 8px; height: 34px; padding: 0 10px; border-radius: 6px; border: 1px solid #2a4566; background: #081524"><svg width="13" height="13" viewBox="0 0 24 24" style="{{s.icDim}}"><path d="{{i.search}}"></path></svg><span style="flex: 1">tier names</span><span style="font-size: 11px; color: #6b7d94">⌘K</span></div>
|
|
40
|
+
<sc-for list="{{results}}" as="r" hint-placeholder-count="3">
|
|
41
|
+
<div style="{{r.row}}"><div style="flex: 1; min-width: 0; display: flex; flex-direction: column"><span style="font-size: 12px; font-weight: 500">{{r.t}}</span><span style="font-size: 11px; color: #8ea3bd">{{r.where}}</span></div><span style="{{r.tagSt}}"><svg width="11" height="11" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.retire}}"></path></svg>{{r.tag}}</span></div>
|
|
42
|
+
</sc-for>
|
|
43
|
+
<span style="font-size: 11px; color: #8ea3bd; padding: 0 4px">Search still finds retired cards and says so; agents find them through canvas_query search too, marked retired.</span>
|
|
44
|
+
</div>
|
|
45
|
+
</section>
|
|
46
|
+
|
|
47
|
+
<section style="display: flex; flex-direction: column; gap: 10px; min-width: 0">
|
|
48
|
+
<span style="{{s.label}}">2 · Lifecycle tab — Old tier names</span>
|
|
49
|
+
<div style="{{s.panel}} box-shadow: 0 10px 30px rgba(0,0,0,0.6)">
|
|
50
|
+
<div style="display: flex; align-items: center; gap: 10px; height: 48px; padding: 0 12px 0 16px; border-bottom: 1px solid #1b2c44">
|
|
51
|
+
<span style="font-size: 15px; font-weight: 600; flex: 1">Old tier names</span>
|
|
52
|
+
<span style="{{s.tabOff}}">Content</span><span style="{{s.tabOn}}">Lifecycle</span><span style="{{s.tabOff}}">Source</span>
|
|
53
|
+
</div>
|
|
54
|
+
<div style="padding: 16px; display: flex; flex-direction: column; gap: 14px">
|
|
55
|
+
<div style="display: flex; flex-direction: column; gap: 8px; padding: 14px; border-radius: 8px; border: 1px solid #2a4566; background: #13243b">
|
|
56
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{s.retiredTag}}"><svg width="11" height="11" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.retire}}"></path></svg>retired from active context</span></div>
|
|
57
|
+
<span style="font-size: 12px; color: #b9c6d6">Not in the brief since 2 Oct 2026. Retired by <span style="color: #B388FF">Claude</span>: “superseded by New tier names”.</span>
|
|
58
|
+
<button style="{{s.btnPrimary}}"><svg width="14" height="14" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.restore}}"></path></svg>Restore to active context</button>
|
|
59
|
+
<div style="{{s.input}}"><span style="color: #6b7d94">Why — optional, e.g. “retired by mistake”</span></div>
|
|
60
|
+
</div>
|
|
61
|
+
<div style="display: flex; flex-direction: column; gap: 6px">
|
|
62
|
+
<span style="font-size: 12px; font-weight: 600">What restore does</span>
|
|
63
|
+
<sc-for list="{{effects}}" as="e" hint-placeholder-count="4"><div style="display: flex; gap: 8px; font-size: 12px; color: #b9c6d6"><span style="{{e.gSt}}">{{e.g}}</span><span>{{e.t}}</span></div></sc-for>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div style="display: flex; align-items: center; gap: 12px; padding: 10px 14px; border-radius: 10px; border: 1px solid #2a4566; background: #13243b; box-shadow: 0 10px 30px rgba(0,0,0,0.5)">
|
|
69
|
+
<svg width="14" height="14" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.retire}}"></path></svg><span style="flex: 1; font-size: 12px">Old tier names retired from active context</span><span style="font-size: 12px; font-weight: 600; color: #4BBCFF">Undo</span>
|
|
70
|
+
</div>
|
|
71
|
+
<span style="font-size: 11px; color: #8ea3bd">Right after retiring, the toast offers Undo — the quickest way back. Later, Restore in the Lifecycle tab.</span>
|
|
72
|
+
</section>
|
|
73
|
+
|
|
74
|
+
<section style="display: flex; flex-direction: column; gap: 10px; min-width: 0">
|
|
75
|
+
<span style="{{s.label}}">3 · Recorded in the history</span>
|
|
76
|
+
<div style="{{s.panel}} padding: 14px; gap: 2px">
|
|
77
|
+
<span style="font-size: 12px; font-weight: 600; padding-bottom: 6px">History · Old tier names</span>
|
|
78
|
+
<sc-for list="{{history}}" as="h" hint-placeholder-count="4">
|
|
79
|
+
<div style="display: flex; flex-direction: column; gap: 1px; padding: 8px 0; border-top: 1px solid #1b2c44"><div style="display: flex; align-items: center; gap: 8px; font-size: 12px"><svg width="12" height="12" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{h.icon}}"></path></svg><span style="font-weight: 600; flex: 1">{{h.o}}</span><span style="color: #8ea3bd">{{h.d}}</span></div><div style="font-size: 12px; padding-left: 20px"><span style="{{h.whoSt}}">{{h.who}}</span><span style="color: #b9c6d6"> · {{h.e}}</span></div></div>
|
|
80
|
+
</sc-for>
|
|
81
|
+
</div>
|
|
82
|
+
<sc-for list="{{rules}}" as="r" hint-placeholder-count="3">
|
|
83
|
+
<div style="{{s.panel}} padding: 12px 14px; gap: 2px"><span style="font-size: 12px; font-weight: 600">{{r.t}}</span><span style="font-size: 11px; color: #b9c6d6">{{r.d}}</span></div>
|
|
84
|
+
</sc-for>
|
|
85
|
+
</section>
|
|
86
|
+
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</x-dc>
|
|
90
|
+
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1440,"height":820}}'>
|
|
91
|
+
class Component extends DCLogic {
|
|
92
|
+
renderVals() {
|
|
93
|
+
var i = {
|
|
94
|
+
glass: 'M7 3h10M7 21h10M8 3v3l4 6-4 6v3M16 3v3l-4 6 4 6v3',
|
|
95
|
+
retire: 'M4 7h16M6 7v12h12V7M9 4h6',
|
|
96
|
+
restore: 'M4 12a8 8 0 1 0 2.3-5.6M4 4v4h4',
|
|
97
|
+
search: 'M10.5 4a6.5 6.5 0 1 0 0 13a6.5 6.5 0 1 0 0-13M15.5 15.5L20 20',
|
|
98
|
+
check: 'M5 12.5l4.5 4.5L19 7',
|
|
99
|
+
revise: 'M4 20l4.2-1L19 8.2 15.8 5 5 15.8zM13 7l4 4'
|
|
100
|
+
};
|
|
101
|
+
var nodeBase = 'position:absolute;box-sizing:border-box;border-radius:10px;background:#0f1d31;border:1px solid #1b2c44;overflow:hidden;';
|
|
102
|
+
var tagBase = 'display:inline-flex;align-items:center;gap:4px;height:20px;box-sizing:border-box;padding:0 7px;border-radius:999px;font-size:11px;font-weight:500;flex-shrink:0;';
|
|
103
|
+
var fBase = 'display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border-radius:999px;font-size:11px;';
|
|
104
|
+
var s = {
|
|
105
|
+
label: 'font-size:11px;font-weight:500;letter-spacing:0.06em;text-transform:uppercase;color:#6b7d94;',
|
|
106
|
+
panel: 'display:flex;flex-direction:column;border-radius:10px;border:1px solid #1b2c44;background:#0f1d31;',
|
|
107
|
+
ic: 'fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0;',
|
|
108
|
+
icDim: 'fill:none;stroke:#6b7d94;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0;',
|
|
109
|
+
filterOn: fBase + 'background:#1b2c44;color:#e6eef7;font-weight:600;',
|
|
110
|
+
filterOff: fBase + 'color:#8ea3bd;',
|
|
111
|
+
cardFaded: nodeBase + 'opacity:0.35;',
|
|
112
|
+
cardRetired: nodeBase + 'border:1px solid #2a4566;box-shadow:0 1px 2px rgba(0,0,0,0.4),0 6px 20px rgba(0,0,0,0.24);',
|
|
113
|
+
head: 'display:flex;align-items:center;gap:6px;height:34px;padding:0 8px 0 12px;border-bottom:1px solid #1b2c44;',
|
|
114
|
+
title: 'flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12px;font-weight:600;',
|
|
115
|
+
body: 'padding:8px 12px;font-size:12px;color:#b9c6d6;',
|
|
116
|
+
retiredTag: tagBase + 'color:#b9c6d6;background:#1b2c44;',
|
|
117
|
+
tabOn: 'height:28px;display:flex;align-items:center;padding:0 10px;border-radius:6px;background:#13243b;font-size:12px;font-weight:600;',
|
|
118
|
+
tabOff: 'height:28px;display:flex;align-items:center;padding:0 10px;font-size:12px;color:#8ea3bd;',
|
|
119
|
+
btnPrimary: 'align-self:flex-start;display:flex;align-items:center;gap:8px;height:34px;padding:0 14px;border:0;border-radius:6px;background:#4BBCFF;color:#081524;font-family:inherit;font-size:13px;font-weight:600;',
|
|
120
|
+
input: 'display:flex;align-items:center;height:34px;box-sizing:border-box;padding:0 10px;border-radius:6px;border:1px solid #2a4566;background:#081524;font-size:12px;'
|
|
121
|
+
};
|
|
122
|
+
var rowBase = 'display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;';
|
|
123
|
+
var results = [
|
|
124
|
+
{ t: 'Old tier names', where: 'Pricing strategy 2027', tag: 'retired', tagSt: s.retiredTag, row: rowBase + 'background:#13243b;' },
|
|
125
|
+
{ t: 'New tier names', where: 'Pricing strategy 2027', tag: '', tagSt: 'display:none;', row: rowBase },
|
|
126
|
+
{ t: 'Tier naming workshop', where: 'Workshops', tag: '', tagSt: 'display:none;', row: rowBase }
|
|
127
|
+
];
|
|
128
|
+
var g = 'flex-shrink:0;width:12px;color:#8ea3bd;';
|
|
129
|
+
var effects = [
|
|
130
|
+
{ g: '+', gSt: g, t: 'The card goes back into the brief on its next delivery, with its lifecycle as it was.' },
|
|
131
|
+
{ g: '=', gSt: g, t: 'It is not a validation. The last validated date stays, so it may come back marked review due.' },
|
|
132
|
+
{ g: '=', gSt: g, t: 'Nothing is lost while retired: content, links, pins and history were kept the whole time.' },
|
|
133
|
+
{ g: '+', gSt: g, t: 'The agent sees the restore in its next brief’s changes and in the history.' }
|
|
134
|
+
];
|
|
135
|
+
var who = 'color:#e6eef7;';
|
|
136
|
+
var agent = 'color:#B388FF;';
|
|
137
|
+
var history = [
|
|
138
|
+
{ o: 'Restored to active context', d: '7 Oct 2026 · 09:42', who: 'Pepe', whoSt: who, e: 'retired by mistake — still our naming in the EU', icon: i.restore },
|
|
139
|
+
{ o: 'Retired from active context', d: '2 Oct 2026 · 16:10', who: 'Claude', whoSt: agent, e: 'superseded by New tier names', icon: i.retire },
|
|
140
|
+
{ o: 'Retained', d: '3 Aug 2026', who: 'Pepe', whoSt: who, e: 'still on the price page', icon: i.check },
|
|
141
|
+
{ o: 'Revised', d: '12 May 2026', who: 'Mia', whoSt: who, e: 'Business renamed from Pro', icon: i.revise }
|
|
142
|
+
];
|
|
143
|
+
var rules = [
|
|
144
|
+
{ t: 'Who can retire and restore', d: 'Anyone who can edit the board, and agents acting for them. An agent’s retire or restore shows its violet name, like any agent edit.' },
|
|
145
|
+
{ t: 'Retired is not deleted', d: 'Delete stays its own action. Retire only answers “should the agent still be told this?”' }
|
|
146
|
+
];
|
|
147
|
+
return { i: i, s: s, results: results, effects: effects, history: history, rules: rules };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
</script>
|
|
151
|
+
</body>
|
|
152
|
+
</html>
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>See change in the session receipt</title>
|
|
6
|
+
<script src="./support.js"></script>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<x-dc>
|
|
10
|
+
<helmet>
|
|
11
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500;600&display=swap">
|
|
12
|
+
<style>
|
|
13
|
+
body{margin:0}
|
|
14
|
+
</style>
|
|
15
|
+
</helmet>
|
|
16
|
+
<div style="width: 1440px; height: 2900px; box-sizing: border-box; padding: 40px 48px; background: #081524; color: #e6eef7; font-family: 'IBM Plex Sans', system-ui, sans-serif; font-size: 13px; line-height: 1.5; display: flex; flex-direction: column; gap: 24px">
|
|
17
|
+
|
|
18
|
+
<div>
|
|
19
|
+
<h1 style="margin: 0; font-size: 28px; font-weight: 600; letter-spacing: -0.015em">“See change” in the session receipt</h1>
|
|
20
|
+
<p style="margin: 4px 0 0; font-size: 13px; color: #8ea3bd">When a session ends, its receipt lists what the agent edited. “See change” opens the change in place: Before above After, the changed words marked, and Undo for that card alone. Stacked, not side by side — the receipt is 290 px wide, and two columns would leave each about 118 px. Violet marks what the agent wrote; nothing here is amber unless it needs a look.</p>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<section style="display: flex; flex-direction: column; gap: 10px">
|
|
24
|
+
<span style="{{s.label}}">1 · One change open, one collapsed — Harbor and Daylight</span>
|
|
25
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px">
|
|
26
|
+
<sc-for list="{{full}}" as="f" hint-placeholder-count="2">
|
|
27
|
+
<div style="{{f.frame}}">
|
|
28
|
+
<div style="{{f.bar}}"><span style="{{f.conn}}"></span><span style="font-size: 13px; font-weight: 600">Pricing research ▾</span><span style="flex: 1"></span><span style="{{f.chip}}">4 cards · ≈ 1.1k tokens</span><span style="{{f.avatar}}">C</span></div>
|
|
29
|
+
<div style="{{f.card}}"><div style="{{f.cardBar}}"></div><div style="{{f.cardHead}}"><span style="font-size: 12px; font-weight: 600">SMB is price-sensitive</span></div><div style="{{f.cardBody}}">Interviews show SMB buyers compare on price first. Eight of twelve would move down a tier at $24.</div></div>
|
|
30
|
+
<div style="{{f.card2}}"><div style="{{f.cardBar}}"></div><div style="{{f.cardHead}}"><span style="font-size: 12px; font-weight: 600">Churn by month</span></div><div style="{{f.cardBody}}">Pro plan, monthly logo churn, last 12 months.</div></div>
|
|
31
|
+
<div style="{{f.r.box}}">
|
|
32
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{f.r.dot}}"></span><span style="{{f.r.title}}">What Codex did</span><span style="{{f.r.close}}">×</span></div>
|
|
33
|
+
<div style="{{f.r.who}}">This session · 14:54–14:55 · saved as a snapshot · ended by the agent</div>
|
|
34
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; margin-top: 12px"><sc-for list="{{f.r.tiles}}" as="t" hint-placeholder-count="3"><div style="{{f.r.tile}}"><span style="{{f.r.tileLabel}}">{{t.l}}</span><span style="{{t.st}}">{{t.v}}</span></div></sc-for></div>
|
|
35
|
+
<div style="{{f.r.row}}"><div style="{{f.r.rowHead}}"><svg width="13" height="13" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.eye}}"></path></svg><span style="{{f.r.rowName}}">Read</span><span style="{{f.r.rowCount}}">2</span></div><div style="{{f.r.items}}">Raise Pro to $24?, Competitor pricing</div></div>
|
|
36
|
+
<div style="{{f.r.row}}">
|
|
37
|
+
<div style="{{f.r.rowHead}}"><svg width="13" height="13" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.pen}}"></path></svg><span style="{{f.r.rowName}}">Edited</span><span style="{{f.r.rowCount}}">2</span><span style="{{f.r.mini}}">Undo</span></div>
|
|
38
|
+
<div style="{{f.r.edits}}">
|
|
39
|
+
<div style="{{f.r.line}}"><span><span style="{{f.r.cardName}}">SMB is price-sensitive</span><span style="{{f.r.change}}"> — rewrote the second paragraph</span></span><span style="{{f.r.link}}">Hide change</span></div>
|
|
40
|
+
<div style="{{f.r.side}}"><span style="{{f.r.sideLabel}}">Before</span><span style="{{f.r.text}}"><sc-for list="{{f.r.before}}" as="w" hint-placeholder-count="4"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
41
|
+
<div style="{{f.r.side}}"><span style="{{f.r.sideLabel}}">After</span><span style="{{f.r.text}}"><sc-for list="{{f.r.after}}" as="w" hint-placeholder-count="4"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
42
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{f.r.mini}}">Undo this card</span><span style="{{f.r.change}}">puts back the text from before</span></div>
|
|
43
|
+
<div style="{{f.r.line}} margin-top: 4px"><span><span style="{{f.r.cardName}}">Churn by month</span><span style="{{f.r.change}}"> — added the September row</span></span><span style="{{f.r.link}}">See change</span></div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
<div style="display: flex; align-items: center; gap: 8px; margin-top: 10px"><span style="{{f.r.track}}"><span style="{{f.r.knob}}"></span></span><span style="{{f.r.change}}">Dim untouched nodes</span></div>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</sc-for>
|
|
50
|
+
</div>
|
|
51
|
+
<span style="font-size: 12px; color: #b9c6d6">The cards the session edited keep their violet title-bar line while the receipt is up. “Hide change” closes the view; only one change is open at a time, so the receipt never grows past the canvas.</span>
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<section style="display: flex; flex-direction: column; gap: 10px">
|
|
55
|
+
<span style="{{s.label}}">2 · States of an open change, and of the row’s Undo</span>
|
|
56
|
+
<div style="display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px">
|
|
57
|
+
<sc-for list="{{states}}" as="x" hint-placeholder-count="4">
|
|
58
|
+
<div style="display: flex; flex-direction: column; gap: 6px">
|
|
59
|
+
<span style="font-size: 12px; font-weight: 600">{{x.name}}</span>
|
|
60
|
+
<div style="{{x.r.box}} width: auto">
|
|
61
|
+
<div style="{{x.r.line}}"><span><span style="{{x.r.cardName}}">{{x.title}}</span><span style="{{x.r.change}}"> — {{x.change}}</span></span><span style="{{x.r.link}}">Hide change</span></div>
|
|
62
|
+
<div style="{{x.r.side}}"><span style="{{x.r.sideLabel}}">Before</span><span style="{{x.r.text}}"><sc-for list="{{x.before}}" as="w" hint-placeholder-count="4"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
63
|
+
<div style="{{x.r.side}}"><span style="{{x.r.sideLabel}}">After</span><span style="{{x.r.text}}"><sc-for list="{{x.after}}" as="w" hint-placeholder-count="4"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
64
|
+
<div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap"><span style="{{x.btnSt}}">{{x.btn}}</span><span style="{{x.r.change}}">{{x.note}}</span></div>
|
|
65
|
+
</div>
|
|
66
|
+
<span style="font-size: 11px; color: #8ea3bd">{{x.why}}</span>
|
|
67
|
+
</div>
|
|
68
|
+
</sc-for>
|
|
69
|
+
</div>
|
|
70
|
+
<div style="display: flex; align-items: center; gap: 24px; padding: 12px 14px; border-radius: 10px; border: 1px solid #1b2c44; background: #0f1d31">
|
|
71
|
+
<span style="font-size: 12px; font-weight: 600">The Edited row’s Undo</span>
|
|
72
|
+
<sc-for list="{{rowUndo}}" as="u" hint-placeholder-count="3"><span style="display: flex; align-items: center; gap: 8px"><span style="{{u.st}}">{{u.t}}</span><span style="font-size: 11px; color: #8ea3bd">{{u.d}}</span></span></sc-for>
|
|
73
|
+
</div>
|
|
74
|
+
</section>
|
|
75
|
+
|
|
76
|
+
<section style="display: flex; flex-direction: column; gap: 10px">
|
|
77
|
+
<span style="{{s.label}}">3 · A long card — the excerpt is cut around the first difference</span>
|
|
78
|
+
<div style="display: grid; grid-template-columns: 290px 1fr; gap: 24px; align-items: start">
|
|
79
|
+
<div style="{{long.r.box}} width: 290px; box-sizing: border-box">
|
|
80
|
+
<div style="{{long.r.line}}"><span><span style="{{long.r.cardName}}">Pricing research notes</span><span style="{{long.r.change}}"> — tightened the summary</span></span><span style="{{long.r.link}}">Hide change</span></div>
|
|
81
|
+
<div style="{{long.r.side}}"><span style="{{long.r.sideLabel}}">Before</span><span style="{{long.r.textLong}}"><sc-for list="{{long.before}}" as="w" hint-placeholder-count="5"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
82
|
+
<div style="{{long.r.side}}"><span style="{{long.r.sideLabel}}">After</span><span style="{{long.r.textLong}}"><sc-for list="{{long.after}}" as="w" hint-placeholder-count="5"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
83
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{long.r.mini}}">Undo this card</span><span style="{{long.r.change}}">undoes the whole card</span></div>
|
|
84
|
+
</div>
|
|
85
|
+
<div style="display: flex; flex-direction: column; gap: 6px; font-size: 12px; color: #b9c6d6">
|
|
86
|
+
<span>About 1,200 characters around the first difference; a muted “…” where the text is cut, at either end. Each box scrolls past 120 px.</span>
|
|
87
|
+
<span>The excerpt is for reading the change; Undo always restores the whole card as it was before the session, which the caption says.</span>
|
|
88
|
+
<span>Removed words: struck through, muted, on the soft surface. Added words: a violet tint with a violet underline — the agent wrote them. No red and green: red is an error, green is done.</span>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</section>
|
|
92
|
+
|
|
93
|
+
<section style="display: flex; flex-direction: column; gap: 10px">
|
|
94
|
+
<span style="{{s.label}}">4 · At 600 px — the same receipt, and where the live counts go</span>
|
|
95
|
+
<div style="display: grid; grid-template-columns: 600px 600px; gap: 48px">
|
|
96
|
+
<sc-for list="{{narrow}}" as="n" hint-placeholder-count="2">
|
|
97
|
+
<div style="display: flex; flex-direction: column; gap: 6px">
|
|
98
|
+
<span style="font-size: 12px; font-weight: 600">{{n.name}}</span>
|
|
99
|
+
<div style="{{n.frame}}">
|
|
100
|
+
<div style="{{n.bar}}"><span style="{{n.conn}}"></span><span style="font-size: 13px; font-weight: 600; flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis">Pricing research ▾</span><span style="{{n.chip}}">4 in context</span><span style="{{n.avatar}}">C<span style="{{n.status}}"></span></span><span style="{{n.more}}">⋯</span></div>
|
|
101
|
+
<sc-if value="{{n.live}}" hint-placeholder-val="{{ true }}">
|
|
102
|
+
<div style="{{n.pop}}">
|
|
103
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{n.popDot}}"></span><span style="font-size: 12px; font-weight: 600; flex: 1">Codex · working</span><span style="font-size: 11px; color: {{n.mutedC}}">14:54</span></div>
|
|
104
|
+
<span style="{{n.counts}}">2 read · 1 edited</span>
|
|
105
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{n.track}}"><span style="{{n.knob}}"></span></span><span style="font-size: 11px; color: {{n.mutedC}}">Dim untouched nodes</span></div>
|
|
106
|
+
<span style="{{n.link}}">Open session panel</span>
|
|
107
|
+
</div>
|
|
108
|
+
</sc-if>
|
|
109
|
+
<sc-if value="{{n.receipt}}" hint-placeholder-val="{{ false }}">
|
|
110
|
+
<div style="{{n.r.box}} position: absolute; right: 12px; top: 56px">
|
|
111
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{n.r.dot}}"></span><span style="{{n.r.title}}">What Codex did</span><span style="{{n.r.close}}">×</span></div>
|
|
112
|
+
<div style="{{n.r.who}}">This session · 14:54–14:55 · ended by the agent</div>
|
|
113
|
+
<div style="{{n.r.row}}">
|
|
114
|
+
<div style="{{n.r.rowHead}}"><svg width="13" height="13" viewBox="0 0 24 24" style="{{s.ic}}"><path d="{{i.pen}}"></path></svg><span style="{{n.r.rowName}}">Edited</span><span style="{{n.r.rowCount}}">1</span><span style="{{n.r.mini}}">Undo</span></div>
|
|
115
|
+
<div style="{{n.r.edits}}">
|
|
116
|
+
<div style="{{n.r.line}}"><span><span style="{{n.r.cardName}}">SMB is price-sensitive</span><span style="{{n.r.change}}"> — rewrote the second paragraph</span></span><span style="{{n.r.link}}">Hide change</span></div>
|
|
117
|
+
<div style="{{n.r.side}}"><span style="{{n.r.sideLabel}}">Before</span><span style="{{n.r.text}}"><sc-for list="{{n.r.before}}" as="w" hint-placeholder-count="4"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
118
|
+
<div style="{{n.r.side}}"><span style="{{n.r.sideLabel}}">After</span><span style="{{n.r.text}}"><sc-for list="{{n.r.after}}" as="w" hint-placeholder-count="4"><span style="{{w.st}}">{{w.t}}</span></sc-for></span></div>
|
|
119
|
+
<div style="display: flex; align-items: center; gap: 8px"><span style="{{n.r.mini}}">Undo this card</span></div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
</sc-if>
|
|
124
|
+
</div>
|
|
125
|
+
<span style="font-size: 11px; color: #8ea3bd">{{n.note}}</span>
|
|
126
|
+
</div>
|
|
127
|
+
</sc-for>
|
|
128
|
+
</div>
|
|
129
|
+
</section>
|
|
130
|
+
|
|
131
|
+
<section style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px">
|
|
132
|
+
<div style="{{s.panel}} padding: 16px 18px; gap: 8px">
|
|
133
|
+
<span style="font-size: 13px; font-weight: 600">The rule</span>
|
|
134
|
+
<sc-for list="{{rules}}" as="r" hint-placeholder-count="5"><span style="font-size: 12px; color: #b9c6d6">{{r}}</span></sc-for>
|
|
135
|
+
</div>
|
|
136
|
+
<div style="{{s.panel}} padding: 16px 18px; gap: 8px">
|
|
137
|
+
<span style="font-size: 13px; font-weight: 600">Settled: Pane600 vs ContextChip600</span>
|
|
138
|
+
<span style="font-size: 12px; color: #b9c6d6">ContextChip600 wins. At ≤ 760 px the agent chip is its initial only, so the live counts are not in the bar. They move into the avatar’s popover, with the same button that turns the dim-untouched lens on and off, plus “Open session panel”. A violet ring on the avatar says a session is attached; a small dot shows its phase.</span>
|
|
139
|
+
<span style="font-size: 12px; color: #b9c6d6">Pane600’s floating “Claude · 4 read · 1 edited” chip at the bottom of the canvas is the older layout and is marked superseded there.</span>
|
|
140
|
+
</div>
|
|
141
|
+
</section>
|
|
142
|
+
|
|
143
|
+
</div>
|
|
144
|
+
</x-dc>
|
|
145
|
+
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1440,"height":2900}}'>
|
|
146
|
+
class Component extends DCLogic {
|
|
147
|
+
renderVals() {
|
|
148
|
+
var i = {
|
|
149
|
+
eye: 'M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12zM12 9.5a2.5 2.5 0 1 0 0 5a2.5 2.5 0 1 0 0-5',
|
|
150
|
+
pen: 'M4 20l4.2-1L19 8.2 15.8 5 5 15.8z'
|
|
151
|
+
};
|
|
152
|
+
var s = {
|
|
153
|
+
label: 'font-size:11px;font-weight:500;letter-spacing:0.06em;text-transform:uppercase;color:#6b7d94;',
|
|
154
|
+
panel: 'display:flex;flex-direction:column;border-radius:10px;border:1px solid #1b2c44;background:#0f1d31;',
|
|
155
|
+
ic: 'fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0;'
|
|
156
|
+
};
|
|
157
|
+
function hexA(h, a) { var n = parseInt(h.slice(1), 16); return 'rgba(' + (n >> 16 & 255) + ',' + (n >> 8 & 255) + ',' + (n & 255) + ',' + a + ')'; }
|
|
158
|
+
var H = { name: 'Harbor', bg: '#081524', panel: '#0f1d31', soft: '#13243b', line: '#1b2c44', line2: '#2a4566', text: '#e6eef7', textSoft: '#b9c6d6', muted: '#8ea3bd', dim: '#6b7d94', pin: '#4BBCFF', agent: '#B388FF', ok: '#2fd07f', shadow: '0 12px 40px rgba(0,0,0,0.5)' };
|
|
159
|
+
var D = { name: 'Daylight', bg: '#F6F7F9', panel: '#FFFFFF', soft: '#F2F4F7', line: '#DDE2E9', line2: '#C9D1DC', text: '#0B1726', textSoft: '#3a4a5e', muted: '#55657a', dim: '#7a8899', pin: '#1A7ABF', agent: '#7C4DDB', ok: '#1E7F51', shadow: '0 12px 40px rgba(8,21,36,0.18)' };
|
|
160
|
+
function words(c, parts) {
|
|
161
|
+
return parts.map(function (p) {
|
|
162
|
+
var st = p[0] === 'del' ? 'text-decoration:line-through;color:' + c.muted + ';background:' + c.soft + ';border-radius:3px;'
|
|
163
|
+
: p[0] === 'add' ? 'background:' + hexA(c.agent, 0.16) + ';box-shadow:inset 0 -1.5px 0 ' + c.agent + ';border-radius:3px;color:' + c.text + ';'
|
|
164
|
+
: p[0] === 'cut' ? 'color:' + c.dim + ';' : '';
|
|
165
|
+
return { t: p[1], st: st };
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
var BEFORE = [['cut', '… '], ['same', 'Interviews show SMB buyers compare on price first. '], ['del', 'Most said a $4 increase would not change their plan.'], ['same', ' Support quality came second.']];
|
|
169
|
+
var AFTER = [['cut', '… '], ['same', 'Interviews show SMB buyers compare on price first. '], ['add', 'Eight of twelve would move down a tier at $24.'], ['same', ' Support quality came second.']];
|
|
170
|
+
function receipt(c) {
|
|
171
|
+
var mini = 'display:inline-flex;align-items:center;height:22px;padding:0 8px;border:1px solid ' + c.line + ';border-radius:6px;color:' + c.text + ';font-size:11px;flex-shrink:0;white-space:nowrap;';
|
|
172
|
+
return {
|
|
173
|
+
box: 'width:290px;box-sizing:border-box;padding:12px 14px;border-radius:12px;border:1px solid ' + c.line + ';background:' + c.panel + ';box-shadow:' + c.shadow + ';display:flex;flex-direction:column;gap:6px;color:' + c.text + ';',
|
|
174
|
+
dot: 'width:7px;height:7px;border-radius:50%;background:' + c.dim + ';',
|
|
175
|
+
title: 'flex:1;font-size:12px;font-weight:600;',
|
|
176
|
+
close: 'width:22px;text-align:center;color:' + c.muted + ';font-size:14px;',
|
|
177
|
+
who: 'margin:-4px 0 0 15px;font-size:11px;color:' + c.muted + ';',
|
|
178
|
+
tiles: [{ l: 'Items', v: '3', st: 'font-size:15px;font-weight:700;color:' + c.text + ';' }, { l: 'Done', v: '3', st: 'font-size:15px;font-weight:700;color:' + c.ok + ';' }, { l: 'Held', v: '0', st: 'font-size:15px;font-weight:700;color:' + c.dim + ';' }],
|
|
179
|
+
tile: 'padding:8px 10px;border-radius:8px;border:1px solid ' + c.line + ';background:' + c.soft + ';display:flex;flex-direction:column;gap:2px;',
|
|
180
|
+
tileLabel: 'font-size:10px;color:' + c.dim + ';',
|
|
181
|
+
row: 'display:flex;flex-direction:column;gap:3px;margin-top:6px;padding-bottom:8px;border-bottom:1px solid ' + c.line + ';',
|
|
182
|
+
rowHead: 'display:flex;align-items:center;gap:6px;color:' + c.agent + ';',
|
|
183
|
+
rowName: 'flex:1;font-size:12px;font-weight:600;color:' + c.text + ';',
|
|
184
|
+
rowCount: 'font-size:11px;color:' + c.dim + ';',
|
|
185
|
+
items: 'padding-left:19px;font-size:11px;color:' + c.muted + ';',
|
|
186
|
+
edits: 'padding-left:19px;display:flex;flex-direction:column;gap:6px;font-size:11px;color:' + c.textSoft + ';',
|
|
187
|
+
line: 'display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11px;',
|
|
188
|
+
cardName: 'color:' + c.textSoft + ';',
|
|
189
|
+
change: 'color:' + c.muted + ';font-size:11px;',
|
|
190
|
+
link: 'color:' + c.agent + ';font-size:11px;flex-shrink:0;white-space:nowrap;',
|
|
191
|
+
side: 'display:flex;flex-direction:column;gap:2px;padding:6px 8px;border-radius:6px;border:1px solid ' + c.line + ';',
|
|
192
|
+
sideLabel: 'font-size:11px;font-weight:500;color:' + c.dim + ';',
|
|
193
|
+
text: 'font-size:11px;line-height:1.5;color:' + c.text + ';',
|
|
194
|
+
textLong: 'display:block;max-height:120px;overflow:hidden;font-size:11px;line-height:1.5;color:' + c.text + ';',
|
|
195
|
+
mini: mini,
|
|
196
|
+
track: 'position:relative;display:inline-block;width:32px;height:18px;border-radius:999px;background:' + c.line + ';',
|
|
197
|
+
knob: 'position:absolute;left:2px;top:2px;width:14px;height:14px;border-radius:999px;background:' + c.muted + ';',
|
|
198
|
+
before: words(c, BEFORE), after: words(c, AFTER)
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function full(c) {
|
|
202
|
+
return {
|
|
203
|
+
r: receipt(c),
|
|
204
|
+
frame: 'position:relative;height:720px;border-radius:12px;border:1px solid ' + c.line + ';overflow:hidden;background-color:' + c.bg + ';background-image:radial-gradient(' + hexA(c.muted, 0.16) + ' 1px, transparent 1.2px);background-size:24px 24px;',
|
|
205
|
+
bar: 'position:absolute;left:0;right:0;top:0;height:44px;box-sizing:border-box;display:flex;align-items:center;gap:8px;padding:0 12px;background:' + c.panel + ';border-bottom:1px solid ' + c.line + ';color:' + c.text + ';',
|
|
206
|
+
conn: 'width:7px;height:7px;border-radius:999px;background:' + c.ok + ';',
|
|
207
|
+
chip: 'display:inline-flex;align-items:center;height:26px;padding:0 10px;border-radius:999px;border:1px solid ' + hexA(c.pin, 0.35) + ';color:' + c.pin + ';font-size:12px;font-weight:500;',
|
|
208
|
+
avatar: 'width:24px;height:24px;border-radius:999px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:' + c.muted + ';background:' + c.soft + ';',
|
|
209
|
+
card: 'position:absolute;left:16px;top:70px;width:300px;box-sizing:border-box;border-radius:10px;border:1px solid ' + c.line + ';background:' + c.panel + ';overflow:hidden;color:' + c.text + ';',
|
|
210
|
+
card2: 'position:absolute;left:16px;top:240px;width:300px;box-sizing:border-box;border-radius:10px;border:1px solid ' + c.line + ';background:' + c.panel + ';overflow:hidden;color:' + c.text + ';',
|
|
211
|
+
cardBar: 'height:2.5px;background:' + c.agent + ';',
|
|
212
|
+
cardHead: 'display:flex;align-items:center;height:32px;padding:0 12px;border-bottom:1px solid ' + c.line + ';',
|
|
213
|
+
cardBody: 'padding:8px 12px 12px;font-size:12px;color:' + c.textSoft + ';',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
var fulls = [H, D].map(function (c) { var f = full(c); f.r.box = f.r.box + 'position:absolute;right:14px;top:58px;'; return f; });
|
|
217
|
+
var R = receipt(H);
|
|
218
|
+
var btnDisabled = 'display:inline-flex;align-items:center;height:22px;padding:0 8px;border:1px solid #1b2c44;border-radius:6px;color:#6b7d94;font-size:11px;white-space:nowrap;';
|
|
219
|
+
function st(name, btn, btnSt, note, why) { return { name: name, r: R, title: 'SMB is price-sensitive', change: 'rewrote the second paragraph', before: words(H, BEFORE), after: words(H, AFTER), btn: btn, btnSt: btnSt, note: note, why: why }; }
|
|
220
|
+
var states = [
|
|
221
|
+
st('Ready', 'Undo this card', R.mini, 'puts back the text from before', 'The default: the session edited the card and nothing changed since.'),
|
|
222
|
+
st('Undone', '✓ Undone', btnDisabled, 'the card shows Before again', 'After Undo the change stays open, so the person sees what came back.'),
|
|
223
|
+
st('You edited it since', 'You edited it since', btnDisabled, 'undo would lose your edit', 'Your later edit wins; Undo is not offered. Neutral, not amber: nothing needs a look.'),
|
|
224
|
+
st('On another board', 'Open its board to undo', 'display:inline-flex;align-items:center;height:22px;padding:0 8px;border:1px solid #2a4566;border-radius:6px;color:#e6eef7;font-size:11px;white-space:nowrap;', 'it is on Churn analysis', 'A button, not a dead caption: it opens the card’s board, where Undo works.')
|
|
225
|
+
];
|
|
226
|
+
var rowUndo = [
|
|
227
|
+
{ t: 'Undo', st: R.mini, d: 'all cards this session edited' },
|
|
228
|
+
{ t: '✓ Undone', st: btnDisabled, d: 'every card restored' },
|
|
229
|
+
{ t: 'Kept your edits', st: btnDisabled, d: 'cards you edited since were left alone' }
|
|
230
|
+
];
|
|
231
|
+
var long = { r: receipt(H),
|
|
232
|
+
before: words(H, [['cut', '… '], ['same', 'The 2025 study priced Pro at $19 against Competitor B at $22 and Competitor C at $25. Across twelve interviews, SMB buyers named price, onboarding time and phone support. '], ['del', 'We think a modest increase is safe because most customers are on annual plans and switching costs are high for teams above ten seats.'], ['same', ' Enterprise buyers ranked SSO and audit logs first; price came fourth. The pilot in Denmark '], ['cut', '…']]),
|
|
233
|
+
after: words(H, [['cut', '… '], ['same', 'The 2025 study priced Pro at $19 against Competitor B at $22 and Competitor C at $25. Across twelve interviews, SMB buyers named price, onboarding time and phone support. '], ['add', 'A $5 increase is risky for SMB: eight of twelve would move down a tier.'], ['same', ' Enterprise buyers ranked SSO and audit logs first; price came fourth. The pilot in Denmark '], ['cut', '…']]) };
|
|
234
|
+
function narrow(c, live) {
|
|
235
|
+
var r = receipt(c);
|
|
236
|
+
return {
|
|
237
|
+
name: live ? 'During the session — Harbor' : 'After the session — Daylight', live: live, receipt: !live, r: r, mutedC: c.muted,
|
|
238
|
+
note: live ? 'The agent is its initial at ≤ 760 px. Tapping it opens the counts and the lens switch that sit in the agent chip at wider sizes.' : 'The receipt stays the same 290 px card in the top-right corner; the stacked change needs no other layout at 600 px.',
|
|
239
|
+
frame: 'position:relative;width:600px;height:' + (live ? 300 : 640) + 'px;box-sizing:border-box;border-radius:12px;border:1px solid ' + c.line + ';overflow:hidden;background-color:' + c.bg + ';background-image:radial-gradient(' + hexA(c.muted, 0.16) + ' 1px, transparent 1.2px);background-size:24px 24px;color:' + c.text + ';',
|
|
240
|
+
bar: 'position:absolute;left:0;right:0;top:0;height:44px;box-sizing:border-box;display:flex;align-items:center;gap:8px;padding:0 8px 0 12px;background:' + c.panel + ';border-bottom:1px solid ' + c.line + ';',
|
|
241
|
+
conn: 'width:7px;height:7px;border-radius:999px;flex-shrink:0;background:' + c.ok + ';',
|
|
242
|
+
chip: 'display:inline-flex;align-items:center;height:28px;padding:0 10px;border-radius:999px;border:1px solid ' + hexA(c.pin, 0.35) + ';color:' + c.pin + ';font-size:12px;font-weight:500;flex-shrink:0;',
|
|
243
|
+
avatar: 'position:relative;width:24px;height:24px;border-radius:999px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:11px;font-weight:600;color:' + c.agent + ';background:' + hexA(c.agent, 0.16) + ';box-shadow:inset 0 0 0 1.5px ' + (live ? c.agent : hexA(c.agent, 0.4)) + ';',
|
|
244
|
+
status: live ? 'position:absolute;right:-2px;bottom:-2px;width:8px;height:8px;border-radius:999px;background:' + c.agent + ';box-shadow:0 0 0 2px ' + c.panel + ';' : 'display:none;',
|
|
245
|
+
more: 'width:28px;height:28px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:' + c.muted + ';font-size:16px;',
|
|
246
|
+
pop: 'position:absolute;right:36px;top:50px;width:240px;box-sizing:border-box;padding:12px;border-radius:12px;border:1px solid ' + c.line2 + ';background:' + c.panel + ';box-shadow:' + c.shadow + ';display:flex;flex-direction:column;gap:8px;',
|
|
247
|
+
popDot: 'width:7px;height:7px;border-radius:999px;background:' + c.agent + ';',
|
|
248
|
+
counts: 'align-self:flex-start;display:inline-flex;align-items:center;height:26px;padding:0 10px;border-radius:999px;background:' + hexA(c.agent, 0.14) + ';color:' + c.agent + ';font-size:12px;font-weight:500;',
|
|
249
|
+
track: 'position:relative;display:inline-block;width:32px;height:18px;border-radius:999px;background:' + c.agent + ';',
|
|
250
|
+
knob: 'position:absolute;right:2px;top:2px;width:14px;height:14px;border-radius:999px;background:' + c.panel + ';',
|
|
251
|
+
link: 'font-size:12px;color:' + c.agent + ';'
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
var narrows = [narrow(H, true), narrow(D, false)];
|
|
255
|
+
var rules = [
|
|
256
|
+
'1 · “See change” opens the change inside the receipt: Before above After, each an excerpt of about 1,200 characters around the first difference, “…” where cut, scrolling past 120 px.',
|
|
257
|
+
'2 · Changed words are marked: removed ones struck through and muted, added ones with a violet tint and underline — the agent wrote them.',
|
|
258
|
+
'3 · Undo this card restores the whole card to its text before the session. Its states: Undo this card · ✓ Undone · You edited it since (not offered) · Open its board to undo (a button that opens the board).',
|
|
259
|
+
'4 · One change open at a time; “Hide change” closes it. The receipt keeps its width at every size, so 600 px needs no other layout.',
|
|
260
|
+
'5 · Edited cards keep the violet title-bar line while the receipt is up.'
|
|
261
|
+
];
|
|
262
|
+
return { i: i, s: s, full: fulls, states: states, rowUndo: rowUndo, long: long, narrow: narrows, rules: rules };
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
</script>
|
|
266
|
+
</body>
|
|
267
|
+
</html>
|
package/docs/design/Uses.dc.html
CHANGED
|
@@ -11,8 +11,14 @@
|
|
|
11
11
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500;600&display=swap">
|
|
12
12
|
<style>
|
|
13
13
|
body{margin:0}
|
|
14
|
+
.r2{width:1440px;height:820px;padding:40px 48px;box-sizing:border-box;background:#081524;color:#e6eef7;font:13px/1.5 'IBM Plex Sans',system-ui,sans-serif}.r2 h1{font-size:28px;margin:0}.r2 h2{font-size:15px}.r2 p,.r2 small{color:#8ea3bd}.r2 .dialog{display:grid;grid-template-columns:220px 1fr;gap:24px;width:900px;margin:24px auto;background:#0f1d31;border:1px solid #1b2c44;border-radius:14px;padding:20px}.r2 button,.r2 select,.r2 input{font:inherit;color:inherit;background:#081524;border:1px solid #1b2c44;border-radius:6px;padding:7px 10px}.r2 aside button{display:block;width:100%;text-align:left;margin:8px 0}.r2 .selected{border-color:#e6eef7;background:#13243b}.r2 .primary{background:#4BBCFF;color:#081524;border-color:transparent;font-weight:600}.r2 .example{display:flex;align-items:center;gap:16px;padding:10px;background:#13243b;border:1px solid #1b2c44;border-radius:10px;margin:8px 0}.r2 .example span{border:1px solid #1b2c44;border-radius:6px;padding:8px}.r2 .example b{flex:1;text-align:center;font-weight:500}.r2 footer{border-top:1px solid #1b2c44;padding-top:12px}.r2 .editor{border:1px solid #1b2c44;border-radius:10px;padding:16px;background:#0f1d31}
|
|
15
|
+
.r2{height:920px}
|
|
14
16
|
</style>
|
|
15
17
|
</helmet>
|
|
18
|
+
<section class="r2"><h1>R2 · Choose then customize workspace relation presets</h1><p>Selected 2026-10-14 · local implementation, validation ongoing. Home → Relation presets; chooser is read-only, editor is separate.</p>
|
|
19
|
+
<div class="dialog"><aside><h2>Workspace relation presets</h2><button class="selected">Research</button><button>Dependencies</button><button>Decision</button><button>Flow</button><button>+ Add preset</button><small>Saved templates shared across the workspace.</small></aside><main><h2>Research · saved relations</h2><small>Read-only example</small><div class="example"><span>Example A</span><b style="color:#5FCFC0">supports ─────→</b><span>Example B</span></div><small>supports · Directed: A → B</small><div class="example"><span>Example A</span><b style="color:#E59B6B">contradicts ─────→</b><span>Example B</span></div><small>contradicts · Directed: A → B</small><div class="example"><span>Example A</span><b style="color:#8ea3bd">related ·········</b><span>Example B</span></div><small>related · Undirected: A — B</small><p>Examples explain meaning and direction, not actual board connections.</p><footer><label>Apply saved preset to board <select><option>Product metrics</option></select></label><p><button class="primary">Use on board</button> <button>Customize preset</button> <button>Delete preset</button></p><small>Copies saved vocabulary to this board only. Existing edges and other boards stay unchanged; later edits/deletion never auto-sync.</small></footer></main></div>
|
|
20
|
+
<section class="editor"><strong>Customize preset · separate editing state</strong><div style="display:flex;gap:12px;align-items:center;margin:12px 0"><label>Name <input value="Research"></label><input value="supports" aria-label="Kind"><select aria-label="Meaning ink"><option>supports</option></select><label><input type="checkbox" checked> Arrow</label><button>×</button><button>Add kind</button></div><button class="primary">Save preset</button> <button>Cancel customization</button><small style="margin-left:12px">Save changes only the template. Dirty exit: Keep editing / Discard changes. Deletion asks inline confirmation.</small></section>
|
|
21
|
+
</section>
|
|
16
22
|
<div style="width: 1440px; height: 1420px; box-sizing: border-box; padding: 48px 56px; background: #081524; color: #e6eef7; font-family: 'IBM Plex Sans', system-ui, sans-serif; font-size: 13px; line-height: 1.5; display: flex; flex-direction: column; gap: 28px">
|
|
17
23
|
|
|
18
24
|
<div>
|
|
@@ -25,7 +31,7 @@ body{margin:0}
|
|
|
25
31
|
<section style="display: flex; flex-direction: column; gap: 8px">
|
|
26
32
|
<div style="display: flex; align-items: baseline; gap: 10px"><h2 style="margin: 0; font-size: 15px; font-weight: 600">Research · evidence</h2><span style="font-size: 12px; color: #8ea3bd">Highlight: what supports or contradicts a claim</span></div>
|
|
27
33
|
<div style="{{u.canvas}}">
|
|
28
|
-
<div style="{{u.legend}}"><span style="{{u.vocab}}">
|
|
34
|
+
<div style="{{u.legend}}"><span style="{{u.vocab}}">All relations ▾</span><span style="{{u.chip}}"><span style="{{u.sw}} background: #5FCFC0"></span>supports<span style="{{u.n}}">1</span></span><span style="{{u.chip}}"><span style="{{u.sw}} background: #E59B6B"></span>contradicts<span style="{{u.n}}">1</span></span><span style="{{u.chip}}"><span style="{{u.sw}} background: #7C9CFF"></span>cites<span style="{{u.n}}">3</span></span></div>
|
|
29
35
|
<svg width="644" height="470" viewBox="0 0 644 470" style="position: absolute; left: 0; top: 0; fill: none; stroke-linecap: round">
|
|
30
36
|
<path d="M 170 180 C 170 140, 290 150, 290 112" style="stroke: #5FCFC0; stroke-width: 2"></path><path d="M 290 110 L 285.5 119 L 294.5 119 Z" style="fill: #5FCFC0"></path>
|
|
31
37
|
<path d="M 474 180 C 474 140, 354 150, 354 112" style="stroke: #E59B6B; stroke-width: 2"></path><path d="M 354 110 L 349.5 119 L 358.5 119 Z" style="fill: #E59B6B"></path>
|
|
@@ -46,7 +52,7 @@ body{margin:0}
|
|
|
46
52
|
<section style="display: flex; flex-direction: column; gap: 8px">
|
|
47
53
|
<div style="display: flex; align-items: baseline; gap: 10px"><h2 style="margin: 0; font-size: 15px; font-weight: 600">Dependency analysis</h2><span style="font-size: 12px; color: #8ea3bd">Highlight: what is affected if a node changes</span></div>
|
|
48
54
|
<div style="{{u.canvas}}">
|
|
49
|
-
<div style="{{u.legend}}"><span style="{{u.vocab}}">
|
|
55
|
+
<div style="{{u.legend}}"><span style="{{u.vocab}}">All relations ▾</span><span style="{{u.chip}}"><span style="{{u.sw}} background: #E58FB0"></span>depends on<span style="{{u.n}}">5</span></span><span style="{{u.chip}} color: #f4c542; border-color: rgba(244,197,66,0.4)"><span style="{{u.sw}} background: #f4c542"></span>cycle<span style="{{u.n}}">1</span></span><span style="font-size: 11px; color: #b9c6d6; margin-left: 4px">Change auth-token.ts → 5 affected</span></div>
|
|
50
56
|
<svg width="644" height="470" viewBox="0 0 644 470" style="position: absolute; left: 0; top: 0; fill: none; stroke-linecap: round">
|
|
51
57
|
<path d="M 105 108 C 105 150, 185 160, 185 196" style="stroke: #E58FB0; stroke-width: 2"></path><path d="M 185 198 L 180.5 189 L 189.5 189 Z" style="fill: #E58FB0"></path>
|
|
52
58
|
<path d="M 322 108 C 322 150, 440 160, 440 196" style="stroke: #E58FB0; stroke-width: 2"></path><path d="M 440 198 L 435.5 189 L 444.5 189 Z" style="fill: #E58FB0"></path>
|
|
@@ -70,7 +76,7 @@ body{margin:0}
|
|
|
70
76
|
<section style="display: flex; flex-direction: column; gap: 8px">
|
|
71
77
|
<div style="display: flex; align-items: baseline; gap: 10px"><h2 style="margin: 0; font-size: 15px; font-weight: 600">Decision tree</h2><span style="font-size: 12px; color: #8ea3bd">Highlight: the chosen path; conditions always labeled</span></div>
|
|
72
78
|
<div style="{{u.canvas}}">
|
|
73
|
-
<div style="{{u.legend}}"><span style="{{u.vocab}}">
|
|
79
|
+
<div style="{{u.legend}}"><span style="{{u.vocab}}">All relations ▾</span><span style="{{u.chip}}"><span style="{{u.sw}} background: #D5DEEA"></span>option<span style="{{u.n}}">3</span></span><span style="{{u.chip}}"><span style="{{u.sw}} background: #7C9CFF"></span>if…<span style="{{u.n}}">2</span></span><span style="{{u.chip}}"><span style="{{u.sw}} background: #3d5170"></span>rejected<span style="{{u.n}}">2</span></span></div>
|
|
74
80
|
<svg width="644" height="470" viewBox="0 0 644 470" style="position: absolute; left: 0; top: 0; fill: none; stroke-linecap: round">
|
|
75
81
|
<path d="M 322 108 C 322 150, 105 140, 105 186" style="stroke: #3d5170; stroke-width: 1.5; stroke-dasharray: 5 4"></path><path d="M 105 188 L 100.5 179 L 109.5 179 Z" style="fill: #3d5170"></path>
|
|
76
82
|
<path d="M 322 108 L 322 186" style="stroke: #D5DEEA; stroke-width: 3"></path><path d="M 322 190 L 316.5 179 L 327.5 179 Z" style="fill: #D5DEEA"></path>
|
|
@@ -92,7 +98,7 @@ body{margin:0}
|
|
|
92
98
|
<section style="display: flex; flex-direction: column; gap: 8px">
|
|
93
99
|
<div style="display: flex; align-items: baseline; gap: 10px"><h2 style="margin: 0; font-size: 15px; font-weight: 600">Agent flow</h2><span style="font-size: 12px; color: #8ea3bd">Highlight: progress — done, current, next, loop</span></div>
|
|
94
100
|
<div style="{{u.canvas}}">
|
|
95
|
-
<div style="{{u.legend}}"><span style="{{u.vocab}}">
|
|
101
|
+
<div style="{{u.legend}}"><span style="{{u.vocab}}">All relations ▾</span><span style="{{u.chip}}"><span style="{{u.sw}} background: #D5DEEA"></span>next<span style="{{u.n}}">3</span></span><span style="{{u.chip}}"><span style="{{u.sw}} background: #E59B6B"></span>if fails<span style="{{u.n}}">1</span></span><span style="{{u.chip}}"><span style="{{u.sw}} background: #8ea3bd"></span>loop<span style="{{u.n}}">1</span></span></div>
|
|
96
102
|
<svg width="644" height="470" viewBox="0 0 644 470" style="position: absolute; left: 0; top: 0; fill: none; stroke-linecap: round; stroke-linejoin: round">
|
|
97
103
|
<path d="M 152 185 L 174 185" style="stroke: #D5DEEA; stroke-width: 2"></path><path d="M 178 185 L 169 180.5 L 169 189.5 Z" style="fill: #D5DEEA"></path>
|
|
98
104
|
<path d="M 308 185 L 330 185" style="stroke: #B388FF; stroke-width: 2; stroke-dasharray: 5 4"></path><path d="M 334 185 L 325 180.5 L 325 189.5 Z" style="fill: #B388FF"></path>
|
|
@@ -119,7 +125,7 @@ body{margin:0}
|
|
|
119
125
|
|
|
120
126
|
</div>
|
|
121
127
|
</x-dc>
|
|
122
|
-
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1440,"height":
|
|
128
|
+
<script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1440,"height":2340}}'>
|
|
123
129
|
class Component extends DCLogic {
|
|
124
130
|
renderVals() {
|
|
125
131
|
var u = {
|
|
@@ -138,7 +144,7 @@ class Component extends DCLogic {
|
|
|
138
144
|
step: 'position:absolute;top:130px;width:128px;height:110px;box-sizing:border-box;overflow:hidden;padding:12px;border-radius:10px;border:1px solid #1b2c44;background:#0f1d31;box-shadow:0 1px 2px rgba(0,0,0,0.4),0 6px 20px rgba(0,0,0,0.24);font-size:12px;font-weight:600;display:flex;flex-direction:column;gap:6px;'
|
|
139
145
|
};
|
|
140
146
|
var grammar = [
|
|
141
|
-
{ t: 'Vocabulary per board', d: '
|
|
147
|
+
{ t: 'Vocabulary per board', d: 'Explicitly copy a saved Home preset or define your own kinds. The legend only filters existing relations.' },
|
|
142
148
|
{ t: 'Own ports, lanes', d: 'Links never stack; parallel ones run side by side with a count.' },
|
|
143
149
|
{ t: 'Hover = neighborhood', d: 'Everything not connected steps back; the link explains itself.' },
|
|
144
150
|
{ t: 'Reason on every link', d: 'One sentence agents write and humans read: the “why”.' },
|