@fenglimg/cocos-state-controller 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +287 -0
  3. package/assets/script/controller/Capability.ts +100 -0
  4. package/assets/script/controller/Capability.ts.meta +10 -0
  5. package/assets/script/controller/CapabilityRegistry.ts +116 -0
  6. package/assets/script/controller/CapabilityRegistry.ts.meta +10 -0
  7. package/assets/script/controller/EnumPropRefMap.ts +232 -0
  8. package/assets/script/controller/EnumPropRefMap.ts.meta +10 -0
  9. package/assets/script/controller/NestedCtrlData.ts +199 -0
  10. package/assets/script/controller/NestedCtrlData.ts.meta +10 -0
  11. package/assets/script/controller/PrefabIntrospection.ts +151 -0
  12. package/assets/script/controller/PrefabIntrospection.ts.meta +10 -0
  13. package/assets/script/controller/Props.meta +13 -0
  14. package/assets/script/controller/StateControllerV2.ts +1957 -0
  15. package/assets/script/controller/StateControllerV2.ts.meta +10 -0
  16. package/assets/script/controller/StateEnumV2.ts +165 -0
  17. package/assets/script/controller/StateEnumV2.ts.meta +10 -0
  18. package/assets/script/controller/StateErrorManagerV2.ts +217 -0
  19. package/assets/script/controller/StateErrorManagerV2.ts.meta +10 -0
  20. package/assets/script/controller/StatePropHandlerV2.ts +316 -0
  21. package/assets/script/controller/StatePropHandlerV2.ts.meta +10 -0
  22. package/assets/script/controller/StatePropertyControlService.ts +148 -0
  23. package/assets/script/controller/StatePropertyControlService.ts.meta +10 -0
  24. package/assets/script/controller/StateSelectV2.ts +4542 -0
  25. package/assets/script/controller/StateSelectV2.ts.meta +10 -0
  26. package/assets/script/controller/capabilities/AutoSyncCapability.ts +30 -0
  27. package/assets/script/controller/capabilities/AutoSyncCapability.ts.meta +10 -0
  28. package/assets/script/controller/capabilities/EventCapability.ts +144 -0
  29. package/assets/script/controller/capabilities/EventCapability.ts.meta +10 -0
  30. package/assets/script/controller/capabilities/MigrationCapability.ts +94 -0
  31. package/assets/script/controller/capabilities/MigrationCapability.ts.meta +10 -0
  32. package/assets/script/controller/capabilities/MultiCtrlBindingCapability.ts +157 -0
  33. package/assets/script/controller/capabilities/MultiCtrlBindingCapability.ts.meta +10 -0
  34. package/assets/script/controller/capabilities/PropertyControlCapability.ts +124 -0
  35. package/assets/script/controller/capabilities/PropertyControlCapability.ts.meta +10 -0
  36. package/assets/script/controller/capabilities/RecordingCapability.ts +69 -0
  37. package/assets/script/controller/capabilities/RecordingCapability.ts.meta +10 -0
  38. package/assets/script/controller/capabilities/SelectedPageIdCapability.ts +88 -0
  39. package/assets/script/controller/capabilities/SelectedPageIdCapability.ts.meta +10 -0
  40. package/assets/script/controller/capabilities.meta +13 -0
  41. package/assets/script/controller/props/CtrlInspectorGroups.ts +138 -0
  42. package/assets/script/controller/props/CtrlInspectorGroups.ts.meta +10 -0
  43. package/assets/script/controller/props/SelectInspectorGroups.ts +104 -0
  44. package/assets/script/controller/props/SelectInspectorGroups.ts.meta +10 -0
  45. package/bin/csc.js +286 -0
  46. package/package.json +60 -0
  47. package/packages/state-controller-v2-panel/README.md +80 -0
  48. package/packages/state-controller-v2-panel/inspector-inject.js +917 -0
  49. package/packages/state-controller-v2-panel/inspector-probe.json +3767 -0
  50. package/packages/state-controller-v2-panel/lib/handlers.js +534 -0
  51. package/packages/state-controller-v2-panel/main.js +149 -0
  52. package/packages/state-controller-v2-panel/package.json +32 -0
  53. package/packages/state-controller-v2-panel/panel/build.js +23 -0
  54. package/packages/state-controller-v2-panel/panel/logic.js +1207 -0
  55. package/packages/state-controller-v2-panel/panel/styles.css +454 -0
  56. package/packages/state-controller-v2-panel/panel/template.html +296 -0
  57. package/packages/state-controller-v2-panel/scene-accessor.js +657 -0
  58. package/skills/cocos-state-controller/SKILL.md +28 -0
  59. package/skills/cocos-state-controller/refs/cli-usage.md +78 -0
  60. package/skills/cocos-state-controller/refs/editor-guide.md +127 -0
  61. package/skills/cocos-state-controller/refs/migrate.md +106 -0
  62. package/skills/cocos-state-controller/refs/upstream-pr.md +66 -0
  63. package/tools/migration/migrate-prefab-v1-to-v2.js +608 -0
  64. package/tools/state-controller-sync-manifest.json +33 -0
