openplanr 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/lib/host-packages/adapter-registry.json +5 -5
- package/lib/host-packages/capability-map.json +1 -1
- package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
- package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
- package/lib/host-packages/claude/openplanr/.openplanr-content.json +46 -14
- package/lib/host-packages/claude/openplanr/skills/design/openplanr.skill.json +22 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/design.mjs +69 -16
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/openplanr.skill.json +22 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design.mjs +69 -16
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/openplanr.skill.json +22 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design.mjs +69 -16
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/claude/openplanr/skills/plan/openplanr.skill.json +22 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/design.mjs +69 -16
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/cursor/openplanr/.openplanr-content.json +42 -10
- package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design.mjs +69 -16
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design.mjs +69 -16
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design.mjs +69 -16
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design.mjs +69 -16
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
- package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
- package/lib/host-packages/openai/openplanr/.openplanr-content.json +46 -14
- package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +22 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/design.mjs +69 -16
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/openplanr.skill.json +22 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design.mjs +69 -16
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/openplanr.skill.json +22 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design.mjs +69 -16
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +22 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/design.mjs +69 -16
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +19 -2
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/handoff-center.css +81 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/handoff-center.js +400 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.6.0
|
|
4
|
+
### Minor Changes
|
|
5
|
+
|
|
6
|
+
- 9924a2d: Add the five-step Design Handoff Center, including server-projected readiness,
|
|
7
|
+
review resolution, implementation package composition, exact owner approval,
|
|
8
|
+
and an explicit zero-effect Continue to Plan handoff.
|
|
9
|
+
|
|
3
10
|
## 2.5.0
|
|
4
11
|
### Minor Changes
|
|
5
12
|
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"kind": "host-native-adapter-registry",
|
|
3
3
|
"schemaVersion": "1.0.0",
|
|
4
4
|
"protocolVersion": "1.8.0",
|
|
5
|
-
"pipelineVersion": "0.
|
|
6
|
-
"pluginVersion": "2.
|
|
5
|
+
"pipelineVersion": "0.49.0",
|
|
6
|
+
"pluginVersion": "2.6.0",
|
|
7
7
|
"adapters": [
|
|
8
8
|
{
|
|
9
9
|
"id": "claude-code",
|
|
10
|
-
"version": "2.
|
|
10
|
+
"version": "2.6.0",
|
|
11
11
|
"capabilityLevel": "product",
|
|
12
12
|
"installScopes": [
|
|
13
13
|
"user",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"id": "codex",
|
|
22
|
-
"version": "2.
|
|
22
|
+
"version": "2.6.0",
|
|
23
23
|
"capabilityLevel": "product",
|
|
24
24
|
"installScopes": [
|
|
25
25
|
"user",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"id": "cursor",
|
|
34
|
-
"version": "2.
|
|
34
|
+
"version": "2.6.0",
|
|
35
35
|
"capabilityLevel": "workflow",
|
|
36
36
|
"installScopes": [
|
|
37
37
|
"project"
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
"name": "AsemDevs"
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
|
-
"version": "2.
|
|
8
|
+
"version": "2.6.0",
|
|
9
9
|
"description": "Generated local OpenPlanr package."
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "planr",
|
|
14
14
|
"source": "./openplanr",
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.6.0",
|
|
16
16
|
"description": "Host-native OpenPlanr skills and role agents for Claude Code.",
|
|
17
17
|
"strict": true
|
|
18
18
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"files": [
|
|
9
9
|
{
|
|
10
10
|
"path": ".claude-plugin/plugin.json",
|
|
11
|
-
"digest": "sha256:
|
|
11
|
+
"digest": "sha256:f78e5406bd3f766995141623cd1f07cb318b0ea20ec8cef6db848a25ebf386df"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"path": "agents/planr-backend.md",
|
|
@@ -372,7 +372,7 @@
|
|
|
372
372
|
},
|
|
373
373
|
{
|
|
374
374
|
"path": "skills/design-loop/openplanr.skill.json",
|
|
375
|
-
"digest": "sha256:
|
|
375
|
+
"digest": "sha256:e74d98bbf31c030727e6cf2bd306b760d1bba2449bbb247148fe6c1dbc684f7b"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "skills/design-loop/references/craft.md",
|
|
@@ -424,7 +424,7 @@
|
|
|
424
424
|
},
|
|
425
425
|
{
|
|
426
426
|
"path": "skills/design-loop/scripts/design.mjs",
|
|
427
|
-
"digest": "sha256:
|
|
427
|
+
"digest": "sha256:3fec9a1d47bc41c0caf4909a2c4b9d00205da630c015a46f6921caf2a4d7a2d2"
|
|
428
428
|
},
|
|
429
429
|
{
|
|
430
430
|
"path": "skills/design-loop/scripts/runtime/notices/entities.txt",
|
|
@@ -444,7 +444,15 @@
|
|
|
444
444
|
},
|
|
445
445
|
{
|
|
446
446
|
"path": "skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js",
|
|
447
|
-
"digest": "sha256:
|
|
447
|
+
"digest": "sha256:e967e9a622018a3bfdd52751ecfa6e842dbbf1922f573f3395a2bf29ca028589"
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"path": "skills/design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.css",
|
|
451
|
+
"digest": "sha256:2f972f98d16723fd19989df349f6342e6eae951820e53ca84f310b433ef83b48"
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
"path": "skills/design-loop/scripts/runtime/packages/design/templates/studio/handoff-center.js",
|
|
455
|
+
"digest": "sha256:012f648cf3936be649ac5f4935412a91489c8f90e076400dc19fbc6ebbf38b21"
|
|
448
456
|
},
|
|
449
457
|
{
|
|
450
458
|
"path": "skills/design-loop/scripts/runtime/packages/design/templates/studio/share.css",
|
|
@@ -552,7 +560,7 @@
|
|
|
552
560
|
},
|
|
553
561
|
{
|
|
554
562
|
"path": "skills/design-review/openplanr.skill.json",
|
|
555
|
-
"digest": "sha256:
|
|
563
|
+
"digest": "sha256:388904d851b0da0e6bc9171db229f80facca68a417bb4e458bf5eebf6cd12be3"
|
|
556
564
|
},
|
|
557
565
|
{
|
|
558
566
|
"path": "skills/design-review/references/craft.md",
|
|
@@ -604,7 +612,7 @@
|
|
|
604
612
|
},
|
|
605
613
|
{
|
|
606
614
|
"path": "skills/design-review/scripts/design.mjs",
|
|
607
|
-
"digest": "sha256:
|
|
615
|
+
"digest": "sha256:3fec9a1d47bc41c0caf4909a2c4b9d00205da630c015a46f6921caf2a4d7a2d2"
|
|
608
616
|
},
|
|
609
617
|
{
|
|
610
618
|
"path": "skills/design-review/scripts/runtime/notices/entities.txt",
|
|
@@ -624,7 +632,15 @@
|
|
|
624
632
|
},
|
|
625
633
|
{
|
|
626
634
|
"path": "skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js",
|
|
627
|
-
"digest": "sha256:
|
|
635
|
+
"digest": "sha256:e967e9a622018a3bfdd52751ecfa6e842dbbf1922f573f3395a2bf29ca028589"
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"path": "skills/design-review/scripts/runtime/packages/design/templates/studio/handoff-center.css",
|
|
639
|
+
"digest": "sha256:2f972f98d16723fd19989df349f6342e6eae951820e53ca84f310b433ef83b48"
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"path": "skills/design-review/scripts/runtime/packages/design/templates/studio/handoff-center.js",
|
|
643
|
+
"digest": "sha256:012f648cf3936be649ac5f4935412a91489c8f90e076400dc19fbc6ebbf38b21"
|
|
628
644
|
},
|
|
629
645
|
{
|
|
630
646
|
"path": "skills/design-review/scripts/runtime/packages/design/templates/studio/share.css",
|
|
@@ -732,7 +748,7 @@
|
|
|
732
748
|
},
|
|
733
749
|
{
|
|
734
750
|
"path": "skills/design/openplanr.skill.json",
|
|
735
|
-
"digest": "sha256:
|
|
751
|
+
"digest": "sha256:b6fb1882f9147414964469f6e3b8089c2ca8d55c0f4a7f92e66b5a107db68051"
|
|
736
752
|
},
|
|
737
753
|
{
|
|
738
754
|
"path": "skills/design/references/craft.md",
|
|
@@ -784,7 +800,7 @@
|
|
|
784
800
|
},
|
|
785
801
|
{
|
|
786
802
|
"path": "skills/design/scripts/design.mjs",
|
|
787
|
-
"digest": "sha256:
|
|
803
|
+
"digest": "sha256:3fec9a1d47bc41c0caf4909a2c4b9d00205da630c015a46f6921caf2a4d7a2d2"
|
|
788
804
|
},
|
|
789
805
|
{
|
|
790
806
|
"path": "skills/design/scripts/runtime/notices/entities.txt",
|
|
@@ -804,7 +820,15 @@
|
|
|
804
820
|
},
|
|
805
821
|
{
|
|
806
822
|
"path": "skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js",
|
|
807
|
-
"digest": "sha256:
|
|
823
|
+
"digest": "sha256:e967e9a622018a3bfdd52751ecfa6e842dbbf1922f573f3395a2bf29ca028589"
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"path": "skills/design/scripts/runtime/packages/design/templates/studio/handoff-center.css",
|
|
827
|
+
"digest": "sha256:2f972f98d16723fd19989df349f6342e6eae951820e53ca84f310b433ef83b48"
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"path": "skills/design/scripts/runtime/packages/design/templates/studio/handoff-center.js",
|
|
831
|
+
"digest": "sha256:012f648cf3936be649ac5f4935412a91489c8f90e076400dc19fbc6ebbf38b21"
|
|
808
832
|
},
|
|
809
833
|
{
|
|
810
834
|
"path": "skills/design/scripts/runtime/packages/design/templates/studio/share.css",
|
|
@@ -1000,7 +1024,7 @@
|
|
|
1000
1024
|
},
|
|
1001
1025
|
{
|
|
1002
1026
|
"path": "skills/plan/openplanr.skill.json",
|
|
1003
|
-
"digest": "sha256:
|
|
1027
|
+
"digest": "sha256:e91d221a286bd91b3b7a2343cea8c73564cb3401b968854d38bcf8a9790131f1"
|
|
1004
1028
|
},
|
|
1005
1029
|
{
|
|
1006
1030
|
"path": "skills/plan/references/artifact-contract.md",
|
|
@@ -1024,7 +1048,7 @@
|
|
|
1024
1048
|
},
|
|
1025
1049
|
{
|
|
1026
1050
|
"path": "skills/plan/scripts/design.mjs",
|
|
1027
|
-
"digest": "sha256:
|
|
1051
|
+
"digest": "sha256:3fec9a1d47bc41c0caf4909a2c4b9d00205da630c015a46f6921caf2a4d7a2d2"
|
|
1028
1052
|
},
|
|
1029
1053
|
{
|
|
1030
1054
|
"path": "skills/plan/scripts/planning-ids.mjs",
|
|
@@ -1048,7 +1072,15 @@
|
|
|
1048
1072
|
},
|
|
1049
1073
|
{
|
|
1050
1074
|
"path": "skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js",
|
|
1051
|
-
"digest": "sha256:
|
|
1075
|
+
"digest": "sha256:e967e9a622018a3bfdd52751ecfa6e842dbbf1922f573f3395a2bf29ca028589"
|
|
1076
|
+
},
|
|
1077
|
+
{
|
|
1078
|
+
"path": "skills/plan/scripts/runtime/packages/design/templates/studio/handoff-center.css",
|
|
1079
|
+
"digest": "sha256:2f972f98d16723fd19989df349f6342e6eae951820e53ca84f310b433ef83b48"
|
|
1080
|
+
},
|
|
1081
|
+
{
|
|
1082
|
+
"path": "skills/plan/scripts/runtime/packages/design/templates/studio/handoff-center.js",
|
|
1083
|
+
"digest": "sha256:012f648cf3936be649ac5f4935412a91489c8f90e076400dc19fbc6ebbf38b21"
|
|
1052
1084
|
},
|
|
1053
1085
|
{
|
|
1054
1086
|
"path": "skills/plan/scripts/runtime/packages/design/templates/studio/share.css",
|
|
@@ -1259,5 +1291,5 @@
|
|
|
1259
1291
|
"digest": "sha256:53698324b62f43b672ce8fe1654c526c96fb202e313442f09c6fc1e72268677e"
|
|
1260
1292
|
}
|
|
1261
1293
|
],
|
|
1262
|
-
"contentDigest": "sha256:
|
|
1294
|
+
"contentDigest": "sha256:2bb0b669bbe13a515f89033b55b369b08f12b7ab62f2dbbfd353eea972fbabaa"
|
|
1263
1295
|
}
|
|
@@ -198,6 +198,28 @@
|
|
|
198
198
|
"cursor"
|
|
199
199
|
]
|
|
200
200
|
},
|
|
201
|
+
{
|
|
202
|
+
"path": "scripts/runtime/packages/design/templates/studio/handoff-center.css",
|
|
203
|
+
"kind": "asset",
|
|
204
|
+
"executable": false,
|
|
205
|
+
"hosts": [
|
|
206
|
+
"claude-code",
|
|
207
|
+
"codex",
|
|
208
|
+
"chatgpt",
|
|
209
|
+
"cursor"
|
|
210
|
+
]
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"path": "scripts/runtime/packages/design/templates/studio/handoff-center.js",
|
|
214
|
+
"kind": "asset",
|
|
215
|
+
"executable": false,
|
|
216
|
+
"hosts": [
|
|
217
|
+
"claude-code",
|
|
218
|
+
"codex",
|
|
219
|
+
"chatgpt",
|
|
220
|
+
"cursor"
|
|
221
|
+
]
|
|
222
|
+
},
|
|
201
223
|
{
|
|
202
224
|
"path": "scripts/runtime/packages/design/templates/studio/share.css",
|
|
203
225
|
"kind": "asset",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// packages/design/lib/design/utility.mjs
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
5
|
import { existsSync as existsSync12, mkdirSync as mkdirSync9, readFileSync as readFileSync17, realpathSync as realpathSync7, writeFileSync as writeFileSync9 } from "node:fs";
|
|
6
|
-
import { dirname as dirname14, join as join13, resolve as
|
|
6
|
+
import { dirname as dirname14, join as join13, resolve as resolve8 } from "node:path";
|
|
7
7
|
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
8
8
|
|
|
9
9
|
// packages/design/lib/design/document.mjs
|
|
@@ -354,11 +354,11 @@ function createArtifactBridgeTools(document2, window2) {
|
|
|
354
354
|
const outputWidth = Math.max(1, Math.round(width * scale)), outputHeight = Math.max(1, Math.round(height * scale));
|
|
355
355
|
const svg = '<svg xmlns="http://www.w3.org/2000/svg" width="' + outputWidth + '" height="' + outputHeight + '" viewBox="0 0 ' + width + " " + height + '"><foreignObject width="' + width + '" height="' + height + '">' + markup + "</foreignObject></svg>";
|
|
356
356
|
image = new Image();
|
|
357
|
-
await new Promise((
|
|
357
|
+
await new Promise((resolve9, reject) => {
|
|
358
358
|
const timer = setTimeout(() => reject(new Error("Thumbnail capture timed out.")), Math.max(1, deadline - Date.now()));
|
|
359
359
|
image.onload = () => {
|
|
360
360
|
clearTimeout(timer);
|
|
361
|
-
|
|
361
|
+
resolve9();
|
|
362
362
|
};
|
|
363
363
|
image.onerror = () => {
|
|
364
364
|
clearTimeout(timer);
|
|
@@ -13081,12 +13081,14 @@ ${shellMarkup}
|
|
|
13081
13081
|
}
|
|
13082
13082
|
|
|
13083
13083
|
// packages/design/lib/design/studio-render.mjs
|
|
13084
|
-
var DESIGN_STUDIO_VERSION = "1.
|
|
13084
|
+
var DESIGN_STUDIO_VERSION = "1.9.0";
|
|
13085
13085
|
var DESIGN_STUDIO_ASSETS = Object.freeze({
|
|
13086
13086
|
style: "templates/studio/studio.css",
|
|
13087
13087
|
runtime: "templates/studio/studio.js",
|
|
13088
13088
|
enhancementsStyle: "templates/studio/enhancements.css",
|
|
13089
|
-
enhancementsRuntime: "templates/studio/enhancements.js"
|
|
13089
|
+
enhancementsRuntime: "templates/studio/enhancements.js",
|
|
13090
|
+
handoffCenterStyle: "templates/studio/handoff-center.css",
|
|
13091
|
+
handoffCenterRuntime: "templates/studio/handoff-center.js"
|
|
13090
13092
|
});
|
|
13091
13093
|
function applyDesignStudioTheme(preference) {
|
|
13092
13094
|
if (!preference) {
|
|
@@ -13543,8 +13545,8 @@ function renderDesignStudio(input = {}, options = {}) {
|
|
|
13543
13545
|
return renderDesignStudioMarkup({ ...input, entries: input.entries ?? createDesignStudioEntries(input.document, input.envelope) }, {
|
|
13544
13546
|
...options,
|
|
13545
13547
|
renderShell: renderArtifactShellDocument,
|
|
13546
|
-
style: ["studio.css", "enhancements.css"].map((file) => readFileSync7(new URL(file, templateRoot), "utf8")).join("\n"),
|
|
13547
|
-
runtime: renderDesignReviewExportSource() + "\n" + ["studio.js", "enhancements.js"].map((file) => readFileSync7(new URL(file, templateRoot), "utf8")).join("\n")
|
|
13548
|
+
style: ["studio.css", "enhancements.css", "handoff-center.css"].map((file) => readFileSync7(new URL(file, templateRoot), "utf8")).join("\n"),
|
|
13549
|
+
runtime: renderDesignReviewExportSource() + "\n" + ["studio.js", "enhancements.js", "handoff-center.js"].map((file) => readFileSync7(new URL(file, templateRoot), "utf8")).join("\n")
|
|
13548
13550
|
});
|
|
13549
13551
|
}
|
|
13550
13552
|
|
|
@@ -13827,7 +13829,7 @@ function designRendererRevision() {
|
|
|
13827
13829
|
json({
|
|
13828
13830
|
version: DESIGN_RENDERER_VERSION,
|
|
13829
13831
|
stage: hash(stageRuntimeBytes()),
|
|
13830
|
-
assets: ["studio.css", "studio.js", "enhancements.css", "enhancements.js"].filter((name) => existsSync3(new URL(`../../templates/studio/${name}`, new URL("./runtime/packages/design/lib/design/document.mjs", import.meta.url).href))).map(
|
|
13832
|
+
assets: ["studio.css", "studio.js", "enhancements.css", "enhancements.js", "handoff-center.css", "handoff-center.js"].filter((name) => existsSync3(new URL(`../../templates/studio/${name}`, new URL("./runtime/packages/design/lib/design/document.mjs", import.meta.url).href))).map(
|
|
13831
13833
|
(name) => hash(
|
|
13832
13834
|
readFileSync8(
|
|
13833
13835
|
new URL(`../../templates/studio/${name}`, new URL("./runtime/packages/design/lib/design/document.mjs", import.meta.url).href)
|
|
@@ -13994,7 +13996,7 @@ ${errors.join("\n")}`);
|
|
|
13994
13996
|
|
|
13995
13997
|
// packages/design/lib/design/review.mjs
|
|
13996
13998
|
import { existsSync as existsSync11, readFileSync as readFileSync16 } from "node:fs";
|
|
13997
|
-
import { dirname as dirname13, join as join12 } from "node:path";
|
|
13999
|
+
import { dirname as dirname13, join as join12, relative as relative4, resolve as resolve7 } from "node:path";
|
|
13998
14000
|
|
|
13999
14001
|
// packages/artifact/lib/artifact/import.mjs
|
|
14000
14002
|
import {
|
|
@@ -18363,6 +18365,52 @@ function currentImplementationBasis(file, env) {
|
|
|
18363
18365
|
}
|
|
18364
18366
|
};
|
|
18365
18367
|
}
|
|
18368
|
+
function proposeImplementationPackage(file, env) {
|
|
18369
|
+
const current = currentDesign(file);
|
|
18370
|
+
const basis = currentImplementationBasis(file, env);
|
|
18371
|
+
const repository = projectRoot(current.root);
|
|
18372
|
+
const paths = [.../* @__PURE__ */ new Set([
|
|
18373
|
+
designSpecPath(current.root),
|
|
18374
|
+
...(current.sourceFiles ?? []).map((path) => resolve7(current.root, path))
|
|
18375
|
+
])].filter((path) => existsSync11(path));
|
|
18376
|
+
const sources = paths.map((path, index) => {
|
|
18377
|
+
const logicalPath2 = relative4(repository, path).replaceAll("\\", "/");
|
|
18378
|
+
const extension = logicalPath2.split(".").pop()?.toLowerCase();
|
|
18379
|
+
return {
|
|
18380
|
+
id: `SRC-${String(index + 1).padStart(3, "0")}`,
|
|
18381
|
+
kind: path === designSpecPath(current.root) ? "design-specification" : extension === "html" ? "screen" : ["css", "json"].includes(extension) ? "token" : "component",
|
|
18382
|
+
path: logicalPath2,
|
|
18383
|
+
revision: basis.sourceRevision,
|
|
18384
|
+
digest: `sha256:${hash(readFileSync16(path))}`
|
|
18385
|
+
};
|
|
18386
|
+
});
|
|
18387
|
+
const sourceByPath = new Map(sources.map((source) => [source.path, source.id]));
|
|
18388
|
+
const sourceId = (path) => sourceByPath.get(relative4(repository, resolve7(current.root, path)).replaceAll("\\", "/"));
|
|
18389
|
+
const selected = current.document.variants.find((variant) => variant.id === current.document.selectedVariant);
|
|
18390
|
+
const requirements = current.document.screens.map((screen) => {
|
|
18391
|
+
const authored = selected?.sources?.[screen.id] ?? screen.source;
|
|
18392
|
+
const refs = [authored?.html, ...authored?.styles ?? [], ...authored?.scripts ?? []].map(sourceId).filter(Boolean);
|
|
18393
|
+
return {
|
|
18394
|
+
kind: "behavior",
|
|
18395
|
+
statement: `${screen.title}: ${screen.description || "Implement the approved screen behavior and states."}`,
|
|
18396
|
+
sourceRefs: refs.length ? refs : [sources[0].id],
|
|
18397
|
+
verification: current.document.frames.map((frame) => `${screen.title} matches the approved ${frame.label} frame at ${frame.width} \xD7 ${frame.height}.`)
|
|
18398
|
+
};
|
|
18399
|
+
});
|
|
18400
|
+
const allRefs = sources.map((source) => source.id);
|
|
18401
|
+
requirements.push({
|
|
18402
|
+
kind: "accessibility",
|
|
18403
|
+
statement: "Preserve the approved interaction semantics, keyboard path, focus behavior and readable status communication.",
|
|
18404
|
+
sourceRefs: allRefs,
|
|
18405
|
+
verification: ["Keyboard-only use, visible focus, screen-reader labels and status announcements pass on every implemented screen."]
|
|
18406
|
+
});
|
|
18407
|
+
return {
|
|
18408
|
+
id: `${current.document.id}-implementation`,
|
|
18409
|
+
title: `${current.document.title} implementation package`,
|
|
18410
|
+
sources,
|
|
18411
|
+
requirements
|
|
18412
|
+
};
|
|
18413
|
+
}
|
|
18366
18414
|
async function persistDesignTaste(current, state) {
|
|
18367
18415
|
const path = join12(
|
|
18368
18416
|
projectRoot(current.root),
|
|
@@ -18585,7 +18633,12 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
18585
18633
|
const unlock = await acquireStartLock(join12(design.root, ".design/render.lock"));
|
|
18586
18634
|
try {
|
|
18587
18635
|
const root = dirname13(designSpecPath(design.root));
|
|
18588
|
-
|
|
18636
|
+
let proposal = null;
|
|
18637
|
+
try {
|
|
18638
|
+
proposal = proposeImplementationPackage(file, env);
|
|
18639
|
+
} catch {
|
|
18640
|
+
}
|
|
18641
|
+
respond(res, 200, { ok: true, draft: readImplementationHandoffDraft(root), ...readImplementationHandoffLifecycle(root), approvalPreview: previewImplementationHandoffApproval(root), proposal });
|
|
18589
18642
|
} finally {
|
|
18590
18643
|
unlock();
|
|
18591
18644
|
}
|
|
@@ -19066,7 +19119,7 @@ function verifyDesignDocument(file, report) {
|
|
|
19066
19119
|
const images = (Array.isArray(report.screenshots) ? report.screenshots : []).filter((item2) => {
|
|
19067
19120
|
const path = typeof item2 === "string" ? item2 : item2?.path;
|
|
19068
19121
|
try {
|
|
19069
|
-
return typeof path === "string" && isPng(readFileSync17(
|
|
19122
|
+
return typeof path === "string" && isPng(readFileSync17(resolve8(path)));
|
|
19070
19123
|
} catch {
|
|
19071
19124
|
return false;
|
|
19072
19125
|
}
|
|
@@ -19095,14 +19148,14 @@ async function designUtility(argv, { stdout = (value) => process.stdout.write(`$
|
|
|
19095
19148
|
flags[key] = ["json", "no-open"].includes(key) ? true : args[++i];
|
|
19096
19149
|
}
|
|
19097
19150
|
if (flags.view && !["canvas", "prototype", "walkthrough"].includes(flags.view)) throw new Error("View must be canvas, prototype, or walkthrough.");
|
|
19098
|
-
const file =
|
|
19151
|
+
const file = resolve8(input);
|
|
19099
19152
|
let result;
|
|
19100
19153
|
if (command === "handoff") {
|
|
19101
19154
|
const action3 = flags.action ?? "inspect";
|
|
19102
19155
|
if (action3 === "inspect") result = readDesignHandoff(file);
|
|
19103
19156
|
else {
|
|
19104
19157
|
const snapshot2 = readDesignHandoff(file);
|
|
19105
|
-
const input2 = flags.input ? readJson2(
|
|
19158
|
+
const input2 = flags.input ? readJson2(resolve8(flags.input)) : {};
|
|
19106
19159
|
result = await updateDesignHandoff(file, { ...input2, action: action3, revision: input2.revision ?? snapshot2.revision, version: input2.version ?? (snapshot2.draft?.version ?? 0) });
|
|
19107
19160
|
}
|
|
19108
19161
|
}
|
|
@@ -19137,7 +19190,7 @@ async function designUtility(argv, { stdout = (value) => process.stdout.write(`$
|
|
|
19137
19190
|
const current = currentDesign(file), view = flags.view ?? current.document.defaultView;
|
|
19138
19191
|
const state = readJson2(join13(current.root, ".design/studio-state.json"), { state: {} }).state;
|
|
19139
19192
|
if (flags.format && flags.format !== "html") throw new Error("Portable export supports HTML. Use the studio PNG action for browser-rendered captures.");
|
|
19140
|
-
const output =
|
|
19193
|
+
const output = resolve8(flags.output ?? join13(current.root, `${view}-export.html`));
|
|
19141
19194
|
if (existsSync12(output)) throw new Error(`Export already exists: ${output}. Choose a new --output path.`);
|
|
19142
19195
|
mkdirSync9(dirname14(output), { recursive: true });
|
|
19143
19196
|
writeFileSync9(output, standaloneDesignHtml({ ...current, state }, view), { flag: "wx" });
|
|
@@ -19145,7 +19198,7 @@ async function designUtility(argv, { stdout = (value) => process.stdout.write(`$
|
|
|
19145
19198
|
}
|
|
19146
19199
|
if (command === "verify") {
|
|
19147
19200
|
if (!flags.report) throw new Error("verify requires --report <browser-report.json>.");
|
|
19148
|
-
result = verifyDesignDocument(file, readJson2(
|
|
19201
|
+
result = verifyDesignDocument(file, readJson2(resolve8(flags.report)));
|
|
19149
19202
|
}
|
|
19150
19203
|
if (command === "feedback") {
|
|
19151
19204
|
await syncDesignShare(file, { env, fetchImpl });
|
|
@@ -19156,7 +19209,7 @@ async function designUtility(argv, { stdout = (value) => process.stdout.write(`$
|
|
|
19156
19209
|
if (!["json", "markdown"].includes(format)) throw new Error("Feedback export format must be json or markdown.");
|
|
19157
19210
|
if (!["current", "all"].includes(scope)) throw new Error("Feedback export scope must be current or all.");
|
|
19158
19211
|
if (!flags.output) throw new Error("Feedback export requires --output <path>.");
|
|
19159
|
-
const output =
|
|
19212
|
+
const output = resolve8(flags.output);
|
|
19160
19213
|
if (existsSync12(output)) throw new Error("Feedback export already exists. Choose a new --output path.");
|
|
19161
19214
|
const snapshot2 = exportDesignReview(file, { scope, env });
|
|
19162
19215
|
mkdirSync9(dirname14(output), { recursive: true });
|
|
@@ -736,7 +736,7 @@
|
|
|
736
736
|
await loadPair();
|
|
737
737
|
} catch (error) { status.textContent = error.message; content.append(button('Retry comparison', () => compareRevisions(beforeId, afterId))); }
|
|
738
738
|
}
|
|
739
|
-
async function
|
|
739
|
+
async function reviewHandoff() {
|
|
740
740
|
const { content, status } = modal('Review handoff', 'design-handoff'); status.textContent = 'Loading review decisions…'; let response;
|
|
741
741
|
const render = () => {
|
|
742
742
|
content.replaceChildren(); const draft = response.draft;
|
|
@@ -766,7 +766,11 @@
|
|
|
766
766
|
catch (error) { status.textContent = error.message; for (const [value,disabled] of previousDisabled) if (value.isConnected) value.disabled = disabled; }
|
|
767
767
|
};
|
|
768
768
|
try { response = await request('loadHandoff', 'handoffUrl'); if (response.metadata) metadata = response.metadata; render(); status.textContent = ''; }
|
|
769
|
-
catch (error) { status.textContent = error.message; content.append(button('Retry',
|
|
769
|
+
catch (error) { status.textContent = error.message; content.append(button('Retry', reviewHandoff)); }
|
|
770
|
+
}
|
|
771
|
+
function handoff() {
|
|
772
|
+
if (window.__openPlanrDesignHandoffCenter?.open) return window.__openPlanrDesignHandoffCenter.open();
|
|
773
|
+
return reviewHandoff();
|
|
770
774
|
}
|
|
771
775
|
async function refreshExperience() {
|
|
772
776
|
const previousContext = JSON.stringify(experience?.reviewContext || payload.reviewContext);
|
|
@@ -797,6 +801,19 @@
|
|
|
797
801
|
on(document, 'openplanr:design-experience-changed', () => { void refreshExperience(); });
|
|
798
802
|
const dispose = () => { disposed = true; activeDialog?.dismiss(); for (const remove of destroyers.splice(0)) remove(); clearTimeout(toastTimer); };
|
|
799
803
|
on(window, 'pagehide', dispose); on(root, 'planr:design-destroy', dispose);
|
|
804
|
+
window.__openPlanrDesignHandoffBridge = Object.freeze({
|
|
805
|
+
owner,
|
|
806
|
+
revision,
|
|
807
|
+
announce,
|
|
808
|
+
openReviewHandoff: reviewHandoff,
|
|
809
|
+
loadReadiness: () => request('loadReadiness', 'readinessUrl'),
|
|
810
|
+
loadReviewHandoff: () => request('loadHandoff', 'handoffUrl'),
|
|
811
|
+
updateReviewHandoff: input => request('updateHandoff', 'handoffUrl', { ...input, revision: revision() }),
|
|
812
|
+
loadImplementationHandoff: () => request('loadImplementationHandoff', 'implementationHandoffUrl'),
|
|
813
|
+
updateImplementationHandoff: input => request('updateImplementationHandoff', 'implementationHandoffUrl', input),
|
|
814
|
+
continueToActiveHost: typeof options().continueToPlan === 'function' ? handoff => options().continueToPlan(handoff) : null,
|
|
815
|
+
context: () => ({ designId: design.id, title: design.title, revision: revision(), host: options().activeHost || options().host || '' }),
|
|
816
|
+
});
|
|
800
817
|
window.__openPlanrDesignExperience = Object.freeze({ about, profile:editProfile, setTheme, history, compare: compareRevisions, handoff, refresh: refreshExperience, getState: () => ({ railTab, inspectorEnabled, profile:{...profile}, theme:themePreference, metadata: structuredClone(metadata) }) });
|
|
801
818
|
}
|
|
802
819
|
const started = Date.now();
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
.design-handoff-center {
|
|
2
|
+
position:absolute; z-index:42; inset:var(--planr-toolbar-height) 0 0 auto;
|
|
3
|
+
display:grid; grid-template-rows:auto auto minmax(0,1fr) auto;
|
|
4
|
+
box-sizing:border-box; width:var(--planr-review-rail-width); max-width:calc(100% - 16px);
|
|
5
|
+
border-left:1px solid var(--planr-color-rule); background:var(--planr-color-chrome);
|
|
6
|
+
color:var(--planr-color-text); box-shadow:-12px 0 32px #0004;
|
|
7
|
+
font:400 var(--design-type-body,14px)/1.5 var(--planr-font-body);
|
|
8
|
+
}
|
|
9
|
+
.design-handoff-center > header { display:flex; align-items:center; justify-content:space-between; gap:12px; min-height:64px; padding:12px 14px; border-bottom:1px solid var(--planr-color-rule); }
|
|
10
|
+
.design-handoff-center h2,.design-handoff-center h3,.design-handoff-center h4 { margin:0; font-family:var(--planr-font-display); }
|
|
11
|
+
.design-handoff-center h2 { font-size:18px; }
|
|
12
|
+
.design-handoff-center h3 { font-size:20px; letter-spacing:-.02em; }
|
|
13
|
+
.design-handoff-center h4 { font-size:14px; }
|
|
14
|
+
.design-handoff-center p { margin:0; overflow-wrap:anywhere; }
|
|
15
|
+
.design-handoff-eyebrow { display:block; color:var(--planr-color-primary); font-size:10px; font-weight:650; letter-spacing:.1em; text-transform:uppercase; }
|
|
16
|
+
.design-handoff-center button,.design-handoff-center input,.design-handoff-center textarea { box-sizing:border-box; font:inherit; }
|
|
17
|
+
.design-handoff-center button { min-height:36px; border:1px solid var(--planr-color-rule); border-radius:6px; padding:8px 10px; color:var(--planr-color-text); background:var(--planr-color-panel); cursor:pointer; }
|
|
18
|
+
.design-handoff-center button:disabled { cursor:wait; opacity:.55; }
|
|
19
|
+
.design-handoff-center button:focus-visible,.design-handoff-center input:focus-visible,.design-handoff-center textarea:focus-visible,.design-handoff-center summary:focus-visible { outline:2px solid var(--planr-color-primary); outline-offset:2px; }
|
|
20
|
+
.design-handoff-center .design-primary { width:100%; min-height:44px; color:var(--planr-color-background); background:var(--planr-color-primary); border-color:transparent; font-weight:650; }
|
|
21
|
+
.design-handoff-center .design-danger { width:100%; color:var(--planr-color-danger); }
|
|
22
|
+
.design-handoff-close { width:44px; height:44px; padding:0!important; background:transparent!important; font-size:22px!important; }
|
|
23
|
+
.design-handoff-progress { display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:2px; padding:8px; border-bottom:1px solid var(--planr-color-rule); overflow-x:auto; }
|
|
24
|
+
.design-handoff-step { display:grid; justify-items:center; gap:3px; min-width:52px; min-height:58px!important; padding:6px 3px!important; border-color:transparent!important; background:transparent!important; color:var(--planr-color-text-muted)!important; font-size:9px!important; line-height:1.2!important; text-align:center; }
|
|
25
|
+
.design-handoff-step > span:first-child { font:650 11px/1 var(--planr-font-body); }
|
|
26
|
+
.design-handoff-step[aria-current="step"] { color:var(--planr-color-text)!important; background:var(--planr-color-raised)!important; border-color:var(--planr-color-rule)!important; }
|
|
27
|
+
.design-handoff-badge { display:inline-flex; align-items:center; gap:4px; width:max-content; max-width:100%; border:1px solid var(--planr-color-rule); border-radius:999px; padding:2px 7px; color:var(--planr-color-text-muted); font-size:10px; font-weight:650; line-height:1.4; }
|
|
28
|
+
.design-handoff-badge::before { content:""; flex:none; width:6px; height:6px; border-radius:50%; background:currentColor; }
|
|
29
|
+
.design-handoff-badge[data-status="ready"],.design-handoff-badge[data-status="pass"],.design-handoff-badge[data-status="approved"] { color:var(--planr-color-primary); }
|
|
30
|
+
.design-handoff-badge[data-status="blocked"],.design-handoff-badge[data-status="revoked"] { color:var(--planr-color-danger); }
|
|
31
|
+
.design-handoff-badge[data-status="attention"],.design-handoff-badge[data-status="stale"],.design-handoff-badge[data-status="superseded"] { color:#d89a39; }
|
|
32
|
+
.design-handoff-step .design-handoff-badge { max-width:44px; overflow:hidden; padding:0; border:0; color:inherit; text-indent:-999px; }
|
|
33
|
+
.design-handoff-step .design-handoff-badge::before { width:7px; height:7px; }
|
|
34
|
+
.design-handoff-content { min-width:0; overflow:auto; overscroll-behavior:contain; padding:18px 14px 28px; }
|
|
35
|
+
.design-handoff-step-header { display:grid; gap:6px; margin-bottom:18px; }
|
|
36
|
+
.design-handoff-step-header p,.design-handoff-content .design-muted { color:var(--planr-color-text-muted); font-size:12px; }
|
|
37
|
+
.design-handoff-summary { display:grid; gap:10px; margin-bottom:16px; padding:12px; border:1px solid var(--planr-color-rule); border-radius:8px; background:var(--planr-color-raised); }
|
|
38
|
+
.design-handoff-summary strong { font-size:13px; line-height:1.45; }
|
|
39
|
+
.design-handoff-empty { display:grid; gap:7px; margin:12px 0 18px; padding:18px 14px; border:1px dashed var(--planr-color-rule); border-radius:8px; }
|
|
40
|
+
.design-handoff-empty p { color:var(--planr-color-text-muted); font-size:12px; }
|
|
41
|
+
.design-handoff-checks,.design-handoff-requirement-list { display:grid; gap:8px; margin:0 0 18px; padding:0; list-style:none; }
|
|
42
|
+
.design-handoff-checks li,.design-handoff-requirement-list li { display:grid; gap:8px; padding:10px; border:1px solid var(--planr-color-rule); border-radius:7px; }
|
|
43
|
+
.design-handoff-checks li > div { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; }
|
|
44
|
+
.design-handoff-checks strong,.design-handoff-requirement-list strong { font-size:12px; line-height:1.45; }
|
|
45
|
+
.design-handoff-link { min-height:32px!important; padding:4px 0!important; border:0!important; background:transparent!important; color:var(--planr-color-primary)!important; text-align:left; }
|
|
46
|
+
.design-handoff-review-groups { display:grid; gap:10px; margin-bottom:18px; }
|
|
47
|
+
.design-handoff-review-group { display:grid; gap:7px; }
|
|
48
|
+
.design-handoff-review-group article { display:grid; gap:4px; padding:9px 10px; border-left:2px solid var(--planr-color-rule); background:var(--planr-color-panel); font-size:12px; }
|
|
49
|
+
.design-handoff-refinement { color:var(--planr-color-text-muted); }
|
|
50
|
+
.design-handoff-package-editor,.design-handoff-requirements,.design-handoff-package-editor fieldset { display:grid; gap:12px; min-width:0; }
|
|
51
|
+
.design-handoff-package-editor > label,.design-handoff-package-editor fieldset label,.design-handoff-content > label { display:grid; gap:6px; margin-bottom:14px; color:var(--planr-color-text-muted); font-size:12px; }
|
|
52
|
+
.design-handoff-package-editor input,.design-handoff-package-editor textarea,.design-handoff-content > label input,.design-handoff-plan-result textarea { width:100%; min-height:44px; border:1px solid var(--planr-color-rule); border-radius:6px; padding:9px 10px; color:var(--planr-color-text); background:var(--planr-color-panel); }
|
|
53
|
+
.design-handoff-package-editor textarea { min-height:82px; resize:vertical; }
|
|
54
|
+
.design-handoff-package-editor fieldset { margin:0; border:1px solid var(--planr-color-rule); border-radius:7px; padding:10px; }
|
|
55
|
+
.design-handoff-package-editor legend { padding:0 5px; color:var(--planr-color-text); font-size:11px; text-transform:capitalize; }
|
|
56
|
+
.design-handoff-content details { margin:14px 0; border-top:1px solid var(--planr-color-rule); padding-top:12px; }
|
|
57
|
+
.design-handoff-content summary { min-height:36px; cursor:pointer; color:var(--planr-color-text-muted); font-size:12px; }
|
|
58
|
+
.design-handoff-approval-card { display:grid; gap:9px; margin-bottom:18px; padding:16px; border:1px solid var(--planr-color-rule); border-radius:8px; background:var(--planr-color-raised); }
|
|
59
|
+
.design-handoff-plan-result { display:grid; gap:10px; margin-top:14px; }
|
|
60
|
+
.design-handoff-plan-result code { display:block; overflow:auto; border:1px solid var(--planr-color-rule); border-radius:6px; padding:10px; background:var(--planr-color-background); font-size:11px; white-space:pre; }
|
|
61
|
+
.design-handoff-copy { width:100%; }
|
|
62
|
+
.design-handoff-center > footer { display:flex; align-items:center; justify-content:space-between; gap:10px; min-height:50px; padding:8px 12px; border-top:1px solid var(--planr-color-rule); background:var(--planr-color-chrome); }
|
|
63
|
+
.design-handoff-center > footer p { flex:1; color:var(--planr-color-text-muted); font-size:10px; }
|
|
64
|
+
.design-handoff-center > footer p[data-error="true"] { color:var(--planr-color-danger); }
|
|
65
|
+
.design-handoff-center > footer button { flex:none; }
|
|
66
|
+
.planr-shell[data-design-handoff-open="true"] .planr-review-rail { visibility:hidden; pointer-events:none; }
|
|
67
|
+
@media (max-width:960px) {
|
|
68
|
+
.design-handoff-center { position:absolute; width:min(380px,calc(100% - 16px)); }
|
|
69
|
+
}
|
|
70
|
+
@media (max-width:680px) {
|
|
71
|
+
.design-handoff-center { inset:var(--planr-toolbar-height) 0 0; width:100%; max-width:none; border-left:0; }
|
|
72
|
+
.design-handoff-center button,.design-handoff-center input,.design-handoff-center textarea,.design-handoff-center summary { min-height:44px; }
|
|
73
|
+
.design-handoff-center input,.design-handoff-center textarea { font-size:16px; }
|
|
74
|
+
.design-handoff-progress { position:sticky; z-index:2; top:0; background:var(--planr-color-chrome); }
|
|
75
|
+
.design-handoff-content { padding-inline:16px; }
|
|
76
|
+
}
|
|
77
|
+
@media (prefers-reduced-motion:reduce) { .design-handoff-center * { scroll-behavior:auto!important; transition:none!important; animation:none!important; } }
|
|
78
|
+
@media (forced-colors:active) {
|
|
79
|
+
.design-handoff-center,.design-handoff-summary,.design-handoff-empty,.design-handoff-checks li,.design-handoff-requirement-list li { border-color:CanvasText; }
|
|
80
|
+
.design-handoff-badge::before { forced-color-adjust:none; background:currentColor; }
|
|
81
|
+
}
|