@hypen-space/web 0.2.0

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 (195) hide show
  1. package/dist/chunk-2s02mkzs.js +32 -0
  2. package/dist/chunk-2s02mkzs.js.map +9 -0
  3. package/dist/src/canvas/accessibility.js +152 -0
  4. package/dist/src/canvas/accessibility.js.map +10 -0
  5. package/dist/src/canvas/events.js +198 -0
  6. package/dist/src/canvas/events.js.map +10 -0
  7. package/dist/src/canvas/index.js +28 -0
  8. package/dist/src/canvas/index.js.map +9 -0
  9. package/dist/src/canvas/input.js +132 -0
  10. package/dist/src/canvas/input.js.map +10 -0
  11. package/dist/src/canvas/layout.js +309 -0
  12. package/dist/src/canvas/layout.js.map +10 -0
  13. package/dist/src/canvas/paint.js +878 -0
  14. package/dist/src/canvas/paint.js.map +10 -0
  15. package/dist/src/canvas/renderer.js +276 -0
  16. package/dist/src/canvas/renderer.js.map +10 -0
  17. package/dist/src/canvas/text.js +118 -0
  18. package/dist/src/canvas/text.js.map +10 -0
  19. package/dist/src/canvas/types.js +2 -0
  20. package/dist/src/canvas/types.js.map +9 -0
  21. package/dist/src/canvas/utils.js +139 -0
  22. package/dist/src/canvas/utils.js.map +10 -0
  23. package/dist/src/dom/applicators/advanced-layout.js +111 -0
  24. package/dist/src/dom/applicators/advanced-layout.js.map +10 -0
  25. package/dist/src/dom/applicators/background.js +54 -0
  26. package/dist/src/dom/applicators/background.js.map +10 -0
  27. package/dist/src/dom/applicators/border.js +33 -0
  28. package/dist/src/dom/applicators/border.js.map +10 -0
  29. package/dist/src/dom/applicators/color.js +36 -0
  30. package/dist/src/dom/applicators/color.js.map +10 -0
  31. package/dist/src/dom/applicators/display.js +57 -0
  32. package/dist/src/dom/applicators/display.js.map +10 -0
  33. package/dist/src/dom/applicators/effects.js +89 -0
  34. package/dist/src/dom/applicators/effects.js.map +10 -0
  35. package/dist/src/dom/applicators/events.js +518 -0
  36. package/dist/src/dom/applicators/events.js.map +10 -0
  37. package/dist/src/dom/applicators/font.js +39 -0
  38. package/dist/src/dom/applicators/font.js.map +10 -0
  39. package/dist/src/dom/applicators/index.js +296 -0
  40. package/dist/src/dom/applicators/index.js.map +10 -0
  41. package/dist/src/dom/applicators/layout.js +86 -0
  42. package/dist/src/dom/applicators/layout.js.map +10 -0
  43. package/dist/src/dom/applicators/margin.js +32 -0
  44. package/dist/src/dom/applicators/margin.js.map +10 -0
  45. package/dist/src/dom/applicators/padding.js +35 -0
  46. package/dist/src/dom/applicators/padding.js.map +10 -0
  47. package/dist/src/dom/applicators/size.js +42 -0
  48. package/dist/src/dom/applicators/size.js.map +10 -0
  49. package/dist/src/dom/applicators/transform.js +92 -0
  50. package/dist/src/dom/applicators/transform.js.map +10 -0
  51. package/dist/src/dom/applicators/transition.js +66 -0
  52. package/dist/src/dom/applicators/transition.js.map +10 -0
  53. package/dist/src/dom/applicators/typography.js +87 -0
  54. package/dist/src/dom/applicators/typography.js.map +10 -0
  55. package/dist/src/dom/canvas/index.js +50 -0
  56. package/dist/src/dom/canvas/index.js.map +10 -0
  57. package/dist/src/dom/components/audio.js +48 -0
  58. package/dist/src/dom/components/audio.js.map +10 -0
  59. package/dist/src/dom/components/avatar.js +58 -0
  60. package/dist/src/dom/components/avatar.js.map +10 -0
  61. package/dist/src/dom/components/badge.js +55 -0
  62. package/dist/src/dom/components/badge.js.map +10 -0
  63. package/dist/src/dom/components/button.js +29 -0
  64. package/dist/src/dom/components/button.js.map +10 -0
  65. package/dist/src/dom/components/card.js +33 -0
  66. package/dist/src/dom/components/card.js.map +10 -0
  67. package/dist/src/dom/components/center.js +32 -0
  68. package/dist/src/dom/components/center.js.map +10 -0
  69. package/dist/src/dom/components/checkbox.js +54 -0
  70. package/dist/src/dom/components/checkbox.js.map +10 -0
  71. package/dist/src/dom/components/column.js +31 -0
  72. package/dist/src/dom/components/column.js.map +10 -0
  73. package/dist/src/dom/components/container.js +29 -0
  74. package/dist/src/dom/components/container.js.map +10 -0
  75. package/dist/src/dom/components/divider.js +45 -0
  76. package/dist/src/dom/components/divider.js.map +10 -0
  77. package/dist/src/dom/components/grid.js +44 -0
  78. package/dist/src/dom/components/grid.js.map +10 -0
  79. package/dist/src/dom/components/heading.js +47 -0
  80. package/dist/src/dom/components/heading.js.map +10 -0
  81. package/dist/src/dom/components/image.js +39 -0
  82. package/dist/src/dom/components/image.js.map +10 -0
  83. package/dist/src/dom/components/index.js +217 -0
  84. package/dist/src/dom/components/index.js.map +10 -0
  85. package/dist/src/dom/components/input.js +41 -0
  86. package/dist/src/dom/components/input.js.map +10 -0
  87. package/dist/src/dom/components/link.js +42 -0
  88. package/dist/src/dom/components/link.js.map +10 -0
  89. package/dist/src/dom/components/list.js +42 -0
  90. package/dist/src/dom/components/list.js.map +10 -0
  91. package/dist/src/dom/components/paragraph.js +35 -0
  92. package/dist/src/dom/components/paragraph.js.map +10 -0
  93. package/dist/src/dom/components/progressbar.js +57 -0
  94. package/dist/src/dom/components/progressbar.js.map +10 -0
  95. package/dist/src/dom/components/route.js +44 -0
  96. package/dist/src/dom/components/route.js.map +10 -0
  97. package/dist/src/dom/components/router.js +33 -0
  98. package/dist/src/dom/components/router.js.map +10 -0
  99. package/dist/src/dom/components/row.js +31 -0
  100. package/dist/src/dom/components/row.js.map +10 -0
  101. package/dist/src/dom/components/select.js +57 -0
  102. package/dist/src/dom/components/select.js.map +10 -0
  103. package/dist/src/dom/components/slider.js +48 -0
  104. package/dist/src/dom/components/slider.js.map +10 -0
  105. package/dist/src/dom/components/spacer.js +30 -0
  106. package/dist/src/dom/components/spacer.js.map +10 -0
  107. package/dist/src/dom/components/spinner.js +65 -0
  108. package/dist/src/dom/components/spinner.js.map +10 -0
  109. package/dist/src/dom/components/stack.js +45 -0
  110. package/dist/src/dom/components/stack.js.map +10 -0
  111. package/dist/src/dom/components/switch.js +83 -0
  112. package/dist/src/dom/components/switch.js.map +10 -0
  113. package/dist/src/dom/components/text.js +37 -0
  114. package/dist/src/dom/components/text.js.map +10 -0
  115. package/dist/src/dom/components/textarea.js +51 -0
  116. package/dist/src/dom/components/textarea.js.map +10 -0
  117. package/dist/src/dom/components/video.js +51 -0
  118. package/dist/src/dom/components/video.js.map +10 -0
  119. package/dist/src/dom/debug.js +170 -0
  120. package/dist/src/dom/debug.js.map +10 -0
  121. package/dist/src/dom/events.js +112 -0
  122. package/dist/src/dom/events.js.map +10 -0
  123. package/dist/src/dom/index.js +73 -0
  124. package/dist/src/dom/index.js.map +9 -0
  125. package/dist/src/dom/renderer.js +277 -0
  126. package/dist/src/dom/renderer.js.map +10 -0
  127. package/dist/src/index.js +89 -0
  128. package/dist/src/index.js.map +9 -0
  129. package/package.json +84 -0
  130. package/src/canvas/QUICKSTART.md +421 -0
  131. package/src/canvas/README.md +376 -0
  132. package/src/canvas/accessibility.ts +218 -0
  133. package/src/canvas/events.ts +307 -0
  134. package/src/canvas/index.ts +35 -0
  135. package/src/canvas/input.ts +210 -0
  136. package/src/canvas/layout.ts +401 -0
  137. package/src/canvas/paint.ts +1321 -0
  138. package/src/canvas/renderer.ts +422 -0
  139. package/src/canvas/text.ts +182 -0
  140. package/src/canvas/types.ts +137 -0
  141. package/src/canvas/utils.ts +218 -0
  142. package/src/dom/README.md +265 -0
  143. package/src/dom/applicators/advanced-layout.ts +128 -0
  144. package/src/dom/applicators/background.ts +50 -0
  145. package/src/dom/applicators/border.ts +19 -0
  146. package/src/dom/applicators/color.ts +23 -0
  147. package/src/dom/applicators/display.ts +54 -0
  148. package/src/dom/applicators/effects.ts +97 -0
  149. package/src/dom/applicators/events.ts +689 -0
  150. package/src/dom/applicators/font.ts +27 -0
  151. package/src/dom/applicators/index.ts +354 -0
  152. package/src/dom/applicators/layout.ts +92 -0
  153. package/src/dom/applicators/margin.ts +18 -0
  154. package/src/dom/applicators/padding.ts +18 -0
  155. package/src/dom/applicators/size.ts +31 -0
  156. package/src/dom/applicators/transform.ts +93 -0
  157. package/src/dom/applicators/transition.ts +65 -0
  158. package/src/dom/applicators/typography.ts +91 -0
  159. package/src/dom/canvas/index.ts +60 -0
  160. package/src/dom/components/audio.ts +45 -0
  161. package/src/dom/components/avatar.ts +49 -0
  162. package/src/dom/components/badge.ts +45 -0
  163. package/src/dom/components/button.ts +13 -0
  164. package/src/dom/components/card.ts +19 -0
  165. package/src/dom/components/center.ts +16 -0
  166. package/src/dom/components/checkbox.ts +54 -0
  167. package/src/dom/components/column.ts +15 -0
  168. package/src/dom/components/container.ts +13 -0
  169. package/src/dom/components/divider.ts +37 -0
  170. package/src/dom/components/grid.ts +40 -0
  171. package/src/dom/components/heading.ts +41 -0
  172. package/src/dom/components/image.ts +27 -0
  173. package/src/dom/components/index.ts +115 -0
  174. package/src/dom/components/input.ts +29 -0
  175. package/src/dom/components/link.ts +35 -0
  176. package/src/dom/components/list.ts +30 -0
  177. package/src/dom/components/paragraph.ts +23 -0
  178. package/src/dom/components/progressbar.ts +51 -0
  179. package/src/dom/components/route.ts +37 -0
  180. package/src/dom/components/router.ts +22 -0
  181. package/src/dom/components/row.ts +15 -0
  182. package/src/dom/components/select.ts +56 -0
  183. package/src/dom/components/slider.ts +45 -0
  184. package/src/dom/components/spacer.ts +16 -0
  185. package/src/dom/components/spinner.ts +60 -0
  186. package/src/dom/components/stack.ts +34 -0
  187. package/src/dom/components/switch.ts +86 -0
  188. package/src/dom/components/text.ts +24 -0
  189. package/src/dom/components/textarea.ts +50 -0
  190. package/src/dom/components/video.ts +50 -0
  191. package/src/dom/debug.ts +247 -0
  192. package/src/dom/events.ts +168 -0
  193. package/src/dom/index.ts +11 -0
  194. package/src/dom/renderer.ts +327 -0
  195. package/src/index.ts +56 -0
