openplanr 2.2641.2 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/cli/commands/doctor.d.ts.map +1 -1
  3. package/dist/cli/commands/doctor.js +19 -4
  4. package/dist/cli/commands/doctor.js.map +1 -1
  5. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  6. package/dist/cli/commands/upgrade.js +15 -11
  7. package/dist/cli/commands/upgrade.js.map +1 -1
  8. package/dist/cli/error-boundary.d.ts.map +1 -1
  9. package/dist/cli/error-boundary.js +2 -1
  10. package/dist/cli/error-boundary.js.map +1 -1
  11. package/dist/dashboard/.vite/manifest.json +1 -1
  12. package/dist/dashboard/assets/{index-DI_TKz9J.js → index-n08LJ6bK.js} +2 -2
  13. package/dist/dashboard/assets/{index-DI_TKz9J.js.map → index-n08LJ6bK.js.map} +1 -1
  14. package/dist/dashboard/dashboard-manifest.json +8 -8
  15. package/dist/dashboard/index.html +1 -1
  16. package/dist/services/claude-plugin-service.d.ts +9 -0
  17. package/dist/services/claude-plugin-service.d.ts.map +1 -1
  18. package/dist/services/claude-plugin-service.js +12 -0
  19. package/dist/services/claude-plugin-service.js.map +1 -1
  20. package/dist/services/runtime-change-summary.d.ts +4 -0
  21. package/dist/services/runtime-change-summary.d.ts.map +1 -1
  22. package/dist/services/runtime-change-summary.js +7 -0
  23. package/dist/services/runtime-change-summary.js.map +1 -1
  24. package/dist/services/runtime-manager/doctor.js +1 -1
  25. package/dist/services/runtime-manager/doctor.js.map +1 -1
  26. package/dist/services/runtime-manager/runtime-package.d.ts +15 -0
  27. package/dist/services/runtime-manager/runtime-package.d.ts.map +1 -1
  28. package/dist/services/runtime-manager/runtime-package.js +50 -10
  29. package/dist/services/runtime-manager/runtime-package.js.map +1 -1
  30. package/dist/services/runtime-manager-service.d.ts +11 -0
  31. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  32. package/dist/services/runtime-manager-service.js +88 -16
  33. package/dist/services/runtime-manager-service.js.map +1 -1
  34. package/dist/services/upgrade-report.d.ts +2 -2
  35. package/dist/services/upgrade-report.d.ts.map +1 -1
  36. package/dist/services/upgrade-report.js +14 -2
  37. package/dist/services/upgrade-report.js.map +1 -1
  38. package/dist/services/upgrade-service.d.ts +22 -2
  39. package/dist/services/upgrade-service.d.ts.map +1 -1
  40. package/dist/services/upgrade-service.js +108 -20
  41. package/dist/services/upgrade-service.js.map +1 -1
  42. package/docs/CLI.md +4 -1
  43. package/docs/TROUBLESHOOTING.md +9 -6
  44. package/install.ps1 +3 -3
  45. package/install.sh +3 -3
  46. package/lib/host-packages/adapter-registry.json +5 -5
  47. package/lib/host-packages/capability-map.json +1 -1
  48. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  49. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +2 -2
  50. package/lib/host-packages/claude/openplanr/.openplanr-content.json +21 -21
  51. package/lib/host-packages/claude/openplanr/README.md +1 -1
  52. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  53. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  54. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  55. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  56. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  57. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +238 -68
  58. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  59. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  60. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  61. package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +1 -1
  62. package/lib/host-packages/claude/openplanr/skills/delegate/references/capsule-contract.md +1 -1
  63. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +3 -3
  64. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +1 -1
  65. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +1 -1
  66. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +1 -1
  67. package/lib/host-packages/claude/openplanr/skills/doctor/SKILL.md +4 -1
  68. package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +8 -0
  69. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +2 -2
  70. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +20 -20
  71. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  72. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/capsule-contract.md +1 -1
  73. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +3 -3
  74. package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +1 -1
  75. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +1 -1
  76. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +1 -1
  77. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +1 -1
  78. package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +8 -0
  79. package/lib/host-packages/cursor/openplanr/rules/planr-doctor.mdc +4 -1
  80. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +2 -2
  81. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  82. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  83. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  84. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  85. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  86. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +238 -68
  87. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  88. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  89. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  90. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  91. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  92. package/lib/host-packages/openai/openplanr/.openplanr-content.json +20 -20
  93. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  94. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  95. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  96. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  97. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  98. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +238 -68
  99. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  100. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  101. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  102. package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +1 -1
  103. package/lib/host-packages/openai/openplanr/skills/delegate/references/capsule-contract.md +1 -1
  104. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +3 -3
  105. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +1 -1
  106. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +1 -1
  107. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +1 -1
  108. package/lib/host-packages/openai/openplanr/skills/doctor/SKILL.md +4 -1
  109. package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +8 -0
  110. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +2 -2
  111. package/lib/node-runtime.d.mts +1 -1
  112. package/lib/node-runtime.mjs +2 -7
  113. package/package.json +5 -6
  114. package/bin/planr.js +0 -7
@@ -1,2 +1,2 @@
1
1
  /* generated by scripts/typescript/compile-sources.mjs from studio-shell.source.css */
