openplanr 3.3.0 → 3.5.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.
Files changed (493) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/dist/cli/commands/artifact-design-share.d.ts +9 -0
  3. package/dist/cli/commands/artifact-design-share.d.ts.map +1 -0
  4. package/dist/cli/commands/artifact-design-share.js +200 -0
  5. package/dist/cli/commands/artifact-design-share.js.map +1 -0
  6. package/dist/cli/commands/artifact.d.ts.map +1 -1
  7. package/dist/cli/commands/artifact.js +5 -18
  8. package/dist/cli/commands/artifact.js.map +1 -1
  9. package/dist/cli/commands/design.d.ts +3 -0
  10. package/dist/cli/commands/design.d.ts.map +1 -0
  11. package/dist/cli/commands/design.js +137 -0
  12. package/dist/cli/commands/design.js.map +1 -0
  13. package/dist/cli/commands/groups/operations.d.ts.map +1 -1
  14. package/dist/cli/commands/groups/operations.js +2 -0
  15. package/dist/cli/commands/groups/operations.js.map +1 -1
  16. package/dist/cli/commands/ship.d.ts.map +1 -1
  17. package/dist/cli/commands/ship.js +2 -0
  18. package/dist/cli/commands/ship.js.map +1 -1
  19. package/dist/dashboard/.vite/manifest.json +2 -2
  20. package/dist/dashboard/assets/index-B-l_941W.js +75 -0
  21. package/dist/dashboard/assets/index-B-l_941W.js.map +1 -0
  22. package/dist/dashboard/assets/index-Cv4Vwhuw.css +2 -0
  23. package/dist/dashboard/dashboard-manifest.json +14 -14
  24. package/dist/dashboard/index.html +2 -2
  25. package/dist/services/design-artifact-service.d.ts +42 -1
  26. package/dist/services/design-artifact-service.d.ts.map +1 -1
  27. package/dist/services/design-artifact-service.js +198 -19
  28. package/dist/services/design-artifact-service.js.map +1 -1
  29. package/dist/services/runtime-manager/runtime-package.js +1 -1
  30. package/dist/services/runtime-manager/runtime-package.js.map +1 -1
  31. package/dist/services/ship-checks/contract.d.ts +3 -1
  32. package/dist/services/ship-checks/contract.d.ts.map +1 -1
  33. package/dist/services/ship-checks/contract.js +1 -1
  34. package/dist/services/ship-checks/contract.js.map +1 -1
  35. package/dist/services/ship-checks/discover.d.ts.map +1 -1
  36. package/dist/services/ship-checks/discover.js +2 -1
  37. package/dist/services/ship-checks/discover.js.map +1 -1
  38. package/dist/services/ship-checks/package-contents.d.ts +4 -0
  39. package/dist/services/ship-checks/package-contents.d.ts.map +1 -0
  40. package/dist/services/ship-checks/package-contents.js +91 -0
  41. package/dist/services/ship-checks/package-contents.js.map +1 -0
  42. package/dist/services/ship-checks/packages.d.ts +2 -0
  43. package/dist/services/ship-checks/packages.d.ts.map +1 -1
  44. package/dist/services/ship-checks/packages.js +4 -0
  45. package/dist/services/ship-checks/packages.js.map +1 -1
  46. package/dist/services/ship-checks/scope.js +2 -1
  47. package/dist/services/ship-checks/scope.js.map +1 -1
  48. package/dist/utils/splice-managed-block.js +1 -1
  49. package/dist/utils/splice-managed-block.js.map +1 -1
  50. package/docs/CLI.md +67 -1
  51. package/lib/host-packages/adapter-registry.json +5 -5
  52. package/lib/host-packages/capability-map.json +1 -1
  53. package/lib/host-packages/claude/.claude-plugin/marketplace.json +3 -3
  54. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +6 -6
  55. package/lib/host-packages/claude/openplanr/.openplanr-content.json +57 -429
  56. package/lib/host-packages/claude/openplanr/README.md +16 -16
  57. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/task-context-resolution.md +4 -4
  58. package/lib/host-packages/claude/openplanr/skills/artifact/references/design-sharing.md +2 -2
  59. package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +2 -1
  60. package/lib/host-packages/claude/openplanr/skills/delegate/references/integration-review.md +26 -20
  61. package/lib/host-packages/claude/openplanr/skills/delegate/references/operator-guide.md +25 -1
  62. package/lib/host-packages/claude/openplanr/skills/delegate/references/run-handoff.md +2 -2
  63. package/lib/host-packages/claude/openplanr/skills/delegate/references/worktree-custody.md +17 -9
  64. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/claude.mjs +15 -3
  65. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/codex.mjs +38 -2
  66. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/native.mjs +5 -0
  67. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/custody.mjs +217 -10
  68. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/handoff.mjs +1080 -0
  69. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/integrate.mjs +96 -201
  70. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/integration-files.mjs +3 -382
  71. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/presentation.mjs +29 -12
  72. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-contract.mjs +11 -0
  73. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-execution.mjs +1 -1
  74. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-lifecycle.mjs +14 -10
  75. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +4 -0
  76. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-record.mjs +2 -2
  77. package/lib/host-packages/claude/openplanr/skills/design/SKILL.md +23 -12
  78. package/lib/host-packages/claude/openplanr/skills/design/references/design-system.md +2 -2
  79. package/lib/host-packages/claude/openplanr/skills/design/references/generation.md +3 -3
  80. package/lib/host-packages/claude/openplanr/skills/design/references/hosted-canvas.md +6 -3
  81. package/lib/host-packages/claude/openplanr/skills/design/references/review.md +6 -6
  82. package/lib/host-packages/claude/openplanr/skills/design/references/team-review.md +3 -4
  83. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +78 -32
  84. package/lib/host-packages/claude/openplanr/skills/design-loop/SKILL.md +15 -7
  85. package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-system.md +2 -2
  86. package/lib/host-packages/claude/openplanr/skills/design-loop/references/generation.md +3 -3
  87. package/lib/host-packages/claude/openplanr/skills/design-loop/references/review.md +6 -6
  88. package/lib/host-packages/claude/openplanr/skills/design-loop/references/team-review.md +3 -4
  89. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +78 -32
  90. package/lib/host-packages/claude/openplanr/skills/design-review/SKILL.md +25 -5
  91. package/lib/host-packages/claude/openplanr/skills/design-review/references/design-system.md +2 -2
  92. package/lib/host-packages/claude/openplanr/skills/design-review/references/generation.md +3 -3
  93. package/lib/host-packages/claude/openplanr/skills/design-review/references/review.md +6 -6
  94. package/lib/host-packages/claude/openplanr/skills/design-review/references/team-review.md +3 -4
  95. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +78 -32
  96. package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +1 -0
  97. package/lib/host-packages/claude/openplanr/skills/investigate/references/fail-first.md +40 -0
  98. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +7 -3
  99. package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +22 -10
  100. package/lib/host-packages/claude/openplanr/skills/ship/references/fail-first.md +40 -0
  101. package/lib/host-packages/claude/openplanr/skills/ship/references/result-contract.md +7 -3
  102. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +55 -427
  103. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  104. package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/design-sharing.md +2 -2
  105. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/integration-review.md +26 -20
  106. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/operator-guide.md +25 -1
  107. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/run-handoff.md +2 -2
  108. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/worktree-custody.md +17 -9
  109. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/claude.mjs +15 -3
  110. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/codex.mjs +38 -2
  111. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/native.mjs +5 -0
  112. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/custody.mjs +217 -10
  113. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/handoff.mjs +1080 -0
  114. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/integrate.mjs +96 -201
  115. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/integration-files.mjs +3 -382
  116. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/presentation.mjs +29 -12
  117. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-contract.mjs +11 -0
  118. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-execution.mjs +1 -1
  119. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-lifecycle.mjs +14 -10
  120. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +4 -0
  121. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-record.mjs +2 -2
  122. package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +2 -1
  123. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-system.md +2 -2
  124. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/generation.md +3 -3
  125. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/hosted-canvas.md +6 -3
  126. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/review.md +6 -6
  127. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/team-review.md +3 -4
  128. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +78 -32
  129. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-system.md +2 -2
  130. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/generation.md +3 -3
  131. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/review.md +6 -6
  132. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/team-review.md +3 -4
  133. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +78 -32
  134. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop.mdc +15 -7
  135. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-system.md +2 -2
  136. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/generation.md +3 -3
  137. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/review.md +6 -6
  138. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/team-review.md +3 -4
  139. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +78 -32
  140. package/lib/host-packages/cursor/openplanr/rules/planr-design-review.mdc +25 -5
  141. package/lib/host-packages/cursor/openplanr/rules/planr-design.mdc +23 -12
  142. package/lib/host-packages/cursor/openplanr/rules/planr-investigate/references/fail-first.md +40 -0
  143. package/lib/host-packages/cursor/openplanr/rules/planr-investigate.mdc +1 -0
  144. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +7 -3
  145. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/fail-first.md +40 -0
  146. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/result-contract.md +7 -3
  147. package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +22 -10
  148. package/lib/host-packages/openai/.claude-plugin/marketplace.json +3 -3
  149. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +2 -2
  150. package/lib/host-packages/openai/openplanr/.openplanr-content.json +62 -434
  151. package/lib/host-packages/openai/openplanr/skills/artifact/references/design-sharing.md +2 -2
  152. package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +2 -1
  153. package/lib/host-packages/openai/openplanr/skills/delegate/openplanr.skill.json +1 -1
  154. package/lib/host-packages/openai/openplanr/skills/delegate/references/integration-review.md +26 -20
  155. package/lib/host-packages/openai/openplanr/skills/delegate/references/operator-guide.md +25 -1
  156. package/lib/host-packages/openai/openplanr/skills/delegate/references/run-handoff.md +2 -2
  157. package/lib/host-packages/openai/openplanr/skills/delegate/references/worktree-custody.md +17 -9
  158. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/claude.mjs +15 -3
  159. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/codex.mjs +38 -2
  160. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/native.mjs +5 -0
  161. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/custody.mjs +217 -10
  162. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/handoff.mjs +1080 -0
  163. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/integrate.mjs +96 -201
  164. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/integration-files.mjs +3 -382
  165. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/presentation.mjs +29 -12
  166. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-contract.mjs +11 -0
  167. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-execution.mjs +1 -1
  168. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-lifecycle.mjs +14 -10
  169. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +4 -0
  170. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-record.mjs +2 -2
  171. package/lib/host-packages/openai/openplanr/skills/design/SKILL.md +23 -12
  172. package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +0 -11
  173. package/lib/host-packages/openai/openplanr/skills/design/references/design-system.md +2 -2
  174. package/lib/host-packages/openai/openplanr/skills/design/references/generation.md +3 -3
  175. package/lib/host-packages/openai/openplanr/skills/design/references/hosted-canvas.md +6 -3
  176. package/lib/host-packages/openai/openplanr/skills/design/references/review.md +6 -6
  177. package/lib/host-packages/openai/openplanr/skills/design/references/team-review.md +3 -4
  178. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +78 -32
  179. package/lib/host-packages/openai/openplanr/skills/design-loop/SKILL.md +15 -7
  180. package/lib/host-packages/openai/openplanr/skills/design-loop/openplanr.skill.json +0 -11
  181. package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-system.md +2 -2
  182. package/lib/host-packages/openai/openplanr/skills/design-loop/references/generation.md +3 -3
  183. package/lib/host-packages/openai/openplanr/skills/design-loop/references/review.md +6 -6
  184. package/lib/host-packages/openai/openplanr/skills/design-loop/references/team-review.md +3 -4
  185. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +78 -32
  186. package/lib/host-packages/openai/openplanr/skills/design-review/SKILL.md +25 -5
  187. package/lib/host-packages/openai/openplanr/skills/design-review/openplanr.skill.json +0 -11
  188. package/lib/host-packages/openai/openplanr/skills/design-review/references/design-system.md +2 -2
  189. package/lib/host-packages/openai/openplanr/skills/design-review/references/generation.md +3 -3
  190. package/lib/host-packages/openai/openplanr/skills/design-review/references/review.md +6 -6
  191. package/lib/host-packages/openai/openplanr/skills/design-review/references/team-review.md +3 -4
  192. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +78 -32
  193. package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +1 -0
  194. package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +12 -1
  195. package/lib/host-packages/openai/openplanr/skills/investigate/references/fail-first.md +40 -0
  196. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +7 -3
  197. package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +0 -11
  198. package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +22 -10
  199. package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +12 -1
  200. package/lib/host-packages/openai/openplanr/skills/ship/references/fail-first.md +40 -0
  201. package/lib/host-packages/openai/openplanr/skills/ship/references/result-contract.md +7 -3
  202. package/package.json +8 -8
  203. package/dist/dashboard/assets/index-BU5fzjyz.css +0 -1
  204. package/dist/dashboard/assets/index-B_96uzCl.js +0 -572
  205. package/dist/dashboard/assets/index-B_96uzCl.js.map +0 -1
  206. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-artifact-shell.mjs +0 -1774
  207. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +0 -555
  208. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-compression.mjs +0 -4180
  209. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-document.mjs +0 -2937
  210. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +0 -647
  211. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-entities.mjs +0 -439
  212. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-handoff.mjs +0 -1576
  213. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-loopback-server.mjs +0 -359
  214. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-owner-custody.mjs +0 -129
  215. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-parse5-parser.mjs +0 -3970
  216. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-parse5-tokenizer.mjs +0 -3501
  217. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-resource-pack.mjs +0 -698
  218. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +0 -3385
  219. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-runtime-home.mjs +0 -39
  220. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-runtime-support-25485dbf1cb2.mjs +0 -24
  221. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-sandbox-guards.mjs +0 -1102
  222. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +0 -1993
  223. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +0 -1113
  224. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +0 -505
  225. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +0 -222
  226. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs +0 -5907
  227. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-upload-spool.mjs +0 -198
  228. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design.mjs +0 -1430
  229. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +0 -2050
  230. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +0 -2
  231. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/01-module-runtime.js +0 -18
  232. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +0 -809
  233. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +0 -5693
  234. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +0 -4175
  235. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +0 -65
  236. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +0 -1755
  237. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +0 -62
  238. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +0 -2633
  239. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +0 -124
  240. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +0 -65
  241. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +0 -388
  242. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/handoff-center.css +0 -81
  243. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.css +0 -1
  244. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +0 -133
  245. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +0 -1159
  246. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +0 -30
  247. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +0 -900
  248. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +0 -2261
  249. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +0 -1595
  250. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +0 -1467
  251. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +0 -1860
  252. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +0 -914
  253. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +0 -2578
  254. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +0 -582
  255. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +0 -17
  256. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +0 -12
  257. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +0 -285
  258. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +0 -2773
  259. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +0 -134
  260. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +0 -2207
  261. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +0 -16
  262. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +0 -8
  263. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +0 -3883
  264. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +0 -966
  265. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/20-studio-shell.js +0 -520
  266. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +0 -1597
  267. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +0 -311
  268. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +0 -159
  269. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/registries/artifact-theme.json +0 -64
  270. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +0 -90
  271. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +0 -142
  272. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +0 -49
  273. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +0 -97
  274. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +0 -584
  275. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +0 -191
  276. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +0 -407
  277. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +0 -106
  278. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-handoff-readiness.schema.json +0 -398
  279. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-implementation-handoff.schema.json +0 -518
  280. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-planning-lineage.schema.json +0 -106
  281. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +0 -107
  282. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.14.0/artifact-theme.schema.json +0 -316
  283. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.16.0/artifact-envelope.schema.json +0 -408
  284. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.16.0/design-review-bundle.schema.json +0 -590
  285. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-document.schema.json +0 -506
  286. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +0 -822
  287. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +0 -346
  288. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +0 -108
  289. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +0 -170
  290. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +0 -97
  291. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +0 -56
  292. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +0 -5468
  293. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +0 -2844
  294. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +0 -21
  295. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +0 -159
  296. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +0 -97
  297. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/integration-transaction.mjs +0 -958
  298. package/lib/host-packages/claude/openplanr/skills/design/scripts/design.mjs +0 -12
  299. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design.mjs +0 -12
  300. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design.mjs +0 -12
  301. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design.mjs +0 -12
  302. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/integration-transaction.mjs +0 -958
  303. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design.mjs +0 -12
  304. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design.mjs +0 -12
  305. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design.mjs +0 -12
  306. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design.mjs +0 -12
  307. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-artifact-shell.mjs +0 -1774
  308. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +0 -555
  309. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-compression.mjs +0 -4180
  310. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-document.mjs +0 -2937
  311. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +0 -647
  312. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-entities.mjs +0 -439
  313. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-handoff.mjs +0 -1576
  314. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-loopback-server.mjs +0 -359
  315. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-owner-custody.mjs +0 -129
  316. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-parse5-parser.mjs +0 -3970
  317. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-parse5-tokenizer.mjs +0 -3501
  318. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-resource-pack.mjs +0 -698
  319. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +0 -3385
  320. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-runtime-home.mjs +0 -39
  321. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-runtime-support-25485dbf1cb2.mjs +0 -24
  322. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-sandbox-guards.mjs +0 -1102
  323. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +0 -1993
  324. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +0 -1113
  325. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +0 -505
  326. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +0 -222
  327. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs +0 -5907
  328. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-upload-spool.mjs +0 -198
  329. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design.mjs +0 -1430
  330. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +0 -2050
  331. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +0 -2
  332. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/01-module-runtime.js +0 -18
  333. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +0 -809
  334. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +0 -5693
  335. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +0 -4175
  336. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +0 -65
  337. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +0 -1755
  338. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +0 -62
  339. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +0 -2633
  340. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +0 -124
  341. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +0 -65
  342. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +0 -388
  343. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/handoff-center.css +0 -81
  344. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.css +0 -1
  345. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +0 -133
  346. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +0 -1159
  347. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +0 -30
  348. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +0 -900
  349. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +0 -2261
  350. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +0 -1595
  351. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +0 -1467
  352. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +0 -1860
  353. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +0 -914
  354. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +0 -2578
  355. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +0 -582
  356. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +0 -17
  357. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +0 -12
  358. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +0 -285
  359. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +0 -2773
  360. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +0 -134
  361. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +0 -2207
  362. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +0 -16
  363. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +0 -8
  364. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +0 -3883
  365. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +0 -966
  366. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/20-studio-shell.js +0 -520
  367. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +0 -1597
  368. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +0 -311
  369. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +0 -159
  370. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/registries/artifact-theme.json +0 -64
  371. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +0 -90
  372. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +0 -142
  373. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +0 -49
  374. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +0 -97
  375. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +0 -584
  376. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +0 -191
  377. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +0 -407
  378. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +0 -106
  379. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-handoff-readiness.schema.json +0 -398
  380. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-implementation-handoff.schema.json +0 -518
  381. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-planning-lineage.schema.json +0 -106
  382. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +0 -107
  383. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.14.0/artifact-theme.schema.json +0 -316
  384. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.16.0/artifact-envelope.schema.json +0 -408
  385. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.16.0/design-review-bundle.schema.json +0 -590
  386. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-document.schema.json +0 -506
  387. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +0 -822
  388. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +0 -346
  389. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +0 -108
  390. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +0 -170
  391. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +0 -97
  392. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +0 -56
  393. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +0 -5468
  394. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +0 -2844
  395. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +0 -21
  396. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +0 -159
  397. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +0 -97
  398. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-artifact-shell.mjs +0 -1774
  399. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +0 -555
  400. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-compression.mjs +0 -4180
  401. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-document.mjs +0 -2937
  402. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +0 -647
  403. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-entities.mjs +0 -439
  404. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-handoff.mjs +0 -1576
  405. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-loopback-server.mjs +0 -359
  406. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-owner-custody.mjs +0 -129
  407. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-parse5-parser.mjs +0 -3970
  408. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-parse5-tokenizer.mjs +0 -3501
  409. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-resource-pack.mjs +0 -698
  410. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +0 -3385
  411. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-runtime-home.mjs +0 -39
  412. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-runtime-support-25485dbf1cb2.mjs +0 -24
  413. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-sandbox-guards.mjs +0 -1102
  414. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +0 -1993
  415. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +0 -1113
  416. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +0 -505
  417. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +0 -222
  418. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs +0 -5907
  419. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-upload-spool.mjs +0 -198
  420. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design.mjs +0 -1430
  421. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +0 -2050
  422. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +0 -2
  423. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/01-module-runtime.js +0 -18
  424. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +0 -809
  425. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +0 -5693
  426. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +0 -4175
  427. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +0 -65
  428. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +0 -1755
  429. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +0 -62
  430. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +0 -2633
  431. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +0 -124
  432. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +0 -65
  433. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +0 -388
  434. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/handoff-center.css +0 -81
  435. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.css +0 -1
  436. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +0 -133
  437. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +0 -1159
  438. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +0 -30
  439. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +0 -900
  440. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +0 -2261
  441. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +0 -1595
  442. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +0 -1467
  443. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +0 -1860
  444. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +0 -914
  445. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +0 -2578
  446. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +0 -582
  447. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +0 -17
  448. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +0 -12
  449. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +0 -285
  450. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +0 -2773
  451. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +0 -134
  452. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +0 -2207
  453. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +0 -16
  454. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +0 -8
  455. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +0 -3883
  456. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +0 -966
  457. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/20-studio-shell.js +0 -520
  458. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +0 -1597
  459. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +0 -311
  460. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +0 -159
  461. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/registries/artifact-theme.json +0 -64
  462. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +0 -90
  463. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +0 -142
  464. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +0 -49
  465. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +0 -97
  466. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +0 -584
  467. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +0 -191
  468. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +0 -407
  469. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +0 -106
  470. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-handoff-readiness.schema.json +0 -398
  471. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-implementation-handoff.schema.json +0 -518
  472. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-planning-lineage.schema.json +0 -106
  473. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +0 -107
  474. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.14.0/artifact-theme.schema.json +0 -316
  475. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.16.0/artifact-envelope.schema.json +0 -408
  476. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.16.0/design-review-bundle.schema.json +0 -590
  477. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-document.schema.json +0 -506
  478. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +0 -822
  479. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +0 -346
  480. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +0 -108
  481. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +0 -170
  482. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +0 -97
  483. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +0 -56
  484. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +0 -5468
  485. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +0 -2844
  486. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +0 -21
  487. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +0 -159
  488. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +0 -97
  489. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/integration-transaction.mjs +0 -958
  490. package/lib/host-packages/openai/openplanr/skills/design/scripts/design.mjs +0 -12
  491. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design.mjs +0 -12
  492. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design.mjs +0 -12
  493. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design.mjs +0 -12
