@qnote/q-ai-note 1.0.5 → 1.0.7

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 (50) hide show
  1. package/README.md +41 -0
  2. package/dist/cli.js +55 -18
  3. package/dist/cli.js.map +1 -1
  4. package/dist/server/accessControl.d.ts +29 -0
  5. package/dist/server/accessControl.d.ts.map +1 -0
  6. package/dist/server/accessControl.js +161 -0
  7. package/dist/server/accessControl.js.map +1 -0
  8. package/dist/server/api/accessHelpers.d.ts +11 -0
  9. package/dist/server/api/accessHelpers.d.ts.map +1 -0
  10. package/dist/server/api/accessHelpers.js +45 -0
  11. package/dist/server/api/accessHelpers.js.map +1 -0
  12. package/dist/server/api/chat.d.ts.map +1 -1
  13. package/dist/server/api/chat.js +31 -0
  14. package/dist/server/api/chat.js.map +1 -1
  15. package/dist/server/api/diary.d.ts.map +1 -1
  16. package/dist/server/api/diary.js +61 -1
  17. package/dist/server/api/diary.js.map +1 -1
  18. package/dist/server/api/nodeEntities.d.ts.map +1 -1
  19. package/dist/server/api/nodeEntities.js +31 -0
  20. package/dist/server/api/nodeEntities.js.map +1 -1
  21. package/dist/server/api/projectSettings.d.ts +3 -0
  22. package/dist/server/api/projectSettings.d.ts.map +1 -0
  23. package/dist/server/api/projectSettings.js +29 -0
  24. package/dist/server/api/projectSettings.js.map +1 -0
  25. package/dist/server/api/sandbox.d.ts.map +1 -1
  26. package/dist/server/api/sandbox.js +35 -1
  27. package/dist/server/api/sandbox.js.map +1 -1
  28. package/dist/server/api/settings.d.ts.map +1 -1
  29. package/dist/server/api/settings.js +25 -1
  30. package/dist/server/api/settings.js.map +1 -1
  31. package/dist/server/api/workItem.d.ts.map +1 -1
  32. package/dist/server/api/workItem.js +59 -0
  33. package/dist/server/api/workItem.js.map +1 -1
  34. package/dist/server/config.d.ts +3 -2
  35. package/dist/server/config.d.ts.map +1 -1
  36. package/dist/server/config.js +6 -1
  37. package/dist/server/config.js.map +1 -1
  38. package/dist/server/index.d.ts +8 -2
  39. package/dist/server/index.d.ts.map +1 -1
  40. package/dist/server/index.js +102 -4
  41. package/dist/server/index.js.map +1 -1
  42. package/dist/server/projectConfig.d.ts +37 -0
  43. package/dist/server/projectConfig.d.ts.map +1 -0
  44. package/dist/server/projectConfig.js +180 -0
  45. package/dist/server/projectConfig.js.map +1 -0
  46. package/dist/web/app.js +760 -44
  47. package/dist/web/index.html +107 -60
  48. package/dist/web/styles.css +256 -11
  49. package/dist/web/vueRenderers.js +71 -57
  50. package/package.json +2 -2
@@ -21,7 +21,8 @@
21
21
  <li><a href="#/sandboxes" data-nav="sandboxes">沙盘</a></li>
22
22
  <li><a href="#/diaries" data-nav="diaries">日记</a></li>
23
23
  <li><a href="#/changes" data-nav="changes">变化</a></li>
24
- <li><a href="#/settings" data-nav="settings">设置</a></li>
24
+ <li><a href="#/settings" data-nav="settings">项目设置</a></li>
25
+ <li><a href="#/system-settings" data-nav="system-settings">系统设置</a></li>
25
26
  </ul>
26
27
  </nav>
27
28
  <main class="content">
@@ -39,7 +40,10 @@
39
40
  <div class="action-strip">
40
41
  <button class="btn btn-secondary btn-sm" id="generate-insight-btn">智能总结</button>
41
42
  <button class="btn btn-secondary btn-sm" id="generate-report-btn">生成汇报</button>
