xbintsc 0.3.18 → 0.3.35

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 (194) hide show
  1. package/README.md +33 -0
  2. package/dist/src/cli/main.js +124 -30
  3. package/dist/src/cli/main.js.map +1 -1
  4. package/dist/src/codegen/generator/calls/access.js +8 -1
  5. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  6. package/dist/src/codegen/generator/state.js +20 -0
  7. package/dist/src/codegen/generator/state.js.map +1 -1
  8. package/dist/src/codegen/generator/tables.d.ts +6 -0
  9. package/dist/src/codegen/generator/tables.js +38 -0
  10. package/dist/src/codegen/generator/tables.js.map +1 -1
  11. package/dist/src/driver/bundler/commonjs.d.ts +52 -0
  12. package/dist/src/driver/bundler/commonjs.js +493 -0
  13. package/dist/src/driver/bundler/commonjs.js.map +1 -0
  14. package/dist/src/driver/bundler/graph.d.ts +2 -1
  15. package/dist/src/driver/bundler/graph.js +32 -3
  16. package/dist/src/driver/bundler/graph.js.map +1 -1
  17. package/dist/src/driver/bundler/merge.d.ts +2 -1
  18. package/dist/src/driver/bundler/merge.js +16 -2
  19. package/dist/src/driver/bundler/merge.js.map +1 -1
  20. package/dist/src/driver/bundler/types.d.ts +8 -0
  21. package/dist/src/driver/compiler.d.ts +8 -1
  22. package/dist/src/driver/compiler.js +75 -7
  23. package/dist/src/driver/compiler.js.map +1 -1
  24. package/dist/src/driver/config.d.ts +53 -0
  25. package/dist/src/driver/config.js +141 -0
  26. package/dist/src/driver/config.js.map +1 -0
  27. package/dist/src/driver/icon.d.ts +62 -0
  28. package/dist/src/driver/icon.js +151 -0
  29. package/dist/src/driver/icon.js.map +1 -0
  30. package/dist/src/driver/index.d.ts +4 -0
  31. package/dist/src/driver/index.js +4 -0
  32. package/dist/src/driver/index.js.map +1 -1
  33. package/dist/src/driver/mac-bundle.d.ts +41 -0
  34. package/dist/src/driver/mac-bundle.js +123 -0
  35. package/dist/src/driver/mac-bundle.js.map +1 -0
  36. package/dist/src/driver/win-icon.d.ts +27 -0
  37. package/dist/src/driver/win-icon.js +80 -0
  38. package/dist/src/driver/win-icon.js.map +1 -0
  39. package/dist/src/extensions/gui/html.d.ts +25 -0
  40. package/dist/src/extensions/gui/html.js +203 -0
  41. package/dist/src/extensions/gui/html.js.map +1 -0
  42. package/dist/src/extensions/gui/index.js +11 -0
  43. package/dist/src/extensions/gui/index.js.map +1 -1
  44. package/dist/src/extensions/registry.d.ts +29 -0
  45. package/dist/src/extensions/registry.js +14 -0
  46. package/dist/src/extensions/registry.js.map +1 -1
  47. package/dist/src/index.d.ts +1 -1
  48. package/dist/src/index.js.map +1 -1
  49. package/dist/src/lexer/scanner/identifiers.js +4 -12
  50. package/dist/src/lexer/scanner/identifiers.js.map +1 -1
  51. package/dist/src/parser/statements.js +17 -4
  52. package/dist/src/parser/statements.js.map +1 -1
  53. package/dist/tests/cli/main.test.js +46 -1
  54. package/dist/tests/cli/main.test.js.map +1 -1
  55. package/dist/tests/driver/bundler-resolve.test.d.ts +1 -0
  56. package/dist/tests/driver/bundler-resolve.test.js +230 -0
  57. package/dist/tests/driver/bundler-resolve.test.js.map +1 -0
  58. package/dist/tests/driver/config.test.d.ts +1 -0
  59. package/dist/tests/driver/config.test.js +124 -0
  60. package/dist/tests/driver/config.test.js.map +1 -0
  61. package/dist/tests/driver/icon.test.d.ts +1 -0
  62. package/dist/tests/driver/icon.test.js +421 -0
  63. package/dist/tests/driver/icon.test.js.map +1 -0
  64. package/dist/tests/driver/modules.test.js +177 -0
  65. package/dist/tests/driver/modules.test.js.map +1 -1
  66. package/dist/tests/e2e/fetch.test.d.ts +12 -0
  67. package/dist/tests/e2e/fetch.test.js +272 -0
  68. package/dist/tests/e2e/fetch.test.js.map +1 -0
  69. package/dist/tests/e2e/gui-dom.test.d.ts +5 -0
  70. package/dist/tests/e2e/gui-dom.test.js +102 -0
  71. package/dist/tests/e2e/gui-dom.test.js.map +1 -0
  72. package/dist/tests/e2e/gui-events.test.d.ts +5 -0
  73. package/dist/tests/e2e/gui-events.test.js +60 -0
  74. package/dist/tests/e2e/gui-events.test.js.map +1 -0
  75. package/dist/tests/e2e/gui-helpers.d.ts +31 -0
  76. package/dist/tests/e2e/gui-helpers.js +74 -0
  77. package/dist/tests/e2e/gui-helpers.js.map +1 -0
  78. package/dist/tests/e2e/gui-layout.test.d.ts +4 -0
  79. package/dist/tests/e2e/gui-layout.test.js +88 -0
  80. package/dist/tests/e2e/gui-layout.test.js.map +1 -0
  81. package/dist/tests/e2e/gui-lifecycle.test.d.ts +5 -0
  82. package/dist/tests/e2e/gui-lifecycle.test.js +58 -0
  83. package/dist/tests/e2e/gui-lifecycle.test.js.map +1 -0
  84. package/dist/tests/e2e/gui-paint.test.d.ts +5 -0
  85. package/dist/tests/e2e/gui-paint.test.js +111 -0
  86. package/dist/tests/e2e/gui-paint.test.js.map +1 -0
  87. package/dist/tests/e2e/gui-script.test.d.ts +5 -0
  88. package/dist/tests/e2e/gui-script.test.js +78 -0
  89. package/dist/tests/e2e/gui-script.test.js.map +1 -0
  90. package/dist/tests/e2e/gui-style.test.d.ts +5 -0
  91. package/dist/tests/e2e/gui-style.test.js +175 -0
  92. package/dist/tests/e2e/gui-style.test.js.map +1 -0
  93. package/dist/tests/e2e/icon.test.d.ts +7 -0
  94. package/dist/tests/e2e/icon.test.js +80 -0
  95. package/dist/tests/e2e/icon.test.js.map +1 -0
  96. package/dist/tests/e2e/npm-modules.test.d.ts +4 -1
  97. package/dist/tests/e2e/npm-modules.test.js +47 -1
  98. package/dist/tests/e2e/npm-modules.test.js.map +1 -1
  99. package/dist/tests/e2e/runtime-coverage-typed-array.test.d.ts +9 -0
  100. package/dist/tests/e2e/runtime-coverage-typed-array.test.js +140 -0
  101. package/dist/tests/e2e/runtime-coverage-typed-array.test.js.map +1 -0
  102. package/dist/tests/extensions/gui-index.test.d.ts +1 -0
  103. package/dist/tests/extensions/gui-index.test.js +49 -0
  104. package/dist/tests/extensions/gui-index.test.js.map +1 -0
  105. package/dist/tests/extensions/gui.test.d.ts +1 -0
  106. package/dist/tests/extensions/gui.test.js +177 -0
  107. package/dist/tests/extensions/gui.test.js.map +1 -0
  108. package/dist/tests/extensions/registry.test.js +36 -0
  109. package/dist/tests/extensions/registry.test.js.map +1 -1
  110. package/dist/tests/parser/statements.test.js +11 -0
  111. package/dist/tests/parser/statements.test.js.map +1 -1
  112. package/dist/tests/public-api.test.d.ts +1 -0
  113. package/dist/tests/public-api.test.js +31 -0
  114. package/dist/tests/public-api.test.js.map +1 -0
  115. package/package.json +1 -1
  116. package/runtime/ext_gui/css.cpp +4 -517
  117. package/runtime/ext_gui/css_internal.h +27 -0
  118. package/runtime/ext_gui/css_match.cpp +195 -0
  119. package/runtime/ext_gui/css_selector.cpp +207 -0
  120. package/runtime/ext_gui/css_sheet.cpp +129 -0
  121. package/runtime/ext_gui/document.cpp +90 -0
  122. package/runtime/ext_gui/document.h +23 -0
  123. package/runtime/ext_gui/dom.cpp +43 -403
  124. package/runtime/ext_gui/dom.h +7 -0
  125. package/runtime/ext_gui/dom_api.cpp +164 -0
  126. package/runtime/ext_gui/dom_api.h +12 -0
  127. package/runtime/ext_gui/dom_api_document.cpp +96 -0
  128. package/runtime/ext_gui/dom_api_events.cpp +123 -0
  129. package/runtime/ext_gui/dom_api_internal.h +135 -0
  130. package/runtime/ext_gui/dom_api_node.cpp +329 -0
  131. package/runtime/ext_gui/dom_api_node_read.cpp +294 -0
  132. package/runtime/ext_gui/dom_api_proto.cpp +130 -0
  133. package/runtime/ext_gui/dom_api_style.cpp +192 -0
  134. package/runtime/ext_gui/dom_internal.h +39 -0
  135. package/runtime/ext_gui/dom_parse.cpp +348 -0
  136. package/runtime/ext_gui/dom_serialize.cpp +54 -0
  137. package/runtime/ext_gui/gui.cpp +61 -245
  138. package/runtime/ext_gui/gui_engine.h +54 -0
  139. package/runtime/ext_gui/gui_events.cpp +294 -0
  140. package/runtime/ext_gui/gui_internal.h +29 -0
  141. package/runtime/ext_gui/layout.cpp +6 -597
  142. package/runtime/ext_gui/layout_flex.cpp +200 -0
  143. package/runtime/ext_gui/layout_flow.cpp +191 -0
  144. package/runtime/ext_gui/layout_flow_internal.h +149 -0
  145. package/runtime/ext_gui/layout_inline.cpp +181 -0
  146. package/runtime/ext_gui/layout_internal.h +20 -0
  147. package/runtime/ext_gui/renderer.cpp +15 -679
  148. package/runtime/ext_gui/renderer_image.cpp +233 -0
  149. package/runtime/ext_gui/renderer_internal.h +112 -0
  150. package/runtime/ext_gui/renderer_shaders.h +108 -0
  151. package/runtime/ext_gui/renderer_text.cpp +342 -0
  152. package/runtime/ext_gui/script.cpp +63 -0
  153. package/runtime/ext_gui/style.cpp +12 -660
  154. package/runtime/ext_gui/style_internal.h +33 -0
  155. package/runtime/ext_gui/style_print.cpp +113 -0
  156. package/runtime/ext_gui/style_ua.cpp +98 -0
  157. package/runtime/ext_gui/style_values.cpp +468 -0
  158. package/runtime/ext_gui/window.cpp +60 -0
  159. package/runtime/rt.h +6 -0
  160. package/runtime/rt_internal.h +4 -0
  161. package/runtime/xt_builtins.c +1 -0
  162. package/runtime/xt_containers/access.inc +32 -1
  163. package/runtime/xt_fetch/buffer.inc +64 -0
  164. package/runtime/xt_fetch/headers.inc +312 -0
  165. package/runtime/xt_fetch/request.inc +386 -0
  166. package/runtime/xt_fetch/response.inc +107 -0
  167. package/runtime/xt_fetch/socket.inc +72 -0
  168. package/runtime/xt_fetch/url.inc +108 -0
  169. package/runtime/xt_fetch.c +39 -0
  170. package/runtime/xt_stdlib2/set.inc +1 -1
  171. package/runtime/xt_typed_array.c +614 -0
  172. package/src/cli/main.ts +137 -29
  173. package/src/codegen/generator/calls/access.ts +9 -1
  174. package/src/codegen/generator/state.ts +20 -0
  175. package/src/codegen/generator/tables.ts +40 -0
  176. package/src/driver/bundler/commonjs.ts +553 -0
  177. package/src/driver/bundler/graph.ts +35 -2
  178. package/src/driver/bundler/merge.ts +18 -1
  179. package/src/driver/bundler/types.ts +8 -0
  180. package/src/driver/compiler.ts +85 -7
  181. package/src/driver/config.ts +173 -0
  182. package/src/driver/icon.ts +184 -0
  183. package/src/driver/index.ts +30 -0
  184. package/src/driver/mac-bundle.ts +156 -0
  185. package/src/driver/win-icon.ts +96 -0
  186. package/src/extensions/gui/html.ts +236 -0
  187. package/src/extensions/gui/index.ts +11 -0
  188. package/src/extensions/registry.ts +39 -0
  189. package/src/index.ts +1 -1
  190. package/src/lexer/scanner/identifiers.ts +4 -11
  191. package/src/parser/statements.ts +17 -4
  192. package/dist/tests/e2e/gui.test.d.ts +0 -12
  193. package/dist/tests/e2e/gui.test.js +0 -493
  194. package/dist/tests/e2e/gui.test.js.map +0 -1
