xbintsc 0.5.23 → 0.5.32

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 (481) hide show
  1. package/AGENTS.md +11 -2
  2. package/README.md +47 -16
  3. package/README.zh-CN.md +21 -2
  4. package/dist/scripts/support-matrix.d.ts +18 -0
  5. package/dist/scripts/support-matrix.js +141 -0
  6. package/dist/scripts/support-matrix.js.map +1 -0
  7. package/dist/src/ast/common.d.ts +2 -2
  8. package/dist/src/ast/declarations.d.ts +7 -1
  9. package/dist/src/ast/expressions.d.ts +5 -0
  10. package/dist/src/ast/kinds.d.ts +2 -0
  11. package/dist/src/ast/kinds.js +2 -0
  12. package/dist/src/ast/kinds.js.map +1 -1
  13. package/dist/src/binder/binder.d.ts +2 -1
  14. package/dist/src/binder/binder.js +2 -0
  15. package/dist/src/binder/binder.js.map +1 -1
  16. package/dist/src/binder/declarations.d.ts +9 -0
  17. package/dist/src/binder/declarations.js +64 -0
  18. package/dist/src/binder/declarations.js.map +1 -1
  19. package/dist/src/binder/references.js +99 -4
  20. package/dist/src/binder/references.js.map +1 -1
  21. package/dist/src/binder/types.d.ts +32 -0
  22. package/dist/src/binder/types.js.map +1 -1
  23. package/dist/src/canonical.d.ts +29 -0
  24. package/dist/src/canonical.js +35 -0
  25. package/dist/src/canonical.js.map +1 -0
  26. package/dist/src/checker/assignability.d.ts +13 -0
  27. package/dist/src/checker/assignability.js +146 -0
  28. package/dist/src/checker/assignability.js.map +1 -0
  29. package/dist/src/checker/calls.d.ts +13 -0
  30. package/dist/src/checker/calls.js +127 -0
  31. package/dist/src/checker/calls.js.map +1 -0
  32. package/dist/src/checker/checker.d.ts +26 -0
  33. package/dist/src/checker/checker.js +31 -0
  34. package/dist/src/checker/checker.js.map +1 -0
  35. package/dist/src/checker/declarations.d.ts +9 -0
  36. package/dist/src/checker/declarations.js +15 -0
  37. package/dist/src/checker/declarations.js.map +1 -0
  38. package/dist/src/checker/flow.d.ts +21 -0
  39. package/dist/src/checker/flow.js +241 -0
  40. package/dist/src/checker/flow.js.map +1 -0
  41. package/dist/src/checker/globals.d.ts +9 -0
  42. package/dist/src/checker/globals.js +29 -0
  43. package/dist/src/checker/globals.js.map +1 -0
  44. package/dist/src/checker/source.d.ts +38 -0
  45. package/dist/src/checker/source.js +48 -0
  46. package/dist/src/checker/source.js.map +1 -0
  47. package/dist/src/checker/type-infer.d.ts +18 -0
  48. package/dist/src/checker/type-infer.js +173 -0
  49. package/dist/src/checker/type-infer.js.map +1 -0
  50. package/dist/src/checker/type-model.d.ts +73 -0
  51. package/dist/src/checker/type-model.js +151 -0
  52. package/dist/src/checker/type-model.js.map +1 -0
  53. package/dist/src/checker/type-system.d.ts +58 -0
  54. package/dist/src/checker/type-system.js +569 -0
  55. package/dist/src/checker/type-system.js.map +1 -0
  56. package/dist/src/checker/typecheck-types.d.ts +22 -0
  57. package/dist/src/checker/typecheck-types.js +109 -0
  58. package/dist/src/checker/typecheck-types.js.map +1 -0
  59. package/dist/src/checker/typecheck.d.ts +62 -0
  60. package/dist/src/checker/typecheck.js +574 -0
  61. package/dist/src/checker/typecheck.js.map +1 -0
  62. package/dist/src/checker/undefined.d.ts +14 -0
  63. package/dist/src/checker/undefined.js +32 -0
  64. package/dist/src/checker/undefined.js.map +1 -0
  65. package/dist/src/checker/walk.d.ts +10 -0
  66. package/dist/src/checker/walk.js +15 -0
  67. package/dist/src/checker/walk.js.map +1 -0
  68. package/dist/src/cli/help.d.ts +7 -0
  69. package/dist/src/cli/help.js +64 -0
  70. package/dist/src/cli/help.js.map +1 -0
  71. package/dist/src/cli/hints.js +2 -1
  72. package/dist/src/cli/hints.js.map +1 -1
  73. package/dist/src/cli/main.js +12 -48
  74. package/dist/src/cli/main.js.map +1 -1
  75. package/dist/src/codegen/generator/calls/access.js +8 -8
  76. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  77. package/dist/src/codegen/generator/calls/invocation.js +9 -4
  78. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  79. package/dist/src/codegen/generator/calls/super.d.ts +9 -1
  80. package/dist/src/codegen/generator/calls/super.js +56 -5
  81. package/dist/src/codegen/generator/calls/super.js.map +1 -1
  82. package/dist/src/codegen/generator/context.d.ts +13 -2
  83. package/dist/src/codegen/generator/context.js +25 -19
  84. package/dist/src/codegen/generator/context.js.map +1 -1
  85. package/dist/src/codegen/generator/debug.js +2 -1
  86. package/dist/src/codegen/generator/debug.js.map +1 -1
  87. package/dist/src/codegen/generator/expressions/primary.d.ts +4 -1
  88. package/dist/src/codegen/generator/expressions/primary.js +68 -8
  89. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  90. package/dist/src/codegen/generator/generator.js +11 -1
  91. package/dist/src/codegen/generator/generator.js.map +1 -1
  92. package/dist/src/codegen/generator/module.d.ts +3 -0
  93. package/dist/src/codegen/generator/module.js +116 -26
  94. package/dist/src/codegen/generator/module.js.map +1 -1
  95. package/dist/src/codegen/generator/state.d.ts +11 -1
  96. package/dist/src/codegen/generator/state.js.map +1 -1
  97. package/dist/src/codegen/generator/statements/variables.js +26 -7
  98. package/dist/src/codegen/generator/statements/variables.js.map +1 -1
  99. package/dist/src/codegen/generator/tables.d.ts +2 -0
  100. package/dist/src/codegen/generator/tables.js +4 -0
  101. package/dist/src/codegen/generator/tables.js.map +1 -1
  102. package/dist/src/driver/build-key.d.ts +2 -0
  103. package/dist/src/driver/build-key.js +1 -0
  104. package/dist/src/driver/build-key.js.map +1 -1
  105. package/dist/src/driver/bundler/graph.js +5 -1
  106. package/dist/src/driver/bundler/graph.js.map +1 -1
  107. package/dist/src/driver/bundler/merge.js +16 -1
  108. package/dist/src/driver/bundler/merge.js.map +1 -1
  109. package/dist/src/driver/bundler/types.d.ts +12 -0
  110. package/dist/src/driver/compiler.d.ts +1 -1
  111. package/dist/src/driver/compiler.js +3 -0
  112. package/dist/src/driver/compiler.js.map +1 -1
  113. package/dist/src/driver/fingerprint.js +2 -1
  114. package/dist/src/driver/fingerprint.js.map +1 -1
  115. package/dist/src/driver/frontend.d.ts +8 -6
  116. package/dist/src/driver/frontend.js +4 -0
  117. package/dist/src/driver/frontend.js.map +1 -1
  118. package/dist/src/driver/options.d.ts +6 -0
  119. package/dist/src/driver/version.d.ts +1 -1
  120. package/dist/src/driver/version.js +1 -1
  121. package/dist/src/extensions/gui/css.d.ts +26 -0
  122. package/dist/src/extensions/gui/css.js +100 -0
  123. package/dist/src/extensions/gui/css.js.map +1 -0
  124. package/dist/src/extensions/gui/html.js +28 -7
  125. package/dist/src/extensions/gui/html.js.map +1 -1
  126. package/dist/src/extensions/gui/index.js +79 -2
  127. package/dist/src/extensions/gui/index.js.map +1 -1
  128. package/dist/src/extensions/gui/three.d.ts +16 -0
  129. package/dist/src/extensions/gui/three.js +22 -0
  130. package/dist/src/extensions/gui/three.js.map +1 -0
  131. package/dist/src/extensions/media/index.d.ts +6 -5
  132. package/dist/src/extensions/media/index.js +12 -14
  133. package/dist/src/extensions/media/index.js.map +1 -1
  134. package/dist/src/extensions/registry.d.ts +38 -0
  135. package/dist/src/extensions/registry.js +10 -0
  136. package/dist/src/extensions/registry.js.map +1 -1
  137. package/dist/src/index.d.ts +1 -0
  138. package/dist/src/index.js +1 -0
  139. package/dist/src/index.js.map +1 -1
  140. package/dist/src/parser/declarations/classes.js +7 -0
  141. package/dist/src/parser/declarations/classes.js.map +1 -1
  142. package/dist/src/parser/expressions.js +14 -1
  143. package/dist/src/parser/expressions.js.map +1 -1
  144. package/dist/src/parser/literals.js +6 -2
  145. package/dist/src/parser/literals.js.map +1 -1
  146. package/dist/tests/binder/binder.test.js +29 -0
  147. package/dist/tests/binder/binder.test.js.map +1 -1
  148. package/dist/tests/canonical.test.d.ts +1 -0
  149. package/dist/tests/canonical.test.js +19 -0
  150. package/dist/tests/canonical.test.js.map +1 -0
  151. package/dist/tests/checker/checker.test.d.ts +1 -0
  152. package/dist/tests/checker/checker.test.js +245 -0
  153. package/dist/tests/checker/checker.test.js.map +1 -0
  154. package/dist/tests/cli/check.test.js +20 -0
  155. package/dist/tests/cli/check.test.js.map +1 -1
  156. package/dist/tests/conformance/matrix.test.d.ts +6 -0
  157. package/dist/tests/conformance/matrix.test.js +23 -0
  158. package/dist/tests/conformance/matrix.test.js.map +1 -0
  159. package/dist/tests/conformance/test262/manifest.d.ts +115 -0
  160. package/dist/tests/conformance/test262/manifest.js +257 -0
  161. package/dist/tests/conformance/test262/manifest.js.map +1 -0
  162. package/dist/tests/conformance/test262.test.d.ts +11 -0
  163. package/dist/tests/conformance/test262.test.js +74 -0
  164. package/dist/tests/conformance/test262.test.js.map +1 -0
  165. package/dist/tests/docs/structure.test.js +9 -11
  166. package/dist/tests/docs/structure.test.js.map +1 -1
  167. package/dist/tests/e2e/child-process.test.js +3 -2
  168. package/dist/tests/e2e/child-process.test.js.map +1 -1
  169. package/dist/tests/e2e/compile-builtins.test.js +45 -0
  170. package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
  171. package/dist/tests/e2e/compile-objects-classes.test.js +77 -0
  172. package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
  173. package/dist/tests/e2e/differential-syntax.test.d.ts +5 -0
  174. package/dist/tests/e2e/differential-syntax.test.js +95 -0
  175. package/dist/tests/e2e/differential-syntax.test.js.map +1 -0
  176. package/dist/tests/e2e/differential-values.test.js +15 -0
  177. package/dist/tests/e2e/differential-values.test.js.map +1 -1
  178. package/dist/tests/e2e/gui-browser.test.d.ts +13 -0
  179. package/dist/tests/e2e/gui-browser.test.js +163 -0
  180. package/dist/tests/e2e/gui-browser.test.js.map +1 -0
  181. package/dist/tests/e2e/gui-effects.test.d.ts +6 -0
  182. package/dist/tests/e2e/gui-effects.test.js +262 -0
  183. package/dist/tests/e2e/gui-effects.test.js.map +1 -0
  184. package/dist/tests/e2e/gui-example-browser.test.js +2 -2
  185. package/dist/tests/e2e/gui-example-browser.test.js.map +1 -1
  186. package/dist/tests/e2e/gui-example-canvas.test.js +5 -4
  187. package/dist/tests/e2e/gui-example-canvas.test.js.map +1 -1
  188. package/dist/tests/e2e/gui-example-svg.test.js +4 -3
  189. package/dist/tests/e2e/gui-example-svg.test.js.map +1 -1
  190. package/dist/tests/e2e/gui-example-webgl.test.d.ts +10 -0
  191. package/dist/tests/e2e/gui-example-webgl.test.js +75 -0
  192. package/dist/tests/e2e/gui-example-webgl.test.js.map +1 -0
  193. package/dist/tests/e2e/gui-example-webgl2.test.d.ts +8 -0
  194. package/dist/tests/e2e/gui-example-webgl2.test.js +72 -0
  195. package/dist/tests/e2e/gui-example-webgl2.test.js.map +1 -0
  196. package/dist/tests/e2e/gui-example.test.js +4 -3
  197. package/dist/tests/e2e/gui-example.test.js.map +1 -1
  198. package/dist/tests/e2e/gui-helpers.js +4 -3
  199. package/dist/tests/e2e/gui-helpers.js.map +1 -1
  200. package/dist/tests/e2e/gui-layout.test.js +48 -0
  201. package/dist/tests/e2e/gui-layout.test.js.map +1 -1
  202. package/dist/tests/e2e/gui-media.test.js +10 -8
  203. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  204. package/dist/tests/e2e/gui-webgl.test.d.ts +11 -0
  205. package/dist/tests/e2e/gui-webgl.test.js +179 -0
  206. package/dist/tests/e2e/gui-webgl.test.js.map +1 -0
  207. package/dist/tests/e2e/gui-webgl2.test.d.ts +10 -0
  208. package/dist/tests/e2e/gui-webgl2.test.js +238 -0
  209. package/dist/tests/e2e/gui-webgl2.test.js.map +1 -0
  210. package/dist/tests/e2e/harness.d.ts +9 -0
  211. package/dist/tests/e2e/harness.js +14 -2
  212. package/dist/tests/e2e/harness.js.map +1 -1
  213. package/dist/tests/e2e/native-extensions.test.js +2 -1
  214. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  215. package/dist/tests/e2e/property-descriptors.test.js +20 -0
  216. package/dist/tests/e2e/property-descriptors.test.js.map +1 -1
  217. package/dist/tests/e2e/unicode-output.test.js +5 -3
  218. package/dist/tests/e2e/unicode-output.test.js.map +1 -1
  219. package/dist/tests/e2e/weak-collections.test.js +16 -2
  220. package/dist/tests/e2e/weak-collections.test.js.map +1 -1
  221. package/dist/tests/extensions/gui.test.js +41 -0
  222. package/dist/tests/extensions/gui.test.js.map +1 -1
  223. package/dist/tests/extensions/media.test.js +7 -3
  224. package/dist/tests/extensions/media.test.js.map +1 -1
  225. package/dist/tests/helpers.d.ts +1 -0
  226. package/dist/tests/helpers.js +1 -0
  227. package/dist/tests/helpers.js.map +1 -1
  228. package/dist/tests/parser/declarations.test.js +20 -0
  229. package/dist/tests/parser/declarations.test.js.map +1 -1
  230. package/dist/tests/parser/expressions.test.js +36 -0
  231. package/dist/tests/parser/expressions.test.js.map +1 -1
  232. package/dist/tests/platform.d.ts +32 -0
  233. package/dist/tests/platform.js +40 -0
  234. package/dist/tests/platform.js.map +1 -0
  235. package/dist/tests/platform.test.d.ts +12 -0
  236. package/dist/tests/platform.test.js +51 -0
  237. package/dist/tests/platform.test.js.map +1 -0
  238. package/dist/tests/version.test.js +4 -4
  239. package/dist/tests/version.test.js.map +1 -1
  240. package/doc/ai/README.md +10 -4
  241. package/doc/ai/build-recipe.md +1 -0
  242. package/doc/ai/cli.md +17 -5
  243. package/doc/ai/contributing.md +59 -2
  244. package/doc/ai/extensions.md +38 -7
  245. package/doc/ai/language-support.md +25 -16
  246. package/doc/ai/troubleshooting.md +12 -8
  247. package/doc/ai/zh-CN/README.md +9 -4
  248. package/doc/ai/zh-CN/build-recipe.md +1 -0
  249. package/doc/ai/zh-CN/cli.md +13 -3
  250. package/doc/ai/zh-CN/contributing.md +49 -3
  251. package/doc/ai/zh-CN/extensions.md +33 -6
  252. package/doc/ai/zh-CN/language-support.md +23 -14
  253. package/doc/ai/zh-CN/troubleshooting.md +10 -6
  254. package/doc/gui/api.md +47 -1
  255. package/doc/gui/build.md +72 -16
  256. package/doc/gui/canvas.md +11 -3
  257. package/doc/gui/dom.md +33 -18
  258. package/doc/gui/known-issues.md +58 -15
  259. package/doc/gui/layout.md +18 -0
  260. package/doc/gui/media.md +17 -13
  261. package/doc/gui/rendering.md +50 -3
  262. package/doc/gui/runtime.md +18 -0
  263. package/doc/gui/webgl.md +256 -0
  264. package/doc/gui-scripts.md +7 -0
  265. package/doc/gui.md +108 -17
  266. package/doc/implemented/binder.md +2 -0
  267. package/doc/implemented/checker.md +117 -0
  268. package/doc/implemented/cli.md +13 -1
  269. package/doc/implemented/codegen.md +3 -2
  270. package/doc/implemented/driver.md +2 -2
  271. package/doc/implemented/operators.md +2 -1
  272. package/doc/implemented/parser.md +3 -2
  273. package/doc/implemented/pipeline.md +8 -1
  274. package/doc/implemented/stdlib.md +2 -1
  275. package/doc/implemented/tests.md +3 -1
  276. package/doc/implemented.md +2 -0
  277. package/doc/npm-package.md +419 -0
  278. package/doc/requirements.md +22 -10
  279. package/doc/support-matrix.md +83 -0
  280. package/doc/unimplemented/classes.md +3 -0
  281. package/doc/unimplemented/deviations.md +3 -2
  282. package/doc/unimplemented/toolchain.md +1 -1
  283. package/doc/unimplemented/types.md +24 -8
  284. package/doc/unimplemented.md +1 -1
  285. package/doc/zh-CN/gui/api.md +43 -1
  286. package/doc/zh-CN/gui/build.md +64 -15
  287. package/doc/zh-CN/gui/canvas.md +9 -2
  288. package/doc/zh-CN/gui/dom.md +20 -7
  289. package/doc/zh-CN/gui/known-issues.md +46 -13
  290. package/doc/zh-CN/gui/layout.md +14 -0
  291. package/doc/zh-CN/gui/media.md +15 -11
  292. package/doc/zh-CN/gui/rendering.md +41 -4
  293. package/doc/zh-CN/gui/runtime.md +16 -0
  294. package/doc/zh-CN/gui/webgl.md +115 -0
  295. package/doc/zh-CN/gui-scripts.md +5 -0
  296. package/doc/zh-CN/gui.md +89 -14
  297. package/doc/zh-CN/implemented/binder.md +2 -0
  298. package/doc/zh-CN/implemented/checker.md +99 -0
  299. package/doc/zh-CN/implemented/cli.md +12 -1
  300. package/doc/zh-CN/implemented/codegen.md +3 -2
  301. package/doc/zh-CN/implemented/driver.md +2 -2
  302. package/doc/zh-CN/implemented/operators.md +1 -1
  303. package/doc/zh-CN/implemented/parser.md +3 -2
  304. package/doc/zh-CN/implemented/pipeline.md +3 -1
  305. package/doc/zh-CN/implemented/stdlib.md +2 -1
  306. package/doc/zh-CN/implemented/tests.md +3 -1
  307. package/doc/zh-CN/implemented.md +2 -0
  308. package/doc/zh-CN/npm-package.md +394 -0
  309. package/doc/zh-CN/post/announce.md +47 -47
  310. package/doc/zh-CN/requirements.md +16 -7
  311. package/doc/zh-CN/support-matrix.md +82 -0
  312. package/doc/zh-CN/unimplemented/classes.md +3 -0
  313. package/doc/zh-CN/unimplemented/deviations.md +3 -2
  314. package/doc/zh-CN/unimplemented/toolchain.md +1 -1
  315. package/doc/zh-CN/unimplemented/types.md +16 -6
  316. package/doc/zh-CN/unimplemented.md +1 -1
  317. package/llms.txt +6 -1
  318. package/package.json +2 -1
  319. package/runtime/ext_gui/audio.cpp +316 -0
  320. package/runtime/ext_gui/browser.cpp +573 -0
  321. package/runtime/ext_gui/browser_escape.cpp +85 -0
  322. package/runtime/ext_gui/browser_loop.cpp +83 -0
  323. package/runtime/ext_gui/canvas.cpp +12 -21
  324. package/runtime/ext_gui/canvas_internal.h +10 -0
  325. package/runtime/ext_gui/canvas_raster.cpp +79 -1
  326. package/runtime/ext_gui/clip_values.cpp +246 -0
  327. package/runtime/ext_gui/css.cpp +94 -0
  328. package/runtime/ext_gui/css.h +22 -1
  329. package/runtime/ext_gui/css_match.cpp +3 -0
  330. package/runtime/ext_gui/css_selector.cpp +9 -0
  331. package/runtime/ext_gui/css_sheet.cpp +89 -45
  332. package/runtime/ext_gui/document.cpp +4 -1
  333. package/runtime/ext_gui/document.h +2 -0
  334. package/runtime/ext_gui/dom.h +16 -0
  335. package/runtime/ext_gui/dom_api.cpp +37 -0
  336. package/runtime/ext_gui/dom_api_canvas.cpp +17 -80
  337. package/runtime/ext_gui/dom_api_canvas_extra.cpp +130 -1
  338. package/runtime/ext_gui/dom_api_canvas_pending.cpp +41 -0
  339. package/runtime/ext_gui/dom_api_document.cpp +96 -5
  340. package/runtime/ext_gui/dom_api_events.cpp +20 -0
  341. package/runtime/ext_gui/dom_api_internal.h +278 -0
  342. package/runtime/ext_gui/dom_api_proto.cpp +6 -0
  343. package/runtime/ext_gui/dom_api_webgl.cpp +376 -0
  344. package/runtime/ext_gui/dom_api_webgl2.cpp +434 -0
  345. package/runtime/ext_gui/dom_api_webgl2_draw.cpp +269 -0
  346. package/runtime/ext_gui/dom_api_webgl_buffer.cpp +212 -0
  347. package/runtime/ext_gui/dom_api_webgl_rt.h +30 -0
  348. package/runtime/ext_gui/dom_api_webgl_shader.cpp +443 -0
  349. package/runtime/ext_gui/dom_api_webgl_state.cpp +444 -0
  350. package/runtime/ext_gui/dom_api_webgl_texture.cpp +445 -0
  351. package/runtime/ext_gui/effect_values.cpp +312 -0
  352. package/runtime/ext_gui/gradient_values.cpp +476 -0
  353. package/runtime/ext_gui/grid_values.cpp +230 -0
  354. package/runtime/ext_gui/gui.cpp +90 -23
  355. package/runtime/ext_gui/gui_canvas.cpp +50 -2
  356. package/runtime/ext_gui/gui_engine.h +71 -0
  357. package/runtime/ext_gui/gui_events.cpp +4 -1
  358. package/runtime/ext_gui/gui_media.cpp +1 -1
  359. package/runtime/ext_gui/gui_webgl.cpp +83 -0
  360. package/runtime/ext_gui/layout.cpp +21 -0
  361. package/runtime/ext_gui/layout_flow.cpp +81 -4
  362. package/runtime/ext_gui/layout_flow_internal.h +31 -0
  363. package/runtime/ext_gui/layout_grid.cpp +374 -0
  364. package/runtime/ext_gui/media.h +1 -1
  365. package/runtime/ext_gui/media_api.h +2 -2
  366. package/runtime/ext_gui/media_query.cpp +211 -0
  367. package/runtime/ext_gui/paint.cpp +111 -77
  368. package/runtime/ext_gui/paint.h +33 -3
  369. package/runtime/ext_gui/paint_background.cpp +229 -0
  370. package/runtime/ext_gui/paint_clip.cpp +268 -0
  371. package/runtime/ext_gui/paint_effects.cpp +324 -0
  372. package/runtime/ext_gui/paint_internal.h +85 -0
  373. package/runtime/ext_gui/renderer.cpp +8 -31
  374. package/runtime/ext_gui/renderer_clip.cpp +196 -0
  375. package/runtime/ext_gui/renderer_image.cpp +13 -8
  376. package/runtime/ext_gui/renderer_internal.h +15 -8
  377. package/runtime/ext_gui/renderer_text.cpp +6 -31
  378. package/runtime/ext_gui/style.cpp +343 -20
  379. package/runtime/ext_gui/style.h +144 -3
  380. package/runtime/ext_gui/style_print.cpp +134 -1
  381. package/runtime/ext_gui/style_values.cpp +152 -126
  382. package/runtime/ext_gui/style_values_internal.h +35 -0
  383. package/runtime/ext_gui/webgl.h +466 -0
  384. package/runtime/ext_gui/webgl2_constants.h +274 -0
  385. package/runtime/ext_gui/webgl_buffer.cpp +565 -0
  386. package/runtime/ext_gui/webgl_constants.h +317 -0
  387. package/runtime/ext_gui/webgl_context.cpp +466 -0
  388. package/runtime/ext_gui/webgl_draw.cpp +495 -0
  389. package/runtime/ext_gui/webgl_glsl.h +125 -0
  390. package/runtime/ext_gui/webgl_glsl_compile.cpp +431 -0
  391. package/runtime/ext_gui/webgl_glsl_rewrite.cpp +349 -0
  392. package/runtime/ext_gui/webgl_glsl_scan.cpp +581 -0
  393. package/runtime/ext_gui/webgl_msl.cpp +62 -0
  394. package/runtime/ext_gui/webgl_msl.h +33 -0
  395. package/runtime/ext_gui/webgl_pipeline.cpp +274 -0
  396. package/runtime/ext_gui/webgl_program_internal.h +18 -0
  397. package/runtime/ext_gui/webgl_shader.cpp +582 -0
  398. package/runtime/ext_gui/webgl_texture.cpp +293 -0
  399. package/runtime/ext_gui/webgl_uniform.cpp +167 -0
  400. package/runtime/ext_gui/webgl_webgl2.cpp +224 -0
  401. package/runtime/ext_gui/window.cpp +9 -0
  402. package/runtime/ext_media/media.cpp +1 -1
  403. package/runtime/ext_media/media_bridge.c +9 -3
  404. package/runtime/ext_node/path/path.c +7 -7
  405. package/runtime/ext_node/url/url.c +4 -2
  406. package/runtime/rt.h +15 -0
  407. package/runtime/rt_internal.h +1 -0
  408. package/runtime/xt_constructors.c +2 -1
  409. package/runtime/xt_containers/access.inc +8 -0
  410. package/runtime/xt_containers/objects.inc +22 -2
  411. package/runtime/xt_io/exception.inc +4 -2
  412. package/runtime/xt_regex/api.inc +2 -0
  413. package/runtime/xt_regex/matcher.inc +16 -3
  414. package/runtime/xt_regex/parser.inc +8 -2
  415. package/runtime/xt_regex/types.inc +3 -0
  416. package/runtime/xt_stdlib/math.inc +62 -0
  417. package/runtime/xt_stdlib2/date.inc +7 -1
  418. package/runtime/xt_stdlib2/objects.inc +14 -0
  419. package/runtime/xt_stdlib2/regexp-match.inc +60 -21
  420. package/runtime/xt_stdlib2/regexp.inc +1 -0
  421. package/runtime/xt_typed_array.c +1 -1
  422. package/scripts/build-gui.ts +90 -3
  423. package/scripts/build-media.ts +323 -58
  424. package/scripts/setup-vs-toolchain.ps1 +152 -0
  425. package/scripts/support-matrix.ts +167 -0
  426. package/src/ast/common.ts +2 -0
  427. package/src/ast/declarations.ts +12 -1
  428. package/src/ast/expressions.ts +6 -0
  429. package/src/ast/kinds.ts +2 -0
  430. package/src/binder/binder.ts +3 -0
  431. package/src/binder/declarations.ts +70 -0
  432. package/src/binder/references.ts +97 -4
  433. package/src/binder/types.ts +30 -0
  434. package/src/canonical.ts +37 -0
  435. package/src/checker/assignability.ts +134 -0
  436. package/src/checker/calls.ts +135 -0
  437. package/src/checker/checker.ts +47 -0
  438. package/src/checker/declarations.ts +26 -0
  439. package/src/checker/flow.ts +236 -0
  440. package/src/checker/globals.ts +40 -0
  441. package/src/checker/source.ts +53 -0
  442. package/src/checker/type-infer.ts +185 -0
  443. package/src/checker/type-model.ts +212 -0
  444. package/src/checker/type-system.ts +578 -0
  445. package/src/checker/typecheck-types.ts +112 -0
  446. package/src/checker/typecheck.ts +586 -0
  447. package/src/checker/undefined.ts +43 -0
  448. package/src/checker/walk.ts +16 -0
  449. package/src/cli/help.ts +65 -0
  450. package/src/cli/hints.ts +2 -1
  451. package/src/cli/main.ts +12 -49
  452. package/src/codegen/generator/calls/access.ts +8 -8
  453. package/src/codegen/generator/calls/invocation.ts +8 -5
  454. package/src/codegen/generator/calls/super.ts +67 -5
  455. package/src/codegen/generator/context.ts +31 -19
  456. package/src/codegen/generator/debug.ts +2 -1
  457. package/src/codegen/generator/expressions/primary.ts +84 -13
  458. package/src/codegen/generator/generator.ts +11 -1
  459. package/src/codegen/generator/module.ts +115 -24
  460. package/src/codegen/generator/state.ts +11 -1
  461. package/src/codegen/generator/statements/variables.ts +26 -6
  462. package/src/codegen/generator/tables.ts +5 -0
  463. package/src/driver/build-key.ts +3 -0
  464. package/src/driver/bundler/graph.ts +6 -2
  465. package/src/driver/bundler/merge.ts +14 -1
  466. package/src/driver/bundler/types.ts +13 -0
  467. package/src/driver/compiler.ts +4 -1
  468. package/src/driver/fingerprint.ts +2 -1
  469. package/src/driver/frontend.ts +13 -2
  470. package/src/driver/options.ts +6 -0
  471. package/src/driver/version.ts +1 -1
  472. package/src/extensions/gui/css.ts +113 -0
  473. package/src/extensions/gui/html.ts +31 -11
  474. package/src/extensions/gui/index.ts +81 -2
  475. package/src/extensions/gui/three.ts +25 -0
  476. package/src/extensions/media/index.ts +13 -16
  477. package/src/extensions/registry.ts +48 -0
  478. package/src/index.ts +1 -0
  479. package/src/parser/declarations/classes.ts +7 -0
  480. package/src/parser/expressions.ts +13 -1
  481. package/src/parser/literals.ts +6 -2