42
- <button class="btn btn-secondary btn-sm" id="toggle-sandbox-present-btn" type="button">展示态布局</button>
43
+ <button class="btn btn-secondary btn-sm ai-toggle-btn" id="toggle-sandbox-chat-btn" type="button">
44
+ <span class="icon" aria-hidden="true">🤖</span>
45
+ <span>显示 AI 助手</span>
46
+ </button>
43
47
  <button class="btn btn-secondary btn-sm" id="toggle-sandbox-fullscreen-btn" type="button">全屏</button>
44
48
  </div>
45
49
  <div class="insight-box hidden" id="sandbox-insight-output" hidden>
@@ -109,72 +113,83 @@
109
113
  <div class="drawer-subtitle" id="drawer-node-title"></div>
110
114
  </div>
111
115
  <div class="drawer-header-actions">
112
- <button class="btn btn-secondary btn-sm" id="toggle-node-entity-form-btn" type="button">+ 新建记录</button>
113
116
  <button class="btn btn-secondary btn-sm" id="close-node-drawer-btn">关闭</button>
114
117
  </div>
115
118
  </div>
116
- <div class="summary-strip compact" id="node-entity-summary"></div>
117
- <div class="drawer-diary-quick-form">
118
- <div class="sandbox-diary-quick-meta">
119
- <span id="sandbox-diary-target-label">快速日记:未选中节点</span>
120
- </div>
121
- <textarea id="drawer-diary-content" placeholder="记录进展(日记支持 Markdown)"></textarea>
122
- <div class="sandbox-diary-quick-actions">
123
- <button class="btn btn-primary btn-sm" id="drawer-diary-save-btn" type="button">记录日记</button>
124
- </div>
125
- </div>
126
- <div class="entity-filter-tabs" id="entity-filter-tabs">
127
- <button class="btn btn-secondary btn-sm active" data-entity-filter="all">全部</button>
128
- <button class="btn btn-secondary btn-sm" data-entity-filter="issue">Issue</button>
129
- <button class="btn btn-secondary btn-sm" data-entity-filter="knowledge">Knowledge</button>
130
- <button class="btn btn-secondary btn-sm" data-entity-filter="capability">Capability</button>
131
- <button class="btn btn-secondary btn-sm" data-entity-filter="diary">Diary</button>
132
- </div>
133
-
134
- <div class="drawer-create-form hidden" id="drawer-create-form">
135
- <select id="entity-type-select">
136
- <option value="issue">Issue</option>
137
- <option value="knowledge">Knowledge</option>
138
- <option value="capability">Capability</option>
139
- </select>
140
- <input type="text" id="entity-title-input" placeholder="标题(必填)">
141
- <div class="entity-field-group" id="entity-assignee-group">
142
- <input type="text" id="entity-assignee-input" placeholder="负责人(Issue可选)">
119
+ <section class="drawer-section">
120
+ <div class="drawer-section-title">节点概览</div>
121
+ <div class="summary-strip compact" id="node-entity-summary"></div>
122
+ </section>
123
+ <section class="drawer-section">
124
+ <div class="drawer-section-title">快速日记</div>
125
+ <div class="drawer-diary-quick-form">
126
+ <div class="sandbox-diary-quick-meta">
127
+ <span id="sandbox-diary-target-label">快速日记:未选中节点</span>
128
+ </div>
129
+ <textarea id="drawer-diary-content" placeholder="记录进展(日记支持 Markdown)"></textarea>
130
+ <div class="sandbox-diary-quick-actions">
131
+ <button class="btn btn-primary btn-sm" id="drawer-diary-save-btn" type="button">记录日记</button>
132
+ </div>
143
133
  </div>
144
- <div class="entity-field-group" id="entity-status-group">
145
- <select id="entity-status-select"></select>
134
+ </section>
135
+ <section class="drawer-section">
136
+ <div class="drawer-section-title-row">
137
+ <div class="drawer-section-title">记录管理</div>
138
+ <button class="btn btn-secondary btn-sm" id="toggle-node-entity-form-btn" type="button">+ 新建记录</button>
146
139
  </div>