@@ -0,0 +1,296 @@
1
+ <div class="panel-shell" id="app">
2
+ <!-- ===== 顶部导航条 ===== -->
3
+ <header class="top-nav">
4
+ <div class="nav-tabs">
5
+ <button id="tab-overview" class="tab-btn is-active">场景观测总览</button>
6
+ <button id="tab-editor" class="tab-btn">单控制器编辑</button>
7
+ <button id="tab-bindings" class="tab-btn">联动关系</button>
8
+ </div>
9
+ <div class="nav-actions">
10
+ <!-- 观测模式操作 -->
11
+ <div id="overview-actions" class="actions-group">
12
+ <select id="filter-level" class="nb-select" title="过滤级别">
13
+ <option value="default">默认 (变化/异常)</option>
14
+ <option value="abnormal">只看异常</option>
15
+ <option value="all">显示全部</option>
16
+ </select>
17
+ <input type="text" id="search-input" class="nb-input" placeholder="搜索节点 / 属性…">
18
+ </div>
19
+ <!-- 编辑模式操作 (inspector 增强 flags) -->
20
+ <div id="editor-actions" class="actions-group" style="display:none;">
21
+ <span class="field-label">Inspector 增强</span>
22
+ <label class="toggle-label"><input type="checkbox" id="chk-inspector-master"> 总开关</label>
23
+ <div class="toggle-group" id="inspector-sub-toggles">
24
+ <label class="toggle-label"><input type="checkbox" id="chk-inspector-viz"> 可视化</label>
25
+ <label class="toggle-label"><input type="checkbox" id="chk-inspector-dirty"> 脏值</label>
26
+ <label class="toggle-label"><input type="checkbox" id="chk-inspector-exclude"> 排除徽标</label>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </header>
31
+
32
+ <!-- ===== 视图 1: 场景观测总览 ===== -->
33
+ <div id="view-overview" class="view-container">
34
+ <!-- 仪表盘: 每个控制器当前所在状态 -->
35
+ <section id="dashboard-grid" class="dashboard-grid"></section>
36
+
37
+ <div id="overview-body" class="overview-body">
38
+ <!-- 左: 拓扑树 -->
39
+ <aside class="topology-panel">
40
+ <div class="panel-cap">拓扑树</div>
41
+ <div id="topology-tree" class="topology-tree"></div>
42
+ </aside>
43
+
44
+ <!-- 中: 值矩阵 -->
45
+ <main class="matrix-container">
46
+ <div class="matrix-title-bar">
47
+ <h2 id="matrix-title">选择一个成员节点</h2>
48
+ <span class="matrix-hint">💥 跨状态有变动高亮</span>
49
+ </div>
50
+ <div class="matrix-scroll">
51
+ <table id="value-matrix" class="matrix-table">
52
+ <thead><tr id="matrix-head"></tr></thead>
53
+ <tbody id="matrix-body"></tbody>
54
+ </table>
55
+ <div id="matrix-empty" class="matrix-empty">
56
+ <p>在左侧拓扑树点选一个<strong>成员节点</strong>,这里铺出它在各状态的属性值矩阵。</p>
57
+ </div>
58
+ </div>
59
+ </main>
60
+
61
+ <!-- 右: 体检 / 问题清单 -->
62
+ <aside class="issues-panel">
63
+ <div class="issues-header">
64
+ <h2>异常清单</h2>
65
+ <span id="issues-count" class="issues-count">0</span>
66
+ </div>
67
+ <div id="issues-list" class="issue-list"></div>
68
+ </aside>
69
+ </div>
70
+
71
+ <div id="overview-empty" class="empty-tip" style="display:none;">
72
+ <h3>场景里还没有控制器</h3>
73
+ <p>给节点挂上 StateControllerV2 并接入控制后, 这里会列出全部观测信息。</p>
74
+ </div>
75
+ </div>
76
+
77
+ <!-- ===== 视图 2: 单控制器编辑 (保留既有能力) ===== -->
78
+ <div id="view-editor" class="view-container" style="display:none;">
79
+ <aside class="sidebar">
80
+ <div id="states-list" class="states-list"></div>
81
+ <!-- 回收站: 暂存被移除的状态, 可恢复或彻底删除 (硬删数据) -->
82
+ <div id="recycle-bin" class="recycle-bin is-collapsed">
83
+ <div id="bin-header" class="bin-header" title="展开/折叠回收站">
84
+ <span class="bin-caret">▸</span>
85
+ <span class="bin-title">🗑 回收站</span>
86
+ <span id="bin-count" class="bin-count">0</span>
87
+ </div>
88
+ <div id="bin-body" class="bin-body">
89
+ <div id="bin-list" class="bin-list"></div>
90
+ <button id="btn-purge-all" class="nb-btn btn-wide btn-danger">清空回收站</button>
91
+ </div>
92
+ </div>
93
+ <div class="sidebar-footer">
94
+ <button id="btn-add-state" class="nb-btn nb-btn-primary btn-wide">+ 新增状态</button>
95
+ </div>
96
+ </aside>
97
+
98
+ <main class="main-content">
99
+ <!-- 回收态只读预览横幅 (强表现): 预览中叠加到节点查看, 场景只读, 出口=恢复/退出 -->
100
+ <div id="preview-banner" class="preview-banner" style="display:none;">
101
+ <span class="pv-icon">👁</span>
102
+ <span class="pv-text">正在预览回收状态 <b id="pv-name">--</b> · 只读叠加, 不影响当前激活状态</span>
103
+ <span class="pv-spacer"></span>
104
+ <button id="btn-preview-restore" class="nb-btn btn-small btn-primary">↩ 恢复到列表</button>
105
+ <button id="btn-preview-exit" class="nb-btn btn-small btn-danger">⏹ 退出预览</button>
106
+ </div>
107
+ <div class="main-toolbar">
108
+ <span class="field-label">当前控制器</span>
109
+ <div id="ctrl-switch-wrap" class="ctrl-switch-wrap">
110
+ <button id="btn-prev-ctrl" class="nb-btn btn-icon" title="上一个">‹</button>
111
+ <select id="ctrl-switch-select" class="nb-select ctrl-switch" title="选择控制器"></select>
112
+ <button id="btn-next-ctrl" class="nb-btn btn-icon" title="下一个">›</button>
113
+ </div>
114
+ </div>
115
+
116
+ <section id="state-detail" class="state-detail" style="display:none;">
117
+ <div class="shared-strip">
118
+ <div class="strip-field">
119
+ <span class="field-label">state</span>
120
+ <select id="state-pick-select" class="nb-select state-pick" title="选择状态"></select>
121
+ </div>
122
+ <div class="record-actions">
123
+ <button id="btn-start-record" class="nb-btn btn-record">🔴 录制</button>
124
+ <button id="btn-stop-record" class="nb-btn btn-stop" style="display:none;">⏹ 停止并保存</button>
125
+ <button id="btn-cancel-record" class="nb-btn btn-cancel" style="display:none;">⤺ 撤销本次录制</button>
126
+ </div>
127
+ </div>
128
+
129
+ <div class="detail-head">
130
+ <div>
131
+ <div class="eyebrow">当前详情</div>
132
+ <h2 id="state-title" class="state-title">--</h2>
133
+ </div>
134
+ <div id="record-badge" class="record-badge">Idle</div>
135
+ </div>
136
+
137
+ <div class="editor-matrix-cap">
138
+ <span>受控属性 · 各状态值</span>
139
+ <label class="toggle-label em-showall"><input type="checkbox" id="chk-show-all-props"> 显示全部受控属性</label>
140
+ <span class="cap-hint">💥 跨状态变动高亮 · 点属性看详情 · ✕ 取消跟随</span>
141
+ </div>
142
+ <div id="editor-matrix" class="editor-matrix"></div>
143
+ </section>
144
+
145
+ <section id="empty-tip" class="empty-tip">
146
+ <h3 id="empty-tip-title">请在场景中选中带 StateControllerV2 的节点</h3>
147
+ <p id="ctrl-list-hint">或从下方列表选择:</p>
148
+ <div id="ctrl-list" class="ctrl-list"></div>
149
+ </section>
150
+ </main>
151
+ </div>
152
+
153
+ <!-- ===== 视图 3: 控制器联动关系图 ===== -->
154
+ <div id="view-bindings" class="view-container" style="display:none;">
155
+ <div id="bindings-form" class="bindings-form">
156
+ <span class="field-label">新增联动</span>
157
+ <select id="bind-source-ctrl" class="nb-select"></select>
158
+ <span class="bind-sep">切到</span>
159
+ <select id="bind-source-state" class="nb-select"></select>
160
+ <span class="bind-sep">触发 ▶</span>
161
+ <select id="bind-target-ctrl" class="nb-select"></select>
162
+ <span class="bind-sep">切到</span>
163
+ <select id="bind-target-state" class="nb-select"></select>
164
+ <button id="btn-add-binding" class="nb-btn nb-btn-primary">+ 添加联动</button>
165
+ </div>
166
+ <div id="bindings-graph" class="bindings-graph"></div>
167
+ <div id="bindings-empty" class="empty-tip" style="display:none;">
168
+ <h3>还没有任何跨控制器联动</h3>
169
+ <p>用上方表单建立「A 切到某状态 → B 自动切到某状态」的声明式联动。</p>
170
+ </div>
171
+ </div>
172
+
173
+ <!-- ===== 属性详情抽屉 (点矩阵属性行展开, 逐状态看全值) ===== -->
174
+ <div id="prop-detail" class="prop-detail" style="display:none;">
175
+ <div class="pd-backdrop" id="pd-backdrop"></div>
176
+ <aside class="pd-panel">
177
+ <div class="pd-head">
178
+ <div class="pd-titles">
179
+ <div id="pd-name" class="pd-name"></div>
180
+ <div id="pd-type" class="pd-type"></div>
181
+ </div>
182
+ <button id="pd-close" class="nb-btn btn-small">✕</button>
183
+ </div>
184
+ <div id="pd-body" class="pd-body"></div>
185
+ </aside>
186
+ </div>
187
+ </div>
188
+
189
+ <!-- ===== 可复用模板 ===== -->
190
+
191
+ <!-- 联动关系边 -->
192
+ <template id="tpl-binding-edge">
193
+ <div class="bind-edge">
194
+ <span class="bind-node bind-src"><span class="bind-ctrl"></span><span class="bind-state"></span></span>
195
+ <span class="bind-arrow">──▶</span>
196
+ <span class="bind-node bind-tgt"><span class="bind-ctrl"></span><span class="bind-state"></span></span>
197
+ <button class="nb-btn btn-small btn-del-binding">✕</button>
198
+ </div>
199
+ </template>
200
+
201
+ <!-- 仪表盘卡片 -->
202
+ <template id="tpl-dashboard-card">
203
+ <div class="db-card">
204
+ <div class="db-title"></div>
205
+ <div class="db-value"><span class="status-dot"></span><span class="db-state-name"></span></div>
206
+ </div>
207
+ </template>
208
+
209
+ <!-- 拓扑树: 控制器头 -->
210
+ <template id="tpl-tree-ctrl">
211
+ <div class="tree-ctrl"><span class="tree-caret">▾</span><span class="tree-ctrl-icon">🎮</span><span class="tree-ctrl-name"></span></div>
212
+ </template>
213
+
214
+ <!-- 拓扑树: 成员节点 -->
215
+ <template id="tpl-tree-node">
216
+ <div class="tree-node"><span class="tree-node-icon">📦</span><span class="tree-node-name"></span></div>
217
+ </template>
218
+
219
+ <!-- 拓扑树: 受控属性行 -->
220
+ <template id="tpl-tree-prop">
221
+ <div class="tree-prop">
222
+ <span class="tree-prop-name"></span>
223
+ <span class="kind-badge"></span>
224
+ </div>
225
+ </template>
226
+
227
+ <!-- 矩阵: 表头状态列 -->
228
+ <template id="tpl-matrix-th"><th class="state-col"></th></template>
229
+
230
+ <!-- 矩阵: 属性行 -->
231
+ <template id="tpl-matrix-row">
232
+ <tr>
233
+ <td class="matrix-prop"><div class="prop-name"></div><div class="prop-type"></div></td>
234
+ </tr>
235
+ </template>
236
+
237
+ <!-- 矩阵: 值格 -->
238
+ <template id="tpl-matrix-cell"><td class="matrix-cell"></td></template>
239
+
240
+ <!-- 问题清单条目 -->
241
+ <template id="tpl-issue-item">
242
+ <div class="issue-item">
243
+ <div class="issue-title"><span class="badge-type"></span><span class="issue-prop"></span></div>
244
+ <div class="issue-desc"><span class="issue-node"></span></div>
245
+ <button class="nb-btn btn-issue-jump">定位 →</button>
246
+ </div>
247
+ </template>
248
+
249
+ <!-- ===== 编辑视图既有模板 (保留) ===== -->
250
+ <template id="tpl-state-item">
251
+ <div class="state-item">
252
+ <div class="state-thumb"></div>
253
+ <div class="state-meta">
254
+ <div class="state-name"></div>
255
+ <div class="state-sub"></div>
256
+ </div>
257
+ <span class="record-dot" style="display:none;">●</span>
258
+ <button class="nb-btn btn-small btn-del-state">✕</button>
259
+ </div>
260
+ </template>
261
+
262
+ <template id="tpl-ctrl-item">
263
+ <div class="ctrl-item">
264
+ <span class="ctrl-name"></span>
265
+ <button class="nb-btn btn-small btn-use-ctrl">选择</button>
266
+ </div>
267
+ </template>
268
+
269
+ <!-- 回收站条目 -->
270
+ <template id="tpl-bin-item">
271
+ <div class="bin-item">
272
+ <div class="bin-meta">
273
+ <div class="bin-name"></div>
274
+ <div class="bin-sub"></div>
275
+ </div>
276
+ <button class="nb-btn btn-small btn-bin-preview" title="只读预览: 把该状态叠加到节点查看 (不改当前选中)">👁</button>
277
+ <button class="nb-btn btn-small btn-bin-restore" title="恢复到状态列表尾部">恢复</button>
278
+ <button class="nb-btn btn-small btn-danger btn-bin-purge" title="彻底删除数据, 不可恢复">彻底删除</button>
279
+ </div>
280
+ </template>
281
+
282
+ <!-- ===== 自定义确认弹窗 (不可恢复操作专用) ===== -->
283
+ <div id="confirm-modal" class="confirm-modal" style="display:none;">
284
+ <div class="cm-backdrop" id="cm-backdrop"></div>
285
+ <div class="cm-dialog">
286
+ <div class="cm-head">
287
+ <span class="cm-icon">⚠️</span>
288
+ <span id="cm-title" class="cm-title">彻底删除?</span>
289
+ </div>
290
+ <div id="cm-body" class="cm-body"></div>
291
+ <div class="cm-actions">
292
+ <button id="cm-cancel" class="nb-btn">取消</button>
293
+ <button id="cm-confirm" class="nb-btn btn-danger">彻底删除</button>
294
+ </div>
295
+ </div>
296
+ </div>