@@ -0,0 +1,83 @@
1
+ # Support matrix
2
+
3
+ > Language: **English** | [简体中文](./zh-CN/support-matrix.md)
4
+
5
+ > **Generated** by `npm run docs:matrix` from the executable catalogue in
6
+ > [`tests/conformance/test262/manifest.ts`](../tests/conformance/test262/manifest.ts). Do not edit this
7
+ > file by hand: change a case and regenerate.
8
+
9
+ Every supported case is an unmodified [test262](https://github.com/tc39/test262)
10
+ file (pinned at `d53ebc8b1931d9f1541e43d59650776e4b766248`) that xbintsc compiles **and runs**; the
11
+ [test262 suite](../tests/conformance/test262.test.ts) fails if one stops passing. The corpus is a
12
+ representative subset, not a full test262 run. Every unsupported case
13
+ is valid JavaScript that xbintsc currently rejects, pinned with the diagnostic
14
+ code it produces. See [`SOURCE.md`](../tests/conformance/test262/SOURCE.md) for the harness adaptation.
15
+ Because the suite runs on every CI platform, this table cannot claim more than
16
+ the compiler does.
17
+
18
+ ## Coverage by area
19
+
20
+ | Area | Supported | Unsupported | Reference |
21
+ | --- | ---: | ---: | --- |
22
+ | Values and operators | 2 | 1 | [reference](implemented/operators.md) |
23
+ | Strings (UTF-16 semantics) | 2 | 0 | [reference](implemented/strings.md) |
24
+ | Arrays | 2 | 0 | [reference](implemented/stdlib.md) |
25
+ | Objects | 2 | 0 | [reference](implemented/stdlib.md) |
26
+ | Classes and inheritance | 2 | 0 | [reference](implemented/codegen.md) |
27
+ | Closures and functions | 2 | 1 | [reference](implemented/binder.md) |
28
+ | Exceptions | 2 | 0 | [reference](implemented/runtime-core.md) |
29
+ | Async and promises | 2 | 0 | [reference](implemented/async.md) |
30
+ | JSON | 2 | 0 | [reference](implemented/stdlib.md) |
31
+ | Map and Set | 2 | 0 | [reference](implemented/collections.md) |
32
+ | Regular expressions | 2 | 0 | [reference](implemented/stdlib.md) |
33
+ | Typed arrays and binary data | 2 | 0 | [reference](implemented/typed-arrays.md) |
34
+ | Date | 2 | 0 | [reference](implemented/stdlib.md) |
35
+ | Generators | 2 | 0 | [reference](implemented/async.md) |
36
+ | Modules | 2 | 1 | [reference](implemented/modules.md) |
37
+ | Optional chaining and templates | 2 | 1 | [reference](implemented/operators.md) |
38
+
39
+ ## Supported cases (test262, compiled and executed)
40
+
41
+ | test262 case | Area | What it pins down |
42
+ | --- | --- | --- |
43
+ | `built-ins/Number/isInteger/integers.js` | Values and operators | Number.isInteger accepts every integer, including ±2^53 |
44
+ | `built-ins/Number/isSafeInteger/infinity.js` | Values and operators | Number.isSafeInteger rejects ±Infinity |
45
+ | `built-ins/String/prototype/padStart/fill-string-empty.js` | Strings (UTF-16 semantics) | padStart leaves the string unchanged when the fill string is empty |
46
+ | `built-ins/String/prototype/includes/String.prototype.includes_Success.js` | Strings (UTF-16 semantics) | includes finds a substring at the requested position |
47
+ | `built-ins/Array/prototype/map/15.4.4.19-1-1.js` | Arrays | map throws a TypeError when its receiver is undefined |
48
+ | `built-ins/Array/prototype/at/index-non-numeric-argument-tointeger.js` | Arrays | at coerces false, null, undefined and the empty string to index 0 |
49
+ | `built-ins/Object/keys/15.2.3.14-0-1.js` | Objects | Object.keys is a callable function |
50
+ | `built-ins/Object/assign/Override.js` | Objects | Object.assign lets a later source override an earlier key |
51
+ | `language/statements/class/subclass/class-definition-evaluation-empty-constructor-heritage-present.js` | Classes and inheritance | a derived class without a constructor forwards its arguments to super |
52
+ | `language/statements/class/definition/class-method-returns-promise.js` | Classes and inheritance | an async class method returns a promise instance |
53
+ | `language/expressions/arrow-function/cannot-override-this-with-thisArg.js` | Closures and functions | arrow functions cannot have this overridden by thisArg |
54
+ | `language/expressions/function/S10.1.1_A1_T2.js` | Closures and functions | named, anonymous and parenthesised function expressions all evaluate |
55
+ | `language/statements/try/12.14-10.js` | Exceptions | catch introduces its own scope for name lookup |
56
+ | `built-ins/Error/length.js` | Exceptions | the Error constructor reports length 1 |
57
+ | `language/expressions/await/async-await-interleaved.js` | Async and promises | await and promise continuations interleave on the microtask queue |
58
+ | `built-ins/Promise/all/S25.4.4.1_A1.1_T1.js` | Async and promises | Promise.all is callable |
59
+ | `built-ins/JSON/stringify/property-order.js` | JSON | JSON.stringify emits keys in property order |
60
+ | `built-ins/JSON/parse/15.12.1.1-0-9.js` | JSON | JSON.parse accepts whitespace before and after a token |
61
+ | `built-ins/Map/prototype/set/append-new-values.js` | Map and Set | Map.set appends new entries in insertion order |
62
+ | `built-ins/Set/prototype/add/does-not-have-setdata-internal-slot-array.js` | Map and Set | Set.prototype.add rejects a non-Set receiver |
63
+ | `built-ins/RegExp/prototype/test/S15.10.6.3_A1_T1.js` | Regular expressions | test() applies /1|12/ to the string "123" |
64
+ | `built-ins/String/prototype/replace/15.5.4.11-1.js` | Regular expressions | replace passes the correct this to the replacer function |
65
+ | `built-ins/DataView/prototype/getUint8/index-is-out-of-range.js` | Typed arrays and binary data | getUint8 throws a RangeError past the end of the view |
66
+ | `built-ins/DataView/prototype/setUint32/no-value-arg.js` | Typed arrays and binary data | setUint32 stores 0 when the value argument is omitted |
67
+ | `built-ins/Date/prototype/getUTCFullYear/this-value-valid-date.js` | Date | getUTCFullYear reads a valid date |
68
+ | `built-ins/Date/parse/year-zero.js` | Date | Date.parse rejects the -000000 extended year |
69
+ | `language/statements/generators/declaration.js` | Generators | generator function declarations are supported |
70
+ | `language/expressions/generators/default-proto.js` | Generators | generator functions share the intrinsic generator prototype |
71
+ | `language/module-code/eval-export-cls-semi.js` | Modules | an exported class declaration needs no trailing semicolon |
72
+ | `language/module-code/eval-export-fun-semi.js` | Modules | an exported function declaration needs no trailing semicolon |
73
+ | `language/expressions/optional-chaining/call-expression.js` | Optional chaining and templates | optional chaining applies to call expressions |
74
+ | `language/expressions/template-literal/evaluation-order.js` | Optional chaining and templates | template substitutions evaluate from left to right |
75
+
76
+ ## Unsupported cases (valid JavaScript, expected diagnostics)
77
+
78
+ | test262 case | Area | Diagnostic | Why |
79
+ | --- | --- | ---: | --- |
80
+ | `language/statements/with/12.10-0-1.js` | Optional chaining and templates | TS2001 | `with` statements are not implemented |
81
+ | `language/expressions/new.target/value-via-call.js` | Closures and functions | TS4005 | `new.target` has no lowering |
82
+ | `language/expressions/comma/S11.14_A2.1_T3.js` | Values and operators | TS3002 | an unbound name is a compile-time error, not a runtime `ReferenceError` |
83
+ | `language/expressions/dynamic-import/always-create-new-promise.js` | Modules | TS2001 | dynamic `import()` is not implemented |
@@ -9,6 +9,9 @@
9
9
  | Instance fields / property declarations | ✓ |
10
10
  | Methods | ✓ |
11
11
  | `static` fields / methods | ✓ |
12
+ | `static { ... }` blocks | ✓ implemented (runs once at class definition; static fields and blocks run in declaration order, static methods are installed first; `this` is the class, `super.x` reads the parent constructor) |
13
+ | `static get` / `static set` accessors | ✓ (accessors on the constructor value; inherited static setters are honoured) |
14
+ | `super[key]` / `super[key](...)` | ✓ |
12
15
  | Inheritance `extends` / `super` | ✓ (single level correct; `super` takes the prototype of `this`'s prototype — see [Runtime deviations](./deviations.md)) |
13
16
  | Prototype chain / method lookup | ✓ |
14
17
  | `instanceof` | ✓ |
@@ -13,11 +13,12 @@ These features **compile and run**, but the result does not fully match ECMAScri
13
13
  | `for...in` | Enumerates own keys of objects / arrays / strings; does not include prototype-chain properties |
14
14
  | Array out-of-bounds / sparse | Out-of-bounds access returns `undefined`; assigning `arr.length` truncates / extends, but sparse holes are not tracked distinctly |
15
15
  | Memory management | Non-moving mark-sweep collector behind `xt_alloc`: explicit roots, subsystem root providers and a conservative C-stack scan. Single-threaded and stop-the-world; no moving/compaction or generational mode |
16
- | Function `arity` / argument count | No argument count validation; `fn.length` reports the declared arity but calls are never checked against it |
16
+ | Function `arity` / argument count | Direct calls to a locally visible function are checked by the default [semantic checker](../implemented/checker.md) (`TS4004`); calls through properties, imports, spread arguments or a reassigned binding are not. `fn.length` reports the declared arity |
17
17
  | `async` / `await` | Real suspension on a stackful coroutine; `await` always queues a microtask (non-promises and already-settled promises included), so interleaving with pending `.then` callbacks matches the specification. Top-level `await` blocks on the event loop rather than yielding the module body. `fs/promises` and `fetch` offload their blocking work to a four-worker pool and settle on the reactor. Async generators suspend at both `await` and `yield`; `for await...of` awaits one step per iteration |
18
18
  | Async generator cleanup | `for await...of` does not call the iterator's `return()` when the loop exits early. `yield*` inside an async generator delegates to synchronous iterables only. `.return()` at a suspended `yield` completes without running `finally` (the same limitation as synchronous generators) |
19
- | `super` | `super.x` / `super(...)` takes the prototype of `this`'s prototype; single-level inheritance is correct, but depth > 1 may be inaccurate |
19
+ | `super` | `super.x` / `super[x]` read from the parent holder of the class whose body is running (in an instance method: the parent prototype; in a `static` method or static block: the parent constructor), so any inheritance depth is correct |
20
20
  | `Error.stack` | Function-level frames only: each frame is `at name (file:line)` with the function's declaration line (updated to the construction line for the innermost frame); no column numbers and no frames for generator / `async` bodies (they switch stacks) |
21
+ | `let` in a `for` loop header | One binding per loop, not one per iteration: closures created inside the body all observe the final value (`for (let i = 0; i < 3; i++) fns.push(() => i)` gives `3,3,3`) |
21
22
  | Module live bindings | Namespace imports and imported bindings are snapshots (see [Module system](./modules.md)) |
22
23
  | `import.meta` | ✓ `import.meta.url` / `.dirname` / `.filename`, resolved from the executable path |
23
24
 
@@ -6,7 +6,7 @@
6
6
  | --- | --- |
7
7
  | GC (garbage collection) | ✓ non-moving mark-sweep in `xt_alloc.c`, armed by a live-heap threshold (`XT_GC_THRESHOLD` pins it) or `xt_gc_collect()`; after each collection the threshold becomes twice the surviving heap (floor 1 MiB), so the resident set follows the live set instead of only growing. `XT_GC_TRACE=1` prints one line per collection to stderr. Explicit roots + root providers + conservative active-stack scan. `WeakMap`/`WeakSet` keys are ephemerons (a value is retained only while its key is reachable) and `WeakRef` targets are cleared when unreachable; because the stack scan is conservative, a stale stack word can delay that clearing. No compaction or background collection |
8
8
  | Self-hosting | ✓ the compiler compiles itself: `xbintsc build src/cli/main.ts` produces a working binary, and the emitted IR is stable from generation 1 onward. The runtime is still C |
9
- | Type checker | ✗ only diagnostic codes are defined; no checker |
9
+ | Type checker | partial: the default [semantic checker](../implemented/checker.md) reports unresolved names, redeclarations, call arity, property existence and definite assignability mismatches, with structural interfaces/classes, simple generics and basic flow narrowing; there is no full inference or strict-null pass |
10
10
  | Full standard library | partial: Math / JSON / Date / Map / Set / RegExp / `Error` / `BigInt` / `Symbol` / `structuredClone` implemented; String.normalize missing |
11
11
  | Multi-file module bundling | partial: relative-path `.ts` bundling, ESM `node_modules` packages, namespace imports and bare-specifier extension module imports implemented; CommonJS is handled only inside `node_modules`; circular dependencies / live bindings are not implemented |
12
12
  | Real async runtime | ✓ `async`/`await` suspends on pending promises on the `select(2)` reactor: timers, TCP sockets, offloaded file/HTTP work and promise callbacks resume the coroutine. Still missing: real OS-level file watching, non-blocking `net.connect`, TLS for `fetch`, and user-visible worker threads (`worker_threads` uses child processes) |
@@ -2,11 +2,27 @@
2
2
 
3
3
  > Part of [Unimplemented syntax and features](../unimplemented.md) · [简体中文](../zh-CN/unimplemented/types.md)
4
4
 
5
- Type syntax is parsed into the AST and then **erased entirely** during binding /
6
- code generation; no type checking is performed:
7
-
8
- - Type annotations, return types, type parameters, type aliases, interfaces, generic constraints, etc.: parse ✓, check ✗.
9
- - Checker diagnostic codes (`TypeMismatch` `NotCallable` `PropertyNotFound` `ArgumentCountMismatch`) are defined but **unused**.
10
- - `as` / `satisfies` / non-null assertion `!`: erased directly, no assertion semantics.
11
- - Generics: no runtime instantiation; type parameters are ignored.
12
- - Optional chaining `?.` type narrowing: none (runtime short-circuit is implemented, but there is no type-level narrowing).
5
+ Type syntax is **not** erased blindly any more: the default
6
+ [semantic checker](../implemented/checker.md) resolves the subset of TypeScript
7
+ types it can model and checks assignability, property existence and simple flow
8
+ narrowing. Type syntax is still erased during code generation, and the checker
9
+ is deliberately incomplete:
10
+
11
+ - **No full inference.** An unannotated function returns `any`; generic
12
+ constraints, higher-order inference and return-type inference are not
13
+ attempted.
14
+ - **No strict-null mode.** `null` / `undefined` are assignable wherever a value
15
+ is expected.
16
+ - **No excess-property check** on fresh object literals.
17
+ - **No overload resolution, mapped types, conditional types or template-literal
18
+ types.** They resolve to `any`.
19
+ - **`as` / `satisfies` / non-null `!`** are still erased and do not validate
20
+ anything; the checker treats them as assertions.
21
+ - **Complex generics.** Simple type parameters are inferred from arguments
22
+ (`T`, `T[]`, `Array<T>`); mapped/conditional generic machinery is not.
23
+ - **Type arguments are not checked for arity**; an unknown type parameter is
24
+ just `any`.
25
+
26
+ All six checker diagnostic codes are now used: `DuplicateIdentifier` (TS3001),
27
+ `CannotFindName` (TS3002), `TypeMismatch` (TS4001), `NotCallable` (TS4002),
28
+ `PropertyNotFound` (TS4003) and `ArgumentCountMismatch` (TS4004).
@@ -25,7 +25,7 @@ under [implemented](./implemented.md); git history records when it changed.
25
25
  - [Module system](./unimplemented/modules.md) — circular dependencies, live bindings, CommonJS boundaries
26
26
  - [Functions](./unimplemented/functions.md) — missing function semantics
27
27
  - [Classes and OO](./unimplemented/classes.md) — access control, `abstract`/`implements`, private-name collisions
28
- - [Type system](./unimplemented/types.md) — parsed but never checked
28
+ - [Type system](./unimplemented/types.md) — parsed and erased; only inference-free facts are checked
29
29
  - [Runtime deviations](./unimplemented/deviations.md) — compiles and runs, but differs from ECMAScript
30
30
  - [Toolchain and platform](./unimplemented/toolchain.md) — type checker, async I/O, GC modes, platform gaps
31
31
  - [Node extension](./unimplemented/node.md) — Node module gaps, one page per area
@@ -34,6 +34,48 @@ API 编写的文档可以原样运行。
34
34
  `ready`(首个呈现帧之后)、`load`、`close`、`resize`,以及输入事件
35
35
  `mousemove`、`mousedown`、`mouseup`、`click`、`wheel`、`keydown`、`keyup`。
36
36
 
37
+ ## 浏览器全局
38
+
39
+ 从 Web 迁移过来的页面很少只用到 `createWindow`。启用 `--ext gui` 后,运行时同样提供
40
+ 这类移植需要的那一层浏览器接口,程序不必自己声明:
41
+
42
+ ```ts
43
+ const ctx = new AudioContext(); // 也可 window.AudioContext
44
+ ctx.createGain().connect(ctx.destination);
45
+ document.querySelector("#start").addEventListener("click", () => {});
46
+ console.log(navigator.userAgent, window.innerWidth, location.href);
47
+ requestAnimationFrame(frame);
48
+ ```
49
+
50
+ | 全局 | 取值 |
51
+ | --- | --- |
52
+ | `window`、`self` | 最近打开的窗口句柄(若程序尚未创建窗口,会隐式打开一个),因此 `window.innerWidth`、`window.addEventListener`、`window.setTimeout`、`window.localStorage`、`window.location`、`window.devicePixelRatio`、`window.matchMedia` 都可用 |
53
+ | `document` | 该窗口的 document 句柄 |
54
+ | `navigator` | `userAgent`(以 `xbintsc` 结尾的桌面 Chrome 字符串)、`platform`、`vendor`、`language(s)`、`hardwareConcurrency`、`maxTouchPoints`、`onLine`、`vibrate()` |
55
+ | `localStorage` | 内存中的 `getItem` / `setItem` / `removeItem` / `clear` / `key` / `length` |
56
+ | `AudioContext`、`webkitAudioContext` | Web Audio 图构建器(见下) |
57
+ | `Event`、`CustomEvent`、`ProgressEvent` 等 | 事件构造器 |
58
+ | `HTMLCanvasElement`、`HTMLImageElement`、`WebGLRenderingContext`、`WebGL2RenderingContext`、`WebGLBuffer`/`WebGLTexture`/`WebGLShader`/`WebGLProgram`/`WebGLFramebuffer`/`WebGLRenderbuffer`/`WebGLUniformLocation`/`WebGLActiveInfo`/`WebGLVertexArrayObject`/`WebGLSampler`/`WebGLQuery`/`WebGLSync`/`WebGLTransformFeedback` | 真实的构造函数值。`canvas.getContext("webgl")` 与 `getContext("webgl2")` 返回 GPU 上下文(见 [WebGL](./webgl.md))。 |
59
+ | `ImageBitmap`、`ImageData`、`OffscreenCanvas`、`XRWebGL*`、`Request`、`Headers`、`Response`、`ReadableStream`、`DOMParser` | `typeof` 探测返回 `"undefined"`(没有 XR/fetch/流式后端),让页面走自己的“不支持”分支,而不是调用空壳。Three.js 页面在本后端上使用真实渲染器(见[已知问题](./known-issues.md))。 |
60
+ | `requestAnimationFrame` / `cancelAnimationFrame` | 排入窗口的动画帧列表,见[运行时集成](./runtime.md) |
61
+ | `alert` / `confirm` / `prompt`、`matchMedia`、`getComputedStyle`、`escape` | 宿主实现(Annex B `escape` 按 UTF-16 码元编码,与 `decodeURIComponent(escape(bytes))` 一致) |
62
+
63
+ `getElementById` / `querySelector` 在 `loadHTML` 之前也能回答:此时得到的是**挂起**句柄,
64
+ 首次使用时才绑定到真实节点,因此在模块初始化阶段缓存 `document.querySelector("#id")`
65
+ 的页面依然可用。页面解析完成后未命中则回答 `undefined`,与浏览器一致。
66
+
67
+ ### Web Audio
68
+
69
+ `new AudioContext()` 会构建音频图,但**不做混音也不渲染音频**:背后没有后端。已实现的是
70
+ 页面运行与自检所需的接口 —— `createGain` / `createOscillator` / `createBufferSource` /
71
+ `createBiquadFilter` / `createDynamicsCompressor` / `createBuffer`(真实的
72
+ `Float32Array` 声道)/ `decodeAudioData`(以空缓冲区兑现)/ `resume` / `suspend` /
73
+ `close`,`AudioParam` 的 `value` 与 `setValueAtTime` / `linearRampToValueAtTime` /
74
+ `exponentialRampToValueAtTime` / `setTargetAtTime` / `cancelScheduledValues` /
75
+ `cancelAndHoldAtTime`,节点 `connect`(返回目标节点,因此可链式连接)/ `disconnect` /
76
+ `start` / `stop`。`sampleRate` 为 48000、`state` 为 `"running"`,`currentTime` 仅随
77
+ 事件循环推进。
78
+
37
79
  输入处理器接收单个负载对象(生命周期处理器不接收任何参数):
38
80
 
39
81
  ```ts
@@ -92,4 +134,4 @@ win.stats() // 引擎/运行时计数器(内存排
92
134
 
93
135
  多窗口由对象模型自然得出:`createWindow` 返回一个原生对象句柄;每个句柄
94
136
  拥有自己的 `SDL_Window`/GPU 表面与自己的 DOM 树。`run()` 驱动一个共享主循环,
95
- 它每帧 tick 所有窗口,并在最后一个窗口关闭时退出。
137
+ 它每帧 tick 所有窗口,并在最后一个窗口关闭时退出。
@@ -8,34 +8,60 @@
8
8
  (被 gitignore;按需获取)。媒体解码位于 `runtime/ext_media/`,单独构建。
9
9
  - `npm run gui`(`scripts/build-gui.ts`)获取固定版本的 SDL3(`SDL3_TAG`,
10
10
  默认 `release-3.2.10`),构建静态 SDL3,获取并构建静态 FreeType
11
- (`FREETYPE_VERSION`)与 HarfBuzz(`HARFBUZZ_VERSION`),编译引擎,并把
11
+ (`FREETYPE_VERSION`)与 HarfBuzz(`HARFBUZZ_VERSION`),并获取、构建静态
12
+ **glslang**(`GLSLANG_VERSION`,默认 `16.6.0`)、固定版本的 SPIR-V 头文件
13
+ (`SPIRV_HEADERS_VERSION`)以及 **SPIRV-Cross**(`SPIRV_CROSS_VERSION`,默认
14
+ `vulkan-sdk-1.4.313.0`)。glslang 是 WebGL 背后的运行时 GLSL ES 编译器,
15
+ SPIRV-Cross 把它的 SPIR-V 转成 Metal 后端使用的 MSL(见
16
+ [WebGL](./webgl.md)),两者都与其他库一样合并进归档。随后编译引擎,并把
12
17
  所有内容合并到 `runtime/lib/<os>-<arch>/gui.a`(Windows 上 MSVC ABI 则为
13
- `gui.lib`),与 `core.a` 采用相同约定,静态打包三者。合并使用 macOS 上的
18
+ `gui.lib`),与 `core.a` 采用相同约定,静态打包这些库。合并使用 macOS 上的
14
19
  `libtool` 与其他平台上的 `ar -M`(GNU/LLVM);CMake 归档会在构建根目录或
15
20
  `Release/` 下按任一生成器风格被发现。
16
21
  - `npm run media`(`scripts/build-media.ts`)构建可选的 **FFmpeg** 后端。它获取
17
22
  FFmpeg(`FFMPEG_VERSION`,默认 `7.1`),配置一个只启用媒体元素所需
18
23
  demuxer/parser/decoder 的最小静态构建,用它编译
19
24
  `runtime/ext_media/media.cpp`,并把所有内容合并到
20
- `runtime/lib/<os>-<arch>/media.a`。`gui.a` **不会**链接 FFmpeg:程序通过
21
- `--ext media` 显式启用播放能力。
25
+ `runtime/lib/<os>-<arch>/media.a`(Windows 上 MSVC ABI 则为 `media.lib`)。
26
+ `gui.a` **不会**链接 FFmpeg:程序通过 `--ext media` 显式启用播放能力。
22
27
  - `src/extensions/gui/index.ts` 通过 `nativeObjects()` 暴露引擎归档(经由
23
28
  `findRuntimeLibrary`,因此 `.a`/`.lib` 都可用),并通过 `linkerFlags()`
24
- 暴露操作系统框架。`src/extensions/media/index.ts` 对 `media.a` 做同样的暴露,
25
- 并把注册桥(`runtime/ext_media/media_bridge.c`)作为普通 runtime 源编译。
29
+ 暴露操作系统框架。`src/extensions/media/index.ts` 对 `media.a`/`media.lib`
30
+ 做同样的暴露,并把注册桥(`runtime/ext_media/media_bridge.c`)作为普通
31
+ runtime 源编译。
26
32
  - `scripts/build-gui.ts` 使用与驱动**相同**的 clang
27
33
  (`src/driver/toolchain-provider.ts`);Windows 上就是 Visual Studio 自带的、
28
34
  面向 MSVC 的 LLVM,并配套使用其同目录下的 `clang++`/`llvm-ar` 来配置 CMake、
29
35
  编译引擎和合并归档。脚本不提供 `gcc`/`g++` 回退,Windows 上也始终使用
30
36
  `llvm-ar`,因此归档不会混入其他目标文件格式或 C++ 运行时。Visual Studio
31
37
  工具链按绝对路径查找,无需开发者命令提示符。Windows 上 SDL_GPU 会选择 Vulkan
32
- 后端,不需要 DXIL/`dxc` 工具链。`scripts/build-media.ts` 对 FFmpeg 与播放器
33
- 使用同一套已解析的工具链。
34
- - CI 在组装发布归档之前构建 `gui.a` 与 `media.a`,因此它们会随
35
- `runtime/lib/<slug>/` 一起发布(发布 tarball 会复制整个 `runtime/` 树)。
38
+ 后端,不需要 DXIL/`dxc` 工具链。
39
+ - `scripts/build-media.ts` 使用同一套已解析的工具链。Windows 上它走 FFmpeg
40
+ 自带的 MSVC 模式:`configure --toolchain=msvc --cc=clang-cl` 把静态 FFmpeg
41
+ 编译为使用静态 MSVC CRT 的 COFF 对象,`clang++` 编译播放器,`llvm-ar`
42
+ 把 COFF 归档合并成 `media.lib`。编译器链完全来自 Visual Studio
43
+ (clang-cl、`cl.exe`、`lib.exe`、`llvm-ar`)。FFmpeg 的
44
+ configure 是 POSIX shell 脚本、Makefile 是 GNU make 格式,因此仍需要这两个
45
+ 构建驱动:shell 来自 Git for Windows 自带的 bash(克隆 SDL3 本来就需要
46
+ Git),make 是原生 GNU make(如 Chocolatey 的 `make`,或用 `xbintsc_MAKE`
47
+ 指定)。脚本会把 configure 写出的源码路径改写成盘符路径,并跳过依赖提取,
48
+ 因为原生 make 无法原样传递 MSVC `/showIncludes` 的 awk 管道。
49
+ `cl.exe`/`lib.exe` 只被 configure 的工具链探测使用,由脚本从 Visual Studio
50
+ 安装目录解析,不需要开发者命令提示符。`xbintsc_SHELL` 与 `xbintsc_MAKE`
51
+ 可覆盖自动发现的 shell/make。头文件与库由脚本复制到
52
+ `vendor/ffmpeg-build-msvc/dist`,而不是执行 `make install`。
53
+ - CI 在组装发布归档之前构建 `gui.a`/`gui.lib` 与 `media.a`/`media.lib`,因此它们
54
+ 会随 `runtime/lib/<slug>/` 一起发布(发布 tarball 会复制整个 `runtime/` 树)。
36
55
  归档在 Linux(Xvfb 下,使用 lavapipe 软件 Vulkan 驱动)与 macOS 上构建并运行
37
- 示例;Windows 为试验性,因为托管 runner 没有 GPU/Vulkan 驱动,且 media 归档
38
- 目前仅支持 POSIX。
56
+ 示例;Windows x64 也会构建两个归档并链接一个 `gui,media` 程序,因此 MSVC
57
+ 构建在 CI 中得到验证,只是*运行*示例仍为试验性(托管 runner 没有 GPU/Vulkan
58
+ 驱动)。Windows arm64 仍跳过两个归档(FFmpeg 的 MSVC arm64 构建尚未验证)。
59
+ - Windows CI 通过 `.github/actions/vs-toolchain` →
60
+ `scripts/setup-vs-toolchain.ps1` 使用与本地构建相同的 Visual Studio
61
+ `vcvarsall` 环境和自带的 LLVM(不再单独安装 Chocolatey LLVM)。媒体构建时该
62
+ action 还会通过 Chocolatey 安装 GNU make 并把 `xbintsc_MAKE` 指向它;FFmpeg
63
+ 源码与已安装的 `vendor/ffmpeg-build-msvc/dist` 前缀按脚本哈希缓存。
64
+ configure/make 构建树本身不缓存(其中记录了另一台机器的绝对路径与编译选项)。
39
65
  - 现有的缓存指纹已经会对 `nativeObjects()` 的内容与 `runtimeSources()` 的内容
40
66
  做哈希,因此重建任一归档都会自动使缓存二进制失效。
41
67
  - CMake 构建树位于其源码**旁边**(`vendor/sdl-build`、`vendor/freetype-build`、
@@ -57,6 +83,26 @@ npm run media # 可选:构建 media.a(首次会获取并构建 FFmpeg
57
83
  xbintsc run examples/gui/hello.ts --ext gui
58
84
  ```
59
85
 
86
+ Windows 上同样的命令在普通 PowerShell 中即可产出 `gui.lib` 与 `media.lib`,
87
+ 不需要开发者命令提示符。Visual Studio 安装提供面向 MSVC 的 `clang++`、
88
+ `clang-cl`、`cl.exe` 与 `lib.exe`;`npm run media` 还需要 POSIX shell 与
89
+ GNU make 来运行 FFmpeg 的 `configure`:shell 来自 Git for Windows(克隆
90
+ SDL3 本来就需要 Git),GNU make 使用原生二进制——可 `choco install make`,
91
+ 或用 `xbintsc_MAKE` 指定。脚本会指出缺失的工具,并支持
92
+ `xbintsc_SHELL` / `xbintsc_MAKE` 覆盖。
93
+
94
+ 如果需要显式选择这套工具链(例如在全新终端中,或想与 CI 使用同一个编译器),
95
+ 运行:
96
+
97
+ ```powershell
98
+ pwsh -File scripts/setup-vs-toolchain.ps1
99
+ ```
100
+
101
+ 它会导入 `vcvarsall`(MSVC、Windows SDK、MSBuild),并把 `xbintsc_CLANG` 指向
102
+ 该 Visual Studio 安装自带的 LLVM。GitHub Actions 通过
103
+ `.github/actions/vs-toolchain` 调用同一个脚本,因此 CI 不再单独安装
104
+ Chocolatey/独立 LLVM,CI、本地构建与预编译归档共用同一条编译链。
105
+
60
106
  设置 `XT_GUI_AUTOCLOSE_MS=<n>` 可在 `n` 毫秒后关闭所有窗口,e2e 测试
61
107
  (`tests/e2e/gui-*.test.ts`)用它来无头运行。
62
108
 
@@ -72,11 +118,13 @@ xbintsc run examples/gui/hello.ts --ext gui
72
118
 
73
119
  这些测试套件在 Windows 上默认跳过(归档可以在本机通过 Vulkan 运行,但 CI
74
120
  runner 没有可用的 GPU 驱动)。如果本机有 `gui.lib` 与可用的 GPU,可用
75
- `xbintsc_GUI_TESTS=1` 选择启用:
121
+ `xbintsc_GUI_TESTS=1` 选择启用;如果还运行过 `npm run media`,媒体套件也会在
122
+ Windows 上走真实的解码路径:
76
123
 
77
124
  ```bat
78
125
  set xbintsc_GUI_TESTS=1
79
126
  npx vitest run tests/e2e/gui-layout.test.ts tests/e2e/gui-example.test.ts
127
+ npx vitest run tests/e2e/gui-media.test.ts
80
128
  ```
81
129
 
82
130
  在无头 Linux 机器上,安装 SDL3 构建头文件,并在 Xvfb 与软件 Vulkan 驱动下
@@ -90,8 +138,9 @@ xvfb-run -a --server-args="-screen 0 1280x720x24" \
90
138
  npx tsx src/cli/main.ts run examples/gui/hello.ts --ext gui
91
139
  ```
92
140
 
93
- 媒体 e2e 套件(`tests/e2e/gui-media.test.ts`)只有在 `gui.a` 与 `media.a` 都
94
- 存在时才会运行;`tests/e2e/gui-media-disabled.test.ts` 覆盖仅 `gui.a` 的构建。
141
+ 媒体 e2e 套件(`tests/e2e/gui-media.test.ts`)只有在 `gui.a`/`gui.lib` 与
142
+ `media.a`/`media.lib` 都存在时才会运行;`tests/e2e/gui-media-disabled.test.ts`
143
+ 覆盖仅 GUI 归档的构建。
95
144
 
96
145
  包清单集中在 `scripts/install-gui-deps.sh`(`apt-get install -y clang cmake
97
146
  libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev
@@ -19,9 +19,14 @@ CSS 盒中。
19
19
 
20
20
  ```ts
21
21
  const canvas: any = document.getElementById("c");
22
- const ctx = canvas.getContext("2d"); // 其他上下文类型返回 null
22
+ const ctx = canvas.getContext("2d"); // 或 "webgl" 取得 GPU 上下文
23
23
  ```
24
24
 
25
+ 一个 canvas 只有一种上下文。`getContext("webgl")` 或 `getContext("webgl2")`
26
+ 返回 WebGL 上下文(见 [WebGL](./webgl.md));一旦 canvas 有了 2D 上下文,
27
+ 再申请任一 WebGL 类型都会返回 `null`,反之亦然。从未申请过上下文的 canvas
28
+ 保持透明。
29
+
25
30
  `getContext("2d")` 返回一个上下文句柄,其方法与访问器位于共享原型上。该句柄会缓存在
26
31
  元素上,因此每次都返回**同一个**对象,绘制状态(变换、样式、路径)按 canvas 而非按调用
27
32
  保存。`ctx.canvas` 是所属元素的句柄。
@@ -81,7 +86,9 @@ Canvas 像素**不参与垃圾回收**:canvas 由窗口拥有、以 DOM 节点
81
86
  而非生成轮廓。
82
87
 
83
88
  图像:`drawImage(source, …)` 支持 3 参数(`dx, dy`)、5 参数(`dx, dy, dw, dh`)与
84
- 9 参数(`dx, dy, dw, dh, sx, sy, sw, sh`)形式。`source` 可以是 `<img>` 元素(经图像
89
+ 9 参数(本引擎为**目标优先**:`dx, dy, dw, dh, sx, sy, sw, sh`)。完整的仿射变换
90
+ (旋转/斜切/缩放)会被应用:目标矩形变为平行四边形,每个设备像素反查到源矩形
91
+ (最近邻采样)。`source` 可以是 `<img>` 元素(经图像
85
92
  模块解码)或另一个 `<canvas>` 元素(取其当前位图)。采样为最近邻,因此把小图大幅放大
86
93
  会有块状感——适合图标与像素画,不适合照片管线。
87
94
 
@@ -12,12 +12,14 @@ doctype 跳过,实体解码(命名 + 十进制/十六进制),空元素
12
12
  (`<style>`/`<script>`),以及常见的隐式闭合规则(`li`、`dt`/`dd`、`option`、
13
13
  `p`、标题、表格单元格/行)。
14
14
 
15
- **CSS 解析器**(`runtime/ext_gui/css.{h,cpp}`):注释与 at-rule 暂时跳过,
16
- 支持多选择器的规则以及声明。选择器:类型、`.class`、`#id`、属性
15
+ **CSS 解析器**(`runtime/ext_gui/css.{h,cpp}`):会剥离注释;`@media` 块递归解析
16
+ (嵌套查询用 `and` 合并,逗号列表会分配到内层查询),其他 at-rule 跳过。规则支持
17
+ 多选择器与声明。选择器:类型、`.class`、`#id`、属性
17
18
  (`=`、`~=`、`|=`、`^=`、`$=`、`*=`)、四种组合器(后代、子、相邻兄弟与
18
- 通用兄弟)以及伪类 `:first-child`、`:last-child`、`:only-child`、`:empty`、
19
- `:root`、`:not(...)`、`:nth-child(an+b)`、`:disabled`、`:checked`,再加上
20
- 有状态的 `:hover` 与 `:focus`(见[输入](./input.md))。值:长度
19
+ 通用兄弟)、伪类 `:first-child`、`:last-child`、`:only-child`、`:empty`、
20
+ `:root`、`:not(...)`、`:nth-child(an+b)`、`:disabled`、`:checked`、有状态的
21
+ `:hover` 与 `:focus`(见[输入](./input.md)),以及伪元素
22
+ `::before`/`::after`(也接受旧式 `:before`/`:after`)。值:长度
21
23
  (`px`、`%`、`em`、`rem`、`vw`、`vh`、`pt`、`pc`、`in`、`cm`、`mm`、`q`)、
22
24
  颜色(十六进制、`rgb()`/`rgba()`、一个命名子集)、数字、关键字与简写
23
25
  (`margin`/`padding`/`border`/`flex`)。`transform`
@@ -25,14 +27,25 @@ doctype 跳过,实体解码(命名 + 十进制/十六进制),空元素
25
27
  `scale`/`scale3d`/`scaleX`/`scaleY`、`rotate`/`rotateZ`、`matrix`;`3d`
26
28
  拼写的 `z` 参数会被丢弃)与 `transform-origin`
27
29
  会被解析进计算样式:前者是操作列表,后者是两个(未解析的)原点长度;不支持的
28
- 函数会让整条声明失效(见[布局](./layout.md#变换m15))。
30
+ 函数会让整条声明失效(见[布局](./layout.md#变换m15))。M19 增加了
31
+ `background-image` 层列表(线性/径向)、`clip-path`
32
+ (`inset`/`circle`/`ellipse`/`polygon`)、`filter`/`backdrop-filter` 函数列表、
33
+ `text-shadow` 与 `content`。
29
34
 
30
35
  **层叠与计算样式**(`runtime/ext_gui/style.{h,cpp}`):一份小的内置 UA
31
36
  样式表,作者规则按 `(!important, 特异性, 源码顺序)` 排序,然后是内联
32
37
  `style=""`(特异性最高,但非 `!important` 的内联会输给 `!important`),
33
- 再加上文本属性的 CSS 继承。相对长度保持未解析状态直到布局阶段,`font-size`
38
+ 再加上文本属性的 CSS 继承。每次重算样式都会按当前视口过滤 `@media` 规则,
39
+ 因此调整窗口大小会切换它们。相对长度保持未解析状态直到布局阶段,`font-size`
34
40
  除外(相对*父级*字号解析)以及 `line-height`。
35
41
 
42
+ `::before`/`::after` 的样式在原始元素之后计算:选择器最后一个复合选择器必须写
43
+ 伪元素,其余部分对原始元素匹配(因此 `.card.info::before` 可用)。伪样式继承
44
+ 原始元素的计算样式,`content` 会被解析(字符串、转义、`attr()`、引号),
45
+ 生成的合成节点存放在每次重算样式时重建的 arena 中。布局把它的盒子插在真实子元素
46
+ 之前/之后;遍历、查询、`innerHTML` 与 `elementIndex()` 永远看不到它,命中测试
47
+ 则指向原始元素。
48
+
36
49
  ## 交互式 DOM(M8)
37
50
 
38
51
  `win.document` 返回文档句柄;元素句柄具有稳定标识,并提供可读写的属性、
@@ -6,6 +6,20 @@
6
6
 
7
7
  ## 已知问题
8
8
 
9
+ - **WebGL 1.0 与 2.0 运行在 GPU 上,但只实现了各自的子集。**
10
+ `canvas.getContext("webgl")` / `"webgl2"` 返回真正的 GPU 上下文(见
11
+ [WebGL](./webgl.md)):GLSL ES 着色器由内置 glslang 翻译为 SPIR-V——Vulkan
12
+ 后端直接消费,Metal 上再由内置 SPIRV-Cross 交叉编译为 MSL——绘图缓冲
13
+ 是一张离屏颜色纹理,页面直接合成而无须读回。WebGL 2 增加了 VAO、实例化、
14
+ 整数属性、采样器对象、`texStorage2D` 与缓冲拷贝。Uniform 块、transform
15
+ feedback、立方体贴图、3D 纹理、浮点/深度纹理、压缩纹理、多渲染目标、
16
+ `blitFramebuffer`、MSAA 与模板操作尚未实现;`clear` 会忽略 scissor 矩形。
17
+ 在两种格式都不接受的 SDL_GPU 后端(Direct3D 12,需要 DXIL)上两种上下文都为
18
+ `null`。`.js` 资源加载器现在只修补 three.js 的着色器循环展开;
19
+ `WebGLRenderer` 直接运行在真实后端上,不再有 Canvas2D 回退。阴影贴图
20
+ (深度纹理)、立方体贴图/环境贴图与 HDR 渲染目标仍未支持。
21
+
22
+
9
23
  - **自动关闭时的偶发崩溃。** 设置 `XT_GUI_AUTOCLOSE_MS` 结束运行时,约五次中有两次会以原生
10
24
  访问违例(`0xC0000005`)退出,其余运行与正常退出无异。该问题只在**动画帧循环运行中**复现
11
25
  (静态文档可以正常关闭),且**不是示例游戏自身**的代码:没有任何异常信息,崩溃多发生在
@@ -23,6 +37,18 @@
23
37
  `tests/e2e/gui-example-browser.test.ts` 中。
24
38
  - **`display: none -> flex` 的重排。** 通过类名切换让隐藏元素显示在 flex 容器上时,也曾观察
25
39
  到同样的崩溃;`examples/gui/pelican-bike` 改用 `opacity` 显示游戏结束遮罩。
40
+ - **CSS 覆盖范围是有意为之的子集。** 已实现 Grid、`clamp()`/`min()`/`max()`/`env()`、
41
+ `var()` 自定义属性、`inset` 简写、`box-sizing`、`visibility`/`pointer-events`、
42
+ `@media` 查询、生成内容(`::before`/`::after`)、线性/径向多层背景、
43
+ `text-shadow`、`clip-path`(`inset`/`circle`/`ellipse`/`polygon`)以及 `filter`
44
+ 的颜色函数。仍有限制:`mix-blend-mode`、`background-clip`、
45
+ `background-position`/`size`/`repeat`、重复渐变与 `backdrop-filter` 合成都未实现
46
+ (`backdrop-filter` 会解析并参与层叠,但采样背景需要离屏图层,因此不绘制);
47
+ `filter: blur()` 是按图形做九次偏移的近似,而不是真正的组模糊,重叠的子元素会加深;
48
+ `drop-shadow` 用盒子轮廓近似;最多只交叉两层嵌套 `clip-path`(更深时保留外侧两层);
49
+ 图像/画布除图像着色器能携带的亮度与透明度染色外不做颜色滤镜。Canvas 纹理使用
50
+ 最近邻采样。背景渐变仍是纯色带(线性 18 条、径向 32 个同心椭圆),柔和渐变可能
51
+ 出现轻微条带。
26
52
  - **SVG 是 NanoSVG 的子集。** SVG *文件*(`<img src="logo.svg">`)与内联
27
53
  `<svg>` 子树共用 vendored 的 NanoSVG 解析/光栅化器(`runtime/ext_gui/svg.cpp`、
28
54
  `inline_svg.cpp`),它会渲染 `path`/`rect`/`circle`/`ellipse`/`line`/
@@ -48,20 +74,27 @@
48
74
  相同的、面向 MSVC 的 clang(`PATH` 上没有更新版本时就是 Visual Studio 自带的
49
75
  LLVM)。
50
76
  - Windows:`scripts/build-gui.ts` 会生成 MSVC 兼容的 `gui.lib`
51
- (COFF 对象 + `ar -M`/`llvm-ar`),但尚未在 CI 中验证,因此 Windows 步骤
52
- 为试验性(job 保持绿色),`package` 会跳过它;在开发者机器上构建并运行
53
- `examples/gui/pelican-svg` 与 `examples/gui/pelican-bike` 是可以的。那里
54
- SDL_GPU 会选择 **Vulkan** 后端(`win.driver()` 返回 `"vulkan"`),因此归档
55
- 不需要 DXIL/`dxc` 工具链;托管 Windows runner 没有 GPU/Vulkan 驱动,这才是
56
- CI 运行仍为试验性的原因。
57
- - **Windows 上的媒体:** `media` 扩展目前仅支持 POSIX。GUI 引擎本身可在
58
- Windows 上构建,但没有该扩展时 `<video>`/`<audio>` 为空操作(打开失败并触发
59
- `error`),`--ext media` 会给出可操作的错误而不是继续链接。启用它需要
60
- MSVC 兼容的 FFmpeg 构建,推迟到 Windows GUI 路径本身验证之后。
61
- `<video controls>` 同样推迟——预期模式是 TS + CSS 叠层,如
62
- `examples/gui/media.ts`。
77
+ (COFF 对象 + `ar -M`/`llvm-ar`)。Windows x64 的 CI job 使用 Visual Studio
78
+ 工具链(`.github/actions/vs-toolchain` 导入 `vcvarsall` 并采用 VS 自带的
79
+ LLVM)构建它、链接一个 `gui,media` 程序,并随 x64 发布归档一起发布。示例在
80
+ 托管 runner 上的*运行*仍为试验性,因为那里没有 GPU/Vulkan 驱动(SDL_GPU 在
81
+ Windows 上选择 **Vulkan** 后端,因此不需要 DXIL/`dxc` 工具链)。Windows
82
+ arm64 仍跳过两个归档。在开发者机器上构建并运行
83
+ `examples/gui/pelican-svg` 与 `examples/gui/pelican-bike` 是可以的。
84
+ - **Windows:x64 在 CI 中构建,arm64 与运行时验证仍为试验性。**
85
+ `scripts/build-media.ts` 用 FFmpeg 的 MSVC 工具链
86
+ (`--toolchain=msvc --cc=clang-cl`)生成 `media.lib`,其 COFF 对象与静态 CRT
87
+ 和 `gui.lib` 一致,`--ext media` 在 Windows 上可以正常链接并播放。构建它需要
88
+ POSIX shell 运行 FFmpeg 的 `configure` 以及 GNU make;shell 来自 Git for
89
+ Windows(克隆 SDL3 本来就需要 Git),make 是原生 GNU make(Chocolatey 的
90
+ `make`,或 `xbintsc_MAKE`)。CI 会显式安装 make,在
91
+ Windows x64 上使用与本地构建相同的 Visual Studio `vcvarsall` + 自带 LLVM
92
+ 构建 `gui.lib` 与 `media.lib`,链接 `gui,media` 程序,并把两个归档放进
93
+ Windows x64 发布包;示例的*运行*仍因托管 runner 没有 GPU/Vulkan 驱动而保持
94
+ 试验性。Windows arm64 仍跳过两个归档;`<video controls>` 同样推迟——预期模式
95
+ 是 TS + CSS 叠层,如 `examples/gui/media.ts`。
63
96
  - **D3D12 着色器:** SPIR-V(Vulkan)与 DXIL(Direct3D 12)二进制块均已构建并
64
97
  内嵌,非 Metal 路径不再跳过几何绘制。但在 **SDL 3.2.10** 上 DXIL 仍不可用:
65
98
  其 D3D12 后端会拒绝任何着色器中声明了 uniform buffer 的图形管线,而引擎正是
66
99
  用这种方式传视口。Windows 实际会选择 Vulkan,因此不受影响;若将来强制走
67
- D3D12,需在 SDL 升级后重新确认。
100
+ D3D12,需在 SDL 升级后重新确认。
@@ -28,6 +28,20 @@
28
28
  flex 项的外边距参与其外框尺寸,因此
29
29
  负的 `margin-top` 会把该项上移,而不是被忽略。项之间的纯空白文本
30
30
  (源码缩进)不会成为 flex 项。
31
+ - **Grid** —— `display: grid`,支持 `grid-template-columns` /
32
+ `grid-template-rows`(固定长度、`auto`、`<n>fr`、`minmax(...)`、
33
+ `repeat(...)`)、`gap`/`row-gap`/`column-gap`、按行自动放置、简单的
34
+ `grid-column`/`grid-row` 线定位,以及 `align/justify-items` 与
35
+ `align/justify-self`(含 `place-items`/`place-self`)。隐式行/列由项目撑开;
36
+ 单单元格网格配合 `place-items: center` 可把卡片居中到整个覆盖层。项目测量是
37
+ 两遍布局(先固有尺寸、再最终放置),因此两遍之间会清空文本片段。
38
+ - **CSS 值函数与自定义属性** —— `clamp(min, value, max)`、`min(...)` 与
39
+ `max(...)` 在计算样式中保留参数,布局时结合元素字号与视口(`vw`/`vh`)求值;
40
+ 桌面窗口中 `env(safe-area-inset-*)` 解析为 0。`var(--name[, fallback])` 在
41
+ 层叠期间从继承的自定义属性替换。`inset` 是四值 `top/right/bottom/left`
42
+ 简写;`box-sizing: border-box` 会从显式宽高里扣除 padding 与边框;
43
+ `visibility: hidden` 跳过绘制与命中测试;`pointer-events: none` 使盒子不接收输入
44
+ (后代可用 `auto` 重新启用)。
31
45
  - **定位** —— `position: relative` 会按 `top`/`right`/`bottom`/`left` 偏移该盒子
32
46
  及其子树,但不改变它在流中占用的空间;`position: absolute`(以及针对视口解析
33
47
  的 `fixed`)使其脱离文档流,并相对最近的已定位祖先的 padding box 定位(没有
@@ -57,17 +57,21 @@ opacity、`display`——与任何其他元素一样。盒子内部的艺术内
57
57
 
58
58
  媒体播放横跨两个扩展,因此只做界面的 GUI 程序不必为用不到的解码器付出体积:
59
59
 
60
- - **`gui`**(`gui.a`)负责 `<video>`/`<audio>` 元素、DOM API、渲染器集成与 SDL
61
- 音频 sink,但**不含 FFmpeg**。`runtime/ext_gui/media.{h,cpp}` 声明播放器接口,
62
- 并通过媒体后端在启动时安装的函数表分发(`runtime/ext_gui/media_api.h`)。
63
- - **`media`**(`media.a`、`runtime/ext_media/`)是可选的解码后端:
64
- `runtime/ext_media/media.cpp` 封装静态 vendored 的 **FFmpeg** 构建,
65
- `runtime/ext_media/media_bridge.c` 把它注册进引擎。用 `--ext media`(或
66
- `--ext gui,media`)启用。`media` 依赖 `gui`;注册表会拒绝错误的组合。
60
+ - **`gui`**(`gui.a`/`gui.lib`)负责 `<video>`/`<audio>` 元素、DOM API、渲染器
61
+ 集成与 SDL 音频 sink,但**不含 FFmpeg**。`runtime/ext_gui/media.{h,cpp}`
62
+ 声明播放器接口,并通过媒体后端在启动时安装的函数表分发
63
+ (`runtime/ext_gui/media_api.h`)。
64
+ - **`media`**(`media.a`,Windows 上 MSVC ABI 则为 `media.lib`;
65
+ `runtime/ext_media/`)是可选的解码后端:`runtime/ext_media/media.cpp`
66
+ 封装静态 vendored 的 **FFmpeg** 构建,`runtime/ext_media/media_bridge.c`
67
+ 把它注册进引擎。用 `--ext media`(或 `--ext gui,media`)启用。`media`
68
+ 依赖 `gui`;注册表会拒绝错误的组合。
67
69
 
68
70
  没有 `media` 扩展时,元素仍然存在、DOM API 仍可调用,但打开源会失败并触发
69
- `error`。Windows 目前也是如此:该归档仅支持 POSIX。两条路径都没有 WebView,也
70
- 没有平台媒体框架。
71
+ `error`。任何没有构建该归档的宿主(先运行 `npm run media`)都是如此;
72
+ Windows 已不再特殊:`media.lib` 是用 clang-cl 为 MSVC ABI 编译的 FFmpeg,
73
+ 因此可以和 `gui.lib` 一起链接并正常播放。两条路径都没有 WebView,也没有平台
74
+ 媒体框架。
71
75
 
72
76
  - **解码。** `avformat_open_input` 打开 `src`(是路径——接受 `file://`,但与
73
77
  图像不同,媒体路径*不做*百分号解码),为每种媒体选取最佳流,软件解码器
@@ -83,8 +87,8 @@ opacity、`display`——与任何其他元素一样。盒子内部的艺术内
83
87
  `xtgui::AudioSink`。GUI 在 `gui_media.cpp` 中用 push 模式(`NULL` 回调)的
84
88
  `SDL_OpenAudioDeviceStream` 实现该 sink,在前方缓冲约 0.25 秒,格式为
85
89
  48 kHz 立体声 `SDL_AUDIO_F32`。`volume` 映射到 `SDL_SetAudioStreamGain`;
86
- 音频是尽力而为,无设备时(无头 CI)跳过。把 sink 留在 `gui.a` 中意味着
87
- `media.a` 只依赖 FFmpeg。
90
+ 音频是尽力而为,无设备时(无头 CI)跳过。把 sink 留在 GUI 归档中意味着
91
+ `media.a`/`media.lib` 只依赖 FFmpeg。
88
92
  - **线程。** 引擎是单线程且非线程感知,因此所有解码都在主线程的
89
93
  `xt_gui_media_tick` 内完成——没有解码线程,也没有跨线程 GC 暴露。
90
94
  - **DOM API。** 元素句柄直接暴露媒体接口(见