@@ -0,0 +1,309 @@
1
+ import {
2
+ measureText
3
+ } from "./text.js";
4
+ import {
5
+ parseSize,
6
+ parseSpacing
7
+ } from "./utils.js";
8
+ import"../../chunk-2s02mkzs.js";
9
+
10
+ // src/canvas/layout.ts
11
+ function computeLayout(ctx, node, availableWidth, availableHeight, x = 0, y = 0) {
12
+ const props = node.props;
13
+ let margin = parseSpacing(props.margin || 0);
14
+ if (props.marginTop !== undefined)
15
+ margin.top = parseFloat(props.marginTop) || 0;
16
+ if (props.marginRight !== undefined)
17
+ margin.right = parseFloat(props.marginRight) || 0;
18
+ if (props.marginBottom !== undefined)
19
+ margin.bottom = parseFloat(props.marginBottom) || 0;
20
+ if (props.marginLeft !== undefined)
21
+ margin.left = parseFloat(props.marginLeft) || 0;
22
+ let padding = parseSpacing(props.padding || 0);
23
+ if (props.paddingTop !== undefined)
24
+ padding.top = parseFloat(props.paddingTop) || 0;
25
+ if (props.paddingRight !== undefined)
26
+ padding.right = parseFloat(props.paddingRight) || 0;
27
+ if (props.paddingBottom !== undefined)
28
+ padding.bottom = parseFloat(props.paddingBottom) || 0;
29
+ if (props.paddingLeft !== undefined)
30
+ padding.left = parseFloat(props.paddingLeft) || 0;
31
+ const borderWidth = parseFloat(props.borderWidth) || 0;
32
+ const borderColor = props.borderColor || "transparent";
33
+ const borderRadius = parseFloat(props.borderRadius) || 0;
34
+ const availableAfterMargin = {
35
+ width: availableWidth - margin.left - margin.right,
36
+ height: availableHeight - margin.top - margin.bottom
37
+ };
38
+ let width = parseSize(props.width);
39
+ let height = parseSize(props.height);
40
+ const type = node.type.toLowerCase();
41
+ if (type === "spacer") {
42
+ if (width === null)
43
+ width = availableAfterMargin.width;
44
+ if (height === null)
45
+ height = availableAfterMargin.height;
46
+ } else if (type === "divider" || type === "separator") {
47
+ const orientation = props.orientation || "horizontal";
48
+ const thickness = parseFloat(props.thickness) || 1;
49
+ if (orientation === "vertical") {
50
+ if (width === null)
51
+ width = thickness;
52
+ if (height === null)
53
+ height = availableAfterMargin.height;
54
+ } else {
55
+ if (width === null)
56
+ width = availableAfterMargin.width;
57
+ if (height === null)
58
+ height = thickness;
59
+ }
60
+ } else if (type === "checkbox" || type === "radio") {
61
+ const size = parseFloat(props.size) || 20;
62
+ if (width === null)
63
+ width = size;
64
+ if (height === null)
65
+ height = size;
66
+ } else if (type === "switch" || type === "toggle") {
67
+ if (width === null)
68
+ width = 44;
69
+ if (height === null)
70
+ height = 24;
71
+ } else if (type === "slider") {
72
+ if (width === null)
73
+ width = 200;
74
+ if (height === null)
75
+ height = 20;
76
+ } else if (type === "progress" || type === "progressbar") {
77
+ if (width === null)
78
+ width = 200;
79
+ if (height === null)
80
+ height = 8;
81
+ } else if (type === "spinner" || type === "loading") {
82
+ const size = parseFloat(props.size) || 24;
83
+ if (width === null)
84
+ width = size;
85
+ if (height === null)
86
+ height = size;
87
+ } else if (type === "badge") {
88
+ if (width === null)
89
+ width = 20;
90
+ if (height === null)
91
+ height = 20;
92
+ } else if (type === "avatar") {
93
+ const size = parseFloat(props.size) || 40;
94
+ if (width === null)
95
+ width = size;
96
+ if (height === null)
97
+ height = size;
98
+ } else if (type === "icon") {
99
+ const size = parseFloat(props.size) || 24;
100
+ if (width === null)
101
+ width = size;
102
+ if (height === null)
103
+ height = size;
104
+ }
105
+ if (node.type === "text" && node.props[0]) {
106
+ const text = String(node.props[0] || "");
107
+ const fontSize = parseFloat(props.fontSize) || 16;
108
+ const fontWeight = props.fontWeight || "normal";
109
+ const fontFamily = props.fontFamily || "system-ui, sans-serif";
110
+ const lineHeight = parseFloat(props.lineHeight) || fontSize * 1.2;
111
+ const maxWidth2 = width || availableAfterMargin.width - padding.left - padding.right;
112
+ const metrics = measureText(ctx, text, { fontSize, fontWeight, fontFamily, lineHeight }, maxWidth2);
113
+ if (!width)
114
+ width = metrics.width + padding.left + padding.right;
115
+ if (!height)
116
+ height = metrics.height + padding.top + padding.bottom;
117
+ }
118
+ if (width === null)
119
+ width = availableAfterMargin.width;
120
+ if (height === null)
121
+ height = availableAfterMargin.height;
122
+ const minWidth = parseSize(props.minWidth);
123
+ const maxWidth = parseSize(props.maxWidth);
124
+ const minHeight = parseSize(props.minHeight);
125
+ const maxHeight = parseSize(props.maxHeight);
126
+ if (minWidth !== null)
127
+ width = Math.max(width, minWidth);
128
+ if (maxWidth !== null)
129
+ width = Math.min(width, maxWidth);
130
+ if (minHeight !== null)
131
+ height = Math.max(height, minHeight);
132
+ if (maxHeight !== null)
133
+ height = Math.min(height, maxHeight);
134
+ const layout = {
135
+ x: x + margin.left,
136
+ y: y + margin.top,
137
+ width,
138
+ height,
139
+ margin,
140
+ padding,
141
+ border: {
142
+ width: borderWidth,
143
+ color: borderColor,
144
+ radius: borderRadius
145
+ },
146
+ contentX: padding.left + borderWidth,
147
+ contentY: padding.top + borderWidth,
148
+ contentWidth: width - padding.left - padding.right - borderWidth * 2,
149
+ contentHeight: height - padding.top - padding.bottom - borderWidth * 2
150
+ };
151
+ node.layout = layout;
152
+ if (node.children.length > 0) {
153
+ layoutChildren(ctx, node);
154
+ }
155
+ }
156
+ function layoutChildren(ctx, parent) {
157
+ const layout = parent.layout;
158
+ const props = parent.props;
159
+ if (parent.type.toLowerCase() === "stack") {
160
+ layoutStackChildren(ctx, parent);
161
+ return;
162
+ }
163
+ const flexDirection = props.flexDirection || (parent.type === "column" ? "column" : "row");
164
+ const justifyContent = props.justifyContent || "flex-start";
165
+ const alignItems = props.alignItems || "flex-start";
166
+ const gap = parseFloat(props.gap) || 0;
167
+ const isColumn = flexDirection === "column";
168
+ const availableWidth = layout.contentWidth;
169
+ const availableHeight = layout.contentHeight;
170
+ const childInfo = [];
171
+ let totalMainSize = 0;
172
+ let totalFlexGrow = 0;
173
+ let totalFlexShrink = 0;
174
+ for (const child of parent.children) {
175
+ const flexGrow = parseFloat(child.props.flexGrow) || parseFloat(child.props.flex) || 0;
176
+ const flexShrink = parseFloat(child.props.flexShrink) || 1;
177
+ const flexBasis = parseSize(child.props.flexBasis);
178
+ computeLayout(ctx, child, availableWidth, availableHeight, 0, 0);
179
+ const childLayout = child.layout;
180
+ let mainSize = isColumn ? childLayout.height : childLayout.width;
181
+ if (flexBasis !== null) {
182
+ mainSize = flexBasis;
183
+ if (isColumn) {
184
+ childLayout.height = flexBasis;
185
+ } else {
186
+ childLayout.width = flexBasis;
187
+ }
188
+ }
189
+ childInfo.push({
190
+ width: childLayout.width,
191
+ height: childLayout.height,
192
+ flexGrow,
193
+ flexShrink,
194
+ flexBasis
195
+ });
196
+ totalMainSize += mainSize;
197
+ totalFlexGrow += flexGrow;
198
+ totalFlexShrink += flexShrink;
199
+ }
200
+ const totalGap = gap * (parent.children.length - 1);
201
+ totalMainSize += totalGap;
202
+ const availableMain = isColumn ? availableHeight : availableWidth;
203
+ let remainingSpace = availableMain - totalMainSize;
204
+ if (remainingSpace > 0 && totalFlexGrow > 0) {
205
+ const spacePerFlex = remainingSpace / totalFlexGrow;
206
+ for (let i = 0;i < parent.children.length; i++) {
207
+ const info = childInfo[i];
208
+ if (info.flexGrow > 0) {
209
+ const extraSpace = spacePerFlex * info.flexGrow;
210
+ if (isColumn) {
211
+ info.height += extraSpace;
212
+ } else {
213
+ info.width += extraSpace;
214
+ }
215
+ totalMainSize += extraSpace;
216
+ }
217
+ }
218
+ remainingSpace = 0;
219
+ }
220
+ if (remainingSpace < 0 && totalFlexShrink > 0) {
221
+ const shrinkPerFlex = Math.abs(remainingSpace) / totalFlexShrink;
222
+ for (let i = 0;i < parent.children.length; i++) {
223
+ const info = childInfo[i];
224
+ if (info.flexShrink > 0) {
225
+ const shrinkSpace = Math.min(shrinkPerFlex * info.flexShrink, isColumn ? info.height : info.width);
226
+ if (isColumn) {
227
+ info.height = Math.max(0, info.height - shrinkSpace);
228
+ } else {
229
+ info.width = Math.max(0, info.width - shrinkSpace);
230
+ }
231
+ totalMainSize -= shrinkSpace;
232
+ }
233
+ }
234
+ remainingSpace = availableMain - totalMainSize;
235
+ }
236
+ let mainStart = 0;
237
+ let spacing = 0;
238
+ if (justifyContent === "center") {
239
+ mainStart = Math.max(0, remainingSpace / 2);
240
+ } else if (justifyContent === "flex-end") {
241
+ mainStart = Math.max(0, remainingSpace);
242
+ } else if (justifyContent === "space-between") {
243
+ spacing = remainingSpace / Math.max(1, parent.children.length - 1);
244
+ } else if (justifyContent === "space-around") {
245
+ spacing = remainingSpace / parent.children.length;
246
+ mainStart = spacing / 2;
247
+ }
248
+ let currentMain = mainStart;
249
+ for (let i = 0;i < parent.children.length; i++) {
250
+ const child = parent.children[i];
251
+ const childLayout = child.layout;
252
+ const info = childInfo[i];
253
+ childLayout.width = info.width;
254
+ childLayout.height = info.height;
255
+ let crossStart = 0;
256
+ const availableCross = isColumn ? availableWidth : availableHeight;
257
+ const childCross = isColumn ? info.width : info.height;
258
+ if (alignItems === "center") {
259
+ crossStart = (availableCross - childCross) / 2;
260
+ } else if (alignItems === "flex-end") {
261
+ crossStart = availableCross - childCross;
262
+ }
263
+ if (isColumn) {
264
+ childLayout.x = layout.x + layout.contentX + crossStart;
265
+ childLayout.y = layout.y + layout.contentY + currentMain;
266
+ currentMain += info.height + gap;
267
+ } else {
268
+ childLayout.x = layout.x + layout.contentX + currentMain;
269
+ childLayout.y = layout.y + layout.contentY + crossStart;
270
+ currentMain += info.width + gap;
271
+ }
272
+ if (justifyContent === "space-between" || justifyContent === "space-around") {
273
+ currentMain += spacing;
274
+ }
275
+ }
276
+ }
277
+ function layoutStackChildren(ctx, parent) {
278
+ const layout = parent.layout;
279
+ const props = parent.props;
280
+ const alignItems = props.alignItems || "flex-start";
281
+ const justifyContent = props.justifyContent || "flex-start";
282
+ const availableWidth = layout.contentWidth;
283
+ const availableHeight = layout.contentHeight;
284
+ for (const child of parent.children) {
285
+ computeLayout(ctx, child, availableWidth, availableHeight, 0, 0);
286
+ const childLayout = child.layout;
287
+ let x = 0;
288
+ let y = 0;
289
+ if (alignItems === "center") {
290
+ x = (availableWidth - childLayout.width) / 2;
291
+ } else if (alignItems === "flex-end") {
292
+ x = availableWidth - childLayout.width;
293
+ }
294
+ if (justifyContent === "center") {
295
+ y = (availableHeight - childLayout.height) / 2;
296
+ } else if (justifyContent === "flex-end") {
297
+ y = availableHeight - childLayout.height;
298
+ }
299
+ childLayout.x = layout.x + layout.contentX + x;
300
+ childLayout.y = layout.y + layout.contentY + y;
301
+ }
302
+ }
303
+ export {
304
+ computeLayout
305
+ };
306
+
307
+ export { computeLayout };
308
+
309
+ //# debugId=DB33C4C61753CE7B64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/canvas/layout.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Layout Engine\n *\n * Flexbox-like layout system for positioning virtual nodes\n */\n\nimport type { VirtualNode, Layout, BoxSpacing } from \"./types.js\";\nimport { parseSpacing, parseSize } from \"./utils.js\";\nimport { measureText } from \"./text.js\";\n\n/**\n * Compute layout for a virtual node tree\n */\nexport function computeLayout(\n ctx: CanvasRenderingContext2D,\n node: VirtualNode,\n availableWidth: number,\n availableHeight: number,\n x: number = 0,\n y: number = 0\n): void {\n // Parse props\n const props = node.props;\n\n // Support individual margins (marginTop, marginRight, etc.)\n let margin = parseSpacing(props.margin || 0);\n if (props.marginTop !== undefined) margin.top = parseFloat(props.marginTop) || 0;\n if (props.marginRight !== undefined) margin.right = parseFloat(props.marginRight) || 0;\n if (props.marginBottom !== undefined) margin.bottom = parseFloat(props.marginBottom) || 0;\n if (props.marginLeft !== undefined) margin.left = parseFloat(props.marginLeft) || 0;\n\n // Support individual padding (paddingTop, paddingRight, etc.)\n let padding = parseSpacing(props.padding || 0);\n if (props.paddingTop !== undefined) padding.top = parseFloat(props.paddingTop) || 0;\n if (props.paddingRight !== undefined) padding.right = parseFloat(props.paddingRight) || 0;\n if (props.paddingBottom !== undefined) padding.bottom = parseFloat(props.paddingBottom) || 0;\n if (props.paddingLeft !== undefined) padding.left = parseFloat(props.paddingLeft) || 0;\n\n const borderWidth = parseFloat(props.borderWidth) || 0;\n const borderColor = props.borderColor || \"transparent\";\n const borderRadius = parseFloat(props.borderRadius) || 0;\n\n // Calculate available space after margin\n const availableAfterMargin = {\n width: availableWidth - margin.left - margin.right,\n height: availableHeight - margin.top - margin.bottom,\n };\n\n // Determine size\n let width = parseSize(props.width);\n let height = parseSize(props.height);\n\n // Default sizing for specific component types\n const type = node.type.toLowerCase();\n\n if (type === \"spacer\") {\n // Spacer fills available space by default\n if (width === null) width = availableAfterMargin.width;\n if (height === null) height = availableAfterMargin.height;\n } else if (type === \"divider\" || type === \"separator\") {\n const orientation = props.orientation || \"horizontal\";\n const thickness = parseFloat(props.thickness) || 1;\n\n if (orientation === \"vertical\") {\n if (width === null) width = thickness;\n if (height === null) height = availableAfterMargin.height;\n } else {\n if (width === null) width = availableAfterMargin.width;\n if (height === null) height = thickness;\n }\n } else if (type === \"checkbox\" || type === \"radio\") {\n const size = parseFloat(props.size) || 20;\n if (width === null) width = size;\n if (height === null) height = size;\n } else if (type === \"switch\" || type === \"toggle\") {\n if (width === null) width = 44;\n if (height === null) height = 24;\n } else if (type === \"slider\") {\n if (width === null) width = 200;\n if (height === null) height = 20;\n } else if (type === \"progress\" || type === \"progressbar\") {\n if (width === null) width = 200;\n if (height === null) height = 8;\n } else if (type === \"spinner\" || type === \"loading\") {\n const size = parseFloat(props.size) || 24;\n if (width === null) width = size;\n if (height === null) height = size;\n } else if (type === \"badge\") {\n if (width === null) width = 20;\n if (height === null) height = 20;\n } else if (type === \"avatar\") {\n const size = parseFloat(props.size) || 40;\n if (width === null) width = size;\n if (height === null) height = size;\n } else if (type === \"icon\") {\n const size = parseFloat(props.size) || 24;\n if (width === null) width = size;\n if (height === null) height = size;\n }\n\n // Intrinsic sizing for text nodes\n if (node.type === \"text\" && node.props[0]) {\n const text = String(node.props[0] || \"\");\n const fontSize = parseFloat(props.fontSize) || 16;\n const fontWeight = props.fontWeight || \"normal\";\n const fontFamily = props.fontFamily || \"system-ui, sans-serif\";\n const lineHeight = parseFloat(props.lineHeight) || fontSize * 1.2;\n\n const maxWidth = width || availableAfterMargin.width - padding.left - padding.right;\n const metrics = measureText(ctx, text, { fontSize, fontWeight, fontFamily, lineHeight }, maxWidth);\n\n if (!width) width = metrics.width + padding.left + padding.right;\n if (!height) height = metrics.height + padding.top + padding.bottom;\n }\n\n // Default to available size if not specified\n if (width === null) width = availableAfterMargin.width;\n if (height === null) height = availableAfterMargin.height;\n\n // Apply constraints\n const minWidth = parseSize(props.minWidth);\n const maxWidth = parseSize(props.maxWidth);\n const minHeight = parseSize(props.minHeight);\n const maxHeight = parseSize(props.maxHeight);\n\n if (minWidth !== null) width = Math.max(width, minWidth);\n if (maxWidth !== null) width = Math.min(width, maxWidth);\n if (minHeight !== null) height = Math.max(height, minHeight);\n if (maxHeight !== null) height = Math.min(height, maxHeight);\n\n // Create layout object\n const layout: Layout = {\n x: x + margin.left,\n y: y + margin.top,\n width,\n height,\n margin,\n padding,\n border: {\n width: borderWidth,\n color: borderColor,\n radius: borderRadius,\n },\n contentX: padding.left + borderWidth,\n contentY: padding.top + borderWidth,\n contentWidth: width - padding.left - padding.right - borderWidth * 2,\n contentHeight: height - padding.top - padding.bottom - borderWidth * 2,\n };\n\n node.layout = layout;\n\n // Layout children if container\n if (node.children.length > 0) {\n layoutChildren(ctx, node);\n }\n}\n\n/**\n * Layout children using flexbox-like rules\n */\nfunction layoutChildren(ctx: CanvasRenderingContext2D, parent: VirtualNode): void {\n const layout = parent.layout!;\n const props = parent.props;\n\n // Stack components overlay children on top of each other\n if (parent.type.toLowerCase() === \"stack\") {\n layoutStackChildren(ctx, parent);\n return;\n }\n\n const flexDirection = props.flexDirection || (parent.type === \"column\" ? \"column\" : \"row\");\n const justifyContent = props.justifyContent || \"flex-start\";\n const alignItems = props.alignItems || \"flex-start\";\n const gap = parseFloat(props.gap) || 0;\n\n const isColumn = flexDirection === \"column\";\n const availableWidth = layout.contentWidth;\n const availableHeight = layout.contentHeight;\n\n // First pass: compute intrinsic sizes and collect flex info\n const childInfo: Array<{\n width: number;\n height: number;\n flexGrow: number;\n flexShrink: number;\n flexBasis: number | null;\n }> = [];\n let totalMainSize = 0;\n let totalFlexGrow = 0;\n let totalFlexShrink = 0;\n\n for (const child of parent.children) {\n const flexGrow = parseFloat(child.props.flexGrow) || parseFloat(child.props.flex) || 0;\n const flexShrink = parseFloat(child.props.flexShrink) || 1;\n const flexBasis = parseSize(child.props.flexBasis);\n\n // Compute child layout with available space\n computeLayout(\n ctx,\n child,\n availableWidth,\n availableHeight,\n 0,\n 0\n );\n\n const childLayout = child.layout!;\n let mainSize = isColumn ? childLayout.height : childLayout.width;\n\n // Use flexBasis if specified\n if (flexBasis !== null) {\n mainSize = flexBasis;\n if (isColumn) {\n childLayout.height = flexBasis;\n } else {\n childLayout.width = flexBasis;\n }\n }\n\n childInfo.push({\n width: childLayout.width,\n height: childLayout.height,\n flexGrow,\n flexShrink,\n flexBasis,\n });\n\n totalMainSize += mainSize;\n totalFlexGrow += flexGrow;\n totalFlexShrink += flexShrink;\n }\n\n // Add gaps\n const totalGap = gap * (parent.children.length - 1);\n totalMainSize += totalGap;\n\n // Apply flex grow/shrink\n const availableMain = isColumn ? availableHeight : availableWidth;\n let remainingSpace = availableMain - totalMainSize;\n\n // Distribute remaining space to flex-grow children\n if (remainingSpace > 0 && totalFlexGrow > 0) {\n const spacePerFlex = remainingSpace / totalFlexGrow;\n\n for (let i = 0; i < parent.children.length; i++) {\n const info = childInfo[i];\n if (info.flexGrow > 0) {\n const extraSpace = spacePerFlex * info.flexGrow;\n if (isColumn) {\n info.height += extraSpace;\n } else {\n info.width += extraSpace;\n }\n totalMainSize += extraSpace;\n }\n }\n\n remainingSpace = 0;\n }\n\n // Apply flex shrink if needed (content is too large)\n if (remainingSpace < 0 && totalFlexShrink > 0) {\n const shrinkPerFlex = Math.abs(remainingSpace) / totalFlexShrink;\n\n for (let i = 0; i < parent.children.length; i++) {\n const info = childInfo[i];\n if (info.flexShrink > 0) {\n const shrinkSpace = Math.min(\n shrinkPerFlex * info.flexShrink,\n isColumn ? info.height : info.width\n );\n\n if (isColumn) {\n info.height = Math.max(0, info.height - shrinkSpace);\n } else {\n info.width = Math.max(0, info.width - shrinkSpace);\n }\n\n totalMainSize -= shrinkSpace;\n }\n }\n\n remainingSpace = availableMain - totalMainSize;\n }\n\n // Calculate starting position based on justifyContent\n let mainStart = 0;\n let spacing = 0;\n\n if (justifyContent === \"center\") {\n mainStart = Math.max(0, remainingSpace / 2);\n } else if (justifyContent === \"flex-end\") {\n mainStart = Math.max(0, remainingSpace);\n } else if (justifyContent === \"space-between\") {\n spacing = remainingSpace / Math.max(1, parent.children.length - 1);\n } else if (justifyContent === \"space-around\") {\n spacing = remainingSpace / parent.children.length;\n mainStart = spacing / 2;\n }\n\n // Position children\n let currentMain = mainStart;\n\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children[i];\n const childLayout = child.layout!;\n const info = childInfo[i];\n\n // Update child layout with flex-adjusted size\n childLayout.width = info.width;\n childLayout.height = info.height;\n\n // Calculate cross position based on alignItems\n let crossStart = 0;\n const availableCross = isColumn ? availableWidth : availableHeight;\n const childCross = isColumn ? info.width : info.height;\n\n if (alignItems === \"center\") {\n crossStart = (availableCross - childCross) / 2;\n } else if (alignItems === \"flex-end\") {\n crossStart = availableCross - childCross;\n }\n\n // Update child position relative to parent content area\n if (isColumn) {\n childLayout.x = layout.x + layout.contentX + crossStart;\n childLayout.y = layout.y + layout.contentY + currentMain;\n currentMain += info.height + gap;\n } else {\n childLayout.x = layout.x + layout.contentX + currentMain;\n childLayout.y = layout.y + layout.contentY + crossStart;\n currentMain += info.width + gap;\n }\n\n if (justifyContent === \"space-between\" || justifyContent === \"space-around\") {\n currentMain += spacing;\n }\n }\n}\n\n/**\n * Layout Stack children - overlays children on top of each other\n */\nfunction layoutStackChildren(ctx: CanvasRenderingContext2D, parent: VirtualNode): void {\n const layout = parent.layout!;\n const props = parent.props;\n\n const alignItems = props.alignItems || \"flex-start\";\n const justifyContent = props.justifyContent || \"flex-start\";\n\n const availableWidth = layout.contentWidth;\n const availableHeight = layout.contentHeight;\n\n // Layout all children at the same position (stacked on top of each other)\n for (const child of parent.children) {\n // Compute child layout\n computeLayout(\n ctx,\n child,\n availableWidth,\n availableHeight,\n 0,\n 0\n );\n\n const childLayout = child.layout!;\n\n // Calculate position based on alignment\n let x = 0;\n let y = 0;\n\n // Horizontal alignment\n if (alignItems === \"center\") {\n x = (availableWidth - childLayout.width) / 2;\n } else if (alignItems === \"flex-end\") {\n x = availableWidth - childLayout.width;\n }\n\n // Vertical alignment\n if (justifyContent === \"center\") {\n y = (availableHeight - childLayout.height) / 2;\n } else if (justifyContent === \"flex-end\") {\n y = availableHeight - childLayout.height;\n }\n\n // Update child position relative to parent content area\n childLayout.x = layout.x + layout.contentX + x;\n childLayout.y = layout.y + layout.contentY + y;\n }\n}\n\n\n\n\n\n\n\n\n\n\n\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "DB33C4C61753CE7B64756E2164756E21",
9
+ "names": []
10
+ }