pmx-canvas 0.6.5 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/.github/extensions/pmx-canvas/extension.mjs +139 -14
  2. package/CHANGELOG.md +70 -0
  3. package/Readme.md +32 -6
  4. package/dist/canvas/global.css +510 -31
  5. package/dist/canvas/index.js +92 -77
  6. package/dist/types/cli/agent.d.ts +3 -0
  7. package/dist/types/cli/commands/backup.d.ts +1 -0
  8. package/dist/types/cli/commands/boards.d.ts +1 -0
  9. package/dist/types/cli/commands/export.d.ts +1 -0
  10. package/dist/types/cli/daemon.d.ts +5 -5
  11. package/dist/types/cli/shared.d.ts +3 -1
  12. package/dist/types/client/canvas/BoardCopyDialog.d.ts +5 -0
  13. package/dist/types/client/canvas/BoardFolderDialog.d.ts +7 -0
  14. package/dist/types/client/canvas/BoardLinkDialog.d.ts +3 -0
  15. package/dist/types/client/canvas/BoardSwitcher.d.ts +8 -0
  16. package/dist/types/client/canvas/ExportDialog.d.ts +7 -0
  17. package/dist/types/client/canvas/HomeView.d.ts +9 -0
  18. package/dist/types/client/nodes/AttachmentNode.d.ts +6 -0
  19. package/dist/types/client/nodes/BoardNode.d.ts +5 -0
  20. package/dist/types/client/state/boards-store.d.ts +79 -0
  21. package/dist/types/client/state/canvas-store.d.ts +2 -0
  22. package/dist/types/client/state/intent-bridge.d.ts +1 -0
  23. package/dist/types/client/state/session-store.d.ts +7 -0
  24. package/dist/types/client/types.d.ts +2 -2
  25. package/dist/types/json-render/catalog.d.ts +1 -1
  26. package/dist/types/json-render/charts/definitions.d.ts +1 -1
  27. package/dist/types/json-render/server.d.ts +6 -0
  28. package/dist/types/mcp/canvas-access.d.ts +10 -3
  29. package/dist/types/mcp/context-uri-template.d.ts +6 -0
  30. package/dist/types/server/agent-presence.d.ts +1 -1
  31. package/dist/types/server/attribution.d.ts +11 -0
  32. package/dist/types/server/ax-context.d.ts +3 -1
  33. package/dist/types/server/ax-interaction.d.ts +2 -2
  34. package/dist/types/server/ax-state.d.ts +13 -3
  35. package/dist/types/server/backup.d.ts +36 -0
  36. package/dist/types/server/board-export.d.ts +45 -0
  37. package/dist/types/server/canvas-db.d.ts +63 -9
  38. package/dist/types/server/canvas-operations.d.ts +23 -0
  39. package/dist/types/server/canvas-provenance.d.ts +1 -1
  40. package/dist/types/server/canvas-state.d.ts +140 -3
  41. package/dist/types/server/context-brief.d.ts +111 -0
  42. package/dist/types/server/context-reads.d.ts +55 -0
  43. package/dist/types/server/document-import.d.ts +66 -0
  44. package/dist/types/server/index.d.ts +103 -4
  45. package/dist/types/server/mutation-history.d.ts +1 -0
  46. package/dist/types/server/operations/invoker.d.ts +2 -0
  47. package/dist/types/server/operations/mcp.d.ts +7 -1
  48. package/dist/types/server/operations/ops/ax-shared.d.ts +2 -2
  49. package/dist/types/server/operations/ops/backup.d.ts +2 -0
  50. package/dist/types/server/operations/ops/boards.d.ts +10 -0
  51. package/dist/types/server/operations/ops/export.d.ts +2 -0
  52. package/dist/types/server/operations/ops/imports.d.ts +2 -0
  53. package/dist/types/server/operations/ops/nodes.d.ts +1 -1
  54. package/dist/types/server/operations/ops/query.d.ts +2 -0
  55. package/dist/types/server/operations/registry.d.ts +9 -1
  56. package/dist/types/server/operations/types.d.ts +1 -1
  57. package/dist/types/server/server.d.ts +1 -0
  58. package/dist/types/server/trace-manager.d.ts +7 -0
  59. package/dist/types/server/webpage-node.d.ts +22 -1
  60. package/dist/types/server/workbench-auth.d.ts +3 -0
  61. package/dist/types/shared/boards.d.ts +6 -0
  62. package/docs/RELEASE.md +5 -0
  63. package/docs/cli.md +73 -0
  64. package/docs/http-api.md +198 -2
  65. package/docs/mcp.md +71 -6
  66. package/docs/node-types.md +26 -0
  67. package/docs/plans/plan-010-attributed-ask-answers.md +39 -0
  68. package/docs/plans/plan-011-context-read-instrumentation.md +54 -0
  69. package/docs/plans/plan-012-many-boards-stage-1.md +98 -0
  70. package/docs/plans/plan-013-static-board-export.md +47 -0
  71. package/docs/plans/plan-014-connected-board-memory.md +140 -0
  72. package/docs/product-vision-2026-09.md +118 -18
  73. package/docs/sdk.md +50 -0
  74. package/package.json +1 -1
  75. package/skills/pmx-canvas/SKILL.md +68 -11
  76. package/skills/pmx-canvas/evals/evals.json +130 -0
  77. package/skills/pmx-canvas/references/full-reference.md +43 -7
  78. package/skills/pmx-canvas/references/github-copilot-app-adapter.md +3 -0
  79. package/skills/pmx-canvas/references/installing-pmx-canvas.md +4 -4
  80. package/skills/pmx-canvas/references/tours-and-recording.md +69 -0
  81. package/skills/pmx-canvas-orchestration/SKILL.md +5 -0
  82. package/skills/pmx-canvas-testing/SKILL.md +11 -2
  83. package/src/cli/agent.ts +4 -0
  84. package/src/cli/commands/apps.ts +1 -1
  85. package/src/cli/commands/ax.ts +13 -0
  86. package/src/cli/commands/backup.ts +66 -0
  87. package/src/cli/commands/boards.ts +71 -0
  88. package/src/cli/commands/export.ts +37 -0
  89. package/src/cli/commands/nodes.ts +4 -1
  90. package/src/cli/commands/pins.ts +6 -2
  91. package/src/cli/commands/pump.ts +3 -0
  92. package/src/cli/commands/query.ts +33 -7
  93. package/src/cli/commands/view.ts +7 -5
  94. package/src/cli/daemon.ts +37 -7
  95. package/src/cli/index.ts +19 -9
  96. package/src/cli/shared.ts +11 -2
  97. package/src/client/App.tsx +21 -4
  98. package/src/client/canvas/AttentionToast.tsx +5 -3
  99. package/src/client/canvas/BoardCopyDialog.tsx +153 -0
  100. package/src/client/canvas/BoardFolderDialog.tsx +120 -0
  101. package/src/client/canvas/BoardLinkDialog.tsx +93 -0
  102. package/src/client/canvas/BoardSwitcher.tsx +149 -0
  103. package/src/client/canvas/CanvasNode.tsx +0 -1
  104. package/src/client/canvas/CanvasViewport.tsx +3 -0
  105. package/src/client/canvas/CommandPalette.tsx +107 -4
  106. package/src/client/canvas/ContextMenu.tsx +4 -1
  107. package/src/client/canvas/ExpandedNodeOverlay.tsx +3 -0
  108. package/src/client/canvas/ExportDialog.tsx +199 -0
  109. package/src/client/canvas/HomeView.tsx +277 -0
  110. package/src/client/canvas/Presentation.tsx +39 -9
  111. package/src/client/canvas/SelectionBar.tsx +0 -2
  112. package/src/client/canvas/SessionPanel.tsx +28 -1
  113. package/src/client/canvas/ToolRail.tsx +38 -3
  114. package/src/client/canvas/TopBar.tsx +34 -18
  115. package/src/client/canvas/import-files.ts +19 -1
  116. package/src/client/canvas/kind-colors.ts +1 -0
  117. package/src/client/icons.tsx +2 -0
  118. package/src/client/nodes/AttachmentNode.tsx +145 -0
  119. package/src/client/nodes/BoardNode.tsx +35 -0
  120. package/src/client/nodes/FileNode.tsx +6 -0
  121. package/src/client/nodes/MarkdownNode.tsx +47 -19
  122. package/src/client/nodes/ax-node-actions.ts +2 -5
  123. package/src/client/nodes/use-ax-surface-bridge.ts +1 -1
  124. package/src/client/state/attention-bridge.ts +3 -1
  125. package/src/client/state/boards-store.ts +167 -0
  126. package/src/client/state/canvas-store.ts +22 -0
  127. package/src/client/state/intent-bridge.ts +30 -2
  128. package/src/client/state/node-factory.ts +1 -0
  129. package/src/client/state/session-store.ts +5 -0
  130. package/src/client/state/sse-bridge.ts +52 -6
  131. package/src/client/theme/global.css +510 -31
  132. package/src/client/types.ts +2 -0
  133. package/src/json-render/server.ts +16 -9
  134. package/src/mcp/canvas-access.ts +59 -22
  135. package/src/mcp/context-uri-template.ts +28 -0
  136. package/src/mcp/server.ts +122 -15
  137. package/src/server/agent-context.ts +116 -29
  138. package/src/server/attribution.ts +29 -0
  139. package/src/server/ax-context.ts +4 -2
  140. package/src/server/ax-interaction.ts +1 -0
  141. package/src/server/ax-state-manager.ts +72 -3
  142. package/src/server/ax-state.ts +41 -0
  143. package/src/server/backup.ts +178 -0
  144. package/src/server/board-export.ts +686 -0
  145. package/src/server/canvas-db.ts +599 -107
  146. package/src/server/canvas-operations.ts +68 -9
  147. package/src/server/canvas-provenance.ts +1 -0
  148. package/src/server/canvas-schema.ts +12 -0
  149. package/src/server/canvas-state.ts +774 -45
  150. package/src/server/context-brief.ts +372 -0
  151. package/src/server/context-reads.ts +238 -0
  152. package/src/server/demo-state.json +659 -2
  153. package/src/server/document-import.ts +223 -0
  154. package/src/server/index.ts +231 -5
  155. package/src/server/mutation-history.ts +10 -13
  156. package/src/server/operations/composites.ts +26 -4
  157. package/src/server/operations/http.ts +9 -3
  158. package/src/server/operations/index.ts +8 -0
  159. package/src/server/operations/invoker.ts +14 -3
  160. package/src/server/operations/mcp.ts +50 -11
  161. package/src/server/operations/ops/app.ts +5 -0
  162. package/src/server/operations/ops/ax-read.ts +10 -6
  163. package/src/server/operations/ops/ax-timeline.ts +75 -0
  164. package/src/server/operations/ops/backup.ts +134 -0
  165. package/src/server/operations/ops/batch.ts +8 -1
  166. package/src/server/operations/ops/boards.ts +351 -0
  167. package/src/server/operations/ops/export.ts +74 -0
  168. package/src/server/operations/ops/ext-app.ts +4 -0
  169. package/src/server/operations/ops/imports.ts +236 -0
  170. package/src/server/operations/ops/nodes.ts +57 -5
  171. package/src/server/operations/ops/query.ts +206 -9
  172. package/src/server/operations/registry.ts +123 -31
  173. package/src/server/operations/types.ts +1 -1
  174. package/src/server/server.ts +146 -2
  175. package/src/server/spatial-analysis.ts +9 -17
  176. package/src/server/trace-manager.ts +19 -0
  177. package/src/server/web-artifacts.ts +2 -1
  178. package/src/server/webpage-node.ts +173 -13
  179. package/src/server/workbench-auth.ts +11 -0
  180. package/src/shared/boards.ts +18 -0
  181. package/src/shared/node-sizes.ts +1 -0
