dsh-gufa-code 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -2
  3. package/client.js +11548 -0
  4. package/cordis.patch.yml +8 -0
  5. package/docs/icon-180.png +0 -0
  6. package/docs/icon.svg +18 -0
  7. package/docs/market-submission.md +32 -0
  8. package/docs/screenshot-ide.jpg +0 -0
  9. package/host/assets.js +31 -0
  10. package/host/chat.js +523 -0
  11. package/host/context.js +438 -0
  12. package/host/dev.js +35 -0
  13. package/host/fs.js +306 -0
  14. package/host/git.js +532 -0
  15. package/host/project.js +305 -0
  16. package/host/ssh.js +54 -0
  17. package/host/terminal-pty.js +237 -0
  18. package/host/terminal.js +947 -0
  19. package/icon.svg +18 -0
  20. package/index.js +63 -0
  21. package/locale/en.json +121 -0
  22. package/locale/zh.json +121 -0
  23. package/package.json +67 -4
  24. package/screenshots.json +3 -0
  25. package/scripts/build-client.mjs +38 -0
  26. package/scripts/selftest-client.mjs +457 -0
  27. package/scripts/selftest-host.mjs +197 -0
  28. package/scripts/selftest-http.mjs +284 -0
  29. package/scripts/selftest-router.mjs +101 -0
  30. package/scripts/selftest-terminal-client.mjs +314 -0
  31. package/scripts/selftest-terminal-pty.mjs +190 -0
  32. package/scripts/selftest-terminal.mjs +351 -0
  33. package/scripts/test-chat-render.mjs +702 -0
  34. package/scripts/test-chat.mjs +761 -0
  35. package/scripts/test-editor.mjs +516 -0
  36. package/scripts/verify-workspace-sessions.mjs +135 -0
  37. package/src/client/00-core.js +1686 -0
  38. package/src/client/10-icons.js +205 -0
  39. package/src/client/20-editor.js +1318 -0
  40. package/src/client/30-terminal.js +1510 -0
  41. package/src/client/40-chat.js +1184 -0
  42. package/src/client/46-gitgraph.js +278 -0
  43. package/src/client/50-panels.js +916 -0
  44. package/src/client/55-backdrop.js +508 -0
  45. package/src/client/60-dock.js +662 -0
  46. package/src/client/85-shortcuts.js +516 -0
  47. package/src/client/90-app.js +2272 -0
  48. package/src/client/99-main.js +449 -0
  49. package/vendor/monaco/LICENSE +21 -0
  50. package/vendor/monaco/ThirdPartyNotices.txt +448 -0
  51. package/vendor/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  52. package/vendor/monaco/vs/base/worker/workerMain.js +31 -0
  53. package/vendor/monaco/vs/basic-languages/abap/abap.js +10 -0
  54. package/vendor/monaco/vs/basic-languages/apex/apex.js +10 -0
  55. package/vendor/monaco/vs/basic-languages/azcli/azcli.js +10 -0
  56. package/vendor/monaco/vs/basic-languages/bat/bat.js +10 -0
  57. package/vendor/monaco/vs/basic-languages/bicep/bicep.js +11 -0
  58. package/vendor/monaco/vs/basic-languages/cameligo/cameligo.js +10 -0
  59. package/vendor/monaco/vs/basic-languages/clojure/clojure.js +10 -0
  60. package/vendor/monaco/vs/basic-languages/coffee/coffee.js +10 -0
  61. package/vendor/monaco/vs/basic-languages/cpp/cpp.js +10 -0
  62. package/vendor/monaco/vs/basic-languages/csharp/csharp.js +10 -0
  63. package/vendor/monaco/vs/basic-languages/csp/csp.js +10 -0
  64. package/vendor/monaco/vs/basic-languages/css/css.js +12 -0
  65. package/vendor/monaco/vs/basic-languages/cypher/cypher.js +10 -0
  66. package/vendor/monaco/vs/basic-languages/dart/dart.js +10 -0
  67. package/vendor/monaco/vs/basic-languages/dockerfile/dockerfile.js +10 -0
  68. package/vendor/monaco/vs/basic-languages/ecl/ecl.js +10 -0
  69. package/vendor/monaco/vs/basic-languages/elixir/elixir.js +10 -0
  70. package/vendor/monaco/vs/basic-languages/flow9/flow9.js +10 -0
  71. package/vendor/monaco/vs/basic-languages/freemarker2/freemarker2.js +12 -0
  72. package/vendor/monaco/vs/basic-languages/fsharp/fsharp.js +10 -0
  73. package/vendor/monaco/vs/basic-languages/go/go.js +10 -0
  74. package/vendor/monaco/vs/basic-languages/graphql/graphql.js +10 -0
  75. package/vendor/monaco/vs/basic-languages/handlebars/handlebars.js +10 -0
  76. package/vendor/monaco/vs/basic-languages/hcl/hcl.js +10 -0
  77. package/vendor/monaco/vs/basic-languages/html/html.js +10 -0
  78. package/vendor/monaco/vs/basic-languages/ini/ini.js +10 -0
  79. package/vendor/monaco/vs/basic-languages/java/java.js +10 -0
  80. package/vendor/monaco/vs/basic-languages/javascript/javascript.js +10 -0
  81. package/vendor/monaco/vs/basic-languages/julia/julia.js +10 -0
  82. package/vendor/monaco/vs/basic-languages/kotlin/kotlin.js +10 -0
  83. package/vendor/monaco/vs/basic-languages/less/less.js +11 -0
  84. package/vendor/monaco/vs/basic-languages/lexon/lexon.js +10 -0
  85. package/vendor/monaco/vs/basic-languages/liquid/liquid.js +10 -0
  86. package/vendor/monaco/vs/basic-languages/lua/lua.js +10 -0
  87. package/vendor/monaco/vs/basic-languages/m3/m3.js +10 -0
  88. package/vendor/monaco/vs/basic-languages/markdown/markdown.js +10 -0
  89. package/vendor/monaco/vs/basic-languages/mdx/mdx.js +10 -0
  90. package/vendor/monaco/vs/basic-languages/mips/mips.js +10 -0
  91. package/vendor/monaco/vs/basic-languages/msdax/msdax.js +10 -0
  92. package/vendor/monaco/vs/basic-languages/mysql/mysql.js +10 -0
  93. package/vendor/monaco/vs/basic-languages/objective-c/objective-c.js +10 -0
  94. package/vendor/monaco/vs/basic-languages/pascal/pascal.js +10 -0
  95. package/vendor/monaco/vs/basic-languages/pascaligo/pascaligo.js +10 -0
  96. package/vendor/monaco/vs/basic-languages/perl/perl.js +10 -0
  97. package/vendor/monaco/vs/basic-languages/pgsql/pgsql.js +10 -0
  98. package/vendor/monaco/vs/basic-languages/php/php.js +10 -0
  99. package/vendor/monaco/vs/basic-languages/pla/pla.js +10 -0
  100. package/vendor/monaco/vs/basic-languages/postiats/postiats.js +10 -0
  101. package/vendor/monaco/vs/basic-languages/powerquery/powerquery.js +10 -0
  102. package/vendor/monaco/vs/basic-languages/powershell/powershell.js +10 -0
  103. package/vendor/monaco/vs/basic-languages/protobuf/protobuf.js +11 -0
  104. package/vendor/monaco/vs/basic-languages/pug/pug.js +10 -0
  105. package/vendor/monaco/vs/basic-languages/python/python.js +10 -0
  106. package/vendor/monaco/vs/basic-languages/qsharp/qsharp.js +10 -0
  107. package/vendor/monaco/vs/basic-languages/r/r.js +10 -0
  108. package/vendor/monaco/vs/basic-languages/razor/razor.js +10 -0
  109. package/vendor/monaco/vs/basic-languages/redis/redis.js +10 -0
  110. package/vendor/monaco/vs/basic-languages/redshift/redshift.js +10 -0
  111. package/vendor/monaco/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  112. package/vendor/monaco/vs/basic-languages/ruby/ruby.js +10 -0
  113. package/vendor/monaco/vs/basic-languages/rust/rust.js +10 -0
  114. package/vendor/monaco/vs/basic-languages/sb/sb.js +10 -0
  115. package/vendor/monaco/vs/basic-languages/scala/scala.js +10 -0
  116. package/vendor/monaco/vs/basic-languages/scheme/scheme.js +10 -0
  117. package/vendor/monaco/vs/basic-languages/scss/scss.js +12 -0
  118. package/vendor/monaco/vs/basic-languages/shell/shell.js +10 -0
  119. package/vendor/monaco/vs/basic-languages/solidity/solidity.js +10 -0
  120. package/vendor/monaco/vs/basic-languages/sophia/sophia.js +10 -0
  121. package/vendor/monaco/vs/basic-languages/sparql/sparql.js +10 -0
  122. package/vendor/monaco/vs/basic-languages/sql/sql.js +10 -0
  123. package/vendor/monaco/vs/basic-languages/st/st.js +10 -0
  124. package/vendor/monaco/vs/basic-languages/swift/swift.js +13 -0
  125. package/vendor/monaco/vs/basic-languages/systemverilog/systemverilog.js +10 -0
  126. package/vendor/monaco/vs/basic-languages/tcl/tcl.js +10 -0
  127. package/vendor/monaco/vs/basic-languages/twig/twig.js +10 -0
  128. package/vendor/monaco/vs/basic-languages/typescript/typescript.js +10 -0
  129. package/vendor/monaco/vs/basic-languages/typespec/typespec.js +10 -0
  130. package/vendor/monaco/vs/basic-languages/vb/vb.js +10 -0
  131. package/vendor/monaco/vs/basic-languages/wgsl/wgsl.js +307 -0
  132. package/vendor/monaco/vs/basic-languages/xml/xml.js +10 -0
  133. package/vendor/monaco/vs/basic-languages/yaml/yaml.js +10 -0
  134. package/vendor/monaco/vs/editor/editor.main.css +8 -0
  135. package/vendor/monaco/vs/editor/editor.main.js +798 -0
  136. package/vendor/monaco/vs/language/css/cssMode.js +13 -0
  137. package/vendor/monaco/vs/language/css/cssWorker.js +77 -0
  138. package/vendor/monaco/vs/language/html/htmlMode.js +13 -0
  139. package/vendor/monaco/vs/language/html/htmlWorker.js +454 -0
  140. package/vendor/monaco/vs/language/json/jsonMode.js +19 -0
  141. package/vendor/monaco/vs/language/json/jsonWorker.js +42 -0
  142. package/vendor/monaco/vs/language/typescript/tsMode.js +20 -0
  143. package/vendor/monaco/vs/language/typescript/tsWorker.js +51328 -0
  144. package/vendor/monaco/vs/loader.js +11 -0
  145. package/vendor/monaco/vs/nls.messages.de.js +21 -0
  146. package/vendor/monaco/vs/nls.messages.es.js +21 -0
  147. package/vendor/monaco/vs/nls.messages.fr.js +19 -0
  148. package/vendor/monaco/vs/nls.messages.it.js +19 -0
  149. package/vendor/monaco/vs/nls.messages.ja.js +21 -0
  150. package/vendor/monaco/vs/nls.messages.ko.js +19 -0
  151. package/vendor/monaco/vs/nls.messages.ru.js +21 -0
  152. package/vendor/monaco/vs/nls.messages.zh-cn.js +21 -0
  153. package/vendor/monaco/vs/nls.messages.zh-tw.js +19 -0
  154. package/vendor/xterm/LICENSE +21 -0
  155. package/vendor/xterm/LICENSE.addon-fit +19 -0
  156. package/vendor/xterm/addon-fit.js +2 -0
  157. package/vendor/xterm/xterm.css +285 -0
  158. package/vendor/xterm/xterm.js +2 -0
