xbintsc 0.3.25 → 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 (154) 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.js +14 -0
  15. package/dist/src/driver/bundler/graph.js.map +1 -1
  16. package/dist/src/driver/bundler/merge.js +14 -0
  17. package/dist/src/driver/bundler/merge.js.map +1 -1
  18. package/dist/src/driver/bundler/types.d.ts +8 -0
  19. package/dist/src/driver/compiler.d.ts +8 -1
  20. package/dist/src/driver/compiler.js +73 -5
  21. package/dist/src/driver/compiler.js.map +1 -1
  22. package/dist/src/driver/config.d.ts +53 -0
  23. package/dist/src/driver/config.js +141 -0
  24. package/dist/src/driver/config.js.map +1 -0
  25. package/dist/src/driver/icon.d.ts +62 -0
  26. package/dist/src/driver/icon.js +151 -0
  27. package/dist/src/driver/icon.js.map +1 -0
  28. package/dist/src/driver/index.d.ts +4 -0
  29. package/dist/src/driver/index.js +4 -0
  30. package/dist/src/driver/index.js.map +1 -1
  31. package/dist/src/driver/mac-bundle.d.ts +41 -0
  32. package/dist/src/driver/mac-bundle.js +123 -0
  33. package/dist/src/driver/mac-bundle.js.map +1 -0
  34. package/dist/src/driver/win-icon.d.ts +27 -0
  35. package/dist/src/driver/win-icon.js +80 -0
  36. package/dist/src/driver/win-icon.js.map +1 -0
  37. package/dist/src/parser/statements.js +17 -4
  38. package/dist/src/parser/statements.js.map +1 -1
  39. package/dist/tests/cli/main.test.js +46 -1
  40. package/dist/tests/cli/main.test.js.map +1 -1
  41. package/dist/tests/driver/config.test.d.ts +1 -0
  42. package/dist/tests/driver/config.test.js +124 -0
  43. package/dist/tests/driver/config.test.js.map +1 -0
  44. package/dist/tests/driver/icon.test.d.ts +1 -0
  45. package/dist/tests/driver/icon.test.js +421 -0
  46. package/dist/tests/driver/icon.test.js.map +1 -0
  47. package/dist/tests/driver/modules.test.js +109 -0
  48. package/dist/tests/driver/modules.test.js.map +1 -1
  49. package/dist/tests/e2e/fetch.test.d.ts +12 -0
  50. package/dist/tests/e2e/fetch.test.js +272 -0
  51. package/dist/tests/e2e/fetch.test.js.map +1 -0
  52. package/dist/tests/e2e/gui-dom.test.d.ts +5 -0
  53. package/dist/tests/e2e/gui-dom.test.js +102 -0
  54. package/dist/tests/e2e/gui-dom.test.js.map +1 -0
  55. package/dist/tests/e2e/gui-events.test.d.ts +5 -0
  56. package/dist/tests/e2e/gui-events.test.js +60 -0
  57. package/dist/tests/e2e/gui-events.test.js.map +1 -0
  58. package/dist/tests/e2e/gui-helpers.d.ts +31 -0
  59. package/dist/tests/e2e/gui-helpers.js +74 -0
  60. package/dist/tests/e2e/gui-helpers.js.map +1 -0
  61. package/dist/tests/e2e/gui-layout.test.d.ts +4 -0
  62. package/dist/tests/e2e/gui-layout.test.js +88 -0
  63. package/dist/tests/e2e/gui-layout.test.js.map +1 -0
  64. package/dist/tests/e2e/gui-lifecycle.test.d.ts +5 -0
  65. package/dist/tests/e2e/gui-lifecycle.test.js +58 -0
  66. package/dist/tests/e2e/gui-lifecycle.test.js.map +1 -0
  67. package/dist/tests/e2e/gui-paint.test.d.ts +5 -0
  68. package/dist/tests/e2e/gui-paint.test.js +111 -0
  69. package/dist/tests/e2e/gui-paint.test.js.map +1 -0
  70. package/dist/tests/e2e/gui-script.test.d.ts +5 -0
  71. package/dist/tests/e2e/gui-script.test.js +78 -0
  72. package/dist/tests/e2e/gui-script.test.js.map +1 -0
  73. package/dist/tests/e2e/gui-style.test.d.ts +5 -0
  74. package/dist/tests/e2e/gui-style.test.js +175 -0
  75. package/dist/tests/e2e/gui-style.test.js.map +1 -0
  76. package/dist/tests/e2e/icon.test.d.ts +7 -0
  77. package/dist/tests/e2e/icon.test.js +80 -0
  78. package/dist/tests/e2e/icon.test.js.map +1 -0
  79. package/dist/tests/e2e/npm-modules.test.d.ts +4 -1
  80. package/dist/tests/e2e/npm-modules.test.js +47 -1
  81. package/dist/tests/e2e/npm-modules.test.js.map +1 -1
  82. package/dist/tests/e2e/runtime-coverage-typed-array.test.d.ts +9 -0
  83. package/dist/tests/e2e/runtime-coverage-typed-array.test.js +140 -0
  84. package/dist/tests/e2e/runtime-coverage-typed-array.test.js.map +1 -0
  85. package/dist/tests/parser/statements.test.js +11 -0
  86. package/dist/tests/parser/statements.test.js.map +1 -1
  87. package/package.json +1 -1
  88. package/runtime/ext_gui/css.cpp +4 -517
  89. package/runtime/ext_gui/css_internal.h +27 -0
  90. package/runtime/ext_gui/css_match.cpp +195 -0
  91. package/runtime/ext_gui/css_selector.cpp +207 -0
  92. package/runtime/ext_gui/css_sheet.cpp +129 -0
  93. package/runtime/ext_gui/dom.cpp +7 -403
  94. package/runtime/ext_gui/dom_api.cpp +63 -1146
  95. package/runtime/ext_gui/dom_api_document.cpp +96 -0
  96. package/runtime/ext_gui/dom_api_events.cpp +123 -0
  97. package/runtime/ext_gui/dom_api_internal.h +135 -0
  98. package/runtime/ext_gui/dom_api_node.cpp +329 -0
  99. package/runtime/ext_gui/dom_api_node_read.cpp +294 -0
  100. package/runtime/ext_gui/dom_api_proto.cpp +130 -0
  101. package/runtime/ext_gui/dom_api_style.cpp +192 -0
  102. package/runtime/ext_gui/dom_internal.h +39 -0
  103. package/runtime/ext_gui/dom_parse.cpp +348 -0
  104. package/runtime/ext_gui/dom_serialize.cpp +54 -0
  105. package/runtime/ext_gui/gui.cpp +56 -286
  106. package/runtime/ext_gui/gui_events.cpp +294 -0
  107. package/runtime/ext_gui/gui_internal.h +29 -0
  108. package/runtime/ext_gui/layout.cpp +6 -597
  109. package/runtime/ext_gui/layout_flex.cpp +200 -0
  110. package/runtime/ext_gui/layout_flow.cpp +191 -0
  111. package/runtime/ext_gui/layout_flow_internal.h +149 -0
  112. package/runtime/ext_gui/layout_inline.cpp +181 -0
  113. package/runtime/ext_gui/layout_internal.h +20 -0
  114. package/runtime/ext_gui/renderer.cpp +15 -679
  115. package/runtime/ext_gui/renderer_image.cpp +233 -0
  116. package/runtime/ext_gui/renderer_internal.h +112 -0
  117. package/runtime/ext_gui/renderer_shaders.h +108 -0
  118. package/runtime/ext_gui/renderer_text.cpp +342 -0
  119. package/runtime/ext_gui/style.cpp +12 -660
  120. package/runtime/ext_gui/style_internal.h +33 -0
  121. package/runtime/ext_gui/style_print.cpp +113 -0
  122. package/runtime/ext_gui/style_ua.cpp +98 -0
  123. package/runtime/ext_gui/style_values.cpp +468 -0
  124. package/runtime/rt.h +6 -0
  125. package/runtime/rt_internal.h +4 -0
  126. package/runtime/xt_builtins.c +1 -0
  127. package/runtime/xt_containers/access.inc +32 -1
  128. package/runtime/xt_fetch/buffer.inc +64 -0
  129. package/runtime/xt_fetch/headers.inc +312 -0
  130. package/runtime/xt_fetch/request.inc +386 -0
  131. package/runtime/xt_fetch/response.inc +107 -0
  132. package/runtime/xt_fetch/socket.inc +72 -0
  133. package/runtime/xt_fetch/url.inc +108 -0
  134. package/runtime/xt_fetch.c +39 -0
  135. package/runtime/xt_stdlib2/set.inc +1 -1
  136. package/runtime/xt_typed_array.c +614 -0
  137. package/src/cli/main.ts +137 -29
  138. package/src/codegen/generator/calls/access.ts +9 -1
  139. package/src/codegen/generator/state.ts +20 -0
  140. package/src/codegen/generator/tables.ts +40 -0
  141. package/src/driver/bundler/commonjs.ts +553 -0
  142. package/src/driver/bundler/graph.ts +14 -0
  143. package/src/driver/bundler/merge.ts +15 -0
  144. package/src/driver/bundler/types.ts +8 -0
  145. package/src/driver/compiler.ts +83 -5
  146. package/src/driver/config.ts +173 -0
  147. package/src/driver/icon.ts +184 -0
  148. package/src/driver/index.ts +30 -0
  149. package/src/driver/mac-bundle.ts +156 -0
  150. package/src/driver/win-icon.ts +96 -0
  151. package/src/parser/statements.ts +17 -4
  152. package/dist/tests/e2e/gui.test.d.ts +0 -12
  153. package/dist/tests/e2e/gui.test.js +0 -702
  154. 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 */