@leeoohoo/ui-apps-devkit 0.1.0 → 0.1.2

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 (62) hide show
  1. package/README.md +75 -60
  2. package/bin/chatos-uiapp.js +4 -4
  3. package/package.json +26 -20
  4. package/src/cli.js +53 -53
  5. package/src/commands/dev.js +14 -14
  6. package/src/commands/init.js +131 -129
  7. package/src/commands/install.js +47 -46
  8. package/src/commands/pack.js +72 -72
  9. package/src/commands/validate.js +138 -80
  10. package/src/lib/args.js +49 -49
  11. package/src/lib/config.js +29 -29
  12. package/src/lib/fs.js +78 -78
  13. package/src/lib/path-boundary.js +16 -16
  14. package/src/lib/plugin.js +45 -45
  15. package/src/lib/state-constants.js +2 -0
  16. package/src/lib/template.js +172 -168
  17. package/src/sandbox/server.js +1957 -692
  18. package/templates/basic/README.md +78 -54
  19. package/templates/basic/chatos.config.json +5 -5
  20. package/templates/basic/docs/CHATOS_UI_APPS_AI_CONTRIBUTIONS.md +214 -181
  21. package/templates/basic/docs/CHATOS_UI_APPS_BACKEND_PROTOCOL.md +75 -74
  22. package/templates/basic/docs/CHATOS_UI_APPS_HOST_API.md +136 -123
  23. package/templates/basic/docs/CHATOS_UI_APPS_OVERVIEW.md +112 -107
  24. package/templates/basic/docs/CHATOS_UI_APPS_PLUGIN_MANIFEST.md +242 -227
  25. package/templates/basic/docs/CHATOS_UI_APPS_STYLE_GUIDE.md +95 -0
  26. package/templates/basic/docs/CHATOS_UI_APPS_TROUBLESHOOTING.md +45 -0
  27. package/templates/basic/docs/CHATOS_UI_PROMPTS_PROTOCOL.md +392 -392
  28. package/templates/basic/plugin/apps/app/compact.mjs +41 -0
  29. package/templates/basic/plugin/apps/app/index.mjs +287 -263
  30. package/templates/basic/plugin/apps/app/mcp-prompt.en.md +7 -7
  31. package/templates/basic/plugin/apps/app/mcp-prompt.zh.md +7 -7
  32. package/templates/basic/plugin/apps/app/mcp-server.mjs +15 -15
  33. package/templates/basic/plugin/backend/index.mjs +37 -37
  34. package/templates/basic/template.json +7 -7
  35. package/templates/notepad/README.md +55 -24
  36. package/templates/notepad/chatos.config.json +4 -4
  37. package/templates/notepad/docs/CHATOS_UI_APPS_AI_CONTRIBUTIONS.md +214 -181
  38. package/templates/notepad/docs/CHATOS_UI_APPS_BACKEND_PROTOCOL.md +75 -74
  39. package/templates/notepad/docs/CHATOS_UI_APPS_HOST_API.md +136 -123
  40. package/templates/notepad/docs/CHATOS_UI_APPS_OVERVIEW.md +112 -107
  41. package/templates/notepad/docs/CHATOS_UI_APPS_PLUGIN_MANIFEST.md +242 -227
  42. package/templates/notepad/docs/CHATOS_UI_APPS_STYLE_GUIDE.md +95 -0
  43. package/templates/notepad/docs/CHATOS_UI_APPS_TROUBLESHOOTING.md +45 -0
  44. package/templates/notepad/docs/CHATOS_UI_PROMPTS_PROTOCOL.md +392 -392
  45. package/templates/notepad/plugin/apps/app/api.mjs +30 -30
  46. package/templates/notepad/plugin/apps/app/compact.mjs +41 -0
  47. package/templates/notepad/plugin/apps/app/dom.mjs +14 -14
  48. package/templates/notepad/plugin/apps/app/ds-tree.mjs +35 -35
  49. package/templates/notepad/plugin/apps/app/index.mjs +1056 -1056
  50. package/templates/notepad/plugin/apps/app/layers.mjs +338 -338
  51. package/templates/notepad/plugin/apps/app/markdown.mjs +120 -120
  52. package/templates/notepad/plugin/apps/app/mcp-prompt.en.md +22 -22
  53. package/templates/notepad/plugin/apps/app/mcp-prompt.zh.md +22 -22
  54. package/templates/notepad/plugin/apps/app/mcp-server.mjs +206 -199
  55. package/templates/notepad/plugin/apps/app/styles.mjs +355 -355
  56. package/templates/notepad/plugin/apps/app/tags.mjs +21 -21
  57. package/templates/notepad/plugin/apps/app/ui.mjs +280 -280
  58. package/templates/notepad/plugin/backend/index.mjs +99 -99
  59. package/templates/notepad/plugin/plugin.json +23 -23
  60. package/templates/notepad/plugin/shared/notepad-paths.mjs +59 -41
  61. package/templates/notepad/plugin/shared/notepad-store.mjs +765 -765
  62. package/templates/notepad/template.json +8 -8