@@ -1,1774 +0,0 @@
1
- import {
2
- digestArtifactEnvelope
3
- } from "./design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs";
4
- import {
5
- validateJson
6
- } from "./design-shared-protocol-contracts-b5f28f94.mjs";
7
-
8
- // packages/artifact/lib/artifact/ui/shell.mjs
9
- import { readFileSync as readFileSync2 } from "node:fs";
10
-
11
- // packages/artifact/lib/artifact/internal/escape.mjs
12
- var HTML_ENTITIES = Object.freeze({
13
- "&": "&",
14
- "<": "&lt;",
15
- ">": "&gt;",
16
- '"': "&quot;",
17
- "'": "&#39;"
18
- });
19
- var LINE_SEP = String.fromCharCode(8232);
20
- var PARA_SEP = String.fromCharCode(8233);
21
- var JSON_HTML_ESCAPES = Object.freeze({
22
- "<": "\\u003c",
23
- ">": "\\u003e",
24
- "&": "\\u0026",
25
- [LINE_SEP]: "\\u2028",
26
- [PARA_SEP]: "\\u2029"
27
- });
28
- var JSON_HTML_RE = new RegExp(`[<>&${LINE_SEP}${PARA_SEP}]`, "g");
29
- function escapeHtml(value) {
30
- return String(value ?? "").replace(/[&<>"']/g, (ch) => HTML_ENTITIES[ch]);
31
- }
32
- function embedJson(value) {
33
- return JSON.stringify(value ?? null).replace(JSON_HTML_RE, (ch) => JSON_HTML_ESCAPES[ch]);
34
- }
35
-
36
- // packages/artifact/lib/artifact/ui/annotation-styles.mjs
37
- var ARTIFACT_ANNOTATION_CSS = `.planr-annotation-layer { position: absolute; z-index: 6; inset: 0; }
38
- .planr-shell[data-planr-review-mode="interact"] .planr-annotation-layer { pointer-events: none; }
39
- .planr-shell[data-planr-review-mode="comment"] .planr-annotation-layer { cursor: crosshair; touch-action: none; }
40
- .planr-shell[data-planr-review-mode="comment"] .planr-frame iframe { pointer-events: none; }
41
- .planr-region-selection {
42
- position: absolute;
43
- min-width: 2px;
44
- min-height: 2px;
45
- border: 2px solid var(--planr-color-primary);
46
- border-radius: var(--planr-radius-small);
47
- background: color-mix(in srgb, var(--planr-color-primary) 14%, transparent);
48
- pointer-events: none;
49
- }
50
- .planr-pin {
51
- position: absolute;
52
- z-index: 8;
53
- width: 44px;
54
- height: 44px;
55
- min-width: 44px;
56
- min-height: 44px;
57
- translate: -50% -50%;
58
- display: grid;
59
- place-items: center;
60
- padding: 0;
61
- border: 8px solid transparent;
62
- border-radius: 50%;
63
- background-clip: padding-box;
64
- color: var(--planr-color-on-danger);
65
- cursor: pointer;
66
- pointer-events: auto;
67
- font: 700 10px/1 var(--planr-font-mono);
68
- box-shadow: 0 4px 14px color-mix(in srgb, var(--planr-color-background) 38%, transparent);
69
- }
70
- .planr-pin-fix { background-color: var(--planr-color-danger); }
71
- .planr-pin-improve { background-color: var(--planr-color-primary-strong); color: var(--planr-color-on-improve); }
72
- .planr-pin-question { background-color: var(--planr-color-question); color: var(--planr-color-on-question); }
73
- .planr-pin-resolved, .planr-pin-addressed { background-color: var(--planr-color-resolved); color: var(--planr-color-on-resolved); }
74
- .planr-pin-highlight { animation: planr-pin-highlight 1.2s ease-out; }
75
- @keyframes planr-pin-highlight {
76
- 0%, 35% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--planr-color-primary) 52%, transparent), 0 4px 14px color-mix(in srgb, var(--planr-color-background) 38%, transparent); }
77
- 100% { box-shadow: 0 4px 14px color-mix(in srgb, var(--planr-color-background) 38%, transparent); }
78
- }
79
- .planr-pin-region {
80
- position: absolute;
81
- z-index: 7;
82
- min-width: 2px;
83
- min-height: 2px;
84
- border: 2px solid var(--planr-color-danger);
85
- border-radius: var(--planr-radius-small);
86
- background: color-mix(in srgb, var(--planr-color-danger) 12%, transparent);
87
- pointer-events: none;
88
- }
89
- .planr-pin-region-improve { border-color: var(--planr-color-primary-strong); background: color-mix(in srgb, var(--planr-color-primary-strong) 12%, transparent); }
90
- .planr-pin-region-question { border-color: var(--planr-color-question); background: color-mix(in srgb, var(--planr-color-question) 12%, transparent); }
91
- .planr-pin-region-resolved, .planr-pin-region-addressed { border-color: var(--planr-color-resolved); background: color-mix(in srgb, var(--planr-color-resolved) 10%, transparent); }
92
- .planr-annotation-composer {
93
- position: fixed;
94
- inset: auto;
95
- z-index: 100;
96
- box-sizing: border-box;
97
- width: min(360px, calc(100vw - 24px));
98
- max-height: min(620px, calc(100dvh - 24px));
99
- margin: 0;
100
- overflow: auto;
101
- overscroll-behavior: contain;
102
- translate: none;
103
- transform: none;
104
- padding: 14px;
105
- border: 1px solid var(--planr-color-rule);
106
- border-radius: var(--planr-radius-large);
107
- background: var(--planr-color-panel);
108
- color: var(--planr-color-text);
109
- box-shadow: 0 18px 60px color-mix(in srgb, var(--planr-color-background) 58%, transparent);
110
- cursor: default;
111
- pointer-events: auto;
112
- }
113
- .planr-annotation-composer strong { display: block; margin: 0; font: 650 14px/1.2 var(--planr-font-display); }
114
- .planr-composer-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
115
- .planr-composer-header button { display: grid; place-items: center; flex: 0 0 28px; width: 28px; height: 28px; padding: 0; border: 1px solid transparent; border-radius: var(--planr-radius-small); background: transparent; color: var(--planr-color-text-muted); font: 22px/1 var(--planr-font-body); cursor: pointer; }
116
- .planr-composer-header button:hover { background: var(--planr-color-raised); color: var(--planr-color-text); }
117
- .planr-annotation-composer :focus-visible { outline: 2px solid var(--planr-color-primary); outline-offset: 2px; }
118
- .planr-annotation-composer::backdrop { background: transparent; pointer-events: none; }
119
- .planr-annotation-composer label, .planr-identity label {
120
- display: grid;
121
- gap: 5px;
122
- margin-bottom: 9px;
123
- color: var(--planr-color-text-muted);
124
- font-size: 11px;
125
- }
126
- .planr-annotation-composer input, .planr-annotation-composer textarea, .planr-identity input,
127
- .planr-reply-form textarea {
128
- width: 100%;
129
- padding: 8px 9px;
130
- border: 1px solid var(--planr-color-rule);
131
- border-radius: var(--planr-radius-small);
132
- background: var(--planr-color-chrome);
133
- color: var(--planr-color-text);
134
- }
135
- .planr-annotation-composer textarea { min-height: 84px; resize: vertical; }
136
- .planr-intent-picker { display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px; margin-bottom: 9px; }
137
- .planr-intent-picker button {
138
- min-height: 30px;
139
- border: 1px solid var(--planr-color-rule);
140
- border-radius: var(--planr-radius-small);
141
- background: transparent;
142
- cursor: pointer;
143
- font-size: 10px;
144
- }
145
- .planr-intent-picker [aria-checked="true"] { border-color: var(--planr-color-primary); background: var(--planr-color-raised); }
146
- .planr-field-error { min-height: 16px; margin: 0; color: var(--planr-color-danger); font-size: 10px; }
147
- .planr-composer-actions { display: flex; justify-content: flex-end; gap: 7px; margin-top: 8px; }
148
- .planr-composer-actions button, .planr-thread button, .planr-reply-form button {
149
- min-height: 30px;
150
- padding: 0 10px;
151
- border: 1px solid var(--planr-color-rule);
152
- border-radius: var(--planr-radius-small);
153
- background: transparent;
154
- cursor: pointer;
155
- font-weight: 700;
156
- }
157
- .planr-composer-actions [type="submit"], .planr-reply-form [type="submit"] { border-color: var(--planr-color-primary); background: var(--planr-color-primary); color: var(--planr-color-background); }
158
- `;
159
- var ARTIFACT_ANNOTATION_MOBILE_CSS = `@media (max-width: 600px) { .planr-annotation-composer input, .planr-annotation-composer textarea, .planr-annotation-composer select { font-size: 16px; } }`;
160
-
161
- // packages/artifact/lib/artifact/ui/presentation.mjs
162
- function resolveArtifactPresentation(value, {
163
- mode,
164
- viewMode = mode ?? "single",
165
- artifactCount = 1
166
- } = {}) {
167
- if (value === "document" || value === "canvas") return value;
168
- return artifactCount > 1 || viewMode === "variants" || viewMode === "split" ? "canvas" : "document";
169
- }
170
-
171
- // packages/artifact/lib/artifact/ui/renderers.mjs
172
- var ARTIFACT_SHELL_STATES = Object.freeze([
173
- "ready",
174
- "empty",
175
- "bundling",
176
- "loading",
177
- "invalid",
178
- "expired",
179
- "decryption-failed",
180
- "unsupported-browser"
181
- ]);
182
- var ARTIFACT_VIEW_MODES = Object.freeze(["single", "variants", "split"]);
183
- var ARTIFACT_REVIEW_MODES = Object.freeze(["interact", "comment"]);
184
- var ARTIFACT_SHELL_THEMES = Object.freeze(["auto", "light", "dark"]);
185
- var ARTIFACT_PRESENTATIONS = Object.freeze(["document", "canvas"]);
186
- var STATUS_COPY = Object.freeze({
187
- empty: Object.freeze({
188
- title: "No artifact content",
189
- detail: "Choose a bundled HTML artifact to begin this review."
190
- }),
191
- bundling: Object.freeze({
192
- title: "Bundling artifact",
193
- detail: "Packaging local scripts, styles, fonts, and images without network access."
194
- }),
195
- loading: Object.freeze({
196
- title: "Loading private review",
197
- detail: "Validating the envelope and frozen artifact viewport."
198
- }),
199
- invalid: Object.freeze({
200
- title: "This review is invalid",
201
- detail: "The artifact envelope could not be decoded or validated."
202
- }),
203
- expired: Object.freeze({
204
- title: "This encrypted review expired",
205
- detail: "Ask the sender for a new immutable review link."
206
- }),
207
- "decryption-failed": Object.freeze({
208
- title: "This key cannot decrypt the review",
209
- detail: "Use the complete link, including its private fragment key."
210
- }),
211
- "unsupported-browser": Object.freeze({
212
- title: "Browser support is required",
213
- detail: "Use a current browser with raw DEFLATE and Web Crypto support."
214
- })
215
- });
216
- var PRIVACY_LABELS = Object.freeze({
217
- local: "Local review",
218
- fragment: "Private fragment",
219
- "encrypted-short": "Encrypted short link"
220
- });
221
- function plainText(value, fallback = "") {
222
- if (typeof value === "string") return value;
223
- if (typeof value === "number" && Number.isFinite(value)) return String(value);
224
- return fallback;
225
- }
226
- function member(value, allowed, fallback) {
227
- return allowed.includes(value) ? value : fallback;
228
- }
229
- function nonNegativeInteger(value, fallback = 0) {
230
- return Number.isInteger(value) && value >= 0 ? value : fallback;
231
- }
232
- function viewportDimension(value, fallback) {
233
- return Number.isInteger(value) && value > 0 && value <= 16384 ? value : fallback;
234
- }
235
- function normalizeArtifact(value, index) {
236
- const artifact = value && typeof value === "object" ? value : {};
237
- const id = plainText(artifact.id, `artifact-${index + 1}`) || `artifact-${index + 1}`;
238
- return Object.freeze({
239
- id,
240
- domId: `planr-artifact-${index + 1}`,
241
- title: plainText(artifact.title, `Artifact ${index + 1}`) || `Artifact ${index + 1}`,
242
- kind: plainText(artifact.kind, "html") || "html",
243
- viewport: Object.freeze({
244
- width: viewportDimension(artifact.viewport?.width, 1440),
245
- height: viewportDimension(artifact.viewport?.height, 900)
246
- }),
247
- colorScheme: member(artifact.colorScheme, ["light", "dark"], "light")
248
- });
249
- }
250
- function normalizeArtifactShellModel(input = {}) {
251
- const source = input && typeof input === "object" ? input : {};
252
- const envelope = source.envelope && typeof source.envelope === "object" ? source.envelope : {};
253
- const viewer = source.viewer && typeof source.viewer === "object" ? source.viewer : envelope.viewer && typeof envelope.viewer === "object" ? envelope.viewer : {};
254
- const shell = source.shell && typeof source.shell === "object" ? source.shell : {};
255
- const artifacts = Object.freeze(
256
- (Array.isArray(envelope.artifacts) ? envelope.artifacts : []).map(normalizeArtifact)
257
- );
258
- const requestedActiveId = plainText(viewer.activeArtifactId);
259
- const activeIndex = Math.max(
260
- 0,
261
- artifacts.findIndex((artifact) => artifact.id === requestedActiveId)
262
- );
263
- const activeArtifact = artifacts[activeIndex] ?? null;
264
- const requestedComparisonId = plainText(viewer.comparisonArtifactId);
265
- let comparisonIndex = artifacts.findIndex(
266
- (artifact, index) => index !== activeIndex && artifact.id === requestedComparisonId
267
- );
268
- if (comparisonIndex < 0 && artifacts.length > 1) comparisonIndex = activeIndex === 0 ? 1 : 0;
269
- const comparisonArtifact = comparisonIndex >= 0 ? artifacts[comparisonIndex] : null;
270
- let viewMode = member(
271
- viewer.mode,
272
- ARTIFACT_VIEW_MODES,
273
- artifacts.length > 1 ? "variants" : "single"
274
- );
275
- if (artifacts.length < 2 && viewMode !== "single") viewMode = "single";
276
- const reviewMode = member(
277
- viewer.reviewMode ?? shell.reviewMode,
278
- ARTIFACT_REVIEW_MODES,
279
- "interact"
280
- );
281
- let status = member(viewer.status ?? shell.status, ARTIFACT_SHELL_STATES, "ready");
282
- if (artifacts.length === 0 && status === "ready") status = "empty";
283
- const privacy = member(shell.privacy, Object.keys(PRIVACY_LABELS), "local");
284
- const theme = member(shell.theme, ARTIFACT_SHELL_THEMES, "auto");
285
- const zoom = Math.min(200, Math.max(25, nonNegativeInteger(shell.zoom, 72)));
286
- const feedbackCount = nonNegativeInteger(shell.feedbackCount, 0);
287
- const presentation = resolveArtifactPresentation(viewer.presentation ?? shell.presentation, {
288
- mode: viewMode,
289
- artifactCount: artifacts.length
290
- });
291
- return Object.freeze({
292
- schemaVersion: "1.0.0",
293
- title: plainText(shell.title, activeArtifact?.title ?? "Artifact review") || "Artifact review",
294
- artifacts,
295
- activeArtifact,
296
- activeIndex,
297
- comparisonArtifact,
298
- comparisonIndex,
299
- viewMode,
300
- reviewMode,
301
- status,
302
- statusCopy: STATUS_COPY[status] ?? null,
303
- privacy,
304
- privacyLabel: PRIVACY_LABELS[privacy],
305
- theme,
306
- zoom,
307
- feedbackCount,
308
- presentation,
309
- railOpen: shell.railOpen === void 0 ? presentation === "canvas" : Boolean(shell.railOpen)
310
- });
311
- }
312
- function activeMetadata(model) {
313
- const artifact = model.activeArtifact;
314
- if (!artifact) return "HTML \xB7 1440\xD7900";
315
- return `${artifact.kind.toUpperCase()} \xB7 ${artifact.viewport.width}\xD7${artifact.viewport.height}`;
316
- }
317
- function renderPlanrMark() {
318
- return '<span class="planr-mark" aria-hidden="true"><svg viewBox="0 0 160 160" focusable="false"><g transform="rotate(-45 80 80)"><path d="M125 50A52 52 0 1 0 125 110" fill="none" stroke="currentColor" stroke-width="12" stroke-linecap="round" stroke-linejoin="round"/><rect x="127" y="71" width="18" height="18" rx="3" fill="currentColor"/></g></svg></span>';
319
- }
320
- function renderArtifactToolbar(model) {
321
- const interact = model.reviewMode === "interact";
322
- const canvas = model.presentation === "canvas";
323
- return `<header class="planr-toolbar">
324
- <div class="planr-brand" aria-label="OpenPlanr">${renderPlanrMark()}<span class="planr-title-block"><strong>${escapeHtml(model.title)}</strong>${canvas ? `<span>${escapeHtml(activeMetadata(model))}</span>` : ""}</span></div>
325
- <span class="planr-privacy" data-privacy="${escapeHtml(model.privacy)}">${escapeHtml(model.privacyLabel)}</span>
326
- ${canvas ? ' <span class="planr-domain-toolbar" data-planr-slot="domain-toolbar" aria-label="Artifact workflow controls"></span>\n' : ""} <span class="planr-toolbar-spacer" aria-hidden="true"></span>
327
- ${canvas ? ` <div class="planr-segment" role="group" aria-label="Viewport controls"><button type="button" data-planr-action="zoom-out" aria-label="Zoom out">\u2212</button><button type="button" data-planr-action="zoom-reset" aria-label="Reset zoom">${model.zoom}%</button><button type="button" data-planr-action="zoom-in" aria-label="Zoom in">+</button></div>
328
- ` : ""} <div class="planr-segment" role="group" aria-label="Review mode"><button type="button" data-planr-mode="interact" data-planr-short-label="I" aria-pressed="${interact}">Interact</button><button type="button" data-planr-mode="comment" data-planr-short-label="C" aria-pressed="${!interact}">Comment</button></div>
329
- ${canvas ? ` <button class="planr-toolbar-action" type="button" data-planr-action="theme" aria-label="Shell theme ${escapeHtml(model.theme)}">${escapeHtml(model.theme)}</button>
330
- ` : ""} <button class="planr-toolbar-action" type="button" data-planr-action="feedback" aria-controls="planr-review-rail" aria-expanded="${model.railOpen}"><span class="planr-feedback-label">Feedback</span> <span class="planr-count">${model.feedbackCount}</span></button>
331
- <button class="planr-toolbar-action planr-share" type="button" data-planr-action="share" aria-haspopup="dialog">Share</button>
332
- </header>`;
333
- }
334
- function actionIcon(name) {
335
- const paths = {
336
- comment: '<path d="M12 20a8 8 0 1 0-7.1-4.3L4 20l4.3-.9A8 8 0 0 0 12 20Z"/><path d="M12 8v8M8 12h8"/>',
337
- comments: '<path d="M20 11.5a7.5 7.5 0 0 1-8 7.5 8.8 8.8 0 0 1-3.2-.6L4 20l1.6-4.1A7.4 7.4 0 0 1 4 11.5a8 8 0 0 1 16 0Z"/><path d="M8.5 11.5h7"/>',
338
- share: '<path d="M12 3v12M7 8l5-5 5 5"/><path d="M5 13v6h14v-6"/>',
339
- more: '<circle cx="5" cy="12" r="1.25"/><circle cx="12" cy="12" r="1.25"/><circle cx="19" cy="12" r="1.25"/>'
340
- };
341
- return `<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">${paths[name]}</svg>`;
342
- }
343
- function commentsLabel(count) {
344
- return `${count} ${count === 1 ? "comment" : "comments"}`;
345
- }
346
- function renderDocumentActionRail(model) {
347
- return `<nav class="planr-floating-actions" aria-label="Review actions">
348
- <button type="button" data-planr-action="add-comment" aria-label="Add comment" aria-keyshortcuts="C" aria-pressed="${model.reviewMode === "comment"}" data-planr-tooltip="Add comment (C)">${actionIcon("comment")}</button>
349
- <button type="button" data-planr-action="feedback" aria-label="${commentsLabel(model.feedbackCount)}" aria-controls="planr-review-rail" aria-expanded="${model.railOpen}" data-planr-tooltip="Comments">${actionIcon("comments")}<span class="planr-count" aria-hidden="true">${model.feedbackCount}</span></button>
350
- <button type="button" data-planr-action="share" aria-label="Share review" aria-haspopup="dialog" data-planr-tooltip="Share">${actionIcon("share")}<span class="planr-action-label">Share</span></button>
351
- <div class="planr-more">
352
- <button type="button" data-planr-action="more" aria-label="More review options" aria-haspopup="menu" aria-expanded="false" data-planr-tooltip="More">${actionIcon("more")}</button>
353
- <div class="planr-more-menu" role="menu" hidden>
354
- <div><strong>Private review</strong><span>${escapeHtml(model.privacyLabel)} \xB7 Encrypted when shared</span></div>
355
- <button type="button" role="menuitem" data-planr-action="sharing-options">Snapshot and sharing options</button>
356
- <div data-planr-slot="room-manager" hidden></div>
357
- </div>
358
- </div>
359
- </nav>`;
360
- }
361
- function renderDocumentCommentsScrim() {
362
- return '<button class="planr-comments-scrim" type="button" data-planr-comments-scrim data-planr-close-feedback aria-label="Close comments" tabindex="-1"></button>';
363
- }
364
- function renderViewButton(mode, model, disabled = false) {
365
- const label = mode[0].toUpperCase() + mode.slice(1);
366
- return `<button type="button" data-planr-view="${mode}" aria-pressed="${model.viewMode === mode}"${disabled ? " disabled" : ""}>${label}</button>`;
367
- }
368
- function renderArtifactVariantControls(model) {
369
- const hasVariants = model.artifacts.length > 1;
370
- const tabs = model.artifacts.map((artifact, index) => {
371
- const selected = index === model.activeIndex;
372
- return `<button type="button" role="tab" id="planr-variant-tab-${index + 1}" aria-controls="${artifact.domId}-panel" aria-selected="${selected}" tabindex="${selected ? 0 : -1}" data-artifact-id="${escapeHtml(artifact.id)}"><span>${String(index + 1).padStart(2, "0")}</span> ${escapeHtml(artifact.title)}</button>`;
373
- }).join("");
374
- return `<div class="planr-stage-controls" role="group" aria-label="Artifact display controls">
375
- <div class="planr-segment planr-view-modes" role="group" aria-label="Artifact view mode">${renderViewButton("single", model)}${renderViewButton("variants", model, !hasVariants)}${renderViewButton("split", model, !hasVariants)}</div>
376
- <div class="planr-variants" role="tablist" aria-label="Artifact variants"${model.viewMode === "single" || !hasVariants ? " hidden" : ""}>${tabs}</div>
377
- </div>`;
378
- }
379
- function visibleArtifactIndexes(model) {
380
- if (model.viewMode === "split" && model.comparisonArtifact) {
381
- return /* @__PURE__ */ new Set([model.activeIndex, model.comparisonIndex]);
382
- }
383
- return new Set(model.activeArtifact ? [model.activeIndex] : []);
384
- }
385
- function renderArtifactPanels(model) {
386
- const visible = visibleArtifactIndexes(model);
387
- const unavailable = model.status !== "ready";
388
- return model.artifacts.map((artifact, index) => {
389
- const hidden = !visible.has(index);
390
- const primary = index === model.activeIndex;
391
- const annotationTabIndex = !hidden && !unavailable && model.reviewMode === "comment" ? 0 : -1;
392
- const frameTabIndex = !hidden && !unavailable && model.reviewMode === "interact" ? 0 : -1;
393
- return `<section class="planr-artifact-panel" id="${artifact.domId}-panel" role="tabpanel" aria-labelledby="planr-variant-tab-${index + 1}" data-artifact-id="${escapeHtml(artifact.id)}" data-artifact-color-scheme="${artifact.colorScheme}" style="--planr-artifact-width:${artifact.viewport.width}px;--planr-artifact-height:${artifact.viewport.height}px" aria-label="${primary ? "Primary" : "Comparison"} artifact: ${escapeHtml(artifact.title)}"${hidden ? " hidden" : ""}>
394
- <span class="planr-frame-label">${String(index + 1).padStart(2, "0")} \xB7 ${escapeHtml(artifact.title)}</span>
395
- <div class="planr-frame"><iframe id="${artifact.domId}" title="${escapeHtml(artifact.title)} artifact" sandbox="allow-scripts" referrerpolicy="no-referrer" tabindex="${frameTabIndex}" data-planr-artifact-frame="${escapeHtml(artifact.id)}"></iframe></div>
396
- <div class="planr-annotation-layer" role="region" aria-label="Annotations for ${escapeHtml(artifact.title)}" aria-disabled="${annotationTabIndex < 0}" tabindex="${annotationTabIndex}" data-coordinate-space="normalized" data-planr-annotation-layer="${escapeHtml(artifact.id)}"></div>
397
- </section>`;
398
- }).join("");
399
- }
400
- function renderArtifactStatus(model) {
401
- const ready = model.status === "ready";
402
- const copy = model.statusCopy ?? { title: "", detail: "" };
403
- return `<div class="planr-stage-status" role="status" aria-live="polite" aria-atomic="true"${ready ? " hidden" : ""}>
404
- <div><strong>${escapeHtml(copy.title)}</strong><p>${escapeHtml(copy.detail)}</p></div>
405
- </div>`;
406
- }
407
- function renderArtifactStage(model) {
408
- const unavailable = model.status !== "ready";
409
- const breadcrumb = model.activeArtifact?.title ?? "Artifact";
410
- return `<main class="planr-stage" aria-label="Artifact review stage">
411
- ${model.presentation === "canvas" ? ` <div class="planr-stage-heading"><span>ARTIFACT / ${escapeHtml(breadcrumb.toUpperCase())}</span><span role="status" aria-live="polite" data-planr-slot="status">${model.reviewMode === "comment" ? "Comment mode" : "Interactions enabled"}</span></div>
412
- ${renderArtifactVariantControls(model)}
413
- ` : ""} <div class="planr-stage-scroll"><div class="planr-stage-surface" style="--planr-shell-zoom:${model.zoom / 100}"${unavailable ? ' inert aria-hidden="true"' : ""}><div class="planr-frame-grid" data-planr-layout="${model.viewMode}">${renderArtifactPanels(model)}</div></div></div>
414
- ${renderArtifactStatus(model)}
415
- </main>`;
416
- }
417
- function renderArtifactRail(model) {
418
- const closed = !model.railOpen;
419
- return `<aside class="planr-review-rail" id="planr-review-rail" aria-label="Review comments"${closed ? ' inert aria-hidden="true"' : ""}>
420
- <header><h2>Review comments</h2><div class="planr-review-header-actions"><div class="planr-review-metrics" aria-label="Review metrics"><span data-planr-metric="open">0 open</span><span class="planr-count" data-planr-metric="total" aria-label="${commentsLabel(model.feedbackCount)}">${model.feedbackCount}</span></div><button class="planr-rail-close" type="button" data-planr-close-feedback aria-label="Close comments">\xD7</button></div></header>
421
- <section class="planr-identity" aria-label="Reviewer identity"><label for="planr-reviewer-name">Your name<input id="planr-reviewer-name" type="text" maxlength="256" autocomplete="name" aria-describedby="planr-identity-status planr-review-error" data-planr-reviewer-name></label><p class="planr-identity-status" id="planr-identity-status" aria-live="polite" data-planr-identity-status>Used to sign your comments.</p><p class="planr-field-error" id="planr-review-error" role="alert" hidden></p></section>
422
- <div class="planr-feedback-slot" data-planr-slot="feedback-rail" role="region" aria-label="Comment threads"><p data-planr-empty-feedback>No comments yet. Choose Add comment, then click or drag on the artifact.</p><div class="planr-thread-list" data-planr-thread-list></div></div>
423
- <section class="planr-domain-rail" data-planr-slot="domain-rail" aria-label="Artifact workflow details" hidden></section>
424
- <section class="planr-decision-slot" data-planr-slot="decision" aria-label="Review decision">
425
- <label for="planr-overall-note">Overall note</label><textarea id="planr-overall-note" maxlength="65536" placeholder="Overall note for the coding agent\u2026" data-planr-overall></textarea>
426
- <div><button type="button" data-planr-decision="approved" aria-pressed="false">Approve</button><button type="button" data-planr-decision="changes_requested" aria-pressed="false">Request changes</button></div>
427
- <p data-planr-slot="decision-status">Decision pending</p>
428
- </section>
429
- </aside>`;
430
- }
431
- function renderArtifactShareDialog() {
432
- return `<div class="planr-dialog-backdrop" data-planr-share-dialog hidden>
433
- <section class="planr-share-dialog" role="dialog" aria-modal="true" aria-labelledby="planr-share-title" aria-describedby="planr-share-description" data-planr-share-phase="idle" data-planr-share-selected="live">
434
- <header><div><h2 id="planr-share-title">Share this review</h2><p id="planr-share-description">Live review is encrypted and collaborative. Snapshot links are immutable alternatives.</p></div><button type="button" class="planr-dialog-close" data-planr-share-close aria-label="Close share dialog">\xD7</button></header>
435
- <div class="planr-share-receipt" role="group" aria-label="Privacy receipt">
436
- <button type="button" class="planr-share-receipt-row is-selected" data-planr-share-transport="live" aria-pressed="true">
437
- <span class="planr-share-receipt-icon" aria-hidden="true">\u25CF</span><span><strong>Live collaborative review</strong><small>Encrypted artifact and comment events are stored until expiry. Anyone with the link can comment.</small></span><span class="planr-share-receipt-size">Default</span>
438
- </button>
439
- <button type="button" class="planr-share-receipt-row" data-planr-share-transport="fragment" aria-pressed="false">
440
- <span class="planr-share-receipt-icon" aria-hidden="true">#</span><span><strong>Private fragment</strong><small>Compressed into the URL. Nothing is uploaded.</small></span><span class="planr-share-receipt-size" data-planr-share-fragment-size>Calculating\u2026</span>
441
- </button>
442
- <button type="button" class="planr-share-receipt-row" data-planr-share-transport="short" aria-pressed="false">
443
- <span class="planr-share-receipt-icon" aria-hidden="true">\u25C7</span><span><strong>Encrypted short link</strong><small>AES-256-GCM ciphertext is stored until expiry; the key stays in this link fragment.</small></span><span class="planr-share-receipt-size" data-planr-share-short-size>Calculating\u2026</span>
444
- </button>
445
- </div>
446
- <p class="planr-share-threshold" data-planr-share-threshold>Live rooms are the default. Private fragments are immutable snapshots through 8,000 characters.</p>
447
- <div class="planr-share-ttl" data-planr-share-ttl-row hidden><label for="planr-share-ttl">Encrypted storage expiry<select id="planr-share-ttl" data-planr-share-ttl><option value="1d">1 day</option><option value="7d" selected>7 days</option><option value="30d">30 days</option></select></label><p>Ciphertext and request metadata are visible to the service until <time data-planr-share-expiry></time>. The decryption key is not uploaded.</p></div>
448
- <aside class="planr-owner-custody" data-planr-share-owner-custody><strong>Owner-verdict custody</strong><p>Download the private owner key first. The key stays in your downloaded file and is never put in a URL, browser storage, log, or server request.</p><p role="status" data-planr-share-owner-custody-status>No room will be created until the private owner key is downloaded successfully.</p></aside>
449
- <section class="planr-share-result" data-planr-share-result hidden aria-label="Share receipt">
450
- <label for="planr-share-url">Reviewer URL \xB7 view and comment</label><div><input id="planr-share-url" data-planr-share-url readonly><button type="button" data-planr-share-copy-url>Copy URL</button></div>
451
- <aside class="planr-live-capability" data-planr-share-owner hidden><strong>Private owner-verdict URL</strong><p>Use this URL with the matching downloaded owner key to approve or request changes.</p><div><input id="planr-share-owner-url" aria-label="Private owner-verdict URL" data-planr-share-owner-url readonly><button type="button" data-planr-share-copy-owner>Copy owner URL</button></div></aside>
452
- <aside class="planr-live-capability" data-planr-share-manage hidden><strong>Private management URL</strong><p>Pause or reopen comments, or delete the room. Management cannot set a verdict.</p><div><input id="planr-share-manage-url" aria-label="Private management URL" data-planr-share-manage-url readonly><button type="button" data-planr-share-copy-manage>Copy manage URL</button></div></aside>
453
- <aside class="planr-deletion-receipt" data-planr-share-deletion hidden><strong>One-time deletion token</strong><p>Store this token now; it cannot be recovered. It is separate from the review URL.</p><code data-planr-share-deletion-token></code><button type="button" data-planr-share-copy-deletion>Copy deletion token</button></aside>
454
- </section>
455
- <p class="planr-share-error" role="alert" data-planr-share-error hidden></p>
456
- <p class="planr-visually-hidden" role="status" aria-live="polite" aria-atomic="true" data-planr-share-status></p>
457
- <footer><button type="button" data-planr-share-cancel>Cancel</button><button type="button" class="planr-share-confirm" data-planr-share-confirm disabled>Download owner key</button></footer>
458
- </section>
459
- </div>`;
460
- }
461
- function renderHostedArtifactViewerSlot() {
462
- return `<section class="planr-hosted-viewer" data-planr-hosted-viewer data-planr-hosted-state="idle" role="status" aria-live="polite" aria-atomic="true" hidden>
463
- <div>${renderPlanrMark()}<strong data-planr-hosted-title></strong><p data-planr-hosted-detail></p><button type="button" data-planr-hosted-retry hidden></button></div>
464
- </section>`;
465
- }
466
- function renderArtifactShellMarkup(model) {
467
- return `<div class="planr-shell" data-planr-presentation="${model.presentation}" data-planr-view="${model.viewMode}" data-planr-review-mode="${model.reviewMode}" data-planr-state="${model.status}" data-planr-rail-open="${model.railOpen}">
468
- ${model.presentation === "canvas" ? renderArtifactToolbar(model) : `${renderDocumentActionRail(model)}
469
- ${renderDocumentCommentsScrim()}`}
470
- <div class="planr-workspace">${renderArtifactStage(model)}${renderArtifactRail(model)}</div>
471
- </div>
472
- <div data-planr-slot="dialogs">${renderArtifactShareDialog()}</div>
473
- ${renderHostedArtifactViewerSlot()}
474
- <div class="planr-visually-hidden" role="status" aria-live="polite" aria-atomic="true" data-planr-slot="review-announcer"></div>`;
475
- }
476
- function renderArtifactShellModelData(model) {
477
- return embedJson(model);
478
- }
479
-
480
- // packages/artifact/lib/artifact/ui/stage-payload.mjs
481
- var PRESENTATIONS = Object.freeze(["document", "canvas"]);
482
- function positiveInteger(value, fallback) {
483
- return Number.isInteger(value) && value > 0 ? value : fallback;
484
- }
485
- function freezeArtifactMetadata(artifact, index) {
486
- if (!artifact || typeof artifact !== "object") {
487
- throw new TypeError(`Artifact ${index + 1} must be an object.`);
488
- }
489
- if (typeof artifact.id !== "string" || artifact.id.length === 0) {
490
- throw new TypeError(`Artifact ${index + 1} requires an id.`);
491
- }
492
- return Object.freeze({
493
- id: artifact.id,
494
- title: typeof artifact.title === "string" && artifact.title.length > 0 ? artifact.title : `Artifact ${index + 1}`,
495
- sha256: typeof artifact.sha256 === "string" ? artifact.sha256 : "",
496
- viewport: Object.freeze({
497
- width: positiveInteger(artifact.viewport?.width, 1440),
498
- height: positiveInteger(artifact.viewport?.height, 900)
499
- }),
500
- colorScheme: ["light", "dark"].includes(artifact.colorScheme) ? artifact.colorScheme : "light"
501
- });
502
- }
503
- function requestedArtifactId(value) {
504
- if (typeof value === "string") return value;
505
- return typeof value?.id === "string" ? value.id : "";
506
- }
507
- function availableId(artifacts, requested, fallback = "") {
508
- return artifacts.some(({ id }) => id === requested) ? requested : fallback;
509
- }
510
- function normalizeViewMode(value, artifactCount) {
511
- if (artifactCount < 2) return "single";
512
- return ["single", "variants", "split"].includes(value) ? value : "variants";
513
- }
514
- function createArtifactStagePayload(envelope = {}, { viewer } = {}) {
515
- const artifacts = Object.freeze(
516
- (Array.isArray(envelope?.artifacts) ? envelope.artifacts : []).map(freezeArtifactMetadata)
517
- );
518
- const sourceViewer = viewer && typeof viewer === "object" ? viewer : envelope?.viewer && typeof envelope.viewer === "object" ? envelope.viewer : {};
519
- const firstId = artifacts[0]?.id ?? "";
520
- const activeArtifactId = availableId(
521
- artifacts,
522
- requestedArtifactId(sourceViewer.activeArtifactId),
523
- firstId
524
- );
525
- const mode = normalizeViewMode(sourceViewer.mode, artifacts.length);
526
- return Object.freeze({
527
- schemaVersion: "1.0.0",
528
- artifacts,
529
- viewer: Object.freeze({
530
- mode,
531
- activeArtifactId,
532
- ...PRESENTATIONS.includes(sourceViewer.presentation) ? { presentation: sourceViewer.presentation } : {}
533
- })
534
- });
535
- }
536
-
537
- // packages/artifact/lib/artifact/ui/tokens.mjs
538
- import { fileURLToPath as __planrAssetFile } from "node:url";
539
- import { readFileSync } from "node:fs";
540
- import { createRequire } from "node:module";
541
-
542
- // packages/artifact/lib/artifact/internal/contrast.mjs
543
- var clamp01 = (x) => x < 0 ? 0 : x > 1 ? 1 : x;
544
- var srgbToLinear = (c) => c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
545
- var linearToSrgb = (c) => {
546
- c = clamp01(c);
547
- return c <= 31308e-7 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;
548
- };
549
- function parseHex(s) {
550
- let h = s.replace("#", "").trim();
551
- if (h.length === 3 || h.length === 4)
552
- h = h.split("").map((d) => d + d).join("");
553
- if (h.length !== 6 && h.length !== 8) return null;
554
- const r = parseInt(h.slice(0, 2), 16) / 255;
555
- const g = parseInt(h.slice(2, 4), 16) / 255;
556
- const b = parseInt(h.slice(4, 6), 16) / 255;
557
- return [r, g, b].some(Number.isNaN) ? null : { r, g, b };
558
- }
559
- function parseRgb(s) {
560
- const m = /rgba?\(([^)]+)\)/i.exec(s);
561
- if (!m) return null;
562
- const parts = m[1].split(/[,\s/]+/).filter(Boolean).slice(0, 3);
563
- if (parts.length < 3) return null;
564
- const toUnit = (p) => p.endsWith("%") ? parseFloat(p) / 100 : parseFloat(p) / 255;
565
- const [r, g, b] = parts.map(toUnit);
566
- return [r, g, b].some((x) => !Number.isFinite(x)) ? null : { r: clamp01(r), g: clamp01(g), b: clamp01(b) };
567
- }
568
- function parseOklch(s) {
569
- const m = /oklch\(([^)]+)\)/i.exec(s);
570
- if (!m) return null;
571
- const parts = m[1].split(/[\s/]+/).filter(Boolean);
572
- if (parts.length < 3) return null;
573
- let [L, C, H] = parts;
574
- L = L.endsWith("%") ? parseFloat(L) / 100 : parseFloat(L);
575
- C = parseFloat(C);
576
- H = parseFloat(H);
577
- if (![L, C, H].every(Number.isFinite)) return null;
578
- const h = H * Math.PI / 180;
579
- const a = C * Math.cos(h);
580
- const b2 = C * Math.sin(h);
581
- const l_ = L + 0.3963377774 * a + 0.2158037573 * b2;
582
- const m_ = L - 0.1055613458 * a - 0.0638541728 * b2;
583
- const s_ = L - 0.0894841775 * a - 1.291485548 * b2;
584
- const l = l_ ** 3, mm = m_ ** 3, ss = s_ ** 3;
585
- return {
586
- r: linearToSrgb(4.0767416621 * l - 3.3077115913 * mm + 0.2309699292 * ss),
587
- g: linearToSrgb(-1.2684380046 * l + 2.6097574011 * mm - 0.3413193965 * ss),
588
- b: linearToSrgb(-0.0041960863 * l - 0.7034186147 * mm + 1.707614701 * ss)
589
- };
590
- }
591
- var NAMED = { white: { r: 1, g: 1, b: 1 }, black: { r: 0, g: 0, b: 0 } };
592
- function parseColor(input) {
593
- if (!input || typeof input !== "string") return null;
594
- const s = input.trim().toLowerCase();
595
- if (s.includes("var(") || s.includes("gradient") || ["currentcolor", "transparent", "inherit", "none"].includes(s))
596
- return null;
597
- if (s in NAMED) return NAMED[s];
598
- if (s.startsWith("#")) return parseHex(s);
599
- if (s.startsWith("rgb")) return parseRgb(s);
600
- if (s.startsWith("oklch")) return parseOklch(s);
601
- return null;
602
- }
603
- function relativeLuminance(color) {
604
- if (!color) return null;
605
- const { r, g, b } = color;
606
- return 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);
607
- }
608
- function contrastRatio(a, b) {
609
- const la = relativeLuminance(typeof a === "string" ? parseColor(a) : a);
610
- const lb = relativeLuminance(typeof b === "string" ? parseColor(b) : b);
611
- if (la == null || lb == null) return null;
612
- const hi = Math.max(la, lb), lo = Math.min(la, lb);
613
- return (hi + 0.05) / (lo + 0.05);
614
- }
615
- var AA_NORMAL = 4.5;
616
-
617
- // packages/artifact/lib/artifact/ui/tokens.mjs
618
- var require2 = createRequire(new URL("./runtime/packages/artifact/lib/artifact/ui/tokens.mjs", import.meta.url).href);
619
- var ARTIFACT_THEME_REGISTRY_PATH = __planrAssetFile(new URL("./runtime/packages/protocol/registries/artifact-theme.json", import.meta.url));
620
- var ARTIFACT_THEME_SCHEMA_PATH = __planrAssetFile(new URL("./runtime/packages/protocol/schemas/v1.14.0/artifact-theme.schema.json", import.meta.url));
621
- var ARTIFACT_THEME_ERROR_CODES = Object.freeze({
622
- PARSE: "E_ARTIFACT_THEME_PARSE",
623
- SCHEMA: "E_ARTIFACT_THEME_SCHEMA",
624
- TOKEN_MISSING: "E_ARTIFACT_THEME_TOKEN_MISSING",
625
- TOKEN_UNKNOWN: "E_ARTIFACT_THEME_TOKEN_UNKNOWN",
626
- FORMAT: "E_ARTIFACT_THEME_FORMAT",
627
- LAYOUT: "E_ARTIFACT_THEME_LAYOUT",
628
- MOTION: "E_ARTIFACT_THEME_MOTION",
629
- CONTRAST: "E_ARTIFACT_THEME_CONTRAST"
630
- });
631
- var ArtifactThemeError = class extends Error {
632
- constructor(code, message, details = {}) {
633
- super(message);
634
- this.name = "ArtifactThemeError";
635
- this.code = code;
636
- this.details = details;
637
- }
638
- };
639
- var TYPOGRAPHY_KEYS = Object.freeze(["display", "body", "mono"]);
640
- var LAYOUT_KEYS = Object.freeze([
641
- "toolbarHeight",
642
- "reviewRailWidth",
643
- "radiusSmall",
644
- "radiusMedium",
645
- "radiusLarge",
646
- "motionFastMs",
647
- "motionBaseMs"
648
- ]);
649
- var THEME_NAMES = Object.freeze(["dark", "light"]);
650
- var COLOR_KEYS = Object.freeze([
651
- "background",
652
- "chrome",
653
- "panel",
654
- "raised",
655
- "stage",
656
- "rule",
657
- "text",
658
- "textMuted",
659
- "primary",
660
- "primaryStrong",
661
- "onPrimary",
662
- "warning",
663
- "danger",
664
- "onDanger",
665
- "question",
666
- "onQuestion",
667
- "resolved",
668
- "onResolved",
669
- "onImprove"
670
- ]);
671
- var AA_PAIRS = Object.freeze([
672
- ["text", "background"],
673
- ["text", "chrome"],
674
- ["text", "panel"],
675
- ["text", "raised"],
676
- ["text", "stage"],
677
- ["textMuted", "background"],
678
- ["textMuted", "panel"],
679
- ["primary", "background"],
680
- ["primaryStrong", "background"],
681
- ["onPrimary", "primary"],
682
- ["onPrimary", "primaryStrong"],
683
- ["warning", "background"],
684
- ["danger", "background"],
685
- ["onDanger", "danger"],
686
- ["onQuestion", "question"],
687
- ["onResolved", "resolved"],
688
- ["onImprove", "primaryStrong"]
689
- ]);
690
- function readJson(path, label) {
691
- try {
692
- return JSON.parse(readFileSync(path, "utf8"));
693
- } catch (error) {
694
- throw new ArtifactThemeError(
695
- ARTIFACT_THEME_ERROR_CODES.PARSE,
696
- `Unable to parse ${label}: ${error.message}`,
697
- { path }
698
- );
699
- }
700
- }
701
- function schemaCode(issue) {
702
- if (issue.rule === "required") return ARTIFACT_THEME_ERROR_CODES.TOKEN_MISSING;
703
- if (issue.rule === "additionalProperties") return ARTIFACT_THEME_ERROR_CODES.TOKEN_UNKNOWN;
704
- if (issue.rule === "pattern") return ARTIFACT_THEME_ERROR_CODES.FORMAT;
705
- if (issue.path.includes(".layout.motion")) return ARTIFACT_THEME_ERROR_CODES.MOTION;
706
- if (issue.path.includes(".layout.")) return ARTIFACT_THEME_ERROR_CODES.LAYOUT;
707
- return ARTIFACT_THEME_ERROR_CODES.SCHEMA;
708
- }
709
- function assertSchema(theme, schema) {
710
- const issues = validateJson(theme, schema);
711
- if (issues.length === 0) return;
712
- const first = issues[0];
713
- throw new ArtifactThemeError(
714
- schemaCode(first),
715
- `Invalid artifact theme at ${first.path}: ${first.detail}`,
716
- { issues }
717
- );
718
- }
719
- function assertLayout(layout) {
720
- if (layout.toolbarHeight !== 48 || layout.reviewRailWidth !== 344) {
721
- throw new ArtifactThemeError(
722
- ARTIFACT_THEME_ERROR_CODES.LAYOUT,
723
- "Artifact shell layout must keep a 48px toolbar and 344px review rail.",
724
- { toolbarHeight: layout.toolbarHeight, reviewRailWidth: layout.reviewRailWidth }
725
- );
726
- }
727
- const radii = ["radiusSmall", "radiusMedium", "radiusLarge"].map((key) => [key, layout[key]]);
728
- const invalidRadius = radii.find(
729
- ([, value]) => !Number.isInteger(value) || value < 0 || value > 32
730
- );
731
- if (invalidRadius) {
732
- throw new ArtifactThemeError(
733
- ARTIFACT_THEME_ERROR_CODES.LAYOUT,
734
- `${invalidRadius[0]} must be an integer from 0 through 32.`,
735
- { token: invalidRadius[0], value: invalidRadius[1] }
736
- );
737
- }
738
- if (!(layout.radiusSmall <= layout.radiusMedium && layout.radiusMedium <= layout.radiusLarge)) {
739
- throw new ArtifactThemeError(
740
- ARTIFACT_THEME_ERROR_CODES.LAYOUT,
741
- "Artifact shell radii must be ordered small <= medium <= large.",
742
- { radii: Object.fromEntries(radii) }
743
- );
744
- }
745
- }
746
- function assertMotion(layout) {
747
- for (const token of ["motionFastMs", "motionBaseMs"]) {
748
- const value = layout[token];
749
- if (!Number.isInteger(value) || value < 120 || value > 200) {
750
- throw new ArtifactThemeError(
751
- ARTIFACT_THEME_ERROR_CODES.MOTION,
752
- `${token} must be an integer from 120 through 200 milliseconds.`,
753
- { token, value }
754
- );
755
- }
756
- }
757
- if (layout.motionFastMs > layout.motionBaseMs) {
758
- throw new ArtifactThemeError(
759
- ARTIFACT_THEME_ERROR_CODES.MOTION,
760
- "motionFastMs must not exceed motionBaseMs.",
761
- { motionFastMs: layout.motionFastMs, motionBaseMs: layout.motionBaseMs }
762
- );
763
- }
764
- }
765
- function assertContrast(themes) {
766
- for (const themeName of THEME_NAMES) {
767
- const colors = themes[themeName];
768
- for (const [foreground, background] of AA_PAIRS) {
769
- const ratio = contrastRatio(colors[foreground], colors[background]);
770
- if (ratio == null || ratio < 4.5) {
771
- throw new ArtifactThemeError(
772
- ARTIFACT_THEME_ERROR_CODES.CONTRAST,
773
- `${themeName}.${foreground} on ${themeName}.${background} must meet WCAG AA (4.5:1).`,
774
- { theme: themeName, foreground, background, ratio }
775
- );
776
- }
777
- }
778
- }
779
- }
780
- function validateArtifactTheme(theme, { schema } = {}) {
781
- const contract = schema ?? readJson(ARTIFACT_THEME_SCHEMA_PATH, "artifact theme schema");
782
- assertSchema(theme, contract);
783
- assertLayout(theme.layout);
784
- assertMotion(theme.layout);
785
- assertContrast(theme.themes);
786
- return theme;
787
- }
788
- function pick(source, keys) {
789
- return Object.fromEntries(keys.map((key) => [key, source[key]]));
790
- }
791
- function normalizeArtifactTheme(theme) {
792
- validateArtifactTheme(theme);
793
- return {
794
- kind: theme.kind,
795
- schemaVersion: theme.schemaVersion,
796
- protocolVersion: theme.protocolVersion,
797
- name: theme.name,
798
- typography: pick(theme.typography, TYPOGRAPHY_KEYS),
799
- layout: pick(theme.layout, LAYOUT_KEYS),
800
- themes: Object.fromEntries(
801
- THEME_NAMES.map((themeName) => [themeName, pick(theme.themes[themeName], COLOR_KEYS)])
802
- )
803
- };
804
- }
805
- function loadArtifactTheme({
806
- registryPath = ARTIFACT_THEME_REGISTRY_PATH,
807
- schemaPath = ARTIFACT_THEME_SCHEMA_PATH
808
- } = {}) {
809
- const registry = readJson(registryPath, "artifact theme registry");
810
- const schema = readJson(schemaPath, "artifact theme schema");
811
- validateArtifactTheme(registry, { schema });
812
- return normalizeArtifactTheme(registry);
813
- }
814
- function kebab(value) {
815
- return value.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
816
- }
817
- function colorVariables(colors) {
818
- return COLOR_KEYS.map((key) => ` --planr-color-${kebab(key)}: ${colors[key]};`).join("\n");
819
- }
820
- function renderArtifactThemeCss(theme) {
821
- const value = normalizeArtifactTheme(theme);
822
- const { typography, layout, themes } = value;
823
- const foundations = [
824
- ` --planr-font-display: "${typography.display}", ui-sans-serif, system-ui, sans-serif;`,
825
- ` --planr-font-body: "${typography.body}", ui-sans-serif, system-ui, sans-serif;`,
826
- ` --planr-font-mono: "${typography.mono}", ui-monospace, SFMono-Regular, Consolas, monospace;`,
827
- ` --planr-toolbar-height: ${layout.toolbarHeight}px;`,
828
- ` --planr-review-rail-width: ${layout.reviewRailWidth}px;`,
829
- ` --planr-radius-small: ${layout.radiusSmall}px;`,
830
- ` --planr-radius-medium: ${layout.radiusMedium}px;`,
831
- ` --planr-radius-large: ${layout.radiusLarge}px;`,
832
- ` --planr-motion-fast: ${layout.motionFastMs}ms;`,
833
- ` --planr-motion-base: ${layout.motionBaseMs}ms;`
834
- ].join("\n");
835
- return [
836
- "/* Generated by scripts/generate-artifact-shell.mjs. Do not edit. */",
837
- ":root,",
838
- '[data-planr-theme="dark"] {',
839
- foundations,
840
- colorVariables(themes.dark),
841
- "}",
842
- "",
843
- '[data-planr-theme="light"] {',
844
- colorVariables(themes.light),
845
- "}",
846
- "",
847
- "@media (prefers-color-scheme: light) {",
848
- " :root:not([data-planr-theme]),",
849
- ' [data-planr-theme="auto"] {',
850
- colorVariables(themes.light).replaceAll(/^/gm, " "),
851
- " }",
852
- "}",
853
- "",
854
- "@media (prefers-reduced-motion: reduce) {",
855
- " :root {",
856
- " --planr-motion-fast: 0ms;",
857
- " --planr-motion-base: 0ms;",
858
- " }",
859
- "}",
860
- ""
861
- ].join("\n");
862
- }
863
-
864
- // packages/artifact/lib/artifact/ui/shell.mjs
865
- var ARTIFACT_SHELL_VERSION = "1.2.1";
866
- var ARTIFACT_SHELL_ASSET_PATHS = Object.freeze({
867
- template: "templates/artifact-review-shell.html",
868
- stageRuntime: "templates/artifact-review-stage.js",
869
- manifest: "lib/artifact/ui/generated/artifact-shell-assets.json",
870
- themeCss: "lib/artifact/ui/generated/artifact-theme.css",
871
- themeJson: "lib/artifact/ui/generated/artifact-theme.json"
872
- });
873
- var ARTIFACT_SHELL_CSS = readFileSync2(new URL("./studio-shell.css", new URL("./runtime/packages/artifact/lib/artifact/ui/shell.mjs", import.meta.url).href), "utf8") + `
874
- * { box-sizing: border-box; }
875
- html, body { width: 100%; height: 100%; margin: 0; }
876
- body {
877
- overflow: hidden;
878
- background: var(--planr-color-background);
879
- color: var(--planr-color-text);
880
- font: 400 13px/1.45 var(--planr-font-body);
881
- -webkit-font-smoothing: antialiased;
882
- }
883
- button, input, select, textarea { font: inherit; }
884
- button { color: inherit; }
885
- button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible,
886
- [tabindex]:focus-visible {
887
- outline: 2px solid var(--planr-color-primary);
888
- outline-offset: 2px;
889
- }
890
- [hidden] { display: none !important; }
891
- .planr-visually-hidden {
892
- position: fixed;
893
- width: 1px;
894
- height: 1px;
895
- overflow: hidden;
896
- clip-path: inset(50%);
897
- white-space: nowrap;
898
- }
899
- .planr-shell {
900
- height: 100%;
901
- display: grid;
902
- grid-template-rows: var(--planr-toolbar-height) minmax(0, 1fr);
903
- background: var(--planr-color-background);
904
- }
905
- .planr-toolbar {
906
- position: relative;
907
- z-index: 40;
908
- min-width: 0;
909
- display: flex;
910
- align-items: center;
911
- gap: 10px;
912
- padding: 0 10px 0 14px;
913
- border-bottom: 1px solid var(--planr-color-rule);
914
- background: color-mix(in srgb, var(--planr-color-chrome) 96%, transparent);
915
- }
916
- .planr-brand { min-width: 0; display: flex; align-items: center; gap: 9px; }
917
- .planr-mark { display: inline-grid; place-items: center; width: 22px; height: 22px; flex: none; color: var(--planr-color-primary); contain: paint; }
918
- .planr-mark svg { display: block; width: 100%; height: 100%; }
919
- .planr-title-block { min-width: 0; display: flex; align-items: baseline; gap: 8px; }
920
- .planr-title-block strong {
921
- max-width: 260px;
922
- overflow: hidden;
923
- color: var(--planr-color-text);
924
- font: 650 13px/1 var(--planr-font-display);
925
- letter-spacing: -.01em;
926
- text-overflow: ellipsis;
927
- white-space: nowrap;
928
- }
929
- .planr-title-block span, .planr-privacy {
930
- color: var(--planr-color-text-muted);
931
- font: 10px/1 var(--planr-font-mono);
932
- white-space: nowrap;
933
- }
934
- .planr-privacy { display: inline-flex; align-items: center; gap: 6px; font-family: var(--planr-font-body); }
935
- .planr-privacy::before {
936
- content: "";
937
- width: 6px;
938
- height: 6px;
939
- border-radius: 50%;
940
- background: var(--planr-color-primary);
941
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--planr-color-primary) 14%, transparent);
942
- }
943
- .planr-toolbar-spacer { flex: 1; }
944
- .planr-room-manager { display: inline-flex; align-items: center; gap: 5px; }
945
- .planr-room-manager button { height: 28px; border: 1px solid var(--planr-color-rule); border-radius: var(--planr-radius-small); background: var(--planr-color-panel); color: var(--planr-color-text-muted); font: 650 10px/1 var(--planr-font-body); padding: 0 8px; }
946
- .planr-room-manager button:last-child { border-color: color-mix(in srgb, var(--planr-color-danger) 55%, var(--planr-color-rule)); color: var(--planr-color-danger); }
947
- .planr-shell[data-planr-room-comments-paused] [data-planr-mode="comment"],
948
- .planr-shell[data-planr-room-comments-paused] [data-planr-action="add-comment"] { cursor: not-allowed; opacity: .48; }
949
- .planr-domain-toolbar { min-width: 0; display: inline-flex; align-items: center; gap: 6px; }
950
- .planr-segment {
951
- height: 30px;
952
- display: inline-flex;
953
- align-items: center;
954
- gap: 2px;
955
- padding: 2px;
956
- border: 1px solid var(--planr-color-rule);
957
- border-radius: var(--planr-radius-medium);
958
- background: var(--planr-color-background);
959
- }
960
- .planr-segment button, .planr-toolbar-action {
961
- height: 24px;
962
- border: 0;
963
- border-radius: var(--planr-radius-small);
964
- background: transparent;
965
- color: var(--planr-color-text-muted);
966
- cursor: pointer;
967
- transition: color var(--planr-motion-fast), background var(--planr-motion-fast), transform var(--planr-motion-fast);
968
- }
969
- .planr-segment button { min-width: 26px; padding: 0 8px; font-size: 11px; font-weight: 650; }
970
- .planr-segment button[aria-pressed="true"] {
971
- background: var(--planr-color-primary);
972
- color: var(--planr-color-background);
973
- }
974
- .planr-segment button:disabled { opacity: .45; cursor: not-allowed; }
975
- .planr-toolbar-action {
976
- height: 30px;
977
- padding: 0 12px;
978
- border: 1px solid var(--planr-color-rule);
979
- color: var(--planr-color-text);
980
- font-weight: 700;
981
- text-transform: capitalize;
982
- }
983
- .planr-toolbar-action:hover, .planr-segment button:not(:disabled):hover { background: var(--planr-color-raised); color: var(--planr-color-text); }
984
- .planr-toolbar-action:active, .planr-segment button:not(:disabled):active { transform: scale(.97); }
985
- .planr-share { border-color: var(--planr-color-primary); background: var(--planr-color-primary); color: var(--planr-color-background); }
986
- .planr-count {
987
- min-width: 18px;
988
- height: 18px;
989
- display: inline-grid;
990
- place-items: center;
991
- padding-inline: 4px;
992
- border-radius: 999px;
993
- background: var(--planr-color-raised);
994
- color: var(--planr-color-text-muted);
995
- font: 10px/1 var(--planr-font-mono);
996
- }
997
- .planr-floating-actions {
998
- position: fixed;
999
- z-index: 45;
1000
- top: 50%;
1001
- right: max(12px, env(safe-area-inset-right));
1002
- display: flex;
1003
- flex-direction: column;
1004
- gap: 4px;
1005
- padding: 5px;
1006
- border: 1px solid var(--planr-color-rule);
1007
- border-radius: var(--planr-radius-large);
1008
- background: color-mix(in srgb, var(--planr-color-chrome) 94%, transparent);
1009
- box-shadow: 0 12px 36px color-mix(in srgb, var(--planr-color-background) 38%, transparent);
1010
- backdrop-filter: blur(16px);
1011
- transform: translateY(-50%);
1012
- }
1013
- .planr-floating-actions > button,
1014
- .planr-floating-actions > .planr-more > button {
1015
- position: relative;
1016
- width: 40px;
1017
- height: 40px;
1018
- display: grid;
1019
- place-items: center;
1020
- border: 0;
1021
- border-radius: var(--planr-radius-medium);
1022
- background: transparent;
1023
- color: var(--planr-color-text);
1024
- cursor: pointer;
1025
- transition: color var(--planr-motion-fast), background var(--planr-motion-fast), transform var(--planr-motion-fast);
1026
- }
1027
- .planr-floating-actions button:hover,
1028
- .planr-floating-actions button[aria-pressed="true"],
1029
- .planr-floating-actions button[aria-expanded="true"] {
1030
- background: var(--planr-color-raised);
1031
- color: var(--planr-color-primary);
1032
- }
1033
- .planr-floating-actions button:active { transform: scale(.96); }
1034
- .planr-floating-actions button:disabled { cursor: not-allowed; opacity: .48; }
1035
- .planr-floating-actions svg {
1036
- width: 20px;
1037
- height: 20px;
1038
- fill: none;
1039
- stroke: currentColor;
1040
- stroke-linecap: round;
1041
- stroke-linejoin: round;
1042
- stroke-width: 1.8;
1043
- }
1044
- .planr-floating-actions svg circle { fill: currentColor; stroke: none; }
1045
- .planr-floating-actions [data-planr-action="feedback"] .planr-count {
1046
- position: absolute;
1047
- top: 2px;
1048
- right: 1px;
1049
- min-width: 16px;
1050
- height: 16px;
1051
- padding-inline: 3px;
1052
- background: var(--planr-color-primary);
1053
- color: var(--planr-color-background);
1054
- font-size: 9px;
1055
- }
1056
- .planr-floating-actions [data-planr-tooltip]::after {
1057
- content: attr(data-planr-tooltip);
1058
- position: absolute;
1059
- top: 50%;
1060
- right: calc(100% + 10px);
1061
- width: max-content;
1062
- max-width: 220px;
1063
- padding: 6px 8px;
1064
- border-radius: var(--planr-radius-small);
1065
- background: var(--planr-color-text);
1066
- color: var(--planr-color-background);
1067
- font: 650 10px/1.2 var(--planr-font-body);
1068
- opacity: 0;
1069
- pointer-events: none;
1070
- transform: translate(4px, -50%);
1071
- transition: opacity var(--planr-motion-fast), transform var(--planr-motion-fast);
1072
- }
1073
- .planr-floating-actions [data-planr-tooltip]:hover::after,
1074
- .planr-floating-actions [data-planr-tooltip]:focus-visible::after {
1075
- opacity: 1;
1076
- transform: translate(0, -50%);
1077
- }
1078
- .planr-action-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
1079
- .planr-more { position: relative; }
1080
- .planr-more-menu {
1081
- position: absolute;
1082
- right: calc(100% + 10px);
1083
- bottom: 0;
1084
- width: 250px;
1085
- padding: 8px;
1086
- border: 1px solid var(--planr-color-rule);
1087
- border-radius: var(--planr-radius-medium);
1088
- background: var(--planr-color-panel);
1089
- box-shadow: 0 16px 48px color-mix(in srgb, var(--planr-color-background) 42%, transparent);
1090
- }
1091
- .planr-more-menu > div:first-child { display: grid; gap: 2px; padding: 7px 8px 10px; }
1092
- .planr-more-menu strong { font-size: 12px; }
1093
- .planr-more-menu span { color: var(--planr-color-text-muted); font-size: 10px; }
1094
- .planr-more-menu > button {
1095
- width: 100%;
1096
- min-height: 36px;
1097
- padding: 0 8px;
1098
- border: 0;
1099
- border-radius: var(--planr-radius-small);
1100
- background: transparent;
1101
- text-align: left;
1102
- cursor: pointer;
1103
- }
1104
- .planr-more-menu > button:hover { background: var(--planr-color-raised); }
1105
- .planr-comments-scrim {
1106
- position: fixed;
1107
- z-index: 40;
1108
- inset: 0;
1109
- border: 0;
1110
- background: color-mix(in srgb, var(--planr-color-background) 8%, transparent);
1111
- cursor: default;
1112
- opacity: 1;
1113
- transition: opacity var(--planr-motion-fast);
1114
- }
1115
- .planr-shell[data-planr-rail-open="false"] .planr-comments-scrim {
1116
- opacity: 0;
1117
- pointer-events: none;
1118
- }
1119
- .planr-workspace {
1120
- min-width: 0;
1121
- min-height: 0;
1122
- display: grid;
1123
- grid-template-columns: minmax(0, 1fr) var(--planr-review-rail-width);
1124
- transition: grid-template-columns var(--planr-motion-base);
1125
- }
1126
- .planr-shell[data-planr-rail-open="false"] .planr-workspace { grid-template-columns: minmax(0, 1fr) 0; }
1127
- .planr-stage {
1128
- position: relative;
1129
- min-width: 0;
1130
- min-height: 0;
1131
- overflow: hidden;
1132
- background-color: var(--planr-color-stage);
1133
- background-image: radial-gradient(color-mix(in srgb, var(--planr-color-text-muted) 20%, transparent) 1px, transparent 1px);
1134
- background-size: 20px 20px;
1135
- }
1136
- .planr-stage-heading {
1137
- position: absolute;
1138
- z-index: 12;
1139
- inset: 0 0 auto;
1140
- height: 34px;
1141
- display: flex;
1142
- align-items: center;
1143
- justify-content: space-between;
1144
- padding: 0 14px;
1145
- color: var(--planr-color-text-muted);
1146
- font: 10px/1 var(--planr-font-mono);
1147
- pointer-events: none;
1148
- }
1149
- .planr-stage-controls {
1150
- position: absolute;
1151
- z-index: 13;
1152
- inset: 34px 0 auto;
1153
- min-width: 0;
1154
- min-height: 42px;
1155
- display: flex;
1156
- align-items: center;
1157
- gap: 8px;
1158
- padding: 5px 14px 7px;
1159
- background: linear-gradient(var(--planr-color-stage) 72%, transparent);
1160
- }
1161
- .planr-view-modes { flex: none; }
1162
- .planr-variants {
1163
- min-width: 0;
1164
- display: flex;
1165
- align-items: center;
1166
- gap: 5px;
1167
- overflow: auto;
1168
- scrollbar-width: none;
1169
- }
1170
- .planr-variants button {
1171
- flex: none;
1172
- height: 28px;
1173
- max-width: 220px;
1174
- overflow: hidden;
1175
- padding: 0 10px;
1176
- border: 1px solid var(--planr-color-rule);
1177
- border-radius: var(--planr-radius-small);
1178
- background: var(--planr-color-chrome);
1179
- color: var(--planr-color-text-muted);
1180
- cursor: pointer;
1181
- font-size: 10px;
1182
- font-weight: 650;
1183
- text-overflow: ellipsis;
1184
- white-space: nowrap;
1185
- }
1186
- .planr-variants button span { font-family: var(--planr-font-mono); }
1187
- .planr-variants button[aria-selected="true"] { border-color: var(--planr-color-primary); color: var(--planr-color-text); }
1188
- .planr-stage-scroll { position: absolute; inset: 76px 0 0; overflow: auto; padding: 8px 34px 64px; }
1189
- .planr-stage-surface {
1190
- width: max-content;
1191
- min-width: 100%;
1192
- transform: scale(var(--planr-shell-zoom));
1193
- transform-origin: top left;
1194
- transition: transform var(--planr-motion-fast);
1195
- }
1196
- .planr-frame-grid { width: max-content; display: grid; grid-auto-flow: column; grid-auto-columns: max-content; gap: 12px; }
1197
- .planr-frame-grid[data-planr-layout="single"] .planr-frame-label { display: none; }
1198
- .planr-artifact-panel {
1199
- position: relative;
1200
- width: var(--planr-artifact-width);
1201
- height: var(--planr-artifact-height);
1202
- }
1203
- .planr-frame {
1204
- width: 100%;
1205
- height: 100%;
1206
- overflow: hidden;
1207
- border: 0;
1208
- border-radius: var(--planr-radius-medium);
1209
- background: var(--planr-color-chrome);
1210
- box-shadow: inset 0 0 0 1px var(--planr-color-rule), 0 18px 60px color-mix(in srgb, var(--planr-color-background) 52%, transparent);
1211
- }
1212
- .planr-frame iframe { width: 100%; height: 100%; display: block; border: 0; background: var(--planr-color-chrome); }
1213
- .planr-frame-label {
1214
- position: absolute;
1215
- z-index: 4;
1216
- inset: 10px auto auto 10px;
1217
- padding: 5px 7px;
1218
- border-radius: var(--planr-radius-small);
1219
- background: color-mix(in srgb, var(--planr-color-background) 78%, transparent);
1220
- color: var(--planr-color-text);
1221
- font: 9px/1 var(--planr-font-mono);
1222
- pointer-events: none;
1223
- }
1224
- ${ARTIFACT_ANNOTATION_CSS}.planr-stage-status {
1225
- position: absolute;
1226
- z-index: 20;
1227
- inset: 76px 0 0;
1228
- display: grid;
1229
- place-items: center;
1230
- padding: 24px;
1231
- background: color-mix(in srgb, var(--planr-color-stage) 94%, transparent);
1232
- text-align: center;
1233
- }
1234
- .planr-stage-status > div {
1235
- max-width: 400px;
1236
- padding: 24px;
1237
- border: 1px solid var(--planr-color-rule);
1238
- border-radius: var(--planr-radius-large);
1239
- background: var(--planr-color-chrome);
1240
- box-shadow: 0 18px 60px color-mix(in srgb, var(--planr-color-background) 50%, transparent);
1241
- }
1242
- .planr-stage-status strong { display: block; margin-bottom: 7px; font: 650 18px/1.2 var(--planr-font-display); }
1243
- .planr-stage-status p { margin: 0; color: var(--planr-color-text-muted); }
1244
- .planr-review-rail {
1245
- min-width: 0;
1246
- display: grid;
1247
- grid-template-rows: auto auto minmax(0, 1fr) auto;
1248
- overflow: hidden;
1249
- border-left: 1px solid var(--planr-color-rule);
1250
- background: var(--planr-color-panel);
1251
- transition: opacity var(--planr-motion-fast), transform var(--planr-motion-base);
1252
- }
1253
- .planr-domain-rail { max-height: 44vh; overflow: auto; padding: 12px 14px; border-top: 1px solid var(--planr-color-rule); }
1254
- .planr-domain-rail[hidden] { display: none; }
1255
- .planr-domain-rail h3 { margin: 0 0 8px; font: 650 12px/1.2 var(--planr-font-display); }
1256
- .planr-domain-rail details { border-top: 1px solid var(--planr-color-rule); }
1257
- .planr-domain-rail summary { padding: 9px 0; color: var(--planr-color-text); cursor: pointer; font-weight: 700; }
1258
- .planr-domain-section-body { padding: 1px 0 10px; }
1259
- .planr-domain-rail fieldset { margin: 0 0 9px; padding: 9px; border: 1px solid var(--planr-color-rule); border-radius: var(--planr-radius-small); }
1260
- .planr-domain-rail legend { padding: 0 4px; color: var(--planr-color-text); font-size: 11px; font-weight: 700; }
1261
- .planr-domain-rail label { display: grid; gap: 5px; margin-bottom: 8px; color: var(--planr-color-text-muted); font-size: 11px; }
1262
- .planr-domain-rail input, .planr-domain-rail select, .planr-domain-rail textarea {
1263
- width: 100%; border: 1px solid var(--planr-color-rule); border-radius: var(--planr-radius-small);
1264
- background: var(--planr-color-background); color: var(--planr-color-text); padding: 7px 8px;
1265
- }
1266
- .planr-domain-actions { display: flex; flex-wrap: wrap; gap: 6px; }
1267
- .planr-domain-remix { display: grid; grid-template-columns: 1fr 1fr; gap: 0 8px; }
1268
- .planr-domain-remix label:last-child { grid-column: 1 / -1; }
1269
- .planr-domain-section-body > p { margin: 8px 0 0; color: var(--planr-color-text-muted); font-size: 10px; }
1270
- .planr-domain-actions button, .planr-domain-toolbar button {
1271
- min-height: 28px; border: 1px solid var(--planr-color-rule); border-radius: var(--planr-radius-small);
1272
- background: var(--planr-color-raised); color: var(--planr-color-text); padding: 0 9px; cursor: pointer;
1273
- }
1274
- .planr-shell[data-planr-rail-open="false"] .planr-review-rail { opacity: 0; pointer-events: none; }
1275
- .planr-review-rail > header {
1276
- min-height: 48px;
1277
- display: flex;
1278
- align-items: center;
1279
- justify-content: space-between;
1280
- padding: 0 14px;
1281
- border-bottom: 1px solid var(--planr-color-rule);
1282
- }
1283
- .planr-review-rail h2 { margin: 0; font: 650 13px/1 var(--planr-font-display); }
1284
- .planr-review-metrics { display: flex; align-items: center; gap: 6px; }
1285
- .planr-review-header-actions { display: flex; align-items: center; gap: 8px; }
1286
- .planr-rail-close {
1287
- width: 32px;
1288
- height: 32px;
1289
- display: none;
1290
- place-items: center;
1291
- border: 1px solid var(--planr-color-rule);
1292
- border-radius: var(--planr-radius-small);
1293
- background: var(--planr-color-raised);
1294
- color: var(--planr-color-text);
1295
- font: 20px/1 var(--planr-font-body);
1296
- cursor: pointer;
1297
- }
1298
- .planr-identity { padding: 10px 14px 0; border-bottom: 1px solid var(--planr-color-rule); }
1299
- .planr-identity label { margin-bottom: 5px; }
1300
- .planr-identity-status { min-height: 16px; margin: 0 0 8px !important; color: var(--planr-color-text-muted); font-size: 10px !important; }
1301
- .planr-identity-status[data-planr-identity-ready="true"] { color: var(--planr-color-primary); }
1302
- .planr-identity-status[data-planr-identity-ready="true"]::before { margin-right: 4px; content: '\u2713'; font-weight: 800; }
1303
- .planr-feedback-slot { overflow: auto; padding: 14px; }
1304
- .planr-feedback-slot > p {
1305
- margin: 0;
1306
- padding: 18px;
1307
- border: 1px dashed var(--planr-color-rule);
1308
- border-radius: var(--planr-radius-medium);
1309
- color: var(--planr-color-text-muted);
1310
- text-align: center;
1311
- }
1312
- .planr-thread-list { display: grid; gap: 10px; }
1313
- .planr-review-empty {
1314
- margin: 0;
1315
- padding: 18px;
1316
- border: 1px dashed var(--planr-color-rule);
1317
- border-radius: var(--planr-radius-medium);
1318
- color: var(--planr-color-text-muted);
1319
- text-align: center;
1320
- }
1321
- .planr-thread {
1322
- padding: 11px;
1323
- border: 1px solid var(--planr-color-rule);
1324
- border-left: 3px solid var(--planr-color-danger);
1325
- border-radius: var(--planr-radius-medium);
1326
- background: var(--planr-color-chrome);
1327
- }
1328
- .planr-thread[data-planr-intent="improve"] { border-left-color: var(--planr-color-primary-strong); }
1329
- .planr-thread[data-planr-intent="question"] { border-left-color: var(--planr-color-question); }
1330
- .planr-thread[data-planr-status="resolved"], .planr-thread[data-planr-status="addressed"] { border-left-color: var(--planr-color-resolved); opacity: .82; }
1331
- .planr-thread > header { display: flex; align-items: center; gap: 7px; color: var(--planr-color-text-muted); font-size: 10px; }
1332
- .planr-thread > header strong { color: var(--planr-color-text); font-size: 11px; }
1333
- .planr-thread > header time { margin-left: auto; font-family: var(--planr-font-mono); }
1334
- .planr-review-byline { display: flex; align-items: center; gap: 6px; }
1335
- .planr-intent { color: var(--planr-color-text-muted); text-transform: capitalize; }
1336
- .planr-thread-comment { margin: 9px 0; white-space: pre-wrap; overflow-wrap: anywhere; }
1337
- .planr-thread-actions { display: flex; gap: 6px; }
1338
- .planr-thread-actions button { min-height: 28px; padding-inline: 8px; font-size: 10px; }
1339
- .planr-replies { display: grid; gap: 7px; margin: 10px 0 0 12px; padding-left: 10px; border-left: 1px solid var(--planr-color-rule); list-style: none; }
1340
- .planr-reply { margin: 0; }
1341
- .planr-reply header { display: flex; gap: 6px; color: var(--planr-color-text-muted); font-size: 9px; }
1342
- .planr-reply header time { margin-left: auto; font-family: var(--planr-font-mono); }
1343
- .planr-reply p { margin: 4px 0; white-space: pre-wrap; overflow-wrap: anywhere; }
1344
- .planr-reply-editor { margin-top: 8px; }
1345
- .planr-thread .planr-reply-toggle { min-height: 28px; padding: 2px 0; border-color: transparent; background: transparent; color: var(--planr-color-text-muted); font-size: 12px; font-weight: 550; }
1346
- .planr-thread .planr-reply-toggle:hover, .planr-thread .planr-reply-toggle[aria-expanded="true"] { color: var(--planr-color-primary-strong); }
1347
- .planr-reply-form { display: grid; gap: 6px; margin-top: 6px; }
1348
- .planr-reply-form[hidden] { display: none; }
1349
- .planr-reply-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
1350
- .planr-reply-form textarea { min-height: 64px; max-height: 180px; resize: vertical; font: 13px/1.5 var(--planr-font-body); }
1351
- .planr-reply-controls { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
1352
- .planr-reply-hint { font-size: 11px; color: var(--planr-color-text-muted); }
1353
- .planr-reply-form .planr-reply-send { display: grid; place-items: center; flex: 0 0 30px; width: 30px; min-width: 30px; height: 30px; min-height: 30px; padding: 0; border-radius: 7px; }
1354
- .planr-reply-form .planr-reply-send:disabled { opacity: .35; cursor: not-allowed; }
1355
- ${ARTIFACT_ANNOTATION_MOBILE_CSS}
1356
- .planr-decision-slot { padding: 12px; border-top: 1px solid var(--planr-color-rule); background: var(--planr-color-chrome); }
1357
- .planr-decision-slot label { display: block; margin-bottom: 6px; color: var(--planr-color-text-muted); font-size: 11px; }
1358
- .planr-decision-slot textarea {
1359
- width: 100%;
1360
- min-height: 58px;
1361
- resize: vertical;
1362
- padding: 9px;
1363
- border: 1px solid var(--planr-color-rule);
1364
- border-radius: var(--planr-radius-small);
1365
- background: var(--planr-color-panel);
1366
- color: var(--planr-color-text);
1367
- }
1368
- .planr-decision-slot > div { display: grid; grid-template-columns: 1fr 1.2fr; gap: 8px; margin-top: 8px; }
1369
- .planr-decision-slot button {
1370
- min-height: 32px;
1371
- border: 1px solid var(--planr-color-rule);
1372
- border-radius: var(--planr-radius-small);
1373
- background: transparent;
1374
- cursor: pointer;
1375
- font-weight: 700;
1376
- }
1377
- .planr-decision-slot button[data-planr-decision="approved"] { border-color: var(--planr-color-primary); color: var(--planr-color-primary); }
1378
- .planr-decision-slot button[data-planr-decision="changes_requested"] { border-color: var(--planr-color-danger); background: var(--planr-color-danger); color: var(--planr-color-on-danger); }
1379
- .planr-decision-slot button[aria-pressed="true"] { box-shadow: 0 0 0 2px color-mix(in srgb, currentColor 25%, transparent); }
1380
- .planr-decision-slot > p { min-height: 16px; margin: 7px 0 0; color: var(--planr-color-text-muted); font-size: 10px; }
1381
- [data-planr-slot="dialogs"] { position: fixed; z-index: 80; inset: 0; pointer-events: none; }
1382
- .planr-dialog-backdrop {
1383
- position: fixed;
1384
- inset: 0;
1385
- display: grid;
1386
- place-items: center;
1387
- padding: 20px;
1388
- background: color-mix(in srgb, var(--planr-color-background) 76%, transparent);
1389
- backdrop-filter: blur(8px);
1390
- pointer-events: auto;
1391
- }
1392
- .planr-share-dialog {
1393
- width: min(560px, 100%);
1394
- max-height: calc(100vh - 40px);
1395
- overflow: auto;
1396
- border: 1px solid var(--planr-color-rule);
1397
- border-radius: var(--planr-radius-large);
1398
- background: var(--planr-color-chrome);
1399
- box-shadow: 0 28px 100px color-mix(in srgb, var(--planr-color-background) 68%, transparent);
1400
- animation: planr-dialog-in var(--planr-motion-base);
1401
- }
1402
- .planr-share-dialog > header {
1403
- display: flex;
1404
- align-items: flex-start;
1405
- justify-content: space-between;
1406
- gap: 18px;
1407
- padding: 18px 18px 12px;
1408
- }
1409
- .planr-share-dialog h2 { margin: 0 0 4px; font: 650 18px/1.15 var(--planr-font-display); letter-spacing: -.025em; }
1410
- .planr-share-dialog p { margin: 0; color: var(--planr-color-text-muted); font-size: 12px; }
1411
- .planr-dialog-close {
1412
- width: 32px;
1413
- height: 32px;
1414
- flex: none;
1415
- border: 1px solid var(--planr-color-rule);
1416
- border-radius: var(--planr-radius-small);
1417
- background: transparent;
1418
- color: var(--planr-color-text-muted);
1419
- cursor: pointer;
1420
- font-size: 18px;
1421
- }
1422
- .planr-share-receipt {
1423
- margin: 8px 18px 10px;
1424
- overflow: hidden;
1425
- border: 1px solid var(--planr-color-rule);
1426
- border-radius: var(--planr-radius-medium);
1427
- background: var(--planr-color-panel);
1428
- }
1429
- .planr-share-receipt-row {
1430
- width: 100%;
1431
- min-height: 68px;
1432
- display: grid;
1433
- grid-template-columns: 30px minmax(0, 1fr) auto;
1434
- align-items: center;
1435
- gap: 10px;
1436
- padding: 11px 12px;
1437
- border: 0;
1438
- border-bottom: 1px solid var(--planr-color-rule);
1439
- background: transparent;
1440
- color: var(--planr-color-text);
1441
- text-align: left;
1442
- cursor: pointer;
1443
- }
1444
- .planr-share-receipt-row:last-child { border-bottom: 0; }
1445
- .planr-share-receipt-row.is-selected {
1446
- background: color-mix(in srgb, var(--planr-color-primary) 8%, var(--planr-color-panel));
1447
- box-shadow: inset 3px 0 var(--planr-color-primary);
1448
- }
1449
- .planr-share-receipt-row:disabled { opacity: .55; cursor: not-allowed; }
1450
- .planr-share-receipt-row strong { display: block; margin-bottom: 3px; font-size: 12px; }
1451
- .planr-share-receipt-row small { display: block; color: var(--planr-color-text-muted); font-size: 10.5px; }
1452
- .planr-share-receipt-icon {
1453
- width: 28px;
1454
- height: 28px;
1455
- display: grid;
1456
- place-items: center;
1457
- border-radius: var(--planr-radius-small);
1458
- background: var(--planr-color-raised);
1459
- font: 12px/1 var(--planr-font-mono);
1460
- }
1461
- .planr-share-receipt-size {
1462
- color: var(--planr-color-primary);
1463
- font: 9px/1.25 var(--planr-font-mono);
1464
- letter-spacing: .04em;
1465
- text-align: right;
1466
- text-transform: uppercase;
1467
- }
1468
- .planr-share-threshold { padding: 0 18px; font: 10px/1.4 var(--planr-font-mono); }
1469
- .planr-share-ttl { margin: 12px 18px 0; padding: 12px; border: 1px solid var(--planr-color-rule); border-radius: var(--planr-radius-medium); background: var(--planr-color-panel); }
1470
- .planr-share-ttl label { display: flex; align-items: center; justify-content: space-between; gap: 12px; color: var(--planr-color-text); font-weight: 700; }
1471
- .planr-share-ttl select {
1472
- min-height: 34px;
1473
- padding: 0 28px 0 9px;
1474
- border: 1px solid var(--planr-color-rule);
1475
- border-radius: var(--planr-radius-small);
1476
- background: var(--planr-color-chrome);
1477
- color: var(--planr-color-text);
1478
- }
1479
- .planr-share-ttl p { margin-top: 8px; font-size: 10.5px; }
1480
- .planr-owner-custody { margin: 12px 18px 0; padding: 12px; border: 1px solid var(--planr-color-rule); border-radius: var(--planr-radius-medium); background: color-mix(in srgb, var(--planr-color-warning) 7%, var(--planr-color-panel)); }
1481
- .planr-owner-custody strong, .planr-live-capability strong { display: block; margin-bottom: 3px; color: var(--planr-color-warning); }
1482
- .planr-owner-custody p, .planr-live-capability p { margin: 4px 0 0; font-size: 10.5px; }
1483
- .planr-share-result { margin: 12px 18px 0; padding: 12px; border: 1px solid var(--planr-color-primary); border-radius: var(--planr-radius-medium); background: color-mix(in srgb, var(--planr-color-primary) 6%, var(--planr-color-panel)); }
1484
- .planr-share-result > label { display: block; margin-bottom: 6px; color: var(--planr-color-text-muted); font-size: 10px; }
1485
- .planr-share-result > div { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 7px; }
1486
- .planr-share-result input {
1487
- min-width: 0;
1488
- padding: 8px 9px;
1489
- border: 1px solid var(--planr-color-rule);
1490
- border-radius: var(--planr-radius-small);
1491
- background: var(--planr-color-chrome);
1492
- color: var(--planr-color-text);
1493
- font: 10px/1.3 var(--planr-font-mono);
1494
- }
1495
- .planr-live-capability { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--planr-color-rule); }
1496
- .planr-live-capability > div { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 7px; margin-top: 7px; }
1497
- .planr-share-result button, .planr-share-dialog footer button, .planr-hosted-viewer button {
1498
- min-height: 34px;
1499
- padding: 0 11px;
1500
- border: 1px solid var(--planr-color-rule);
1501
- border-radius: var(--planr-radius-small);
1502
- background: transparent;
1503
- color: var(--planr-color-text);
1504
- cursor: pointer;
1505
- font-weight: 700;
1506
- }
1507
- .planr-share-result button[data-planr-copy-state], .planr-toolbar-action[data-planr-copy-state] {
1508
- min-width: 96px;
1509
- transition: border-color var(--planr-motion-fast), background var(--planr-motion-fast), color var(--planr-motion-fast), transform var(--planr-motion-fast);
1510
- }
1511
- .planr-share-result button[data-planr-copy-state]::before, .planr-toolbar-action[data-planr-copy-state]::before {
1512
- display: inline-grid;
1513
- width: 17px;
1514
- height: 17px;
1515
- place-items: center;
1516
- margin-right: 6px;
1517
- border-radius: 50%;
1518
- content: '';
1519
- font: 800 11px/1 var(--planr-font-mono);
1520
- vertical-align: -1px;
1521
- }
1522
- .planr-share-result button[data-planr-copy-state="copied"], .planr-toolbar-action[data-planr-copy-state="copied"] {
1523
- border-color: var(--planr-color-primary);
1524
- background: color-mix(in srgb, var(--planr-color-primary) 12%, transparent);
1525
- color: var(--planr-color-primary-strong);
1526
- animation: planr-copy-confirm var(--planr-motion-base);
1527
- }
1528
- .planr-share-result button[data-planr-copy-state="copied"]::before, .planr-toolbar-action[data-planr-copy-state="copied"]::before { background: var(--planr-color-primary); color: var(--planr-color-background); content: '\u2713'; }
1529
- .planr-share-result button[data-planr-copy-state="error"], .planr-toolbar-action[data-planr-copy-state="error"] { border-color: var(--planr-color-danger); color: var(--planr-color-danger); }
1530
- .planr-share-result button[data-planr-copy-state="error"]::before, .planr-toolbar-action[data-planr-copy-state="error"]::before { border: 1px solid currentColor; content: '!'; }
1531
- .planr-deletion-receipt { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--planr-color-rule); }
1532
- .planr-deletion-receipt strong { display: block; margin-bottom: 3px; color: var(--planr-color-warning); }
1533
- .planr-deletion-receipt code { display: block; margin: 9px 0; padding: 9px; overflow-wrap: anywhere; border-radius: var(--planr-radius-small); background: var(--planr-color-background); color: var(--planr-color-text); }
1534
- .planr-share-error { margin: 10px 18px 0 !important; color: var(--planr-color-danger) !important; }
1535
- .planr-share-dialog > footer { display: flex; justify-content: flex-end; gap: 8px; padding: 14px 18px 18px; }
1536
- .planr-share-dialog footer .planr-share-confirm { border-color: var(--planr-color-primary); background: var(--planr-color-primary); color: var(--planr-color-background); }
1537
- .planr-share-dialog footer button:disabled { opacity: .55; cursor: wait; }
1538
- .planr-hosted-viewer {
1539
- position: fixed;
1540
- z-index: 70;
1541
- inset: var(--planr-toolbar-height) 0 0;
1542
- display: grid;
1543
- place-items: center;
1544
- padding: 24px;
1545
- background: var(--planr-color-stage);
1546
- }
1547
- .planr-hosted-viewer > div {
1548
- width: min(420px, 100%);
1549
- padding: 28px;
1550
- border: 1px solid var(--planr-color-rule);
1551
- border-radius: var(--planr-radius-large);
1552
- background: var(--planr-color-chrome);
1553
- text-align: center;
1554
- box-shadow: 0 18px 60px color-mix(in srgb, var(--planr-color-background) 50%, transparent);
1555
- }
1556
- .planr-hosted-viewer .planr-mark { width: 40px; height: 40px; margin-bottom: 20px; }
1557
- .planr-hosted-viewer strong { display: block; margin-bottom: 7px; font: 650 19px/1.2 var(--planr-font-display); }
1558
- .planr-hosted-viewer p { margin: 0; color: var(--planr-color-text-muted); }
1559
- .planr-hosted-viewer button { margin-top: 16px; border-color: var(--planr-color-primary); color: var(--planr-color-primary); }
1560
- @keyframes planr-dialog-in { from { opacity: 0; transform: translateY(8px) scale(.985); } }
1561
- @keyframes planr-copy-confirm { 50% { transform: translateY(-1px); } }
1562
- @media (max-width: 900px) {
1563
- .planr-title-block > span, .planr-privacy, .planr-toolbar .planr-segment:first-of-type { display: none; }
1564
- .planr-title-block strong { max-width: 170px; }
1565
- .planr-workspace, .planr-shell[data-planr-rail-open="false"] .planr-workspace { grid-template-columns: minmax(0, 1fr); }
1566
- .planr-review-rail {
1567
- position: fixed;
1568
- z-index: 50;
1569
- inset: auto 0 0;
1570
- height: min(52vh, 480px);
1571
- height: min(52dvh, 480px);
1572
- max-height: calc(100dvh - var(--planr-toolbar-height));
1573
- padding-bottom: env(safe-area-inset-bottom, 0px);
1574
- overscroll-behavior: contain;
1575
- border: 1px solid var(--planr-color-rule);
1576
- border-radius: var(--planr-radius-large) var(--planr-radius-large) 0 0;
1577
- box-shadow: 0 18px 60px color-mix(in srgb, var(--planr-color-background) 52%, transparent);
1578
- }
1579
- .planr-shell[data-planr-rail-open="false"] .planr-review-rail { opacity: 0; visibility: hidden; transform: translate3d(0, calc(100% + env(safe-area-inset-bottom, 0px)), 0); }
1580
- .planr-rail-close { display: grid; }
1581
- .planr-stage-scroll { padding-left: 14px; }
1582
- }
1583
- @media (max-width: 620px) {
1584
- .planr-toolbar {
1585
- gap: 5px;
1586
- padding-left: max(8px, env(safe-area-inset-left));
1587
- padding-right: max(8px, env(safe-area-inset-right));
1588
- }
1589
- .planr-brand { max-width: 128px; }
1590
- .planr-title-block strong { max-width: 96px; }
1591
- .planr-toolbar [data-planr-mode] { min-width: 42px; padding-inline: 7px; }
1592
- .planr-toolbar [data-planr-mode="interact"] { font-size: 0; }
1593
- .planr-toolbar [data-planr-mode="interact"]::before { content: "View"; font-size: 11px; }
1594
- .planr-toolbar-action { padding-inline: 8px; }
1595
- .planr-stage-controls { padding-inline: 10px; }
1596
- .planr-dialog-backdrop { align-items: end; padding: 0; }
1597
- .planr-share-dialog { width: 100%; max-height: min(78vh, 680px); border-radius: var(--planr-radius-large) var(--planr-radius-large) 0 0; }
1598
- }
1599
- @media (max-width: 390px) {
1600
- .planr-toolbar { gap: 5px; padding-inline: 8px; }
1601
- .planr-brand { max-width: 20px; }
1602
- .planr-title-block { display: none; }
1603
- .planr-toolbar-action[data-planr-action="feedback"] { min-width: 32px; padding-inline: 6px; }
1604
- .planr-toolbar-action[data-planr-action="feedback"] .planr-feedback-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
1605
- .planr-variants button { max-width: 150px; padding-inline: 8px; }
1606
- .planr-share-receipt-row { grid-template-columns: 28px minmax(0, 1fr); }
1607
- .planr-share-receipt-size { grid-column: 2; text-align: left; }
1608
- .planr-share-result > div { grid-template-columns: 1fr; }
1609
- }
1610
- /* Document presentation: the artifact owns the page; the iframe is only an
1611
- opaque-origin security boundary and has no visible canvas treatment. */
1612
- html[data-planr-presentation="document"],
1613
- html[data-planr-presentation="document"] body {
1614
- height: auto;
1615
- min-height: 100%;
1616
- }
1617
- html[data-planr-presentation="document"] body { overflow: visible; }
1618
- .planr-shell[data-planr-presentation="document"] {
1619
- height: auto;
1620
- min-height: 100vh;
1621
- display: block;
1622
- }
1623
- .planr-shell[data-planr-presentation="document"] .planr-workspace,
1624
- .planr-shell[data-planr-presentation="document"][data-planr-rail-open="false"] .planr-workspace {
1625
- display: block;
1626
- }
1627
- .planr-shell[data-planr-presentation="document"] .planr-stage {
1628
- overflow: visible;
1629
- background: transparent;
1630
- }
1631
- .planr-shell[data-planr-presentation="document"] .planr-stage-scroll {
1632
- position: static;
1633
- overflow: visible;
1634
- padding: 0;
1635
- }
1636
- .planr-shell[data-planr-presentation="document"] .planr-stage-surface {
1637
- width: 100%;
1638
- min-width: 100%;
1639
- transform: none;
1640
- }
1641
- .planr-shell[data-planr-presentation="document"] .planr-frame-grid {
1642
- width: 100%;
1643
- display: block;
1644
- }
1645
- .planr-shell[data-planr-presentation="document"] .planr-artifact-panel {
1646
- width: 100%;
1647
- max-width: 100%;
1648
- min-width: 0;
1649
- height: var(--planr-document-height, max(var(--planr-artifact-height), 100vh));
1650
- min-height: 100vh;
1651
- }
1652
- .planr-shell[data-planr-presentation="document"] .planr-frame {
1653
- overflow: visible;
1654
- border-radius: 0;
1655
- background: transparent;
1656
- box-shadow: none;
1657
- }
1658
- .planr-shell[data-planr-presentation="document"] .planr-frame iframe {
1659
- width: 100%;
1660
- max-width: 100%;
1661
- background: transparent;
1662
- }
1663
- .planr-shell[data-planr-presentation="document"] .planr-frame-label { display: none; }
1664
- .planr-shell[data-planr-presentation="document"] .planr-stage-status { inset: 0; min-height: 100vh; }
1665
- .planr-shell[data-planr-presentation="document"] .planr-review-rail {
1666
- position: fixed;
1667
- z-index: 50;
1668
- inset: 0 0 0 auto;
1669
- width: min(var(--planr-review-rail-width), 100vw);
1670
- border-left: 1px solid var(--planr-color-rule);
1671
- box-shadow: -18px 0 60px color-mix(in srgb, var(--planr-color-background) 34%, transparent);
1672
- }
1673
- .planr-shell[data-planr-presentation="document"][data-planr-rail-open="false"] .planr-review-rail {
1674
- opacity: 1;
1675
- transform: translateX(100%);
1676
- }
1677
- @media (max-width: 900px) {
1678
- .planr-shell[data-planr-presentation="document"] .planr-floating-actions {
1679
- top: auto;
1680
- right: max(12px, env(safe-area-inset-right));
1681
- bottom: max(12px, env(safe-area-inset-bottom));
1682
- flex-direction: row;
1683
- transform: none;
1684
- }
1685
- .planr-shell[data-planr-presentation="document"] .planr-floating-actions > button,
1686
- .planr-shell[data-planr-presentation="document"] .planr-floating-actions > .planr-more > button {
1687
- width: 44px;
1688
- height: 44px;
1689
- }
1690
- .planr-shell[data-planr-presentation="document"] .planr-floating-actions [data-planr-tooltip]::after { display: none; }
1691
- .planr-shell[data-planr-presentation="document"] .planr-more-menu {
1692
- right: 0;
1693
- bottom: calc(100% + 10px);
1694
- }
1695
- .planr-shell[data-planr-presentation="document"] .planr-review-rail {
1696
- inset: auto 0 0;
1697
- width: 100%;
1698
- max-height: 100dvh;
1699
- }
1700
- .planr-shell[data-planr-presentation="document"][data-planr-rail-open="false"] .planr-review-rail {
1701
- transform: translate3d(0, calc(100% + env(safe-area-inset-bottom, 0px)), 0);
1702
- }
1703
- }
1704
- @media (prefers-reduced-motion: reduce) {
1705
- *, *::before, *::after {
1706
- animation-duration: 0s !important;
1707
- animation-iteration-count: 1 !important;
1708
- scroll-behavior: auto !important;
1709
- transition-duration: 0s !important;
1710
- }
1711
- }
1712
- `;
1713
- var DEFAULT_ARTIFACT_SHELL_INPUT = Object.freeze({
1714
- envelope: Object.freeze({ artifacts: Object.freeze([]) }),
1715
- viewer: Object.freeze({ mode: "single", status: "loading" }),
1716
- shell: Object.freeze({
1717
- title: "OpenPlanr artifact review",
1718
- privacy: "local",
1719
- theme: "auto",
1720
- railOpen: false,
1721
- feedbackCount: 0,
1722
- zoom: 72
1723
- })
1724
- });
1725
- function renderArtifactShellDocument(input = DEFAULT_ARTIFACT_SHELL_INPUT, { theme, stageRuntimeUrl = "./artifact-review-stage.js" } = {}) {
1726
- const model = normalizeArtifactShellModel(input);
1727
- const canonicalTheme = theme ?? loadArtifactTheme();
1728
- const themeCss = renderArtifactThemeCss(canonicalTheme);
1729
- const shellMarkup = renderArtifactShellMarkup(model);
1730
- const modelData = renderArtifactShellModelData(model);
1731
- const stagePayload = createArtifactStagePayload(input.envelope, {
1732
- viewer: input.viewer ?? input.envelope?.viewer
1733
- });
1734
- const reviewState = Object.freeze({
1735
- schemaVersion: "1.0.0",
1736
- reviewOf: digestArtifactEnvelope({
1737
- schemaVersion: input.envelope?.schemaVersion ?? "1.0.0",
1738
- ...input.envelope?.sources ? { sources: input.envelope.sources } : {},
1739
- artifacts: input.envelope?.artifacts ?? [],
1740
- viewer: input.envelope?.viewer ?? input.viewer ?? {}
1741
- }),
1742
- review: input.envelope?.review ?? null
1743
- });
1744
- return `<!doctype html>
1745
- <html lang="en" data-planr-theme="${model.theme}" data-planr-presentation="${model.presentation}" data-planr-artifact-shell="${ARTIFACT_SHELL_VERSION}">
1746
- <head>
1747
- <meta charset="utf-8">
1748
- <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
1749
- <meta name="robots" content="noindex,nofollow,noarchive">
1750
- <meta name="referrer" content="no-referrer">
1751
- <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline' data: blob:; script-src 'self' 'unsafe-inline' data: blob:; frame-src blob:; img-src data: blob:; media-src data: blob:; font-src data:; connect-src 'self'; worker-src data: blob:; object-src 'none'; form-action 'none'; base-uri 'none'">
1752
- <title>${escapeHtml(model.title)} \xB7 OpenPlanr</title>
1753
- <style>
1754
- ${themeCss}${ARTIFACT_SHELL_CSS}</style>
1755
- </head>
1756
- <body>
1757
- ${shellMarkup}
1758
- <script type="application/json" id="planr-artifact-shell-model">${modelData}</script>
1759
- <script type="application/json" id="planr-artifact-stage-payload">${embedJson(stagePayload)}</script>
1760
- <script type="application/json" id="planr-artifact-review-state">${embedJson(reviewState)}</script>
1761
- <script src="${escapeHtml(stageRuntimeUrl)}" defer></script>
1762
- </body>
1763
- </html>
1764
- `;
1765
- }
1766
-
1767
- export {
1768
- contrastRatio,
1769
- AA_NORMAL,
1770
- escapeHtml,
1771
- embedJson,
1772
- renderPlanrMark,
1773
- renderArtifactShellDocument
1774
- };