@@ -0,0 +1,205 @@
1
+ /**
2
+ * 10-icons:内联 SVG 图标集与「古」印章 Logo。全部使用 currentColor / 品牌色,无外部资源。
3
+ */
4
+ const ICON_PATHS = {
5
+ close: [['path', { d: 'M5 5l14 14M19 5L5 19' }]],
6
+ plus: [['path', { d: 'M12 5v14M5 12h14' }]],
7
+ minus: [['path', { d: 'M5 12h14' }]],
8
+ refresh: [['path', { d: 'M20 11a8 8 0 1 0-.6 4.2M20 4v7h-7' }]],
9
+ 'arrow-up': [
10
+ ['path', { d: 'M12 19V5' }],
11
+ ['path', { d: 'M6 11l6-6 6 6' }],
12
+ ],
13
+ 'arrow-down': [
14
+ ['path', { d: 'M12 5v14' }],
15
+ ['path', { d: 'M6 13l6 6 6-6' }],
16
+ ],
17
+ graph: [
18
+ ['circle', { cx: 6, cy: 6, r: 2.2 }],
19
+ ['circle', { cx: 6, cy: 18, r: 2.2 }],
20
+ ['circle', { cx: 18, cy: 12, r: 2.2 }],
21
+ ['path', { d: 'M6 8.2v7.6M8.2 12h7.6' }],
22
+ ],
23
+ undo: [
24
+ ['path', { d: 'M9 14L4 9l5-5' }],
25
+ ['path', { d: 'M4 9h10a6 6 0 0 1 0 12h-4' }],
26
+ ],
27
+ 'arrow-left': [['path', { d: 'M19 12H5M11 6l-6 6 6 6' }]],
28
+ 'arrow-right': [['path', { d: 'M5 12h14M13 6l6 6-6 6' }]],
29
+ 'chevron-right': [['path', { d: 'M9 5l7 7-7 7' }]],
30
+ 'chevron-down': [['path', { d: 'M5 9l7 7 7-7' }]],
31
+ folder: [['path', { d: 'M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7z' }]],
32
+ 'folder-open': [
33
+ ['path', { d: 'M3 8V7a2 2 0 0 1 2-2h4l2 2h6a2 2 0 0 1 2 2v1' }],
34
+ ['path', { d: 'M3.5 10h17l-2.2 8.3a2 2 0 0 1-1.9 1.5H5.2a2 2 0 0 1-2-1.6L2.3 12a1.4 1.4 0 0 1 1.2-2z' }],
35
+ ],
36
+ file: [['path', { d: 'M6 3h8l4 4v13a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V3z' }], ['path', { d: 'M14 3v5h5' }]],
37
+ files: [
38
+ ['path', { d: 'M8 3h7l4 4v10a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z' }],
39
+ ['path', { d: 'M15 3v4h4M3 8v12a1 1 0 0 0 1 1h9' }, { opacity: 0.55 }],
40
+ ],
41
+ git: [
42
+ ['circle', { cx: 6, cy: 6, r: 2.2 }],
43
+ ['circle', { cx: 6, cy: 18, r: 2.2 }],
44
+ ['circle', { cx: 18, cy: 8, r: 2.2 }],
45
+ ['path', { d: 'M6 8.2v7.6M8.2 6h5.4a2.2 2.2 0 0 1 2.2 2.2v5.6' }],
46
+ ],
47
+ server: [
48
+ ['rect', { x: 3, y: 4, width: 18, height: 6, rx: 1.6 }],
49
+ ['rect', { x: 3, y: 14, width: 18, height: 6, rx: 1.6 }],
50
+ ['path', { d: 'M7 7h.01M7 17h.01' }],
51
+ ],
52
+ terminal: [['path', { d: 'M4 6l6 6-6 6M13 18h7' }]],
53
+ sparkles: [
54
+ ['path', { d: 'M12 3l1.7 4.6L18 9.3l-4.3 1.7L12 15.6l-1.7-4.6L6 9.3l4.3-1.7L12 3z' }],
55
+ ['path', { d: 'M18.5 15.5l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8.8-2.2z' }, { opacity: 0.8 }],
56
+ ],
57
+ send: [['path', { d: 'M4 12l16-7-6.5 16-2.3-6.6L4 12z' }]],
58
+ stop: [['rect', { x: 6, y: 6, width: 12, height: 12, rx: 2.4 }]],
59
+ trash: [
60
+ ['path', { d: 'M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2' }],
61
+ ['path', { d: 'M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13' }],
62
+ ],
63
+ pencil: [['path', { d: 'M4 20l4.5-1 10-10a2.1 2.1 0 0 0-3-3l-10 10L4 20z' }], ['path', { d: 'M14 5.5l3.5 3.5' }]],
64
+ save: [
65
+ ['path', { d: 'M5 3h11l3 3v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z' }],
66
+ ['path', { d: 'M8 3v6h7V3M8 21v-7h8v7' }],
67
+ ],
68
+ gear: [
69
+ ['circle', { cx: 12, cy: 12, r: 3.2 }],
70
+ ['path', { d: 'M12 2.8l1 2.6 2.7.7 2-1.8 2.2 2.2-1.8 2 .7 2.7 2.6 1v3l-2.6 1-.7 2.7 1.8 2-2.2 2.2-2-1.8-2.7.7-1 2.6h-3l-1-2.6-2.7-.7-2 1.8-2.2-2.2 1.8-2-.7-2.7-2.6-1v-3l2.6-1 .7-2.7-1.8-2 2.2-2.2 2 1.8 2.7-.7 1-2.6h3z' }],
71
+ ],
72
+ code: [['path', { d: 'M8.5 6L3 12l5.5 6M15.5 6L21 12l-5.5 6' }]],
73
+ search: [['circle', { cx: 11, cy: 11, r: 6.5 }], ['path', { d: 'M16 16l4.5 4.5' }]],
74
+ message: [['path', { d: 'M4 5h16a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H9l-5 4V6a1 1 0 0 1 1-1z' }]],
75
+ 'panel-right': [['rect', { x: 3, y: 4, width: 18, height: 16, rx: 2 }], ['path', { d: 'M14 4v16' }]],
76
+ 'panel-left': [['rect', { x: 3, y: 4, width: 18, height: 16, rx: 2 }], ['path', { d: 'M10 4v16' }]],
77
+ keyboard: [
78
+ ['rect', { x: 2.5, y: 6, width: 19, height: 12, rx: 2 }],
79
+ ['path', { d: 'M6 10h.01M9.5 10h.01M13 10h.01M16.5 10h.01M6 13.5h.01M9.5 13.5h.01M13 13.5h.01M16.5 13.5h.01M8 16.5h8' }],
80
+ ],
81
+ branch: [
82
+ ['circle', { cx: 7, cy: 5, r: 2.2 }],
83
+ ['circle', { cx: 7, cy: 19, r: 2.2 }],
84
+ ['circle', { cx: 17, cy: 8, r: 2.2 }],
85
+ ['path', { d: 'M7 7.2v9.6M9.2 5h4.3a3.5 3.5 0 0 1 3.5 3.5v0' }],
86
+ ],
87
+ check: [['path', { d: 'M4.5 12.5l5 5 10-11' }]],
88
+ warn: [['path', { d: 'M12 3l9.5 17H2.5L12 3z' }], ['path', { d: 'M12 9v5M12 17h.01' }]],
89
+ info: [['circle', { cx: 12, cy: 12, r: 9 }], ['path', { d: 'M12 11v6M12 8h.01' }]],
90
+ history: [['path', { d: 'M3.5 12a8.5 8.5 0 1 0 2.6-6.1M3.5 4.5V10h5.5' }], ['path', { d: 'M12 8v4.5l3 2' }]],
91
+ plug: [['path', { d: 'M9 3v5M15 3v5M6 8h12v4a6 6 0 0 1-12 0V8zM12 18v3' }]],
92
+ 'chevron-up': [['path', { d: 'M5 15l7-7 7 7' }]],
93
+ layout: [['rect', { x: 3, y: 4, width: 18, height: 16, rx: 2 }], ['path', { d: 'M9 4v16M3 10h6' }]],
94
+ image: [
95
+ ['rect', { x: 3, y: 4, width: 18, height: 16, rx: 2.4 }],
96
+ ['circle', { cx: 8.5, cy: 9.5, r: 1.6 }],
97
+ ['path', { d: 'M4 17l5-4.5 3.5 3L16 12l4 4' }],
98
+ ],
99
+ }
100
+
101
+ /** 通用图标:props = { name, size?, className? } */
102
+ G.Icon = function Icon(props) {
103
+ const size = props.size ?? 16
104
+ const shapes = ICON_PATHS[props.name] ?? ICON_PATHS.file
105
+ return h(
106
+ 'svg',
107
+ {
108
+ viewBox: '0 0 24 24',
109
+ width: size,
110
+ height: size,
111
+ fill: 'none',
112
+ stroke: 'currentColor',
113
+ strokeWidth: props.strokeWidth ?? 1.8,
114
+ strokeLinecap: 'round',
115
+ strokeLinejoin: 'round',
116
+ className: props.className,
117
+ 'aria-hidden': 'true',
118
+ focusable: 'false',
119
+ style: props.style,
120
+ },
121
+ shapes.map((shape, index) => h(shape[0], { key: index, ...shape[1] })),
122
+ )
123
+ }
124
+
125
+ /** 「古」印章 Logo(品牌艺术色,非主题 token)。 */
126
+ G.Seal = function Seal(props) {
127
+ const size = props.size ?? 24
128
+ return h(
129
+ 'svg',
130
+ { viewBox: '0 0 128 128', width: size, height: size, className: props.className, 'aria-hidden': 'true', focusable: 'false' },
131
+ h(
132
+ 'defs',
133
+ null,
134
+ h(
135
+ 'linearGradient',
136
+ { id: 'gufaSealGrad', x1: '0', y1: '0', x2: '1', y2: '1' },
137
+ h('stop', { offset: '0', stopColor: '#d0573f' }),
138
+ h('stop', { offset: '0.55', stopColor: '#b33a2c' }),
139
+ h('stop', { offset: '1', stopColor: '#8c211b' }),
140
+ ),
141
+ ),
142
+ h('rect', { x: 6, y: 6, width: 116, height: 116, rx: 28, fill: 'url(#gufaSealGrad)' }),
143
+ h('rect', { x: 15, y: 15, width: 98, height: 98, rx: 21, fill: 'none', stroke: '#f7e9d8', strokeOpacity: 0.78, strokeWidth: 3.5 }),
144
+ h(
145
+ 'g',
146
+ { fill: '#fbeee0' },
147
+ h('rect', { x: 32, y: 32, width: 64, height: 9.5, rx: 2.5 }),
148
+ h('rect', { x: 58.5, y: 32, width: 11, height: 30, rx: 2 }),
149
+ h('path', {
150
+ fillRule: 'evenodd',
151
+ d: 'M40 62 h48 a4 4 0 0 1 4 4 v27 a4 4 0 0 1 -4 4 h-48 a4 4 0 0 1 -4 -4 v-27 a4 4 0 0 1 4 -4 z m8 10 h32 v19 h-32 z',
152
+ }),
153
+ ),
154
+ h('path', { d: 'M27 101 l-7 -6 7 -6', fill: 'none', stroke: '#f7e9d8', strokeWidth: 3.5, strokeLinecap: 'round', strokeLinejoin: 'round', opacity: 0.8 }),
155
+ h('path', { d: 'M101 101 l7 -6 -7 -6', fill: 'none', stroke: '#f7e9d8', strokeWidth: 3.5, strokeLinecap: 'round', strokeLinejoin: 'round', opacity: 0.8 }),
156
+ )
157
+ }
158
+
159
+ /**
160
+ * 侧边栏 panel 图标(ownerProps: size, active)。
161
+ * 点击直接进入古法编程覆盖层,并 stopPropagation 阻止侧边栏把主面板切到 main key
162
+ * (否则官方会话会被卸载,无法停靠进 IDE 右侧)。
163
+ */
164
+ G.PanelIcon = function PanelIcon(props) {
165
+ const active = G.useMode()
166
+ return h(
167
+ 'span',
168
+ {
169
+ className: 'gufa-panel-icon',
170
+ title: G.t('panel.label'),
171
+ role: 'img',
172
+ 'aria-label': G.t('panel.label'),
173
+ style: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', filter: active ? 'drop-shadow(0 0 5px color-mix(in srgb, #c0392b 55%, transparent))' : undefined },
174
+ onClick: (event) => {
175
+ event.preventDefault()
176
+ event.stopPropagation()
177
+ if (G.mode.get()) G.mode.set(false)
178
+ else G.enterGufa()
179
+ },
180
+ },
181
+ h(G.Seal, { size: props.size ?? 20 }),
182
+ )
183
+ }
184
+
185
+ /** 侧边栏底部动作:显示「古法编程」按钮(ownerProps: wide)。 */
186
+ G.FooterAction = function FooterAction(props) {
187
+ const active = G.useMode()
188
+ const click = () => {
189
+ if (G.mode.get()) G.mode.set(false)
190
+ else G.enterGufa()
191
+ }
192
+ return h(
193
+ 'button',
194
+ {
195
+ type: 'button',
196
+ className: 'gufa-footer-action',
197
+ title: active ? G.t('app.exitHint') : G.t('panel.enterHint'),
198
+ 'aria-label': G.t('panel.label'),
199
+ 'data-active': active ? '' : undefined,
200
+ onClick: click,
201
+ },
202
+ h(G.Seal, { size: 18 }),
203
+ props.wide === false ? null : h('span', { className: 'gufa-footer-action-label' }, active ? G.t('app.exit') : G.t('panel.label')),
204
+ )
205
+ }