@@ -1,355 +1,355 @@
1
- import { DS_TREE_STYLES } from './ds-tree.mjs';
2
-
3
- export const NOTEPAD_MANAGER_STYLES = `
4
- ${DS_TREE_STYLES}
5
- .np-root {
6
- height: 100%;
7
- min-height: 0;
8
- display: flex;
9
- flex-direction: column;
10
- gap: 10px;
11
- padding: 12px;
12
- box-sizing: border-box;
13
- }
14
- .np-header {
15
- display: flex;
16
- align-items: center;
17
- justify-content: space-between;
18
- gap: 12px;
19
- }
20
- .np-title {
21
- font-weight: 750;
22
- letter-spacing: 0.2px;
23
- }
24
- .np-meta {
25
- font-size: 12px;
26
- opacity: 0.72;
27
- }
28
- .np-pill {
29
- font-size: 12px;
30
- padding: 6px 10px;
31
- border-radius: 999px;
32
- border: 1px solid var(--ds-panel-border);
33
- background: var(--ds-subtle-bg);
34
- white-space: nowrap;
35
- user-select: none;
36
- }
37
- .np-pill[data-tone='ok'] { box-shadow: 0 0 0 3px rgba(46, 160, 67, 0.12); }
38
- .np-pill[data-tone='bad'] { box-shadow: 0 0 0 3px rgba(248, 81, 73, 0.12); }
39
- .np-btn {
40
- border: 1px solid var(--ds-panel-border);
41
- background: transparent;
42
- border-radius: 10px;
43
- padding: 6px 8px;
44
- cursor: pointer;
45
- font-weight: 600;
46
- font-size: 12px;
47
- line-height: 1.2;
48
- white-space: nowrap;
49
- }
50
- .np-btn:hover { background: var(--ds-subtle-bg); }
51
- .np-btn:focus-visible {
52
- outline: 2px solid var(--ds-focus-ring, rgba(0, 212, 255, 0.32));
53
- outline-offset: 1px;
54
- }
55
- .np-btn:disabled,
56
- .np-btn[data-disabled='1'] {
57
- opacity: 0.55;
58
- cursor: not-allowed;
59
- box-shadow: none !important;
60
- }
61
- .np-input, .np-select, .np-textarea {
62
- border: 1px solid var(--ds-panel-border);
63
- background: var(--ds-subtle-bg);
64
- color: inherit;
65
- border-radius: 10px;
66
- padding: 7px 9px;
67
- outline: none;
68
- box-sizing: border-box;
69
- }
70
- .np-input { width: 100%; }
71
- .np-select { width: 100%; }
72
- .np-textarea {
73
- width: 100%;
74
- height: 100%;
75
- resize: none;
76
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
77
- font-size: 13px;
78
- line-height: 1.45;
79
- background: var(--ds-code-bg);
80
- border-color: var(--ds-code-border);
81
- }
82
- .np-grid {
83
- flex: 1;
84
- min-height: 0;
85
- display: grid;
86
- grid-template-columns: 300px 1fr;
87
- gap: 10px;
88
- }
89
- .np-card {
90
- border: 1px solid var(--ds-panel-border);
91
- background: var(--ds-panel-bg);
92
- border-radius: 12px;
93
- overflow: hidden;
94
- min-height: 0;
95
- display: flex;
96
- flex-direction: column;
97
- }
98
- .np-card-header {
99
- padding: 8px 10px;
100
- border-bottom: 1px solid var(--ds-panel-border);
101
- display: flex;
102
- align-items: center;
103
- justify-content: space-between;
104
- gap: 10px;
105
- font-size: 12px;
106
- font-weight: 650;
107
- }
108
- .np-card-body {
109
- padding: 10px;
110
- flex: 1;
111
- min-height: 0;
112
- overflow: auto;
113
- display: flex;
114
- flex-direction: column;
115
- gap: 10px;
116
- }
117
- .np-section-title {
118
- font-size: 12px;
119
- font-weight: 750;
120
- opacity: 0.85;
121
- margin-bottom: 6px;
122
- }
123
- .np-section-title-row {
124
- display: flex;
125
- align-items: center;
126
- justify-content: space-between;
127
- gap: 8px;
128
- }
129
- .np-section-actions {
130
- display: flex;
131
- align-items: center;
132
- gap: 6px;
133
- }
134
- .np-btn-icon {
135
- width: 30px;
136
- height: 30px;
137
- padding: 0;
138
- display: inline-flex;
139
- align-items: center;
140
- justify-content: center;
141
- }
142
- .np-btn-icon .ds-tree-icon {
143
- opacity: 0.86;
144
- }
145
- .np-create-hint {
146
- margin-top: 6px;
147
- }
148
- .np-list {
149
- display: flex;
150
- flex-direction: column;
151
- gap: 6px;
152
- }
153
- .np-item {
154
- border: 1px solid var(--ds-panel-border);
155
- background: var(--ds-subtle-bg);
156
- border-radius: 12px;
157
- padding: 8px 10px;
158
- cursor: pointer;
159
- display: flex;
160
- flex-direction: column;
161
- gap: 2px;
162
- }
163
- .np-item:hover { box-shadow: 0 0 0 3px var(--ds-focus-ring); }
164
- .np-item[data-active='1'] {
165
- border-color: rgba(46, 160, 67, 0.55);
166
- box-shadow: 0 0 0 3px rgba(46, 160, 67, 0.18);
167
- }
168
- .np-item-title { font-weight: 700; }
169
- .np-item-meta { font-size: 12px; opacity: 0.72; }
170
- .np-chip-row { display: flex; flex-wrap: wrap; gap: 6px; }
171
- .np-chip {
172
- font-size: 12px;
173
- padding: 6px 10px;
174
- border-radius: 999px;
175
- border: 1px solid var(--ds-panel-border);
176
- background: var(--ds-subtle-bg);
177
- cursor: pointer;
178
- user-select: none;
179
- }
180
- .np-chip:hover { box-shadow: 0 0 0 3px var(--ds-focus-ring); }
181
- .np-chip[data-active='1'] {
182
- border-color: rgba(46, 160, 67, 0.55);
183
- box-shadow: 0 0 0 3px rgba(46, 160, 67, 0.18);
184
- }
185
- .np-row {
186
- display: flex;
187
- align-items: center;
188
- gap: 6px;
189
- flex-wrap: wrap;
190
- }
191
- .np-row-compact {
192
- flex-wrap: nowrap;
193
- }
194
- .np-row-compact > .np-input {
195
- width: auto;
196
- flex: 1 1 auto;
197
- min-width: 0;
198
- }
199
- .np-editor-top {
200
- display: grid;
201
- grid-template-columns: 1fr 220px;
202
- gap: 8px;
203
- }
204
- .np-editor-top-row {
205
- display: grid;
206
- grid-template-columns: 1fr 220px;
207
- gap: 8px;
208
- align-items: center;
209
- }
210
- .np-editor-split {
211
- flex: 1;
212
- min-height: 0;
213
- display: grid;
214
- grid-template-columns: 1fr 1fr;
215
- gap: 10px;
216
- }
217
- .np-root[data-editor-mode='preview'] .np-textarea {
218
- display: none;
219
- }
220
- .np-root[data-editor-mode='preview'] .np-editor-split {
221
- grid-template-columns: 1fr;
222
- }
223
- .np-preview {
224
- border: 1px solid var(--ds-code-border);
225
- background: var(--ds-code-bg);
226
- border-radius: 10px;
227
- padding: 10px;
228
- overflow: auto;
229
- min-height: 0;
230
- font-size: 13px;
231
- line-height: 1.6;
232
- }
233
- .np-preview h1, .np-preview h2, .np-preview h3, .np-preview h4, .np-preview h5, .np-preview h6 {
234
- margin: 12px 0 8px;
235
- font-weight: 750;
236
- }
237
- .np-preview p { margin: 0 0 10px; }
238
- .np-preview code {
239
- padding: 2px 6px;
240
- border-radius: 6px;
241
- border: 1px solid var(--ds-code-border);
242
- background: rgba(110, 118, 129, 0.18);
243
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
244
- font-size: 12px;
245
- }
246
- .np-preview pre {
247
- padding: 10px 12px;
248
- border-radius: 10px;
249
- border: 1px solid var(--ds-code-border);
250
- overflow: auto;
251
- background: rgba(110, 118, 129, 0.18);
252
- }
253
- .np-preview pre code { border: none; padding: 0; background: transparent; }
254
- .np-preview blockquote {
255
- margin: 0 0 10px;
256
- padding: 8px 10px;
257
- border-left: 3px solid var(--ds-panel-border);
258
- background: rgba(110, 118, 129, 0.14);
259
- border-radius: 10px;
260
- }
261
- .np-preview ul, .np-preview ol { margin: 0 0 10px 22px; }
262
- .np-preview img { max-width: 100%; border-radius: 10px; border: 1px solid var(--ds-panel-border); }
263
- .np-menu-overlay {
264
- position: fixed;
265
- inset: 0;
266
- z-index: 999;
267
- }
268
- .np-menu {
269
- position: absolute;
270
- min-width: 220px;
271
- background: var(--ds-panel-bg);
272
- border: 1px solid var(--ds-panel-border);
273
- border-radius: 12px;
274
- padding: 6px;
275
- box-shadow: 0 18px 48px rgba(0,0,0,0.22);
276
- }
277
- .np-menu-item {
278
- width: 100%;
279
- border: none;
280
- background: transparent;
281
- color: inherit;
282
- text-align: left;
283
- padding: 8px 10px;
284
- border-radius: 10px;
285
- cursor: pointer;
286
- font-size: 13px;
287
- font-weight: 600;
288
- }
289
- .np-menu-item:hover { background: var(--ds-subtle-bg); }
290
- .np-menu-item:disabled { opacity: 0.5; cursor: not-allowed; }
291
- .np-menu-item[data-danger='1'] { color: #f85149; }
292
- :root[data-theme='dark'] .np-menu-item[data-danger='1'] { color: #ff7b72; }
293
- .np-modal-overlay {
294
- position: fixed;
295
- inset: 0;
296
- z-index: 1000;
297
- display: flex;
298
- align-items: center;
299
- justify-content: center;
300
- padding: 18px;
301
- background: rgba(0,0,0,0.35);
302
- }
303
- .np-modal {
304
- width: min(520px, 100%);
305
- border: 1px solid var(--ds-panel-border);
306
- background: var(--ds-panel-bg);
307
- border-radius: 14px;
308
- overflow: hidden;
309
- display: flex;
310
- flex-direction: column;
311
- box-shadow: 0 18px 48px rgba(0,0,0,0.25);
312
- }
313
- .np-modal-header {
314
- padding: 12px 14px;
315
- border-bottom: 1px solid var(--ds-panel-border);
316
- font-weight: 750;
317
- font-size: 14px;
318
- }
319
- .np-modal-body {
320
- padding: 14px;
321
- display: flex;
322
- flex-direction: column;
323
- gap: 12px;
324
- }
325
- .np-modal-desc {
326
- font-size: 13px;
327
- opacity: 0.85;
328
- white-space: pre-wrap;
329
- }
330
- .np-modal-field {
331
- display: flex;
332
- flex-direction: column;
333
- gap: 6px;
334
- }
335
- .np-modal-label {
336
- font-size: 12px;
337
- font-weight: 700;
338
- opacity: 0.85;
339
- }
340
- .np-modal-error {
341
- font-size: 12px;
342
- color: #f85149;
343
- }
344
- :root[data-theme='dark'] .np-modal-error { color: #ff7b72; }
345
- .np-modal-actions {
346
- padding: 12px 14px;
347
- border-top: 1px solid var(--ds-panel-border);
348
- display: flex;
349
- align-items: center;
350
- justify-content: flex-end;
351
- gap: 8px;
352
- }
353
- .np-btn[data-variant='danger'] { border-color: rgba(248, 81, 73, 0.5); }
354
- .np-btn[data-variant='danger']:hover { box-shadow: 0 0 0 3px rgba(248, 81, 73, 0.24); }
355
- `;
1
+ import { DS_TREE_STYLES } from './ds-tree.mjs';
2
+
3
+ export const NOTEPAD_MANAGER_STYLES = `
4
+ ${DS_TREE_STYLES}
5
+ .np-root {
6
+ height: 100%;
7
+ min-height: 0;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 10px;
11
+ padding: 12px;
12
+ box-sizing: border-box;
13
+ }
14
+ .np-header {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ gap: 12px;
19
+ }
20
+ .np-title {
21
+ font-weight: 750;
22
+ letter-spacing: 0.2px;
23
+ }
24
+ .np-meta {
25
+ font-size: 12px;
26
+ opacity: 0.72;
27
+ }
28
+ .np-pill {
29
+ font-size: 12px;
30
+ padding: 6px 10px;
31
+ border-radius: 999px;
32
+ border: 1px solid var(--ds-panel-border);
33
+ background: var(--ds-subtle-bg);
34
+ white-space: nowrap;
35
+ user-select: none;
36
+ }
37
+ .np-pill[data-tone='ok'] { box-shadow: 0 0 0 3px rgba(46, 160, 67, 0.12); }
38
+ .np-pill[data-tone='bad'] { box-shadow: 0 0 0 3px rgba(248, 81, 73, 0.12); }
39
+ .np-btn {
40
+ border: 1px solid var(--ds-panel-border);
41
+ background: transparent;
42
+ border-radius: 10px;
43
+ padding: 6px 8px;
44
+ cursor: pointer;
45
+ font-weight: 600;
46
+ font-size: 12px;
47
+ line-height: 1.2;
48
+ white-space: nowrap;
49
+ }
50
+ .np-btn:hover { background: var(--ds-subtle-bg); }
51
+ .np-btn:focus-visible {
52
+ outline: 2px solid var(--ds-focus-ring, rgba(0, 212, 255, 0.32));
53
+ outline-offset: 1px;
54
+ }
55
+ .np-btn:disabled,
56
+ .np-btn[data-disabled='1'] {
57
+ opacity: 0.55;
58
+ cursor: not-allowed;
59
+ box-shadow: none !important;
60
+ }
61
+ .np-input, .np-select, .np-textarea {
62
+ border: 1px solid var(--ds-panel-border);
63
+ background: var(--ds-subtle-bg);
64
+ color: inherit;
65
+ border-radius: 10px;
66
+ padding: 7px 9px;
67
+ outline: none;
68
+ box-sizing: border-box;
69
+ }
70
+ .np-input { width: 100%; }
71
+ .np-select { width: 100%; }
72
+ .np-textarea {
73
+ width: 100%;
74
+ height: 100%;
75
+ resize: none;
76
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
77
+ font-size: 13px;
78
+ line-height: 1.45;
79
+ background: var(--ds-code-bg);
80
+ border-color: var(--ds-code-border);
81
+ }
82
+ .np-grid {
83
+ flex: 1;
84
+ min-height: 0;
85
+ display: grid;
86
+ grid-template-columns: 300px 1fr;
87
+ gap: 10px;
88
+ }
89
+ .np-card {
90
+ border: 1px solid var(--ds-panel-border);
91
+ background: var(--ds-panel-bg);
92
+ border-radius: 12px;
93
+ overflow: hidden;
94
+ min-height: 0;
95
+ display: flex;
96
+ flex-direction: column;
97
+ }
98
+ .np-card-header {
99
+ padding: 8px 10px;
100
+ border-bottom: 1px solid var(--ds-panel-border);
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: space-between;
104
+ gap: 10px;
105
+ font-size: 12px;
106
+ font-weight: 650;
107
+ }
108
+ .np-card-body {
109
+ padding: 10px;
110
+ flex: 1;
111
+ min-height: 0;
112
+ overflow: auto;
113
+ display: flex;
114
+ flex-direction: column;
115
+ gap: 10px;
116
+ }
117
+ .np-section-title {
118
+ font-size: 12px;
119
+ font-weight: 750;
120
+ opacity: 0.85;
121
+ margin-bottom: 6px;
122
+ }
123
+ .np-section-title-row {
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: space-between;
127
+ gap: 8px;
128
+ }
129
+ .np-section-actions {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 6px;
133
+ }
134
+ .np-btn-icon {
135
+ width: 30px;
136
+ height: 30px;
137
+ padding: 0;
138
+ display: inline-flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ }
142
+ .np-btn-icon .ds-tree-icon {
143
+ opacity: 0.86;
144
+ }
145
+ .np-create-hint {
146
+ margin-top: 6px;
147
+ }
148
+ .np-list {
149
+ display: flex;
150
+ flex-direction: column;
151
+ gap: 6px;
152
+ }
153
+ .np-item {
154
+ border: 1px solid var(--ds-panel-border);
155
+ background: var(--ds-subtle-bg);
156
+ border-radius: 12px;
157
+ padding: 8px 10px;
158
+ cursor: pointer;
159
+ display: flex;
160
+ flex-direction: column;
161
+ gap: 2px;
162
+ }
163
+ .np-item:hover { box-shadow: 0 0 0 3px var(--ds-focus-ring); }
164
+ .np-item[data-active='1'] {
165
+ border-color: rgba(46, 160, 67, 0.55);
166
+ box-shadow: 0 0 0 3px rgba(46, 160, 67, 0.18);
167
+ }
168
+ .np-item-title { font-weight: 700; }
169
+ .np-item-meta { font-size: 12px; opacity: 0.72; }
170
+ .np-chip-row { display: flex; flex-wrap: wrap; gap: 6px; }
171
+ .np-chip {
172
+ font-size: 12px;
173
+ padding: 6px 10px;
174
+ border-radius: 999px;
175
+ border: 1px solid var(--ds-panel-border);
176
+ background: var(--ds-subtle-bg);
177
+ cursor: pointer;
178
+ user-select: none;
179
+ }
180
+ .np-chip:hover { box-shadow: 0 0 0 3px var(--ds-focus-ring); }
181
+ .np-chip[data-active='1'] {
182
+ border-color: rgba(46, 160, 67, 0.55);
183
+ box-shadow: 0 0 0 3px rgba(46, 160, 67, 0.18);
184
+ }
185
+ .np-row {
186
+ display: flex;
187
+ align-items: center;
188
+ gap: 6px;
189
+ flex-wrap: wrap;
190
+ }
191
+ .np-row-compact {
192
+ flex-wrap: nowrap;
193
+ }
194
+ .np-row-compact > .np-input {
195
+ width: auto;
196
+ flex: 1 1 auto;
197
+ min-width: 0;
198
+ }
199
+ .np-editor-top {
200
+ display: grid;
201
+ grid-template-columns: 1fr 220px;
202
+ gap: 8px;
203
+ }
204
+ .np-editor-top-row {
205
+ display: grid;
206
+ grid-template-columns: 1fr 220px;
207
+ gap: 8px;
208
+ align-items: center;
209
+ }
210
+ .np-editor-split {
211
+ flex: 1;
212
+ min-height: 0;
213
+ display: grid;
214
+ grid-template-columns: 1fr 1fr;
215
+ gap: 10px;
216
+ }
217
+ .np-root[data-editor-mode='preview'] .np-textarea {
218
+ display: none;
219
+ }
220
+ .np-root[data-editor-mode='preview'] .np-editor-split {
221
+ grid-template-columns: 1fr;
222
+ }
223
+ .np-preview {
224
+ border: 1px solid var(--ds-code-border);
225
+ background: var(--ds-code-bg);
226
+ border-radius: 10px;
227
+ padding: 10px;
228
+ overflow: auto;
229
+ min-height: 0;
230
+ font-size: 13px;
231
+ line-height: 1.6;
232
+ }
233
+ .np-preview h1, .np-preview h2, .np-preview h3, .np-preview h4, .np-preview h5, .np-preview h6 {
234
+ margin: 12px 0 8px;
235
+ font-weight: 750;
236
+ }
237
+ .np-preview p { margin: 0 0 10px; }
238
+ .np-preview code {
239
+ padding: 2px 6px;
240
+ border-radius: 6px;
241
+ border: 1px solid var(--ds-code-border);
242
+ background: rgba(110, 118, 129, 0.18);
243
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
244
+ font-size: 12px;
245
+ }
246
+ .np-preview pre {
247
+ padding: 10px 12px;
248
+ border-radius: 10px;
249
+ border: 1px solid var(--ds-code-border);
250
+ overflow: auto;
251
+ background: rgba(110, 118, 129, 0.18);
252
+ }
253
+ .np-preview pre code { border: none; padding: 0; background: transparent; }
254
+ .np-preview blockquote {
255
+ margin: 0 0 10px;
256
+ padding: 8px 10px;
257
+ border-left: 3px solid var(--ds-panel-border);
258
+ background: rgba(110, 118, 129, 0.14);
259
+ border-radius: 10px;
260
+ }
261
+ .np-preview ul, .np-preview ol { margin: 0 0 10px 22px; }
262
+ .np-preview img { max-width: 100%; border-radius: 10px; border: 1px solid var(--ds-panel-border); }
263
+ .np-menu-overlay {
264
+ position: fixed;
265
+ inset: 0;
266
+ z-index: 999;
267
+ }
268
+ .np-menu {
269
+ position: absolute;
270
+ min-width: 220px;
271
+ background: var(--ds-panel-bg);
272
+ border: 1px solid var(--ds-panel-border);
273
+ border-radius: 12px;
274
+ padding: 6px;
275
+ box-shadow: 0 18px 48px rgba(0,0,0,0.22);
276
+ }
277
+ .np-menu-item {
278
+ width: 100%;
279
+ border: none;
280
+ background: transparent;
281
+ color: inherit;
282
+ text-align: left;
283
+ padding: 8px 10px;
284
+ border-radius: 10px;
285
+ cursor: pointer;
286
+ font-size: 13px;
287
+ font-weight: 600;
288
+ }
289
+ .np-menu-item:hover { background: var(--ds-subtle-bg); }
290
+ .np-menu-item:disabled { opacity: 0.5; cursor: not-allowed; }
291
+ .np-menu-item[data-danger='1'] { color: #f85149; }
292
+ :root[data-theme='dark'] .np-menu-item[data-danger='1'] { color: #ff7b72; }
293
+ .np-modal-overlay {
294
+ position: fixed;
295
+ inset: 0;
296
+ z-index: 1000;
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ padding: 18px;
301
+ background: rgba(0,0,0,0.35);
302
+ }
303
+ .np-modal {
304
+ width: min(520px, 100%);
305
+ border: 1px solid var(--ds-panel-border);
306
+ background: var(--ds-panel-bg);
307
+ border-radius: 14px;
308
+ overflow: hidden;
309
+ display: flex;
310
+ flex-direction: column;
311
+ box-shadow: 0 18px 48px rgba(0,0,0,0.25);
312
+ }
313
+ .np-modal-header {
314
+ padding: 12px 14px;
315
+ border-bottom: 1px solid var(--ds-panel-border);
316
+ font-weight: 750;
317
+ font-size: 14px;
318
+ }
319
+ .np-modal-body {
320
+ padding: 14px;
321
+ display: flex;
322
+ flex-direction: column;
323
+ gap: 12px;
324
+ }
325
+ .np-modal-desc {
326
+ font-size: 13px;
327
+ opacity: 0.85;
328
+ white-space: pre-wrap;
329
+ }
330
+ .np-modal-field {
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: 6px;
334
+ }
335
+ .np-modal-label {
336
+ font-size: 12px;
337
+ font-weight: 700;
338
+ opacity: 0.85;
339
+ }
340
+ .np-modal-error {
341
+ font-size: 12px;
342
+ color: #f85149;
343
+ }
344
+ :root[data-theme='dark'] .np-modal-error { color: #ff7b72; }
345
+ .np-modal-actions {
346
+ padding: 12px 14px;
347
+ border-top: 1px solid var(--ds-panel-border);
348
+ display: flex;
349
+ align-items: center;
350
+ justify-content: flex-end;
351
+ gap: 8px;
352
+ }
353
+ .np-btn[data-variant='danger'] { border-color: rgba(248, 81, 73, 0.5); }
354
+ .np-btn[data-variant='danger']:hover { box-shadow: 0 0 0 3px rgba(248, 81, 73, 0.24); }
355
+ `;