147
- <div class="entity-field-group" id="entity-priority-group">
148
- <select id="entity-priority-select">
149
- <option value="">优先级(Issue可选)</option>
150
- <option value="low">low</option>
151
- <option value="medium">medium</option>
152
- <option value="high">high</option>
153
- <option value="critical">critical</option>
154
- </select>
140
+ <div class="entity-filter-tabs" id="entity-filter-tabs">
141
+ <button class="btn btn-secondary btn-sm active" data-entity-filter="all">全部</button>
142
+ <button class="btn btn-secondary btn-sm" data-entity-filter="issue">Issue</button>
143
+ <button class="btn btn-secondary btn-sm" data-entity-filter="knowledge">Knowledge</button>
144
+ <button class="btn btn-secondary btn-sm" data-entity-filter="capability">Capability</button>
145
+ <button class="btn btn-secondary btn-sm" data-entity-filter="diary">Diary</button>
155
146
  </div>
156
- <div class="entity-field-group" id="entity-capability-type-group">
157
- <select id="entity-capability-type-input">
158
- <option value="">能力类型(Capability可选)</option>
159
- <option value="workflow">workflow(流程能力)</option>
160
- <option value="automation">automation(自动化能力)</option>
161
- <option value="tooling">tooling(工具能力)</option>
162
- <option value="collaboration">collaboration(协作能力)</option>
163
- <option value="analysis">analysis(分析能力)</option>
164
- <option value="delivery">delivery(交付能力)</option>
165
- <option value="governance">governance(治理能力)</option>
166
- <option value="other">other(其他)</option>
147
+
148
+ <div class="drawer-create-form hidden" id="drawer-create-form">
149
+ <select id="entity-type-select">
150
+ <option value="issue">Issue</option>
151
+ <option value="knowledge">Knowledge</option>
152
+ <option value="capability">Capability</option>
167
153
  </select>
154
+ <input type="text" id="entity-title-input" placeholder="标题(必填)">
155
+ <div class="entity-field-group" id="entity-assignee-group">
156
+ <input type="text" id="entity-assignee-input" placeholder="负责人(Issue可选)">
157
+ </div>
158
+ <div class="entity-field-group" id="entity-status-group">
159
+ <select id="entity-status-select"></select>
160
+ </div>
161
+ <div class="entity-field-group" id="entity-priority-group">
162
+ <select id="entity-priority-select">
163
+ <option value="">优先级(Issue可选)</option>
164
+ <option value="low">low</option>
165
+ <option value="medium">medium</option>
166
+ <option value="high">high</option>
167
+ <option value="critical">critical</option>
168
+ </select>
169
+ </div>
170
+ <div class="entity-field-group" id="entity-capability-type-group">
171
+ <select id="entity-capability-type-input">
172
+ <option value="">能力类型(Capability可选)</option>
173
+ <option value="workflow">workflow(流程能力)</option>
174
+ <option value="automation">automation(自动化能力)</option>
175
+ <option value="tooling">tooling(工具能力)</option>
176
+ <option value="collaboration">collaboration(协作能力)</option>
177
+ <option value="analysis">analysis(分析能力)</option>
178
+ <option value="delivery">delivery(交付能力)</option>
179
+ <option value="governance">governance(治理能力)</option>
180
+ <option value="other">other(其他)</option>
181
+ </select>
182
+ </div>
183
+ <textarea id="entity-content-input" rows="4" placeholder="Markdown 内容(Knowledge/Capability 推荐)"></textarea>
184
+ <div class="entity-form-hint" id="entity-form-hint"></div>
185
+ <div class="entity-form-actions">
186
+ <button class="btn btn-secondary btn-sm hidden" id="cancel-edit-entity-btn" type="button">取消编辑</button>
187
+ <button class="btn btn-primary btn-sm" id="create-node-entity-btn" type="button">添加记录</button>
188
+ </div>
168
189
  </div>
169
- <textarea id="entity-content-input" rows="4" placeholder="Markdown 内容(Knowledge/Capability 推荐)"></textarea>
170
- <div class="entity-form-hint" id="entity-form-hint"></div>
171
- <div class="entity-form-actions">
172
- <button class="btn btn-secondary btn-sm hidden" id="cancel-edit-entity-btn" type="button">取消编辑</button>
173
- <button class="btn btn-primary btn-sm" id="create-node-entity-btn" type="button">添加记录</button>
174
- </div>
175
- </div>
176
190
 
177
- <div class="drawer-list" id="node-entity-list"></div>
191
+ <div class="drawer-list" id="node-entity-list"></div>
192
+ </section>
178
193
  </aside>