2
- .studio-toolbar{min-width:0;min-height:54px;gap:12px;font:400 13px / 1.4 var(--planr-font-body, "DM Sans", sans-serif);box-sizing:border-box;display:flex;align-items:center;flex-wrap:nowrap;padding:0 16px;width:100%}.studio-toolbar .planr-brand{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.studio-toolbar .planr-mark{display:inline-flex;flex:none;width:28px;height:28px;color:var(--planr-color-primary)}.studio-toolbar .planr-mark svg{display:block;width:100%;height:100%}.studio-toolbar .design-wordmark{font-weight:500;white-space:nowrap;font-size:13px;color:var(--planr-color-text)}.studio-toolbar .design-wordmark>span{font-weight:600;color:var(--planr-color-primary)}.studio-toolbar .planr-title-block{display:flex;align-items:center;gap:7px;min-width:0}.studio-chrome-mount,.studio-panel-mount{display:contents}.studio-toolbar-leading,.studio-toolbar-trailing{min-width:0;display:flex;align-items:center;gap:8px}.studio-toolbar-leading{flex:1}.studio-toolbar-trailing{justify-content:flex-end}.studio-identity{min-width:0}.studio-toolbar .planr-title-block strong{max-width:min(25vw,300px)}.studio-subtitle,.studio-hierarchy{display:block;overflow:hidden;color:var(--planr-color-text-muted);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.studio-hierarchy a{color:inherit}.studio-type-badge{display:inline-flex;flex:none;align-items:center;padding:2px 5px;border:1px solid var(--planr-color-rule);border-radius:var(--planr-radius-small, 5px);color:var(--planr-color-text-muted);font:500 10px / 1.2 var(--planr-font-body);white-space:nowrap}.studio-button,.studio-menu-content,.studio-tooltip,.studio-panel-dialog{border:1px solid var(--planr-color-rule);background:var(--planr-color-panel);color:var(--planr-color-text)}.studio-button{min-height:32px;display:inline-flex;justify-content:center;align-items:center;gap:6px;border-radius:var(--planr-radius-medium, 8px);padding:0 9px;font:500 13px / 1 var(--planr-font-body);cursor:pointer}.studio-button-ghost{background:transparent;border-color:transparent}.studio-button-primary{background:var(--planr-color-primary);border-color:var(--planr-color-primary);color:var(--planr-color-background)}.studio-button:not(:disabled):hover,.studio-button[aria-pressed=true],.studio-button[aria-expanded=true]{background:var(--planr-color-raised);color:var(--planr-color-primary)}.studio-button:disabled,.studio-menu-item[data-disabled]{opacity:0.45;cursor:not-allowed}.studio-button:focus-visible,.studio-menu-item:focus-visible{outline:2px solid var(--planr-color-primary);outline-offset:2px}.studio-menu{display:inline-flex}.studio-menu-content{min-width:180px;max-width:min(320px,calc(100vw - 16px));max-height:var(--radix-dropdown-menu-content-available-height);overflow-y:auto;padding:5px;z-index:160;border-radius:var(--planr-radius-medium, 8px);box-shadow:0 12px 30px color-mix(in srgb,var(--planr-color-background) 60%,transparent)}.studio-menu-item{width:100%;min-height:34px;padding:8px 10px;display:flex;align-items:center;text-align:left;border:0;border-radius:var(--planr-radius-small, 5px);background:transparent;color:inherit;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-menu-item[data-highlighted]{background:var(--planr-color-raised);outline:none;color:var(--planr-color-primary)}.studio-menu-group-start{border-top:1px solid var(--planr-color-rule);border-radius:0}.studio-tooltip{z-index:180;padding:6px 8px;border-radius:var(--planr-radius-small, 5px);font:12px / 1.4 var(--planr-font-body)}.studio-status{min-width:0;display:inline-flex;align-items:center;gap:4px;color:var(--planr-color-text-muted);font:10px / 1.3 var(--planr-font-body)}.studio-status[data-tone=error]{color:var(--planr-color-danger)}.studio-status .studio-button{width:24px;min-height:24px;padding:0}.studio-panel-overlay{position:absolute;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-panel-dialog{position:absolute;top:env(safe-area-inset-top,0px);bottom:env(safe-area-inset-bottom,0px);z-index:180;width:min(350px,calc(100% - 32px));box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent)}.studio-panel-left{left:0}.studio-panel-right{right:0}.studio-panel-close{position:absolute;right:8px;top:8px;z-index:2;width:32px}.studio-panel-content{height:100%;min-height:0}.studio-panel-dialog .design-navigator,.studio-panel-dialog .planr-review-rail,.studio-panel-dialog .diagram-outline{position:static!important;width:100%!important;height:100%!important;max-height:100%!important;transform:none!important;overflow-y:auto;padding-top:42px;border:0}@media(max-width:680px){.studio-toolbar{gap:6px;padding-inline:8px}.studio-toolbar .planr-title-block strong{max-width:30vw}.studio-toolbar .design-wordmark{display:none}.studio-toolbar .design-button-label{display:none}.studio-toolbar .studio-status{max-width:90px}.studio-button{min-height:36px;padding-inline:8px}}.planr-shell[data-studio-framework=react]{--planr-toolbar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-shell[data-studio-framework=react] :is(.design-toolbar,.diagram-toolbar){display:flex;grid-template-columns:none;flex-wrap:wrap;min-height:var(--planr-toolbar-height);height:auto;padding-block:4px;overflow:visible}.planr-shell[data-studio-framework=react] .planr-brand{display:flex;gap:8px;max-width:none;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{flex:0 0 auto;flex-wrap:wrap;max-width:100%}.planr-shell[data-studio-framework=react] .design-toolbar .design-view-picker{display:inline-flex;width:auto;margin:0;border:0}.planr-shell[data-studio-framework=react] .design-export>button{display:inline-flex;width:auto;padding:0 9px}.planr-shell[data-studio-framework=react] .studio-menu-content{position:relative}.planr-shell[data-studio-framework=react] .planr-title-block{display:flex}.planr-shell[data-studio-framework=react]>.planr-workspace{position:relative}@media(max-width:680px){.planr-shell[data-studio-framework=react] .studio-toolbar.planr-toolbar{gap:2px;padding-inline:4px}.planr-shell[data-studio-framework=react] .studio-toolbar-leading,.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:2px}.planr-shell[data-studio-framework=react] .planr-brand{overflow:hidden}.planr-shell[data-studio-framework=react] .studio-identity{display:block;overflow:hidden}.planr-shell[data-studio-framework=react] .planr-mark{width:22px;height:22px}.planr-shell[data-studio-framework=react] .design-view-picker{height:44px;gap:0}.planr-shell[data-studio-framework=react] .design-view-picker button{width:44px;height:100%;padding:0}.planr-shell[data-studio-framework=react] .studio-button{min-width:44px;min-height:44px}.planr-shell[data-studio-framework=react] :is(.design-save-state,.design-preview-state){display:none}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button span{font-size:16px}}@media(max-width:960px){.planr-shell[data-studio-framework=react] .design-wordmark{display:none}.planr-shell[data-studio-framework=react] .planr-workspace>:is(.design-navigator,.planr-review-rail){top:0;max-height:100%}}@media(max-width:1240px){.planr-shell[data-studio-framework=react] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-shell[data-studio-framework=react] .planr-title-block strong{max-width:100%;line-height:1.1}.planr-shell[data-studio-framework=react] .design-preview-state{max-width:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.planr-diagram-editor[data-studio-framework=react]{--de-bar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-diagram-editor[data-studio-framework=react] .de-bar{display:block;padding:0;height:auto;overflow:visible;border-bottom:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar{min-height:60px;height:auto;flex-wrap:wrap;padding:4px 16px;border:0;border-bottom:1px solid var(--de-rule);background:var(--de-panel)}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar :is(.de-command-group,.studio-toolbar-trailing){flex:none}.planr-diagram-editor[data-studio-framework=react] .planr-brand{min-width:min-content;overflow:hidden}.planr-diagram-editor[data-studio-framework=react] .de-title{max-width:25vw;line-height:1.35}.planr-diagram-editor[data-studio-framework=react] .studio-subtitle .de-subtitle{line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .de-alert{grid-row:2;top:var(--de-space-3)}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .design-wordmark,.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .studio-subtitle{display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar{padding:4px 8px;gap:8px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar-trailing{gap:4px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-menu:has([data-studio-palette-menu]){display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .de-more-menu{top:calc(100% + var(--de-space-2))}[data-studio-framework=react]{position:relative}[data-studio-framework=react] .studio-toolbar .studio-type-badge{display:inline-flex}[data-studio-framework=react] .studio-identity{flex:1;min-width:min-content}[data-studio-framework=react] .studio-toolbar .planr-title-block strong{contain:inline-size;display:block;align-self:stretch;width:auto;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-studio-framework=react] .studio-subtitle{contain:inline-size}[data-studio-framework=react]:has(.studio-panel-dialog) [data-planr-close-feedback],[data-studio-framework=react]:has(.studio-panel-dialog) .planr-review-rail [data-planr-close-feedback]{display:none}.studio-panel-dialog .design-nav-close,.studio-panel-dialog .studio-panel-content .planr-review-rail [data-planr-close-feedback]{display:none}.studio-preserved-control{display:contents}.studio-toolbar fieldset.planr-segment{margin:0;padding:0;min-inline-size:0}.diagram-shell[data-present=true] .studio-toolbar-trailing>:not([data-action=present]):not(.studio-menu){display:none}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button{color:var(--planr-color-text);background:var(--planr-color-panel)}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button:enabled:hover{background:var(--planr-color-raised)}@media(max-width:680px){.studio-panel-close{width:44px;min-height:44px}}@media(max-width:700px){.diagram-shell[data-present=true] .studio-toolbar-leading{flex:none}.diagram-shell[data-present=true] .diagram-presentation-nav{min-width:0;flex:1;gap:4px}.diagram-shell[data-present=true] .diagram-presentation-nav>div{min-width:0}}@media(min-width:681px)and (max-width:960px){.diagram-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:4px}}@media(max-width:480px){.studio-toolbar .planr-mark{display:none}}
2
+ .studio-toolbar{min-width:0;min-height:54px;gap:12px;font:400 13px / 1.4 var(--planr-font-body, "DM Sans", sans-serif);box-sizing:border-box;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;flex-wrap:nowrap;padding:0 16px;width:100%}.studio-toolbar .planr-brand{display:flex;align-items:center;gap:8px;min-width:0;max-width:none;flex:1}.studio-toolbar .planr-mark{display:inline-flex;flex:none;width:28px;height:28px;color:var(--planr-color-primary)}.studio-toolbar .planr-mark svg{display:block;width:100%;height:100%}.studio-toolbar .design-wordmark{font-weight:500;white-space:nowrap;font-size:13px;color:var(--planr-color-text)}.studio-toolbar .design-wordmark>span{font-weight:600;color:var(--planr-color-primary)}.studio-toolbar .planr-title-block{display:flex;align-items:center;gap:7px;min-width:0}.studio-toolbar[data-studio-react-chrome=true]{display:grid;padding-inline:16px}.studio-chrome-mount,.studio-panel-mount{display:contents}.studio-toolbar-leading,.studio-toolbar-trailing{min-width:0;display:flex;align-items:center;gap:8px}.studio-toolbar-leading{min-width:0}.studio-toolbar-trailing{justify-content:flex-end;justify-self:end;width:max-content;max-width:100%}.studio-toolbar-center{min-width:0;width:max-content;max-width:100%;justify-self:center}.studio-toolbar[data-studio-react-chrome=true] .studio-toolbar-center .planr-segment{display:inline-flex}.studio-toolbar[data-studio-center=false] .studio-toolbar-center,.studio-toolbar-center:empty,.studio-toolbar-status:empty,.studio-toolbar-actions:empty{display:none}.studio-toolbar-status,.studio-toolbar-actions{display:flex;align-items:center;min-width:0;gap:8px}.studio-toolbar-status{max-width:128px}.studio-toolbar-status>:is(output,.studio-status){display:inline-flex;align-items:center;min-width:0;max-width:none;overflow-wrap:normal}.studio-identity{min-width:0;flex:1;overflow:hidden}.studio-toolbar .planr-title-block strong{max-width:min(25vw,300px);min-width:0;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.studio-toolbar[data-studio-react-chrome=true] .studio-type-badge{display:inline-flex}.studio-subtitle,.studio-hierarchy{display:block;overflow:hidden;color:var(--planr-color-text-muted);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.studio-hierarchy a{color:inherit}.studio-type-badge{display:inline-flex;flex:none;align-items:center;padding:2px 5px;border:1px solid var(--planr-color-rule);border-radius:var(--planr-radius-small, 5px);color:var(--planr-color-text-muted);font:500 10px / 1.2 var(--planr-font-body);white-space:nowrap}.studio-button,.studio-menu-content,.studio-tooltip,.studio-panel-dialog,.studio-dialog{border:1px solid var(--planr-color-rule);background:var(--planr-color-panel);color:var(--planr-color-text)}.studio-button{min-height:32px;display:inline-flex;justify-content:center;align-items:center;gap:6px;border-radius:var(--planr-radius-medium, 8px);padding:0 9px;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-button-ghost{background:transparent;border-color:transparent}.studio-toolbar[data-studio-react-chrome=true] :is(.studio-button,.planr-toolbar-action){height:auto;min-height:32px;padding-block:4px;white-space:nowrap}.studio-button-primary{background:var(--planr-color-primary);border-color:var(--planr-color-primary);color:var(--planr-color-background)}.studio-button:not(:disabled):hover,.studio-button[aria-pressed=true],.studio-button[aria-expanded=true]{background:var(--planr-color-raised);color:var(--planr-color-primary)}.studio-button:disabled,.studio-menu-item[data-disabled]{opacity:0.45;cursor:not-allowed}.studio-button:focus-visible,.studio-menu-item:focus-visible{outline:2px solid var(--planr-color-primary);outline-offset:2px}.studio-menu{display:inline-flex}.studio-menu-content{min-width:180px;max-width:min(320px,calc(100vw - 16px));max-height:var(--radix-dropdown-menu-content-available-height);overflow-y:auto;padding:5px;z-index:160;border-radius:var(--planr-radius-medium, 8px);box-shadow:0 12px 30px color-mix(in srgb,var(--planr-color-background) 60%,transparent)}.studio-menu-item{width:100%;min-height:34px;padding:8px 10px;display:flex;align-items:center;text-align:left;border:0;border-radius:var(--planr-radius-small, 5px);background:transparent;color:inherit;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-menu-item[data-highlighted]{background:var(--planr-color-raised);outline:none;color:var(--planr-color-primary)}.studio-menu-group-start{border-top:1px solid var(--planr-color-rule);border-radius:0}.studio-tooltip{z-index:180;padding:6px 8px;border-radius:var(--planr-radius-small, 5px);font:12px / 1.4 var(--planr-font-body)}.studio-status{min-width:0;display:inline-flex;align-items:center;gap:4px;color:var(--planr-color-text-muted);font:10px / 1.3 var(--planr-font-body)}.studio-status[data-tone=error]{color:var(--planr-color-danger)}.studio-status .studio-button{width:24px;min-height:24px;padding:0}.studio-panel-overlay{position:absolute;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-panel-dialog{position:absolute;top:env(safe-area-inset-top,0px);bottom:env(safe-area-inset-bottom,0px);z-index:180;width:min(350px,calc(100% - 32px));box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent)}.studio-panel-left{left:0}.studio-panel-right{right:0}.studio-panel-close{position:absolute;right:8px;top:8px;z-index:2;width:32px}.studio-dialog-overlay{position:fixed;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-dialog{position:fixed;z-index:180;inset:50% auto auto 50%;transform:translate(-50%,-50%);box-sizing:border-box;width:min(480px,calc(100vw - 32px));max-height:calc(100dvh - 32px);overflow:auto;padding:24px;border-radius:var(--planr-radius-large, 12px);box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent);font:400 13px / 1.5 var(--planr-font-body)}.studio-dialog-title{margin:0 32px 12px 0;font:600 20px / 1.3 var(--planr-font-display)}.studio-dialog-description{color:var(--planr-color-text-muted)}.studio-panel-content{height:100%;min-height:0}.studio-panel-dialog .design-navigator,.studio-panel-dialog .planr-review-rail,.studio-panel-dialog .diagram-outline{position:static!important;width:100%!important;height:100%!important;max-height:100%!important;transform:none!important;overflow-y:auto;padding-top:42px;border:0}@media(max-width:680px){.studio-toolbar{gap:6px;padding-inline:8px}.studio-toolbar .planr-title-block strong{max-width:30vw}.studio-toolbar .design-wordmark{display:none}.studio-toolbar .design-button-label{display:none}.studio-toolbar .studio-status{max-width:90px}.studio-button{min-height:36px;padding-inline:8px}}.planr-shell[data-studio-framework=react]{--planr-toolbar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-shell[data-studio-framework=react] :is(.design-toolbar,.diagram-toolbar){display:grid;grid-template-columns:minmax(0,1fr) auto;min-height:var(--planr-toolbar-height);height:auto;padding-block:4px;overflow:visible}.planr-shell[data-studio-framework=react] .planr-brand{display:flex;gap:8px;max-width:none;min-width:0}.planr-shell[data-studio-framework=react] .studio-toolbar-leading{min-width:0}.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{max-width:100%}.planr-shell[data-studio-framework=react] .design-toolbar .design-view-picker{display:inline-flex;width:auto;height:auto;min-height:32px;margin:0;border:0}.planr-shell[data-studio-framework=react] .design-export>button{display:inline-flex;width:auto;padding:0 9px}.planr-shell[data-studio-framework=react] .studio-menu-content{position:relative}.planr-shell[data-studio-framework=react] .planr-title-block{display:flex}.planr-shell[data-studio-framework=react]>.planr-workspace{position:relative}@media(max-width:680px){.planr-shell[data-studio-framework=react] .studio-toolbar.planr-toolbar{gap:2px;padding-inline:4px}.planr-shell[data-studio-framework=react] .studio-toolbar-leading,.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:2px}.planr-shell[data-studio-framework=react] .planr-brand{overflow:hidden}.planr-shell[data-studio-framework=react] .studio-identity{display:block;overflow:hidden}.planr-shell[data-studio-framework=react] .planr-mark{width:22px;height:22px}.planr-shell[data-studio-framework=react] .design-view-picker{height:auto;min-height:44px;gap:0}.planr-shell[data-studio-framework=react] .design-view-picker button{width:44px;height:auto;padding:0}.planr-shell[data-studio-framework=react] .studio-button{min-width:44px;min-height:44px}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button span{font-size:16px}}@media(max-width:960px){.planr-shell[data-studio-framework=react] .design-wordmark{display:none}.planr-shell[data-studio-framework=react] .planr-workspace>:is(.design-navigator,.planr-review-rail){top:0;max-height:100%}}@media(max-width:1240px){.planr-shell[data-studio-framework=react] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-shell[data-studio-framework=react] .planr-title-block strong{max-width:100%;line-height:1.1}.planr-shell[data-studio-framework=react] .design-preview-state{max-width:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.planr-diagram-editor[data-studio-framework=react]{--de-bar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-diagram-editor[data-studio-framework=react] .de-bar{display:block;padding:0;min-height:0;height:auto;overflow:visible;border-bottom:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar{min-height:60px;height:auto;padding:4px 16px;border:0;border-bottom:1px solid var(--de-rule);background:var(--de-panel)}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar-leading{min-width:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar :is(.de-command-group,.studio-toolbar-trailing){flex:none}.planr-diagram-editor[data-studio-framework=react] .planr-brand{min-width:0;overflow:hidden}.planr-diagram-editor[data-studio-framework=react] .de-title{max-width:25vw;line-height:1.35}.planr-diagram-editor[data-studio-framework=react] .studio-subtitle .de-subtitle{line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .de-alert{grid-row:2;top:var(--de-space-3)}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .design-wordmark,.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .studio-subtitle{display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar{padding:4px 8px;gap:8px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar-trailing{gap:4px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-menu:has([data-studio-palette-menu]){display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .de-more-menu{top:calc(100% + var(--de-space-2))}[data-studio-framework=react]{position:relative}[data-studio-framework=react] .studio-toolbar .studio-type-badge{display:inline-flex}[data-studio-framework=react] .studio-identity{flex:1;min-width:0}[data-studio-framework=react] .studio-toolbar .planr-title-block strong{contain:inline-size;display:block;align-self:stretch;width:auto;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-studio-framework=react] .studio-subtitle{contain:inline-size}[data-studio-framework=react]:has(.studio-panel-dialog) [data-planr-close-feedback],[data-studio-framework=react]:has(.studio-panel-dialog) .planr-review-rail [data-planr-close-feedback]{display:none}.studio-panel-dialog .design-nav-close,.studio-panel-dialog .studio-panel-content .planr-review-rail [data-planr-close-feedback]{display:none}.studio-preserved-control{display:contents}.studio-toolbar fieldset.planr-segment{margin:0;padding:0;min-inline-size:0}.diagram-shell[data-present=true] .studio-toolbar-actions>:not([data-action=present]):not(.studio-menu){display:none}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button{color:var(--planr-color-text);background:var(--planr-color-panel)}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button:enabled:hover{background:var(--planr-color-raised)}@media(max-width:680px){.studio-panel-close{width:44px;min-height:44px}}@media(max-width:700px){.diagram-shell[data-present=true] .studio-toolbar-leading{flex:none}.diagram-shell[data-present=true] .diagram-presentation-nav{min-width:0;flex:1;gap:4px}.diagram-shell[data-present=true] .diagram-presentation-nav>div{min-width:0}}@media(min-width:681px)and (max-width:960px){.diagram-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:4px}}@media(max-width:480px){.studio-toolbar .planr-mark{display:none}}.studio-toolbar[data-studio-center=true],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-center=true]{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr)}.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]{grid-template-columns:minmax(0,1fr);grid-template-rows:none;grid-auto-rows:auto;row-gap:4px;padding-block:4px}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-leading{grid-column:1;grid-row:1;width:100%}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-trailing{grid-column:1;grid-row:2;width:100%;flex-wrap:wrap}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-actions{justify-content:flex-end;flex-wrap:wrap;max-width:100%}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-center{grid-column:1;grid-row:3}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-status{max-width:100%;width:100%;flex-basis:100%;flex-wrap:wrap;justify-content:flex-end}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-status>:is(output,.studio-status,.design-preview-state){max-width:100%;white-space:normal;overflow:visible;overflow-wrap:normal}.studio-toolbar[data-studio-density=narrow]{gap:4px;padding-inline:8px}.studio-toolbar[data-studio-density=narrow] .design-wordmark,.studio-toolbar[data-studio-density=narrow] .design-button-label,.studio-toolbar[data-studio-density=narrow] .planr-mark{display:none}.studio-toolbar[data-studio-density=narrow] .studio-button,.studio-toolbar[data-studio-density=narrow] .planr-toolbar-action,.studio-toolbar[data-studio-density=narrow] .design-view-picker button{min-height:44px;min-width:44px}.studio-toolbar[data-studio-density=narrow] .design-view-picker{height:auto;gap:0}.studio-toolbar[data-studio-density=narrow] .design-view-picker button{width:44px;height:auto;padding:0}.studio-toolbar[data-studio-density=narrow] .studio-toolbar-actions{gap:4px}.studio-toolbar[data-studio-density=narrow] .studio-toolbar-status{font-size:10px}.studio-toolbar[data-studio-density=narrow] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.studio-toolbar[data-studio-density=narrow] :is(.design-export,.diagram-export)>button span{font-size:16px}@media(max-width:680px),(pointer:coarse){.studio-button,.studio-menu-item{min-width:44px;min-height:44px}}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar{grid-template-columns:minmax(0,1fr) auto auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .planr-title-block strong{max-width:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-leading{grid-column:1;grid-row:1}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-center{display:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-secondary{grid-column:3;grid-row:1;display:flex;align-items:center;gap:4px;min-width:0}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-trailing{grid-column:2;grid-row:1;width:auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-actions{flex-wrap:nowrap}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .de-icon-button{min-width:44px;min-height:44px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar button,.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar a{border-radius:8px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar button svg,.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar a svg{width:18px;height:18px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar [data-action=outline]{background:transparent;border-color:transparent}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact]{grid-template-columns:minmax(0,1fr) auto;gap:0 8px;padding-block:0}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-leading{grid-column:1;grid-row:1;width:auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-trailing{grid-column:2;grid-row:1;flex-wrap:nowrap;width:auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-secondary{grid-column:1 / -1;grid-row:2;border-top:0;padding-top:0}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .de-save-state{display:inline-block;flex:1;max-width:none;overflow:visible;white-space:normal;font-size:12px;line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .planr-brand{flex:1}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .de-title{max-width:none;font-size:14px;font-weight:600;line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-type-badge{font-size:10px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-actions{flex-wrap:nowrap}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]){position:relative;isolation:isolate;min-width:44px;min-height:44px;padding:0;border-color:transparent;background:transparent;box-shadow:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem])::before{content:"";position:absolute;z-index:-1;inset:6px;border:1px solid transparent;border-radius:8px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]):is(:hover,[aria-expanded=true],[aria-pressed=true])::before{background:var(--de-raised);border-color:var(--de-rule)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]).de-primary:not(:disabled)::before{background:var(--de-primary);border-color:var(--de-primary)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]).de-primary:hover:not(:disabled)::before{background:var(--de-primary-hover);border-color:var(--de-primary-hover)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]).de-primary:disabled::before{background:var(--de-raised);border-color:var(--de-rule)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]):focus-visible{outline:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]):focus-visible::before{outline:2px solid var(--de-primary);outline-offset:1px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] .de-save-state{font-size:11px}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/design",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Canonical OpenPlanr design helpers and design-loop engine",
@@ -43,11 +43,11 @@
43
43
  "LICENSE"
44
44
  ],
45
45
  "engines": {
46
- "node": ">=20.19.0"
46
+ "node": ">=22.13.0"
47
47
  },
48
48
  "dependencies": {
49
- "@openplanr/artifact": "0.6.5",
50
- "@openplanr/protocol": "0.10.3"
49
+ "@openplanr/artifact": "0.6.7",
50
+ "@openplanr/protocol": "0.12.0"
51
51
  },
52
52
  "scripts": {
53
53
  "test": "node --test --test-concurrency=2 tests/*.test.mjs",
@@ -267,8 +267,13 @@ html[data-design-theme="light"] .design-export > div { box-shadow:0 12px 30px #1
267
267
 
268
268
  /* A shared sizing contract keeps captions, tools and service status from
269
269
  overlapping. It belongs to the shell; iframe documents inherit none of it. */
270
- [data-design-studio] .design-stage-context { height:var(--design-stage-context-height); }
271
- [data-design-studio] .planr-shell:not([data-design-presentation="true"]) .planr-stage-scroll { inset-block-start:var(--design-stage-context-height); }
270
+ [data-design-studio] .design-stage-context { height:auto; min-height:var(--design-stage-context-height); flex-wrap:wrap; }
271
+ [data-design-studio] .design-stage-context > div:first-child { flex:1 1 220px; max-width:100%; }
272
+ [data-design-studio] .design-stage-context > .design-stage-actions { flex:0 1 auto; flex-wrap:wrap; max-width:100%; }
273
+ [data-design-studio] .design-frame-picker { min-width:0; max-width:100%; }
274
+ [data-design-studio] .design-frame-picker select { min-width:0; flex:1 1 auto; appearance:none; line-height:1.3; min-height:32px; padding-inline-end:26px; background-image:linear-gradient(45deg,transparent 50%,var(--planr-color-text) 50%),linear-gradient(135deg,var(--planr-color-text) 50%,transparent 50%); background-position:calc(100% - 12px) 50%,calc(100% - 8px) 50%; background-size:4px 4px; background-repeat:no-repeat; }
275
+ [data-design-studio] .design-guidance > summary { height:auto; min-height:30px; padding-block:4px; line-height:1.3; white-space:nowrap; }
276
+ [data-design-studio] .planr-shell:not([data-design-presentation="true"]) .planr-stage-scroll { inset-block-start:var(--design-stage-context-measured-height,var(--design-stage-context-height)); }
272
277
  [data-design-studio] .planr-shell[data-design-view="prototype"]:not([data-design-presentation="true"]) .planr-stage-scroll { bottom:calc(var(--design-tools-space) + var(--design-status-space)); }
273
278
  [data-design-studio] .planr-shell[data-design-view="walkthrough"]:not([data-design-presentation="true"]) .planr-stage-scroll { bottom:calc(var(--design-tools-space) + var(--design-caption-height) + var(--design-status-space)); }
274
279
  [data-design-studio] .design-walkthrough-caption { height:var(--design-caption-height); min-height:var(--design-caption-height); max-height:var(--design-caption-height); bottom:var(--design-status-space); }
@@ -286,14 +291,14 @@ html[data-design-theme="light"] .design-export > div { box-shadow:0 12px 30px #1
286
291
  font-size:var(--design-type-control); line-height:1.4; min-height:var(--design-touch-target);
287
292
  min-width:0; max-width:100%; border-radius:8px; padding:10px 12px; scroll-margin-block:16px;
288
293
  }
289
- :root[data-design-studio] body select { height:var(--design-touch-target); }
294
+ :root[data-design-studio] body select { height:auto; min-height:var(--design-touch-target); }
290
295
  :root[data-design-studio] body :is(button:not(.planr-pin):not(.design-minimap-close),.design-export > summary,.design-tools-menu > summary,.design-guidance > summary) {
291
296
  min-height:var(--design-touch-target); min-width:var(--design-touch-target); touch-action:manipulation;
292
297
  }
293
298
  :root[data-design-studio] body :is(.design-dialog-close,.design-nav-close,.planr-rail-close,.planr-composer-header button) {
294
299
  width:var(--design-touch-target); height:var(--design-touch-target); flex-basis:var(--design-touch-target);
295
300
  }
296
- :root[data-design-studio] .design-canvas-tools button { height:var(--design-touch-target); white-space:nowrap; }
301
+ :root[data-design-studio] .design-canvas-tools button { height:auto; min-height:var(--design-touch-target); white-space:nowrap; }
297
302
  :root[data-design-studio] :is(.design-dialog-content,.design-inspector,.planr-thread-comment,.planr-reply) { font-size:var(--design-type-body); }
298
303
  :root[data-design-studio] :is(.design-profile-form > label,.planr-annotation-composer label,.planr-identity label,.design-profile-form legend) { font-size:var(--design-type-label); }
299
304
  :root[data-design-studio] :is(.design-muted,.design-profile-form > .design-muted,.design-dialog-status) { font-size:var(--design-type-label); }
@@ -365,6 +370,11 @@ html[data-design-theme="light"] .design-export > div { box-shadow:0 12px 30px #1
365
370
  :root[data-design-studio] .planr-shell { height:var(--design-frozen-shell-height,100%); }
366
371
  :root[data-design-studio] .design-toolbar { grid-template-columns:auto minmax(0,1fr) auto; grid-template-rows:52px; padding:0 max(8px,env(safe-area-inset-right,0px)) 0 max(8px,env(safe-area-inset-left,0px)); }
367
372
  :root[data-design-studio] .design-toolbar .planr-brand { display:none; }
373
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] { grid-template-columns:auto minmax(0,1fr); }
374
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-leading { grid-column:1; grid-row:1; width:auto; }
375
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-trailing { grid-column:2; grid-row:1; width:auto; flex-wrap:nowrap; }
376
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-center { grid-column:1 / -1; grid-row:2; }
377
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-status { width:auto; flex-basis:auto; max-width:128px; }
368
378
  :root[data-design-studio] .design-toolbar-trailing { grid-column:3; }
369
379
  :root[data-design-studio] .design-view-picker { grid-column:2; grid-row:1; }
370
380
  :root[data-design-studio] .design-stage-context { flex-wrap:nowrap; padding:4px 12px; }
@@ -506,6 +506,11 @@
506
506
  transform: translateX(-50%);
507
507
  display: flex;
508
508
  align-items: center;
509
+ flex-wrap: wrap;
510
+ justify-content: center;
511
+ width: max-content;
512
+ max-width: calc(100% - 32px);
513
+ box-sizing: border-box;
509
514
  gap: 2px;
510
515
  padding: 4px;
511
516
  border: 1px solid var(--planr-color-rule);
@@ -514,22 +519,26 @@
514
519
  box-shadow: 0 8px 28px #0006;
515
520
  }
516
521
  .design-canvas-tools button {
517
- height: 28px;
522
+ height: auto;
523
+ min-height: 28px;
518
524
  min-width: 28px;
519
- padding: 0 8px;
525
+ flex: none;
526
+ padding: 4px 8px;
520
527
  border: 0;
521
528
  border-radius: 4px;
522
529
  background: transparent;
523
530
  font-size: 11px;
531
+ line-height: 1.3;
532
+ white-space: nowrap;
524
533
  cursor: pointer;
525
534
  }
526
535
  .design-canvas-tools [data-design-zoom="reset"] {
527
- flex: 0 0 56px;
528
- width: 56px;
536
+ flex: 0 0 auto;
537
+ width: auto;
529
538
  min-width: 56px;
530
539
  font-variant-numeric: tabular-nums;
531
540
  }
532
- .design-interaction-picker { height:30px; padding:0; border:0; background:transparent; }
541
+ .design-interaction-picker { height:auto; min-height:30px; flex:none; padding:0; border:0; background:transparent; }
533
542
  .design-interaction-picker button { display:flex; align-items:center; gap:6px; }
534
543
  .design-interaction-picker .design-button-label { display:none; }
535
544
  .design-canvas-tools .design-interaction-picker button[aria-pressed="true"] { background:var(--planr-color-raised); color:var(--planr-color-primary); }
@@ -2307,6 +2307,33 @@ ${fence}`;
2307
2307
  );
2308
2308
  content.append(value, reason, save);
2309
2309
  }
2310
+ function installStageContextGeometry() {
2311
+ const context = q(".design-stage-context", root);
2312
+ if (!context) return;
2313
+ let frame = 0;
2314
+ const measure = () => {
2315
+ frame = 0;
2316
+ if (disposed) return;
2317
+ const height = Math.ceil(context.getBoundingClientRect().height);
2318
+ const value = `${height}px`;
2319
+ if (height && root.style.getPropertyValue("--design-stage-context-measured-height") !== value)
2320
+ root.style.setProperty("--design-stage-context-measured-height", value);
2321
+ };
2322
+ const schedule = () => {
2323
+ if (!frame && !disposed) frame = requestAnimationFrame(measure);
2324
+ };
2325
+ const observer = typeof ResizeObserver === "function" ? new ResizeObserver(schedule) : null;
2326
+ observer?.observe(context);
2327
+ on(window, "resize", schedule);
2328
+ on(root, "planr:design-render", schedule);
2329
+ void document.fonts?.ready.then(schedule);
2330
+ measure();
2331
+ destroyers.push(() => {
2332
+ observer?.disconnect();
2333
+ cancelAnimationFrame(frame);
2334
+ root.style.removeProperty("--design-stage-context-measured-height");
2335
+ });
2336
+ }
2310
2337
  function installCanvas() {
2311
2338
  const tools = q(".design-canvas-tools");
2312
2339
  const more = node("details", "", { class: "design-tools-menu" });
@@ -3494,6 +3521,7 @@ ${fence}`;
3494
3521
  installComposerCategory();
3495
3522
  installInspector();
3496
3523
  installCanvas();
3524
+ installStageContextGeometry();
3497
3525
  installThumbnails();
3498
3526
  installPersonalDrafts();
3499
3527
  about(true);
@@ -32,6 +32,34 @@
32
32
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("rect", { x: "127", y: "71", width: "18", height: "18", rx: "3", fill: "currentColor" })
33
33
  ] }) }) });
34
34
  }
35
+ function inlineGap(element) {
36
+ const view = element?.ownerDocument.defaultView;
37
+ return view && element ? parseFloat(view.getComputedStyle(element).gap) || 0 : 0;
38
+ }
39
+ function measureLeadingFloor(leading) {
40
+ const view = leading.ownerDocument.defaultView;
41
+ if (!view) return 128;
42
+ const leadingControls = [...leading.children].filter(
43
+ (node) => node instanceof view.HTMLElement && !node.classList.contains("planr-brand") && node.getClientRects().length > 0
44
+ );
45
+ const branding = [
46
+ ...leading.querySelectorAll(".planr-mark,.design-wordmark")
47
+ ].filter((node) => node.getClientRects().length);
48
+ const brandGap = inlineGap(leading.querySelector(".planr-brand"));
49
+ const brandingWidth = branding.reduce(
50
+ (total, node) => total + node.getBoundingClientRect().width + brandGap,
51
+ 0
52
+ );
53
+ const titleBlock = leading.querySelector(".planr-title-block");
54
+ const badge = titleBlock?.querySelector(".studio-type-badge");
55
+ const title = titleBlock?.querySelector("strong,.de-title");
56
+ const titleFloor = Math.max(36, parseFloat(view.getComputedStyle(title ?? leading).fontSize) * 3);
57
+ const identityFloor = Math.max(
58
+ 128,
59
+ (badge?.getBoundingClientRect().width || 0) + inlineGap(titleBlock) + titleFloor
60
+ );
61
+ return identityFloor + brandingWidth + leadingControls.reduce((total, control) => total + control.getBoundingClientRect().width, 0) + leadingControls.length * inlineGap(leading);
62
+ }
35
63
  function StudioToolbar({
36
64
  title,
37
65
  titleNode,
@@ -44,38 +72,123 @@
44
72
  viewPicker,
45
73
  status,
46
74
  actions,
75
+ secondaryActions,
47
76
  className = ""
48
77
  }) {
49
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(Tag, { className: `planr-toolbar studio-toolbar ${className}`, "data-studio-react-chrome": "true", children: [
50
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-toolbar-leading design-toolbar-leading", children: [
51
- leading,
52
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "planr-brand", children: [
53
- brand && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
54
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(StudioMark, {}),
55
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "design-wordmark", children: [
56
- "Open",
57
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: "Planr" })
78
+ const toolbar = (0, import_react3.useRef)(null);
79
+ (0, import_react3.useLayoutEffect)(() => {
80
+ const element = toolbar.current;
81
+ const window2 = element?.ownerDocument.defaultView;
82
+ if (!element || !window2) return;
83
+ const center = element.querySelector(".studio-toolbar-center");
84
+ const trailing = element.querySelector(".studio-toolbar-trailing");
85
+ const leading2 = element.querySelector(".studio-toolbar-leading");
86
+ const secondary = element.querySelector(".studio-toolbar-secondary");
87
+ if (!center || !trailing || !leading2) return;
88
+ const measure = () => {
89
+ const width = element.getBoundingClientRect().width;
90
+ if (!width) return;
91
+ element.dataset.studioDensity = width <= 680 ? "narrow" : "regular";
92
+ const style = window2.getComputedStyle(element);
93
+ const available = width - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight);
94
+ const gap = Math.max(12, parseFloat(style.columnGap) || 0);
95
+ element.dataset.studioCenter = "true";
96
+ const centerWidth = center.scrollWidth;
97
+ element.dataset.studioCenter = String(centerWidth > 0);
98
+ const controlSelector = 'button,a,summary,input,select,output,[role="status"]';
99
+ const controls = [
100
+ ...trailing.querySelectorAll(controlSelector),
101
+ ...secondary?.querySelectorAll(controlSelector) ?? []
102
+ ].filter(
103
+ (control) => control.getClientRects().length && !control.closest('[role="menu"],.studio-tooltip,[role="dialog"]') && (!control.closest("details") || !!control.closest("summary")) && !control.parentElement?.closest(controlSelector)
104
+ );
105
+ const actionWidth = controls.reduce((total, control) => {
106
+ if (secondary?.contains(control) && control.getAttribute("role") === "status") {
107
+ const range = element.ownerDocument.createRange();
108
+ range.selectNodeContents(control);
109
+ const textWidth = range.getBoundingClientRect().width;
110
+ const controlStyle = window2.getComputedStyle(control);
111
+ return total + textWidth + (parseFloat(controlStyle.paddingLeft) || 0) + (parseFloat(controlStyle.paddingRight) || 0);
112
+ }
113
+ return total + control.getBoundingClientRect().width;
114
+ }, 0) + Math.max(0, controls.length - 1) * (parseFloat(window2.getComputedStyle(trailing).gap) || 8);
115
+ const leadingFloor = measureLeadingFloor(leading2);
116
+ const outerWidth = Math.max(leadingFloor, actionWidth);
117
+ element.dataset.studioLayout = centerWidth > 0 ? width <= 680 || centerWidth + outerWidth * 2 + gap * 2 > available ? "compact" : "inline" : leadingFloor + actionWidth + gap > available ? "compact" : "inline";
118
+ };
119
+ measure();
120
+ let frame = 0;
121
+ const scheduleMeasure = () => {
122
+ if (frame) return;
123
+ frame = window2.requestAnimationFrame(() => {
124
+ frame = 0;
125
+ measure();
126
+ });
127
+ };
128
+ const resize = typeof window2.ResizeObserver === "function" ? new window2.ResizeObserver(scheduleMeasure) : null;
129
+ for (const node of [element, center, trailing, secondary]) if (node) resize?.observe(node);
130
+ const mutations = new window2.MutationObserver(scheduleMeasure);
131
+ mutations.observe(element, {
132
+ subtree: true,
133
+ childList: true,
134
+ characterData: true,
135
+ attributes: true,
136
+ attributeFilter: ["hidden"]
137
+ });
138
+ window2.addEventListener("resize", scheduleMeasure);
139
+ let active = true;
140
+ void element.ownerDocument.fonts?.ready.then(() => {
141
+ if (active) scheduleMeasure();
142
+ });
143
+ return () => {
144
+ active = false;
145
+ resize?.disconnect();
146
+ mutations.disconnect();
147
+ window2.cancelAnimationFrame(frame);
148
+ window2.removeEventListener("resize", scheduleMeasure);
149
+ };
150
+ }, [Tag]);
151
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
152
+ Tag,
153
+ {
154
+ ref: (node) => {
155
+ toolbar.current = node;
156
+ },
157
+ className: `planr-toolbar studio-toolbar ${className}`,
158
+ "data-studio-react-chrome": "true",
159
+ children: [
160
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-toolbar-leading design-toolbar-leading", children: [
161
+ leading,
162
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "planr-brand", children: [
163
+ brand && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
164
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(StudioMark, {}),
165
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "design-wordmark", children: [
166
+ "Open",
167
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: "Planr" })
168
+ ] })
169
+ ] }),
170
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-identity", children: [
171
+ hierarchy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("nav", { className: "studio-hierarchy", "aria-label": "Project path", children: hierarchy.map((item, index2) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
172
+ index2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": "true", children: " / " }),
173
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: item.href, children: item.label }) : item.label
174
+ ] }, item.href ?? item.label)) }),
175
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "planr-title-block", children: [
176
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(StudioBadge, { children: kind === "artifact" ? "Artifact" : kind === "diagram" ? "Diagram" : "Design" }),
177
+ titleNode ?? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { title, children: title })
178
+ ] }),
179
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "studio-subtitle", children: subtitle })
180
+ ] })
58
181
  ] })