@@ -0,0 +1,181 @@
1
+ /*
2
+ * xbintsc GUI engine — inline formatting context.
3
+ *
4
+ * Flattens inline subtrees into text/atomic items, breaks them into lines and
5
+ * writes the resulting visual text fragments onto the boxes (`layout_flow.cpp`
6
+ * owns the surrounding block/flow logic).
7
+ */
8
+
9
+ #include "layout_flow_internal.h"
10
+
11
+ namespace xtgui {
12
+ namespace layout_flow_detail {
13
+
14
+ void Layouter::flattenInline(LayoutBox *box, float contentWidth,
15
+ std::vector<InlineItem> &out) const {
16
+ const XtStyle &style = *box->style;
17
+ if (box->is_text) {
18
+ float height = lineHeightOf(style);
19
+ float ascent = ascentOf(style);
20
+ const std::string &text = box->text;
21
+ size_t i = 0;
22
+ while (i < text.size()) {
23
+ if (text[i] == '\n') {
24
+ InlineItem br;
25
+ br.box = box;
26
+ br.style = &style;
27
+ br.force_break = true;
28
+ out.push_back(std::move(br));
29
+ i++;
30
+ continue;
31
+ }
32
+ bool space = text[i] == ' ' || text[i] == '\t';
33
+ size_t j = i;
34
+ while (j < text.size() && text[j] != '\n' && (text[j] == ' ' || text[j] == '\t') == space) j++;
35
+ InlineItem item;
36
+ item.box = box;
37
+ item.style = &style;
38
+ item.text = text.substr(i, j - i);
39
+ item.is_space = space;
40
+ item.width = textWidth(item.text, style);
41
+ item.height = height;
42
+ item.ascent = ascent;
43
+ out.push_back(std::move(item));
44
+ i = j;
45
+ }
46
+ return;
47
+ }
48
+ if (box->display == Display::InlineBlock) {
49
+ float available = contentWidth;
50
+ float intrinsic = preferredContentWidth(box, available);
51
+ layoutBlock(box, 0, 0, available, -1, intrinsic);
52
+ InlineItem item;
53
+ item.box = box;
54
+ item.style = &style;
55
+ item.atomic = true;
56
+ item.width = box->margin_left + box->width + box->margin_right;
57
+ item.height = box->margin_top + box->height + box->margin_bottom;
58
+ item.ascent = item.height;
59
+ out.push_back(std::move(item));
60
+ return;
61
+ }
62
+ /* Inline element: flatten its subtree. */
63
+ for (const std::unique_ptr<LayoutBox> &child : box->children) {
64
+ if (child->display == Display::None) continue;
65
+ flattenInline(child.get(), contentWidth, out);
66
+ }
67
+ }
68
+
69
+ void Layouter::computeInlineGeometry(LayoutBox *box) const {
70
+ if (box->is_text) {
71
+ if (box->fragments.empty()) return;
72
+ float minx = kHuge, miny = kHuge, maxx = -kHuge, maxy = -kHuge;
73
+ for (const TextFragment &fragment : box->fragments) {
74
+ minx = std::min(minx, fragment.x);
75
+ miny = std::min(miny, fragment.y);
76
+ maxx = std::max(maxx, fragment.x + fragment.width);
77
+ maxy = std::max(maxy, fragment.y + fragment.height);
78
+ }
79
+ box->x = minx;
80
+ box->y = miny;
81
+ box->width = maxx - minx;
82
+ box->height = maxy - miny;
83
+ box->content_x = minx;
84
+ box->content_y = miny;
85
+ box->content_width = box->width;
86
+ box->content_height = box->height;
87
+ return;
88
+ }
89
+ float minx = kHuge, miny = kHuge, maxx = -kHuge, maxy = -kHuge;
90
+ bool any = false;
91
+ for (const std::unique_ptr<LayoutBox> &child : box->children) {
92
+ if (child->display == Display::None) continue;
93
+ computeInlineGeometry(child.get());
94
+ if (child->is_text && child->fragments.empty()) continue;
95
+ if (child->width <= 0 && child->height <= 0 && !child->is_text && child->children.empty())
96
+ continue;
97
+ any = true;
98
+ minx = std::min(minx, child->x);
99
+ miny = std::min(miny, child->y);
100
+ maxx = std::max(maxx, child->x + child->width);
101
+ maxy = std::max(maxy, child->y + child->height);
102
+ }
103
+ if (!any) return;
104
+ box->x = minx;
105
+ box->y = miny;
106
+ box->width = maxx - minx;
107
+ box->height = maxy - miny;
108
+ box->content_x = minx;
109
+ box->content_y = miny;
110
+ box->content_width = box->width;
111
+ box->content_height = box->height;
112
+ }
113
+
114
+ float Layouter::layoutInlineRun(LayoutBox *container, const std::vector<LayoutBox *> &run,
115
+ float contentWidth, float y) const {
116
+ std::vector<InlineItem> items;
117
+ for (LayoutBox *box : run) flattenInline(box, contentWidth, items);
118
+ if (items.empty()) return 0;
119
+
120
+ std::vector<std::vector<InlineItem *>> lines;
121
+ std::vector<InlineItem *> line;
122
+ float lineWidth = 0;
123
+ auto pushLine = [&]() {
124
+ while (!line.empty() && line.back()->is_space) {
125
+ lineWidth -= line.back()->width;
126
+ line.pop_back();
127
+ }
128
+ if (!line.empty()) lines.push_back(line);
129
+ line.clear();
130
+ lineWidth = 0;
131
+ };
132
+ for (InlineItem &item : items) {
133
+ if (item.force_break) {
134
+ pushLine();
135
+ continue;
136
+ }
137
+ if (item.is_space && line.empty()) continue; // no leading space on a line
138
+ if (lineWidth + item.width > contentWidth && !line.empty()) pushLine();
139
+ if (item.is_space && line.empty()) continue;
140
+ line.push_back(&item);
141
+ lineWidth += item.width;
142
+ }
143
+ pushLine();
144
+
145
+ const XtStyle &containerStyle = *container->style;
146
+ float cursorY = y;
147
+ for (size_t index = 0; index < lines.size(); index++) {
148
+ std::vector<InlineItem *> &current = lines[index];
149
+ float width = 0;
150
+ float ascent = 0;
151
+ float descent = 0;
152
+ for (InlineItem *item : current) {
153
+ width += item->width;
154
+ ascent = std::max(ascent, item->ascent);
155
+ descent = std::max(descent, item->height - item->ascent);
156
+ }
157
+ float height = ascent + descent;
158
+ float x = container->content_x;
159
+ if (containerStyle.text_align == TextAlign::Center) {
160
+ x += (contentWidth - width) / 2.0f;
161
+ } else if (containerStyle.text_align == TextAlign::End) {
162
+ x += contentWidth - width;
163
+ }
164
+ for (InlineItem *item : current) {
165
+ if (item->atomic) {
166
+ float dx = x + item->box->margin_left - item->box->x;
167
+ float dy = cursorY + item->box->margin_top - item->box->y;
168
+ translate(item->box, dx, dy);
169
+ } else {
170
+ item->box->fragments.push_back({x, cursorY, item->width, height, item->text});
171
+ }
172
+ x += item->width;
173
+ }
174
+ cursorY += height;
175
+ }
176
+ for (LayoutBox *box : run) computeInlineGeometry(box);
177
+ return cursorY - y;
178
+ }
179
+
180
+ } // namespace layout_flow_detail
181
+ } // namespace xtgui
@@ -0,0 +1,20 @@
1
+ /*
2
+ * xbintsc GUI engine — shared declarations for the layout translation units
3
+ * (`layout.cpp`, `layout_flow.cpp`, `layout_inline.cpp`, `layout_flex.cpp`).
4
+ */
5
+ #ifndef XT_GUI_LAYOUT_INTERNAL_H
6
+ #define XT_GUI_LAYOUT_INTERNAL_H
7
+
8
+ #include <unordered_map>
9
+
10
+ #include "layout.h"
11
+
12
+ namespace xtgui {
13
+
14
+ /** Lay out an already-built box tree starting at `root`. */
15
+ void xt_layout_run(LayoutBox *root, const std::unordered_map<const Node *, XtStyle> &styles,
16
+ float viewportWidth, float viewportHeight);
17
+
18
+ } // namespace xtgui
19
+
20
+ #endif /* XT_GUI_LAYOUT_INTERNAL_H */