179
194
  </div>
180
195
  </div>
@@ -246,7 +261,35 @@
246
261
  </div>
247
262
 
248
263
  <div id="page-settings" class="page hidden">
249
- <h2>设置</h2>
264
+ <h2>项目设置</h2>
265
+ <div class="settings-form">
266
+ <div class="setting-group project-setting-section">
267
+ <div class="project-setting-header">
268
+ <label>Users(按 IP 精确匹配,IP 不能复用)</label>
269
+ <button class="btn btn-secondary btn-sm" id="add-project-user-btn" type="button">+ 添加用户</button>
270
+ </div>
271
+ <div class="project-setting-list" id="project-users-list"></div>
272
+ </div>
273
+ <div class="setting-group project-setting-section">
274
+ <div class="project-setting-header">
275
+ <label>Profiles(支持 apply_to_all_users)</label>
276
+ <button class="btn btn-secondary btn-sm" id="add-project-profile-btn" type="button">+ 添加 Profile</button>
277
+ </div>
278
+ <div class="project-setting-list" id="project-profiles-list"></div>
279
+ </div>
280
+ <div class="setting-group project-setting-section">
281
+ <div class="project-setting-header">
282
+ <label>Bindings(user -> profiles)</label>
283
+ <button class="btn btn-secondary btn-sm" id="add-project-binding-btn" type="button">+ 添加绑定</button>
284
+ </div>
285
+ <div class="project-setting-list" id="project-bindings-list"></div>
286
+ </div>
287
+ <button class="btn btn-primary" id="save-project-settings-btn">保存项目设置</button>
288
+ </div>
289
+ </div>
290
+
291
+ <div id="page-system-settings" class="page hidden">
292
+ <h2>系统设置</h2>
250
293
  <div class="settings-form">
251
294
  <div class="setting-group">
252
295
  <label>API URL</label>
@@ -265,6 +308,10 @@
265
308
  <div class="settings-kv-list" id="setting-headers-list"></div>
266
309
  <button class="btn btn-secondary btn-sm" id="add-setting-header-btn" type="button">+ 添加 Header</button>
267
310
  </div>
311
+ <div class="setting-group">
312
+ <label>系统可编辑 IP(精确 IP,一行一个)</label>
313
+ <textarea id="setting-editable-ips" rows="5" placeholder="10.1.2.3&#10;192.168.1.20"></textarea>
314
+ </div>
268
315
  <button class="btn btn-primary" id="save-settings-btn">保存</button>
269
316
  </div>
270
317
  </div>
@@ -138,6 +138,10 @@ body {
138
138
  display: none;
139
139
  }
140
140
 