59
182
  ] }),
60
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-identity", children: [
61
- hierarchy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("nav", { className: "studio-hierarchy", "aria-label": "Project path", children: hierarchy.map((item, index2) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
62
- index2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": "true", children: " / " }),
63
- item.href ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: item.href, children: item.label }) : item.label
64
- ] }, item.href ?? item.label)) }),
65
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "planr-title-block", children: [
66
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(StudioBadge, { children: kind === "artifact" ? "Artifact" : kind === "diagram" ? "Diagram" : "Design" }),
67
- titleNode ?? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { title, children: title })
68
- ] }),
69
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "studio-subtitle", children: subtitle })
70
- ] })
71
- ] })
72
- ] }),
73
- viewPicker,
74
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-toolbar-trailing design-toolbar-trailing", children: [
75
- status,
76
- actions
77
- ] })
78
- ] });
183
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "studio-toolbar-center", children: viewPicker }),
184
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-toolbar-trailing design-toolbar-trailing", children: [
185
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "studio-toolbar-status", children: status }),
186
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "studio-toolbar-actions", children: actions })
187
+ ] }),
188
+ secondaryActions && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "studio-toolbar-secondary", children: secondaryActions })
189
+ ]
190
+ }
191
+ );
79
192
  }
80
193
  function StudioMenu({
81
194
  label,
@@ -86,49 +199,106 @@
86
199
  onOpenChange
87
200
  }) {
88
201
  const trigger = (0, import_react3.useRef)(null);
89
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports5.Root, { modal: false, open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: `studio-menu ${className}`, children: [
90
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports5.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(StudioButton, { "aria-label": label, title: label, ...triggerAttributes, ref: trigger, children: [
91
- label,
92
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": "true", children: "⌄" })
93
- ] }) }),
94
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
95
- dist_exports5.Content,
96
- {
97
- className: "studio-menu-content",
98
- align: "end",
99
- sideOffset: 8,
100
- collisionPadding: 8,
101
- onCloseAutoFocus: (event) => {
102
- event.preventDefault();
103
- const content = event.target;
104
- const ownerDocument = content?.ownerDocument;
105
- const active = ownerDocument?.activeElement;
106
- if (active?.isConnected && active !== ownerDocument?.body && active !== ownerDocument?.documentElement && !content?.contains(active))
107
- return;
108
- if (trigger.current?.isConnected) trigger.current.focus();
109
- },
110
- children: items.map((item, index2) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
111
- dist_exports5.Item,
202
+ const mousePosition = (0, import_react3.useRef)(null);
203
+ const keyboardPosition = (0, import_react3.useRef)(null);
204
+ (0, import_react3.useLayoutEffect)(() => {
205
+ const ownerDocument = trigger.current?.ownerDocument;
206
+ if (!ownerDocument) return;
207
+ const move = (event) => {
208
+ if (event.pointerType !== "mouse") return;
209
+ const position = { x: event.clientX, y: event.clientY };
210
+ const previous = keyboardPosition.current;
211
+ if (previous && (previous.x !== position.x || previous.y !== position.y))
212
+ keyboardPosition.current = null;
213
+ mousePosition.current = position;
214
+ };
215
+ const down = (event) => {
216
+ keyboardPosition.current = null;
217
+ if (event.pointerType === "mouse")
218
+ mousePosition.current = { x: event.clientX, y: event.clientY };
219
+ };
220
+ ownerDocument.addEventListener("pointermove", move, true);
221
+ ownerDocument.addEventListener("pointerdown", down, true);
222
+ return () => {
223
+ ownerDocument.removeEventListener("pointermove", move, true);
224
+ ownerDocument.removeEventListener("pointerdown", down, true);
225
+ };
226
+ }, []);
227
+ const retainKeyboardFocus = (event) => {
228
+ const position = keyboardPosition.current;
229
+ if (event.pointerType === "mouse" && position?.x === event.clientX && position.y === event.clientY)
230
+ event.preventDefault();
231
+ };
232
+ const keyboardInput = () => {
233
+ keyboardPosition.current = mousePosition.current;
234
+ };
235
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
236
+ dist_exports5.Root,
237
+ {
238
+ modal: false,
239
+ open,
240
+ onOpenChange: (value) => {
241
+ if (!value) keyboardPosition.current = null;
242
+ onOpenChange?.(value);
243
+ },
244
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: `studio-menu ${className}`, children: [
245
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports5.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
246
+ StudioButton,
247
+ {
248
+ "aria-label": label,
249
+ title: label,
250
+ ...triggerAttributes,
251
+ ref: trigger,
252
+ onKeyDownCapture: keyboardInput,
253
+ children: [
254
+ label,
255
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": "true", children: "⌄" })
256
+ ]
257
+ }
258
+ ) }),
259
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
260
+ dist_exports5.Content,
112
261
  {
113
- asChild: true,
114
- disabled: item.disabled,
115
- onSelect: item.onSelect,
116
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
117
- "button",
262
+ className: "studio-menu-content",
263
+ align: "end",
264
+ sideOffset: 8,
265
+ collisionPadding: 8,
266
+ onKeyDownCapture: keyboardInput,
267
+ onCloseAutoFocus: (event) => {
268
+ event.preventDefault();
269
+ const content = event.target;
270
+ const ownerDocument = content?.ownerDocument;
271
+ const active = ownerDocument?.activeElement;
272
+ if (active?.isConnected && active !== ownerDocument?.body && active !== ownerDocument?.documentElement && !content?.contains(active))
273
+ return;
274
+ if (trigger.current?.isConnected) trigger.current.focus();
275
+ },
276
+ children: items.map((item, index2) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
277
+ dist_exports5.Item,
118
278
  {
119
- type: "button",
120
- className: `studio-menu-item${index2 > 0 && item.group !== items[index2 - 1].group ? " studio-menu-group-start" : ""}`,
279
+ asChild: true,
121
280
  disabled: item.disabled,
122
- ...item.attributes,
123
- children: item.label
124
- }
125
- )
126
- },
127
- item.id
128
- ))
129
- }
130
- )
131
- ] }) });
281
+ onSelect: item.onSelect,
282
+ onPointerMove: retainKeyboardFocus,
283
+ onPointerLeave: retainKeyboardFocus,
284
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
285
+ "button",
286
+ {
287
+ type: "button",
288
+ className: `studio-menu-item${index2 > 0 && item.group !== items[index2 - 1].group ? " studio-menu-group-start" : ""}`,
289
+ disabled: item.disabled,
290
+ ...item.attributes,
291
+ children: item.label
292
+ }
293
+ )
294
+ },
295
+ item.id
296
+ ))
297
+ }
298
+ )
299
+ ] })
300
+ }
301
+ );
132
302
  }