@@ -60,6 +60,26 @@
60
60
  --hud-bar-height: 44px;
61
61
  }
62
62
 
63
+ .board-node, .md-card-preview { display: flex; flex-direction: column; height: 100%; min-height: 0; }
64
+ .board-node-content { flex: 1; min-height: 0; overflow: auto; padding: 16px; overflow-wrap: anywhere; }
65
+ .board-node-label { color: var(--c-dim); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .1em; margin-bottom: 8px; }
66
+ .board-node-title { display: block; font-size: 17px; line-height: 1.35; margin-bottom: 6px; }
67
+ .board-node-meta { color: var(--c-dim); font-size: 11px; line-height: 1.5; }
68
+ .board-node-summary { color: var(--c-text-soft); font-size: 13px; line-height: 1.6; margin: 14px 0; }
69
+ .board-node-open { display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; width: 100%; padding: 10px 16px; border: 0; border-top: 1px solid var(--c-line); background: var(--c-panel); color: var(--c-accent); font: 500 12px var(--font); text-align: left; cursor: pointer; }
70
+ .board-node-open:hover:not(:disabled) { background: var(--c-accent-8); }
71
+ .board-node-open:disabled { color: var(--c-dim); cursor: default; }
72
+ .md-card-content { flex: 1; min-height: 0; overflow: auto; }
73
+ .md-card-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; border-top: 1px solid var(--c-line); padding: 6px 36px 6px 8px; background: var(--c-panel); }
74
+ .md-card-actions button { border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--c-dim); padding: 4px 8px; font: 500 11px var(--font); cursor: pointer; }
75
+ .md-card-actions button:hover { color: var(--c-text); background: var(--c-accent-8); }
76
+ .md-card-actions .md-readme-btn[aria-pressed="true"] { color: var(--c-accent); background: var(--c-accent-8); border-color: var(--c-accent-25); }
77
+ .md-card-edit { margin-left: auto; }
78
+ .board-node-open:focus-visible, .md-card-actions button:focus-visible { outline: 2px solid var(--c-accent); outline-offset: -2px; }
79
+ .canvas-node[data-node-type="markdown"] .node-body,
80
+ .canvas-node[data-node-type="board"] .node-body { padding: 0; }
81
+ .md-card-content { padding: 10px 14px; }
82
+
63
83
  :root[data-theme="light"] {
64
84
  /* ── Core palette (light · paper + ink) ──────────────────── */
65
85
  --c-bg: #F4EFE6;
@@ -1251,7 +1271,7 @@ body,
1251
1271
  }