141
+ .hidden {
142
+ display: none !important;
143
+ }
144
+
141
145
  @keyframes fadeIn {
142
146
  from { opacity: 0; transform: translateY(8px); }
143
147
  to { opacity: 1; transform: translateY(0); }
@@ -453,6 +457,11 @@ h2 {
453
457
  background: linear-gradient(135deg, #e8f0fe 0%, #f0f7ff 100%);
454
458
  }
455
459
 
460
+ .tree-parent-header.is-selected {
461
+ background: linear-gradient(135deg, #dbeafe 0%, #eef6ff 100%);
462
+ box-shadow: inset 0 0 0 1px #8bb8ff;
463
+ }
464
+
456
465
  .tree-parent-header .node-status {
457
466
  width: 10px;
458
467
  height: 10px;
@@ -772,6 +781,12 @@ h2 {
772
781
  background: #f7faff;
773
782
  }
774
783
 
784
+ .lane-tree-node-row.is-selected {
785
+ border-color: #80aef5;
786
+ background: #edf5ff;
787
+ box-shadow: inset 0 0 0 1px #80aef5;
788
+ }
789
+
775
790
  .lane-tree-node-row:focus-visible {
776
791
  outline: 2px solid #c2dbff;
777
792
  outline-offset: 1px;
@@ -793,6 +808,18 @@ h2 {
793
808
  border-top: 1.2px solid #9bb3d8;
794
809
  }
795
810
 
811
+ /* Last sibling ends with an "L" connector */
812
+ .lane-tree-children > .lane-tree-node:last-child::after {
813
+ content: '';
814
+ position: absolute;
815
+ left: -10px;
816
+ top: 13px;
817
+ bottom: -2px;
818
+ width: 2px;
819
+ background: var(--bg-secondary);
820
+ pointer-events: none;
821
+ }
822
+
796
823
  .dense-lane > .dense-lane-body > .lane-tree-node > .lane-tree-node-row::before {
797
824
  display: none;
798
825
  }
@@ -936,6 +963,12 @@ h2 {
936
963
  box-shadow: 0 4px 10px rgba(0,0,0,0.1);
937
964
  }
938
965
 
966
+ .tree-leaf-node.is-selected {
967
+ border-color: #7aa9f8;
968
+ background: linear-gradient(180deg, #f5f9ff 0%, #ffffff 100%);
969
+ box-shadow: 0 0 0 2px rgba(122, 169, 248, 0.28), 0 6px 14px rgba(58, 108, 196, 0.12);
970
+ }
971
+
939
972
  .tree-leaf-node .node-status {
940
973
  display: inline-flex;
941
974
  width: 6px;
@@ -1560,7 +1593,7 @@ h2 {
1560
1593
  background: var(--bg);
1561
1594
  border-radius: 12px;
1562
1595
  padding: 24px;
1563
- max-width: 600px;
1596
+ max-width: 980px;
1564
1597
  box-shadow: var(--shadow);
1565
1598
  }
1566
1599
 
@@ -1607,6 +1640,160 @@ h2 {
1607
1640
  width: 100%;
1608
1641
  }
1609
1642
 
1643
+ .project-setting-section {
1644
+ border: 1px solid var(--border);
1645
+ border-radius: 10px;
1646
+ padding: 12px;
1647
+ background: #fcfdff;
1648
+ }
1649
+
1650
+ .project-setting-header {
1651
+ display: flex;
1652
+ align-items: center;
1653
+ justify-content: space-between;
1654
+ gap: 10px;
1655
+ margin-bottom: 10px;
1656
+ }
1657
+
1658
+ .project-setting-list {
1659
+ display: flex;
1660
+ flex-direction: column;
1661
+ gap: 10px;
1662
+ }
1663
+
1664
+ .project-empty {
1665
+ font-size: 12px;
1666
+ color: var(--text-secondary);
1667
+ background: var(--bg);
1668
+ border: 1px dashed var(--border);
1669
+ border-radius: 8px;
1670
+ padding: 10px;
1671
+ }
1672
+
1673
+ .project-row {
1674
+ display: grid;
1675
+ grid-template-columns: minmax(150px, 0.9fr) minmax(180px, 1fr) minmax(360px, 1.8fr) auto;
1676
+ gap: 8px;
1677
+ align-items: center;
1678
+ }
1679
+
1680
+ .project-row select,
1681
+ .project-profile-grid select,
1682
+ .project-profile-grid input,
1683
+ .project-row input {
1684
+ width: 100%;
1685
+ border: 1px solid var(--border);
1686
+ border-radius: 8px;
1687
+ padding: 8px 10px;
1688
+ font-size: 13px;
1689
+ background: var(--bg);
1690
+ }
1691
+
1692
+ .project-ip-editor {
1693
+ border: 1px solid var(--border);
1694
+ border-radius: 8px;
1695
+ background: var(--bg);
1696
+ padding: 8px;
1697
+ display: flex;
1698
+ flex-direction: column;
1699
+ gap: 8px;
1700
+ }
1701
+
1702
+ .project-ip-chips {
1703
+ display: flex;
1704
+ flex-wrap: wrap;
1705
+ gap: 6px;
1706
+ min-height: 24px;
1707
+ }
1708
+
1709
+ .project-ip-chip {
1710
+ display: inline-flex;
1711
+ align-items: center;
1712
+ gap: 6px;
1713
+ padding: 2px 8px;
1714
+ border-radius: 999px;
1715
+ background: #eef4ff;
1716
+ border: 1px solid #c7d9ff;
1717
+ color: #1d4fae;
1718
+ font-size: 12px;
1719
+ }
1720
+
1721
+ .project-ip-remove {
1722
+ border: none;
1723
+ background: transparent;
1724
+ color: #1d4fae;
1725
+ cursor: pointer;
1726
+ font-size: 14px;
1727
+ line-height: 1;
1728
+ }
1729
+
1730
+ .project-ip-input-row {
1731
+ display: grid;
1732
+ grid-template-columns: 1fr auto;
1733
+ gap: 8px;
1734
+ align-items: center;
1735
+ }
1736
+
1737
+ .project-row.compact {
1738
+ grid-template-columns: 1fr 160px auto;
1739
+ }
1740
+
1741
+ .project-profile-card,
1742
+ .project-binding-card {
1743
+ border: 1px solid var(--border);
1744
+ background: var(--bg);
1745
+ border-radius: 8px;
1746
+ padding: 10px;
1747
+ display: flex;
1748
+ flex-direction: column;
1749
+ gap: 10px;
1750
+ }
1751
+
1752
+ .project-profile-grid {
1753
+ display: grid;
1754
+ grid-template-columns: minmax(170px, 1fr) minmax(200px, 1.2fr) minmax(240px, 0.8fr) auto;
1755
+ gap: 8px;
1756
+ align-items: center;
1757
+ }
1758
+
1759
+ .project-profile-pages {
1760
+ display: flex;
1761
+ flex-wrap: wrap;
1762
+ gap: 10px;
1763
+ }
1764
+
1765
+ .project-sandbox-items {
1766
+ display: flex;
1767
+ flex-direction: column;
1768
+ gap: 8px;
1769
+ }
1770
+
1771
+ .project-profile-footer {
1772
+ display: flex;
1773
+ justify-content: flex-end;
1774
+ }
1775
+
1776
+ .project-binding-profiles {
1777
+ display: flex;
1778
+ flex-wrap: wrap;
1779
+ gap: 10px;
1780
+ }
1781
+
1782
+ @media (max-width: 1180px) {
1783
+ .settings-form {
1784
+ max-width: 100%;
1785
+ }
1786
+ .project-row {
1787
+ grid-template-columns: 1fr;
1788
+ }
1789
+ .project-row.compact {
1790
+ grid-template-columns: 1fr;
1791
+ }
1792
+ .project-profile-grid {
1793
+ grid-template-columns: 1fr;
1794
+ }
1795
+ }
1796
+
1610
1797
  /* Dialog */
1611
1798
  dialog {
1612
1799
  position: fixed;
@@ -1753,16 +1940,24 @@ dialog::backdrop {
1753
1940
  /* Sandbox Layout - Left/Right */
1754
1941
  .sandbox-layout {
1755
1942
  display: grid;
1756
- grid-template-columns: minmax(0, 72fr) minmax(280px, 28fr);
1943
+ grid-template-columns: minmax(0, 1fr);
1757
1944
  gap: 16px;
1758
- height: calc(100vh - 180px);
1945
+ min-height: 320px;
1759
1946
  padding-right: 8px;
1760
1947
  box-sizing: border-box;
1761
1948
  position: relative;
1762
1949
  }
1763
1950
 
1764
- .sandbox-layout.presentation-mode {
1765
- grid-template-columns: minmax(0, 82fr) minmax(240px, 18fr);
1951
+ .sandbox-layout.show-chat {
1952
+ grid-template-columns: minmax(0, 72fr) minmax(280px, 28fr);
1953
+ }
1954
+
1955
+ .sandbox-layout .sandbox-chat-section {
1956
+ display: none;
1957
+ }
1958
+
1959
+ .sandbox-layout.show-chat .sandbox-chat-section {
1960
+ display: flex;
1766
1961
  }
1767
1962
 
1768
1963
  .sandbox-layout.is-fullscreen {
@@ -1774,12 +1969,24 @@ dialog::backdrop {
1774
1969
  align-items: stretch;
1775
1970
  }
1776
1971
 
1972
+ .sandbox-layout.is-fullscreen.show-chat {
1973
+ grid-template-columns: minmax(0, 72fr) minmax(280px, 28fr);
1974
+ }
1975
+
1777
1976
  .sandbox-layout.is-fullscreen .sandbox-tree-section,
1778
1977
  .sandbox-layout.is-fullscreen .sandbox-chat-section {
1779
1978
  min-height: 0;
1780
1979
  }
1781
1980
 
1782
- .sandbox-layout.is-fullscreen .sandbox-chat-section {
1981
+ .sandbox-layout.is-fullscreen:not(.show-chat) .sandbox-chat-section {
1982
+ display: none;
1983
+ }
1984
+
1985
+ #page-sandbox-detail.is-sandbox-fullscreen #sandbox-overview {
1986
+ display: none;
1987
+ }
1988
+
1989
+ #page-sandbox-detail.is-sandbox-fullscreen .back-link {
1783
1990
  display: none;
1784
1991
  }
1785
1992
 
@@ -1898,7 +2105,7 @@ dialog::backdrop {
1898
2105
  }
1899
2106
 
1900
2107
  .summary-strip.compact {
1901
- margin-bottom: 10px;
2108
+ margin-bottom: 0;
1902
2109
  gap: 8px;
1903
2110
  }
1904
2111
 
@@ -1912,6 +2119,25 @@ dialog::backdrop {
1912
2119
  font-size: 14px;
1913
2120
  }
1914
2121
 
2122
+ .drawer-section {
2123
+ margin-bottom: 12px;
2124
+ }
2125
+
2126
+ .drawer-section-title {
2127
+ font-size: 12px;
2128
+ font-weight: 600;
2129
+ color: var(--text-secondary);
2130
+ margin: 0 0 8px;
2131
+ }
2132
+
2133
+ .drawer-section-title-row {
2134
+ display: flex;
2135
+ align-items: center;
2136
+ justify-content: space-between;
2137
+ gap: 8px;
2138
+ margin-bottom: 8px;
2139
+ }
2140
+
1915
2141
  .drawer-create-form {
1916
2142
  display: grid;
1917
2143
  gap: 8px;
@@ -1919,7 +2145,7 @@ dialog::backdrop {
1919
2145
  background: #f8f9fb;
1920
2146
  border: 1px solid var(--border);
1921
2147
  border-radius: 10px;
1922
- margin-bottom: 10px;
2148
+ margin-bottom: 8px;
1923
2149
  }
1924
2150
 
1925
2151
  .drawer-create-form.hidden {
@@ -2012,7 +2238,7 @@ dialog::backdrop {
2012
2238
  display: flex;
2013
2239
  flex-wrap: wrap;
2014
2240
  gap: 6px;
2015
- margin-bottom: 10px;
2241
+ margin-bottom: 8px;
2016
2242
  }
2017
2243
 
2018
2244
  .entity-filter-tabs .btn.active {
@@ -2121,11 +2347,15 @@ dialog::backdrop {
2121
2347
 
2122
2348
  @media (max-width: 1366px) {
2123
2349
  .sandbox-layout {
2350
+ grid-template-columns: minmax(0, 1fr);
2351
+ }
2352
+
2353
+ .sandbox-layout.show-chat {
2124
2354
  grid-template-columns: minmax(0, 70fr) minmax(260px, 30fr);
2125
2355
  }
2126
2356
 
2127
- .sandbox-layout.presentation-mode {
2128
- grid-template-columns: minmax(0, 80fr) minmax(220px, 20fr);
2357
+ .sandbox-layout.is-fullscreen.show-chat {
2358
+ grid-template-columns: minmax(0, 70fr) minmax(260px, 30fr);
2129
2359
  }
2130
2360
 
2131
2361
  .node-entity-drawer {
@@ -2138,6 +2368,21 @@ dialog::backdrop {
2138
2368
  }
2139
2369
  }
2140
2370
 
2371
+ .ai-toggle-btn {
2372
+ background: linear-gradient(135deg, #2563eb, #1d4ed8);
2373
+ color: #fff;
2374
+ border-color: transparent;
2375
+ box-shadow: 0 6px 14px rgba(37, 99, 235, 0.24);
2376
+ }
2377
+
2378
+ .ai-toggle-btn:hover {
2379
+ background: linear-gradient(135deg, #1d4ed8, #1e40af);
2380
+ }
2381
+
2382
+ .ai-toggle-btn .icon {
2383
+ margin-right: 4px;
2384
+ }
2385
+
2141
2386
  .sandbox-chat-section .chat-container {
2142
2387
  flex: 1;
2143
2388
  height: auto;