133
303
  function StudioPanelDialog({
134
304
  open,
@@ -2,8 +2,8 @@
2
2
  "kind": "openplanr-runtime-asset-sources",
3
3
  "schemaVersion": "1.0.0",
4
4
  "asset": "studio.js",
5
- "bytes": 1136703,
6
- "sha256": "24745f5b2327275efa2cb904652c4451b16a6893d4284e375a3ce986d909f49e",
5
+ "bytes": 1146075,
6
+ "sha256": "f649b59fe0a31ec9055d6e5bf5b68425c1fe4e996224c35603d84f91021949cf",
7
7
  "scopes": [
8
8
  {
9
9
  "id": "bundle",
@@ -143,8 +143,8 @@
143
143
  "packages/design/lib/design/ui/enhancements.mjs",
144
144
  "packages/design/lib/design/ui/handoff-center.mjs"
145
145
  ],
146
- "bytes": 151613,
147
- "sha256": "c40392e1328eb17f9d0a778d1f20e44118731d7c6a0a25f0aa731304a86994a0"
146
+ "bytes": 152776,
147
+ "sha256": "9e2ac3d6b99028c7335aacf548f9e04fdf709d15f889db3e35bbebc389631000"
148
148
  },
149
149
  {
150
150
  "path": "studio.js.sources/13-studio-shell.js",
@@ -238,8 +238,8 @@
238
238
  "packages/artifact/lib/artifact/ui/studio-shell-components.mjs",
239
239
  "packages/artifact/lib/artifact/ui/studio-shell-mount-impl.mjs"
240
240
  ],
241
- "bytes": 19068,
242
- "sha256": "a84049d6a41dd3f655e85a4a39e4874a4c7f6f2013ad9d8c192d22a7082bf407"
241
+ "bytes": 27277,
242
+ "sha256": "81af29a6a5a15fd4f0ef41fc48e1eca63c30b3745fd1d92830ba83f7cf2ba603"
243
243
  },
244
244
  {
245
245
  "path": "studio.js.sources/17-design-studio.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.10.3",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -115,6 +115,10 @@
115
115
  "./sharing-security-contracts": {
116
116
  "types": "./src/sharing-security-contracts.d.mts",
117
117
  "import": "./src/sharing-security-contracts.mjs"
118
+ },
119
+ "./enterprise-journey-contracts": {
120
+ "types": "./src/enterprise-journey-contracts.d.mts",
121
+ "import": "./src/enterprise-journey-contracts.mjs"
118
122
  }
119
123
  },
120
124
  "files": [
@@ -132,7 +136,7 @@
132
136
  "test": "node --test ../../tests/protocol/*.test.mjs"
133
137
  },
134
138
  "engines": {
135
- "node": ">=20"
139
+ "node": ">=22.13.0"
136
140
  },
137
141
  "repository": {
138
142
  "type": "git",