1252
1272
 
1253
1273
  .agent-chip-end:hover {
1254
- color: var(--c-danger, #ef4444);
1274
+ color: var(--c-danger);
1255
1275
  background: color-mix(in srgb, currentColor 12%, transparent);
1256
1276
  }
1257
1277
 
@@ -3317,29 +3337,6 @@ body,
3317
3337
  }
3318
3338
 
3319
3339
  /* Raw markdown source editor */
3320
- .md-edit-btn {
3321
- position: absolute;
3322
- top: 4px;
3323
- right: 4px;
3324
- padding: 3px 8px;
3325
- font-size: 10px;
3326
- background: var(--c-panel);
3327
- border: 1px solid var(--c-line);
3328
- border-radius: 4px;
3329
- color: var(--c-text-soft);
3330
- cursor: pointer;
3331
- opacity: 0;
3332
- transition: opacity 0.12s ease;
3333
- }
3334
- .canvas-node:hover .md-edit-btn,
3335
- .md-edit-btn:focus-visible {
3336
- opacity: 1;
3337
- }
3338
- .md-edit-btn:hover {
3339
- color: var(--c-text);
3340
- border-color: var(--c-accent-25);
3341
- }
3342
-
3343
3340
  .md-editor-split {
3344
3341
  display: flex;
3345
3342
  height: 100%;
@@ -4787,7 +4784,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4787
4784
  position: absolute;
4788
4785
  top: 18px;
4789
4786
  right: 18px;
4790
- max-width: min(260px, calc(100% - 24px));
4787
+ max-width: min(360px, calc(100% - 36px));
4791
4788
  display: inline-flex;
4792
4789
  align-items: center;
4793
4790
  gap: 8px;
@@ -4795,7 +4792,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4795
4792
  background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
4796
4793
  backdrop-filter: blur(14px);
4797
4794
  border: 1px solid color-mix(in srgb, var(--c-line) 76%, var(--c-warn) 24%);
4798
- border-radius: 999px;
4795
+ border-radius: 12px;
4799
4796
  box-shadow: 0 8px 22px var(--c-shadow);
4800
4797
  color: var(--c-text);
4801
4798
  font: inherit;
@@ -4834,15 +4831,27 @@ html.is-node-resizing .ext-app-preview-catcher {
4834
4831
  box-shadow: 0 0 0 2px color-mix(in srgb, currentColor 28%, transparent);
4835
4832
  }
4836
4833
 
4834
+ .attention-toast-copy {
4835
+ display: grid;
4836
+ gap: 4px;
4837
+ min-width: 0;
4838
+ text-align: left;
4839
+ overflow-wrap: anywhere;
4840
+ }
4841
+
4842
+ .attention-toast-detail {
4843
+ color: var(--c-text-soft);
4844
+ font-size: 12px;
4845
+ line-height: 1.45;
4846
+ max-height: 9em;
4847
+ overflow: auto;
4848
+ }
4849
+
4837
4850
  .attention-toast-title {
4838
4851
  font-size: 12px;
4839
4852
  font-weight: 600;
4840
4853
  line-height: 1.2;
4841
4854
  letter-spacing: -0.005em;
4842
- white-space: nowrap;
4843
- overflow: hidden;
4844
- text-overflow: ellipsis;
4845
- max-width: 200px;
4846
4855
  }
4847
4856
 
4848
4857
  .attention-history {
@@ -6844,12 +6853,23 @@ html.is-node-dragging .intent-line-layer {
6844
6853
  padding: 4px 12px;
6845
6854
  cursor: pointer;
6846
6855
  }
6847
- .is-presenting > :not(.app-main):not(.presentation-error),
6856
+ .is-presenting > :not(.app-main):not(.presentation-error):not(.presentation-navigation),
6848
6857
  .is-presenting .app-main > :not(.canvas-region),
6849
6858
  .is-presenting .canvas-region > :not(.canvas-viewport) {
6850
6859
  display: none !important;
6851
6860
  }
6852
6861
  .is-presenting .canvas-viewport { pointer-events: none; }
6862
+ .presentation-navigation {
6863
+ position: fixed;
6864
+ inset: 0;
6865
+ z-index: 99;
6866
+ }
6867
+ .presentation-exit {
6868
+ position: absolute;
6869
+ top: 16px;
6870
+ right: 16px;
6871
+ box-shadow: 0 2px 12px var(--c-shadow);
6872
+ }
6853
6873
  .presentation-error {
6854
6874
  position: fixed;
6855
6875
  bottom: 16px;
@@ -6862,3 +6882,462 @@ html.is-node-dragging .intent-line-layer {
6862
6882
  background: var(--c-panel);
6863
6883
  color: var(--c-text);
6864
6884
  }
6885
+
6886
+ /* ── Many boards (plan 012): top-bar switcher + Home ── */
6887
+ .board-switcher {
6888
+ display: inline-flex;
6889
+ /* The board name is the bar's identity: it keeps room for a short name
6890
+ ("Home") when chips crowd a 600px pane; long names still ellipsize. */
6891
+ min-width: 88px;
6892
+ flex-shrink: 1;
6893
+ }
6894
+ .board-switcher-button {
6895
+ display: inline-flex;
6896
+ align-items: center;
6897
+ gap: 6px;
6898
+ max-width: 280px;
6899
+ padding: 4px 8px;
6900
+ margin-left: -8px;
6901
+ background: none;
6902
+ border: 1px solid transparent;
6903
+ border-radius: 8px;
6904
+ cursor: pointer;
6905
+ }
6906
+ .board-switcher-button:hover,
6907
+ .board-switcher-button[aria-expanded='true'] {
6908
+ border-color: var(--c-line);
6909
+ background: var(--c-panel);
6910
+ }
6911
+ .board-switcher-name {
6912
+ overflow: hidden;
6913
+ text-overflow: ellipsis;
6914
+ white-space: nowrap;
6915
+ }
6916
+ .board-switcher-caret {
6917
+ font-size: 10px;
6918
+ color: var(--c-text-soft);
6919
+ }
6920
+ .board-switcher-menu {
6921
+ width: min(340px, calc(100vw - 24px));
6922
+ min-width: 0;
6923
+ padding: 8px;
6924
+ background: var(--c-panel);
6925
+ backdrop-filter: none;
6926
+ overflow: hidden;
6927
+ }
6928
+ .board-switcher-heading {
6929
+ padding: 8px 10px 10px;
6930
+ font-size: 11px;
6931
+ font-weight: 600;
6932
+ color: var(--c-dim);
6933
+ text-transform: uppercase;
6934
+ letter-spacing: 0.08em;
6935
+ flex-shrink: 0;
6936
+ }
6937
+ .board-switcher-recents { min-height: 0; overflow-y: auto; }
6938
+ .board-switcher-menu .toolbar-menu-item { padding: 10px; gap: 12px; }
6939
+ .board-switcher-menu .toolbar-menu-item:hover,
6940
+ .board-switcher-menu .toolbar-menu-item:focus-visible {
6941
+ background: var(--c-accent-8);
6942
+ border-color: var(--c-accent-25);
6943
+ outline: none;
6944
+ }
6945
+ .board-switcher-icon { display: flex; align-items: center; justify-content: center; width: 20px; flex-shrink: 0; color: var(--c-accent); font-size: 22px; }
6946
+ .board-switcher-item-copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
6947
+ .board-switcher-item-name {
6948
+ color: var(--c-text);
6949
+ font-weight: 500;
6950
+ line-height: 1.35;
6951
+ overflow-wrap: anywhere;
6952
+ text-align: left;
6953
+ }
6954
+ .board-switcher-item-folder { font-size: 11px; line-height: 1.4; color: var(--c-dim); overflow-wrap: anywhere; }
6955
+ .board-switcher-item-meta {
6956
+ font-size: 10px;
6957
+ color: var(--c-dim);
6958
+ white-space: nowrap;
6959
+ align-self: flex-start;
6960
+ padding-top: 2px;
6961
+ }
6962
+ .board-switcher-actions { border-top: 1px solid var(--c-line); margin-top: 6px; padding-top: 6px; flex-shrink: 0; }
6963
+
6964
+ .home-view {
6965
+ position: absolute;
6966
+ inset: 0;
6967
+ /* Above the canvas's floating chrome (the updates tab sits at 60), below menus and prompts. */
6968
+ z-index: 70;
6969
+ overflow-y: auto;
6970
+ background: var(--c-bg);
6971
+ padding: 32px 16px;
6972
+ }
6973
+ .home-view-inner {
6974
+ max-width: 720px;
6975
+ margin: 0 auto;
6976
+ display: flex;
6977
+ flex-direction: column;
6978
+ gap: 18px;
6979
+ }
6980
+ .home-view-head {
6981
+ display: flex;
6982
+ align-items: center;
6983
+ justify-content: space-between;
6984
+ gap: 12px;
6985
+ }
6986
+ .home-view-title {
6987
+ margin: 0;
6988
+ font-size: 20px;
6989
+ font-weight: 650;
6990
+ color: var(--c-text);
6991
+ }
6992
+ .home-view-new {
6993
+ padding: 7px 14px;
6994
+ border-radius: 8px;
6995
+ border: 1px solid var(--c-accent);
6996
+ background: var(--c-accent);
6997
+ color: var(--c-bg);
6998
+ font-weight: 600;
6999
+ cursor: pointer;
7000
+ }
7001
+ .home-view-empty {
7002
+ color: var(--c-text-soft);
7003
+ font-size: 13px;
7004
+ }
7005
+ .home-view-list {
7006
+ list-style: none;
7007
+ margin: 0;
7008
+ padding: 0;
7009
+ display: flex;
7010
+ flex-direction: column;
7011
+ gap: 7px;
7012
+ }
7013
+ .home-board {
7014
+ display: flex;
7015
+ align-items: center;
7016
+ gap: 8px;
7017
+ padding: 7px 8px 7px 5px;
7018
+ border: 1px solid var(--c-line);
7019
+ border-radius: 10px;
7020
+ background: var(--c-panel);
7021
+ }
7022
+ .home-board.is-confirming {
7023
+ border-color: var(--c-danger);
7024
+ padding: 10px 12px;
7025
+ flex-wrap: wrap;
7026
+ }
7027
+ .home-board-open {
7028
+ flex: 1;
7029
+ min-width: 0;
7030
+ display: flex;
7031
+ flex-direction: column;
7032
+ align-items: flex-start;
7033
+ gap: 2px;
7034
+ padding: 6px 8px;
7035
+ background: none;
7036
+ border: none;
7037
+ border-radius: 8px;
7038
+ color: var(--c-text);
7039
+ cursor: pointer;
7040
+ text-align: left;
7041
+ }
7042
+ .home-board-open:hover {
7043
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
7044
+ }
7045
+ .home-board-name {
7046
+ max-width: 100%;
7047
+ font-size: 14px;
7048
+ font-weight: 600;
7049
+ overflow: hidden;
7050
+ text-overflow: ellipsis;
7051
+ white-space: nowrap;
7052
+ }
7053
+ .home-board-meta {
7054
+ font: 11px var(--mono);
7055
+ color: var(--c-text-soft);
7056
+ }
7057
+ .home-board-confirm-text {
7058
+ flex: 1 1 240px;
7059
+ font-size: 13px;
7060
+ color: var(--c-text);
7061
+ }
7062
+ .home-board-actions {
7063
+ display: flex;
7064
+ gap: 2px;
7065
+ flex-shrink: 0;
7066
+ }
7067
+ .home-board-action {
7068
+ padding: 6px 7px;
7069
+ border-radius: 6px;
7070
+ border: 1px solid transparent;
7071
+ background: none;
7072
+ color: var(--c-dim);
7073
+ font-size: 11px;
7074
+ cursor: pointer;
7075
+ }
7076
+ .home-board-action:hover {
7077
+ border-color: var(--c-line);
7078
+ background: color-mix(in srgb, var(--c-text) 5%, transparent);
7079
+ color: var(--c-text-soft);
7080
+ }
7081
+ .home-board-action.is-danger {
7082
+ border-color: var(--c-danger);
7083
+ background: var(--c-danger);
7084
+ color: var(--c-bg);
7085
+ font-weight: 600;
7086
+ }
7087
+ .home-board-open:focus-visible,
7088
+ .home-board-action:focus-visible,
7089
+ .home-view-new:focus-visible,
7090
+ .board-switcher-button:focus-visible {
7091
+ outline: 2px solid var(--c-accent);
7092
+ outline-offset: 2px;
7093
+ }
7094
+
7095
+ /* ── Board export dialog (plan 013) ── */
7096
+ .export-dialog {
7097
+ width: min(520px, calc(100% - 32px));
7098
+ }
7099
+ .export-dialog-note {
7100
+ font-size: 12px;
7101
+ color: var(--c-text-soft);
7102
+ }
7103
+ .export-dialog-list {
7104
+ margin: 0;
7105
+ padding-left: 18px;
7106
+ font-size: 13px;
7107
+ color: var(--c-text);
7108
+ display: flex;
7109
+ flex-direction: column;
7110
+ gap: 4px;
7111
+ }
7112
+ .export-dialog-files {
7113
+ display: flex;
7114
+ gap: 8px;
7115
+ align-items: flex-start;
7116
+ font-size: 12px;
7117
+ color: var(--c-text);
7118
+ word-break: break-all;
7119
+ }
7120
+ .export-dialog-result {
7121
+ font-size: 12px;
7122
+ color: var(--c-text);
7123
+ display: flex;
7124
+ flex-direction: column;
7125
+ gap: 6px;
7126
+ word-break: break-all;
7127
+ }
7128
+ .export-dialog-links {
7129
+ display: flex;
7130
+ flex-wrap: wrap;
7131
+ gap: 12px;
7132
+ margin-top: 12px;
7133
+ }
7134
+ .export-dialog-links a {
7135
+ display: inline-flex;
7136
+ align-items: center;
7137
+ justify-content: center;
7138
+ box-sizing: border-box;
7139
+ text-decoration: none;
7140
+ word-break: normal;
7141
+ }
7142
+
7143
+ /* ── Home categories ── */
7144
+ .home-section {
7145
+ display: flex;
7146
+ flex-direction: column;
7147
+ gap: 8px;
7148
+ }
7149
+ .home-section-head {
7150
+ display: flex;
7151
+ align-items: center;
7152
+ gap: 9px;
7153
+ min-height: 42px;
7154
+ width: 100%;
7155
+ padding: 9px 10px;
7156
+ background: none;
7157
+ border: none;
7158
+ border-radius: 8px;
7159
+ color: var(--c-text-soft);
7160
+ font-size: 12px;
7161
+ font-weight: 600;
7162
+ text-transform: uppercase;
7163
+ letter-spacing: 0.06em;
7164
+ cursor: pointer;
7165
+ text-align: left;
7166
+ }
7167
+ .home-section-head:hover {
7168
+ color: var(--c-text);
7169
+ background: color-mix(in srgb, var(--c-text) 5%, transparent);
7170
+ }
7171
+ .home-section-chevron,
7172
+ .home-section-folder {
7173
+ flex: 0 0 18px;
7174
+ stroke: currentColor;
7175
+ stroke-width: 1.75;
7176
+ stroke-linecap: round;
7177
+ stroke-linejoin: round;
7178
+ }
7179
+ .home-section-chevron {
7180
+ transition: transform 120ms ease;
7181
+ }
7182
+ .home-section-head[aria-expanded='true'] .home-section-chevron {
7183
+ transform: rotate(90deg);
7184
+ }
7185
+ .home-section-folder { color: var(--c-dim); }
7186
+ .home-section-count {
7187
+ font: 11px var(--mono);
7188
+ text-transform: none;
7189
+ color: var(--c-dim);
7190
+ margin-left: auto;
7191
+ }
7192
+ .home-section-head:focus-visible {
7193
+ outline: 2px solid var(--c-accent);
7194
+ outline-offset: 2px;
7195
+ }
7196
+ .home-section-head {
7197
+ text-transform: none;
7198
+ letter-spacing: normal;
7199
+ max-width: 100%;
7200
+ }
7201
+ .home-section-name {
7202
+ font-size: 13px;
7203
+ font-weight: 650;
7204
+ overflow-wrap: anywhere;
7205
+ }
7206
+ .home-folder-children {
7207
+ display: flex;
7208
+ flex-direction: column;
7209
+ gap: 10px;
7210
+ padding-left: 12px;
7211
+ border-left: 1px solid var(--c-line);
7212
+ }
7213
+ .home-search { width: 100%; box-sizing: border-box; }
7214
+ .board-copy-dialog,
7215
+ .board-link-dialog {
7216
+ width: min(540px, calc(100vw - 32px));
7217
+ max-height: calc(100dvh - 40px);
7218
+ overflow-y: auto;
7219
+ box-sizing: border-box;
7220
+ }
7221
+ .board-copy-dialog form,
7222
+ .board-copy-field,
7223
+ .board-copy-options {
7224
+ display: flex;
7225
+ flex-direction: column;
7226
+ gap: 8px;
7227
+ }
7228
+ .board-copy-dialog h2,
7229
+ .board-link-dialog h2 { margin: 0 0 12px; font-size: 17px; }
7230
+ .board-copy-field { color: var(--c-text-soft); font-size: 12px; }
7231
+ .board-copy-cards {
7232
+ margin: 14px 0;
7233
+ padding: 8px;
7234
+ border: 1px solid var(--c-line);
7235
+ border-radius: 9px;
7236
+ max-height: 230px;
7237
+ overflow-y: auto;
7238
+ }
7239
+ .board-copy-cards legend { color: var(--c-text-soft); font-size: 12px; }
7240
+ .board-copy-card {
7241
+ display: flex;
7242
+ align-items: center;
7243
+ gap: 9px;
7244
+ padding: 8px;
7245
+ border-radius: 7px;
7246
+ cursor: pointer;
7247
+ }
7248
+ .board-copy-card:hover { background: color-mix(in srgb, var(--c-accent) 9%, transparent); }
7249
+ .board-copy-card span { display: flex; flex-direction: column; min-width: 0; }
7250
+ .board-copy-card strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
7251
+ .board-copy-card small,
7252
+ .board-link-results small { color: var(--c-text-soft); font: 11px var(--mono); }
7253
+ .board-copy-options { font-size: 13px; }
7254
+ .board-copy-options label { display: flex; gap: 8px; align-items: center; }
7255
+ .board-copy-note,
7256
+ .board-copy-status { color: var(--c-text-soft); font-size: 12px; line-height: 1.5; }
7257
+ .board-copy-error { color: var(--c-danger); font-size: 12px; margin-top: 8px; }
7258
+ .board-link-results { display: flex; flex-direction: column; gap: 5px; margin: 12px 0; padding: 0; max-height: 320px; overflow-y: auto; list-style: none; }
7259
+ .board-link-results button { width: 100%; display: flex; justify-content: space-between; gap: 12px; padding: 10px; border: 1px solid var(--c-line); border-radius: 8px; background: var(--c-panel); color: var(--c-text); text-align: left; cursor: pointer; }
7260
+ .board-link-results button:hover,
7261
+ .board-link-results button:focus-visible { border-color: var(--c-accent); outline: none; }
7262
+ .home-folder-dialog {
7263
+ width: min(460px, calc(100vw - 32px));
7264
+ max-height: calc(100dvh - 48px);
7265
+ overflow-y: auto;
7266
+ box-sizing: border-box;
7267
+ }
7268
+ .home-folder-hint {
7269
+ color: var(--c-text-soft);
7270
+ font-size: 12px;
7271
+ line-height: 1.5;
7272
+ overflow-wrap: anywhere;
7273
+ }
7274
+ .home-folder-options {
7275
+ margin: 12px 0;
7276
+ padding: 8px;
7277
+ border: 1px solid var(--c-line);
7278
+ border-radius: 8px;
7279
+ max-height: 240px;
7280
+ overflow-y: auto;
7281
+ }
7282
+ .home-folder-options legend { color: var(--c-text-soft); font-size: 12px; }
7283
+ .home-folder-option {
7284
+ display: flex;
7285
+ align-items: center;
7286
+ gap: 8px;
7287
+ padding: 8px;
7288
+ border-radius: 6px;
7289
+ font-size: 13px;
7290
+ overflow-wrap: anywhere;
7291
+ cursor: pointer;
7292
+ }
7293
+ .home-folder-option:has(input:checked) { background: color-mix(in srgb, var(--c-accent) 12%, transparent); }
7294
+ .home-folder-option input { accent-color: var(--c-accent); flex-shrink: 0; }
7295
+ .home-folder-new { display: flex; flex-direction: column; gap: 6px; font-size: 12px; overflow-wrap: anywhere; }
7296
+ .attachment-node { padding: 16px; display: flex; flex-direction: column; align-items: flex-start; gap: 10px; font-size: 13px; overflow: auto; height: 100%; box-sizing: border-box; }
7297
+ .attachment-node p { margin: 0; color: var(--c-text-soft); line-height: 1.5; }
7298
+ .attachment-node a, .md-import-source a { color: var(--c-accent); }
7299
+ .attachment-status { font-weight: 600; }
7300
+ .attachment-button,
7301
+ .presentation-exit,
7302
+ .export-dialog-links a {
7303
+ min-height: 38px;
7304
+ padding: 8px 14px;
7305
+ border: 1px solid var(--c-text-soft);
7306
+ border-radius: 8px;
7307
+ background: var(--c-panel);
7308
+ color: var(--c-text);
7309
+ font: inherit;
7310
+ font-weight: 600;
7311
+ cursor: pointer;
7312
+ }
7313
+ .attachment-button.is-primary,
7314
+ .export-dialog-links a.is-primary { background: var(--c-accent); border-color: var(--c-accent); color: var(--c-bg); }
7315
+ .attachment-button:hover:not(:disabled),
7316
+ .presentation-exit:hover,
7317
+ .export-dialog-links a:hover { filter: brightness(1.12); }
7318
+ .attachment-button:focus-visible,
7319
+ .presentation-exit:focus-visible,
7320
+ .export-dialog-links a:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 3px; }
7321
+ .attachment-button:disabled { opacity: 0.5; cursor: default; }
7322
+ .attachment-review { width: 100%; border-top: 1px solid var(--c-line); padding-top: 12px; }
7323
+ .attachment-review-actions {
7324
+ position: sticky;
7325
+ bottom: -16px;
7326
+ display: flex;
7327
+ flex-wrap: wrap;
7328
+ justify-content: flex-end;
7329
+ gap: 12px;
7330
+ margin-top: 24px;
7331
+ padding: 16px 0;
7332
+ border-top: 1px solid var(--c-line);
7333
+ background: var(--c-panel);
7334
+ z-index: 1;
7335
+ }
7336
+ .attachment-review pre { white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.6 var(--mono); padding: 12px; background: var(--c-bg); border-radius: 8px; }
7337
+ .attachment-review h4 { margin-bottom: 6px; }
7338
+ .md-import-source { padding: 6px 12px; font-size: 11px; overflow-wrap: anywhere; color: var(--c-text-soft); border-top: 1px solid var(--c-line); }
7339
+ @media (max-width: 640px) {
7340
+ .home-board { flex-wrap: wrap; }
7341
+ .home-board-open { flex-basis: 100%; }
7342
+ .home-board-actions { padding: 0 8px 4px; }
7343
+ }