@smoove/core 0.1.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 (307) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/dist/animation/color.d.ts +9 -0
  4. package/dist/animation/color.d.ts.map +1 -0
  5. package/dist/animation/color.js +224 -0
  6. package/dist/animation/color.js.map +1 -0
  7. package/dist/animation/easing.d.ts +22 -0
  8. package/dist/animation/easing.d.ts.map +1 -0
  9. package/dist/animation/easing.js +59 -0
  10. package/dist/animation/easing.js.map +1 -0
  11. package/dist/animation/interpolate-colors.d.ts +7 -0
  12. package/dist/animation/interpolate-colors.d.ts.map +1 -0
  13. package/dist/animation/interpolate-colors.js +19 -0
  14. package/dist/animation/interpolate-colors.js.map +1 -0
  15. package/dist/animation/interpolate.d.ts +12 -0
  16. package/dist/animation/interpolate.d.ts.map +1 -0
  17. package/dist/animation/interpolate.js +65 -0
  18. package/dist/animation/interpolate.js.map +1 -0
  19. package/dist/audio/asset.d.ts +21 -0
  20. package/dist/audio/asset.d.ts.map +1 -0
  21. package/dist/audio/asset.js +2 -0
  22. package/dist/audio/asset.js.map +1 -0
  23. package/dist/audio/audio-driver.d.ts +34 -0
  24. package/dist/audio/audio-driver.d.ts.map +1 -0
  25. package/dist/audio/audio-driver.js +2 -0
  26. package/dist/audio/audio-driver.js.map +1 -0
  27. package/dist/audio/audio-for-preview.d.ts +12 -0
  28. package/dist/audio/audio-for-preview.d.ts.map +1 -0
  29. package/dist/audio/audio-for-preview.js +70 -0
  30. package/dist/audio/audio-for-preview.js.map +1 -0
  31. package/dist/audio/audio-for-rendering.d.ts +16 -0
  32. package/dist/audio/audio-for-rendering.d.ts.map +1 -0
  33. package/dist/audio/audio-for-rendering.js +32 -0
  34. package/dist/audio/audio-for-rendering.js.map +1 -0
  35. package/dist/audio/audio-source-browser.d.ts +30 -0
  36. package/dist/audio/audio-source-browser.d.ts.map +1 -0
  37. package/dist/audio/audio-source-browser.js +139 -0
  38. package/dist/audio/audio-source-browser.js.map +1 -0
  39. package/dist/audio/audio-source.d.ts +38 -0
  40. package/dist/audio/audio-source.d.ts.map +1 -0
  41. package/dist/audio/audio-source.js +2 -0
  42. package/dist/audio/audio-source.js.map +1 -0
  43. package/dist/audio/index.d.ts +45 -0
  44. package/dist/audio/index.d.ts.map +1 -0
  45. package/dist/audio/index.js +143 -0
  46. package/dist/audio/index.js.map +1 -0
  47. package/dist/audio/mixer.d.ts +43 -0
  48. package/dist/audio/mixer.d.ts.map +1 -0
  49. package/dist/audio/mixer.js +51 -0
  50. package/dist/audio/mixer.js.map +1 -0
  51. package/dist/audio/types.d.ts +31 -0
  52. package/dist/audio/types.d.ts.map +1 -0
  53. package/dist/audio/types.js +2 -0
  54. package/dist/audio/types.js.map +1 -0
  55. package/dist/block.d.ts +16 -0
  56. package/dist/block.d.ts.map +1 -0
  57. package/dist/block.js +173 -0
  58. package/dist/block.js.map +1 -0
  59. package/dist/composition.d.ts.map +1 -0
  60. package/dist/composition.js.map +1 -0
  61. package/dist/easing.d.ts +22 -0
  62. package/dist/easing.d.ts.map +1 -0
  63. package/dist/easing.js +59 -0
  64. package/dist/easing.js.map +1 -0
  65. package/dist/emitter.d.ts +7 -0
  66. package/dist/emitter.d.ts.map +1 -0
  67. package/dist/emitter.js +29 -0
  68. package/dist/emitter.js.map +1 -0
  69. package/dist/engine/composition.d.ts +182 -0
  70. package/dist/engine/composition.d.ts.map +1 -0
  71. package/dist/engine/composition.js +527 -0
  72. package/dist/engine/composition.js.map +1 -0
  73. package/dist/engine/emitter.d.ts +7 -0
  74. package/dist/engine/emitter.d.ts.map +1 -0
  75. package/dist/engine/emitter.js +29 -0
  76. package/dist/engine/emitter.js.map +1 -0
  77. package/dist/engine/environment.d.ts +30 -0
  78. package/dist/engine/environment.d.ts.map +1 -0
  79. package/dist/engine/environment.js +27 -0
  80. package/dist/engine/environment.js.map +1 -0
  81. package/dist/engine/offsets.d.ts +39 -0
  82. package/dist/engine/offsets.d.ts.map +1 -0
  83. package/dist/engine/offsets.js +54 -0
  84. package/dist/engine/offsets.js.map +1 -0
  85. package/dist/engine/runtime-defaults.d.ts +50 -0
  86. package/dist/engine/runtime-defaults.d.ts.map +1 -0
  87. package/dist/engine/runtime-defaults.js +77 -0
  88. package/dist/engine/runtime-defaults.js.map +1 -0
  89. package/dist/engine/sequence.d.ts +44 -0
  90. package/dist/engine/sequence.d.ts.map +1 -0
  91. package/dist/engine/sequence.js +101 -0
  92. package/dist/engine/sequence.js.map +1 -0
  93. package/dist/engine/series.d.ts +40 -0
  94. package/dist/engine/series.d.ts.map +1 -0
  95. package/dist/engine/series.js +58 -0
  96. package/dist/engine/series.js.map +1 -0
  97. package/dist/engine/signal.d.ts +10 -0
  98. package/dist/engine/signal.d.ts.map +1 -0
  99. package/dist/engine/signal.js +39 -0
  100. package/dist/engine/signal.js.map +1 -0
  101. package/dist/environment.d.ts.map +1 -0
  102. package/dist/environment.js.map +1 -0
  103. package/dist/flex-engine.d.ts +31 -0
  104. package/dist/flex-engine.d.ts.map +1 -0
  105. package/dist/flex-engine.js +186 -0
  106. package/dist/flex-engine.js.map +1 -0
  107. package/dist/flex-types.d.ts +165 -0
  108. package/dist/flex-types.d.ts.map +1 -0
  109. package/dist/flex-types.js +2 -0
  110. package/dist/flex-types.js.map +1 -0
  111. package/dist/flex.d.ts +26 -0
  112. package/dist/flex.d.ts.map +1 -0
  113. package/dist/flex.js +179 -0
  114. package/dist/flex.js.map +1 -0
  115. package/dist/image.d.ts +10 -0
  116. package/dist/image.d.ts.map +1 -0
  117. package/dist/image.js +156 -0
  118. package/dist/image.js.map +1 -0
  119. package/dist/index.d.ts +34 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +28 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/interpolate-colors.d.ts +7 -0
  124. package/dist/interpolate-colors.d.ts.map +1 -0
  125. package/dist/interpolate-colors.js +240 -0
  126. package/dist/interpolate-colors.js.map +1 -0
  127. package/dist/interpolate.d.ts +12 -0
  128. package/dist/interpolate.d.ts.map +1 -0
  129. package/dist/interpolate.js +65 -0
  130. package/dist/interpolate.js.map +1 -0
  131. package/dist/layout/block.d.ts +54 -0
  132. package/dist/layout/block.d.ts.map +1 -0
  133. package/dist/layout/block.js +186 -0
  134. package/dist/layout/block.js.map +1 -0
  135. package/dist/layout/contract.d.ts +41 -0
  136. package/dist/layout/contract.d.ts.map +1 -0
  137. package/dist/layout/contract.js +8 -0
  138. package/dist/layout/contract.js.map +1 -0
  139. package/dist/layout/flex/engine.d.ts +31 -0
  140. package/dist/layout/flex/engine.d.ts.map +1 -0
  141. package/dist/layout/flex/engine.js +186 -0
  142. package/dist/layout/flex/engine.js.map +1 -0
  143. package/dist/layout/flex/flex.d.ts +31 -0
  144. package/dist/layout/flex/flex.d.ts.map +1 -0
  145. package/dist/layout/flex/flex.js +175 -0
  146. package/dist/layout/flex/flex.js.map +1 -0
  147. package/dist/layout/flex/mixin.d.ts +52 -0
  148. package/dist/layout/flex/mixin.d.ts.map +1 -0
  149. package/dist/layout/flex/mixin.js +114 -0
  150. package/dist/layout/flex/mixin.js.map +1 -0
  151. package/dist/layout/flex/types.d.ts +31 -0
  152. package/dist/layout/flex/types.d.ts.map +1 -0
  153. package/dist/layout/flex/types.js +2 -0
  154. package/dist/layout/flex/types.js.map +1 -0
  155. package/dist/layout/image.d.ts +46 -0
  156. package/dist/layout/image.d.ts.map +1 -0
  157. package/dist/layout/image.js +198 -0
  158. package/dist/layout/image.js.map +1 -0
  159. package/dist/layout/shapes.d.ts +72 -0
  160. package/dist/layout/shapes.d.ts.map +1 -0
  161. package/dist/layout/shapes.js +29 -0
  162. package/dist/layout/shapes.js.map +1 -0
  163. package/dist/layout/text/font.d.ts +92 -0
  164. package/dist/layout/text/font.d.ts.map +1 -0
  165. package/dist/layout/text/font.js +166 -0
  166. package/dist/layout/text/font.js.map +1 -0
  167. package/dist/layout/text/geometry.d.ts +31 -0
  168. package/dist/layout/text/geometry.d.ts.map +1 -0
  169. package/dist/layout/text/geometry.js +81 -0
  170. package/dist/layout/text/geometry.js.map +1 -0
  171. package/dist/layout/text/text.d.ts +98 -0
  172. package/dist/layout/text/text.d.ts.map +1 -0
  173. package/dist/layout/text/text.js +676 -0
  174. package/dist/layout/text/text.js.map +1 -0
  175. package/dist/layout/text/types.d.ts +103 -0
  176. package/dist/layout/text/types.d.ts.map +1 -0
  177. package/dist/layout/text/types.js +2 -0
  178. package/dist/layout/text/types.js.map +1 -0
  179. package/dist/media/audio/asset.d.ts +21 -0
  180. package/dist/media/audio/asset.d.ts.map +1 -0
  181. package/dist/media/audio/asset.js +2 -0
  182. package/dist/media/audio/asset.js.map +1 -0
  183. package/dist/media/audio/audio-driver.d.ts +34 -0
  184. package/dist/media/audio/audio-driver.d.ts.map +1 -0
  185. package/dist/media/audio/audio-driver.js +2 -0
  186. package/dist/media/audio/audio-driver.js.map +1 -0
  187. package/dist/media/audio/audio-for-preview.d.ts +47 -0
  188. package/dist/media/audio/audio-for-preview.d.ts.map +1 -0
  189. package/dist/media/audio/audio-for-preview.js +232 -0
  190. package/dist/media/audio/audio-for-preview.js.map +1 -0
  191. package/dist/media/audio/audio-for-rendering.d.ts +16 -0
  192. package/dist/media/audio/audio-for-rendering.d.ts.map +1 -0
  193. package/dist/media/audio/audio-for-rendering.js +32 -0
  194. package/dist/media/audio/audio-for-rendering.js.map +1 -0
  195. package/dist/media/audio/audio-source-browser.d.ts +30 -0
  196. package/dist/media/audio/audio-source-browser.d.ts.map +1 -0
  197. package/dist/media/audio/audio-source-browser.js +139 -0
  198. package/dist/media/audio/audio-source-browser.js.map +1 -0
  199. package/dist/media/audio/audio-source-mediabunny.d.ts +45 -0
  200. package/dist/media/audio/audio-source-mediabunny.d.ts.map +1 -0
  201. package/dist/media/audio/audio-source-mediabunny.js +79 -0
  202. package/dist/media/audio/audio-source-mediabunny.js.map +1 -0
  203. package/dist/media/audio/audio-source.d.ts +38 -0
  204. package/dist/media/audio/audio-source.d.ts.map +1 -0
  205. package/dist/media/audio/audio-source.js +2 -0
  206. package/dist/media/audio/audio-source.js.map +1 -0
  207. package/dist/media/audio/index.d.ts +57 -0
  208. package/dist/media/audio/index.d.ts.map +1 -0
  209. package/dist/media/audio/index.js +170 -0
  210. package/dist/media/audio/index.js.map +1 -0
  211. package/dist/media/audio/mixer.d.ts +43 -0
  212. package/dist/media/audio/mixer.d.ts.map +1 -0
  213. package/dist/media/audio/mixer.js +51 -0
  214. package/dist/media/audio/mixer.js.map +1 -0
  215. package/dist/media/audio/shared-audio-context.d.ts +30 -0
  216. package/dist/media/audio/shared-audio-context.d.ts.map +1 -0
  217. package/dist/media/audio/shared-audio-context.js +68 -0
  218. package/dist/media/audio/shared-audio-context.js.map +1 -0
  219. package/dist/media/audio/types.d.ts +31 -0
  220. package/dist/media/audio/types.d.ts.map +1 -0
  221. package/dist/media/audio/types.js +2 -0
  222. package/dist/media/audio/types.js.map +1 -0
  223. package/dist/media/media-marker.d.ts +26 -0
  224. package/dist/media/media-marker.d.ts.map +1 -0
  225. package/dist/media/media-marker.js +26 -0
  226. package/dist/media/media-marker.js.map +1 -0
  227. package/dist/media/media-time.d.ts +17 -0
  228. package/dist/media/media-time.d.ts.map +1 -0
  229. package/dist/media/media-time.js +17 -0
  230. package/dist/media/media-time.js.map +1 -0
  231. package/dist/media/video/driver.d.ts +31 -0
  232. package/dist/media/video/driver.d.ts.map +1 -0
  233. package/dist/media/video/driver.js +3 -0
  234. package/dist/media/video/driver.js.map +1 -0
  235. package/dist/media/video/index.d.ts +66 -0
  236. package/dist/media/video/index.d.ts.map +1 -0
  237. package/dist/media/video/index.js +372 -0
  238. package/dist/media/video/index.js.map +1 -0
  239. package/dist/media/video/types.d.ts +36 -0
  240. package/dist/media/video/types.d.ts.map +1 -0
  241. package/dist/media/video/types.js +2 -0
  242. package/dist/media/video/types.js.map +1 -0
  243. package/dist/media/video/video-for-preview.d.ts +17 -0
  244. package/dist/media/video/video-for-preview.d.ts.map +1 -0
  245. package/dist/media/video/video-for-preview.js +30 -0
  246. package/dist/media/video/video-for-preview.js.map +1 -0
  247. package/dist/media/video/video-for-rendering.d.ts +17 -0
  248. package/dist/media/video/video-for-rendering.d.ts.map +1 -0
  249. package/dist/media/video/video-for-rendering.js +59 -0
  250. package/dist/media/video/video-for-rendering.js.map +1 -0
  251. package/dist/media/video/video-source-browser.d.ts +37 -0
  252. package/dist/media/video/video-source-browser.d.ts.map +1 -0
  253. package/dist/media/video/video-source-browser.js +171 -0
  254. package/dist/media/video/video-source-browser.js.map +1 -0
  255. package/dist/media/video/video-source-mediabunny.d.ts +69 -0
  256. package/dist/media/video/video-source-mediabunny.d.ts.map +1 -0
  257. package/dist/media/video/video-source-mediabunny.js +236 -0
  258. package/dist/media/video/video-source-mediabunny.js.map +1 -0
  259. package/dist/media/video/video-source.d.ts +48 -0
  260. package/dist/media/video/video-source.d.ts.map +1 -0
  261. package/dist/media/video/video-source.js +2 -0
  262. package/dist/media/video/video-source.js.map +1 -0
  263. package/dist/media-marker.d.ts +19 -0
  264. package/dist/media-marker.d.ts.map +1 -0
  265. package/dist/media-marker.js +19 -0
  266. package/dist/media-marker.js.map +1 -0
  267. package/dist/media-time.d.ts +17 -0
  268. package/dist/media-time.d.ts.map +1 -0
  269. package/dist/media-time.js +17 -0
  270. package/dist/media-time.js.map +1 -0
  271. package/dist/signal.d.ts +10 -0
  272. package/dist/signal.d.ts.map +1 -0
  273. package/dist/signal.js +39 -0
  274. package/dist/signal.js.map +1 -0
  275. package/dist/text.d.ts +91 -0
  276. package/dist/text.d.ts.map +1 -0
  277. package/dist/text.js +704 -0
  278. package/dist/text.js.map +1 -0
  279. package/dist/video/driver.d.ts +31 -0
  280. package/dist/video/driver.d.ts.map +1 -0
  281. package/dist/video/driver.js +3 -0
  282. package/dist/video/driver.js.map +1 -0
  283. package/dist/video/index.d.ts +45 -0
  284. package/dist/video/index.d.ts.map +1 -0
  285. package/dist/video/index.js +276 -0
  286. package/dist/video/index.js.map +1 -0
  287. package/dist/video/types.d.ts +35 -0
  288. package/dist/video/types.d.ts.map +1 -0
  289. package/dist/video/types.js +2 -0
  290. package/dist/video/types.js.map +1 -0
  291. package/dist/video/video-for-preview.d.ts +12 -0
  292. package/dist/video/video-for-preview.d.ts.map +1 -0
  293. package/dist/video/video-for-preview.js +73 -0
  294. package/dist/video/video-for-preview.js.map +1 -0
  295. package/dist/video/video-for-rendering.d.ts +16 -0
  296. package/dist/video/video-for-rendering.d.ts.map +1 -0
  297. package/dist/video/video-for-rendering.js +45 -0
  298. package/dist/video/video-for-rendering.js.map +1 -0
  299. package/dist/video/video-source-browser.d.ts +37 -0
  300. package/dist/video/video-source-browser.d.ts.map +1 -0
  301. package/dist/video/video-source-browser.js +171 -0
  302. package/dist/video/video-source-browser.js.map +1 -0
  303. package/dist/video/video-source.d.ts +48 -0
  304. package/dist/video/video-source.d.ts.map +1 -0
  305. package/dist/video/video-source.js +2 -0
  306. package/dist/video/video-source.js.map +1 -0
  307. package/package.json +42 -0
@@ -0,0 +1,54 @@
1
+ import Konva from "konva";
2
+ import type { KMLayoutNode, LayoutBox } from "./contract.js";
3
+ import type { EdgeValue, FlexChildProps, FlexProps, SizeValue } from "./flex/types.js";
4
+ export type EdgeColor = string | [string, string] | [string, string, string, string] | {
5
+ top?: string;
6
+ right?: string;
7
+ bottom?: string;
8
+ left?: string;
9
+ };
10
+ export type GradientStop = [number, string];
11
+ export type GradientBackground = {
12
+ gradient: {
13
+ type: "linear" | "radial";
14
+ stops: GradientStop[];
15
+ angle?: number;
16
+ };
17
+ };
18
+ export type BackgroundValue = string | GradientBackground;
19
+ export type ShadowProps = {
20
+ color?: string;
21
+ blur?: number;
22
+ offsetX?: number;
23
+ offsetY?: number;
24
+ opacity?: number;
25
+ };
26
+ export type BlockConfig = Omit<Konva.GroupConfig, "width" | "height"> & FlexProps & FlexChildProps & {
27
+ width?: SizeValue;
28
+ height?: SizeValue;
29
+ borderSize?: EdgeValue;
30
+ borderColor?: EdgeColor;
31
+ borderStyle?: "solid" | "dashed";
32
+ shadow?: ShadowProps;
33
+ background?: BackgroundValue;
34
+ cornerRadius?: number | number[];
35
+ };
36
+ export declare class Block extends Konva.Group implements KMLayoutNode {
37
+ readonly _kmRole: "container";
38
+ private readonly _bg;
39
+ constructor(config: BlockConfig);
40
+ /**
41
+ * Lay this Block out as a standalone Flexily root, sizing it to its children
42
+ * (hug) or to its explicit width/height, then restyle the background. Called
43
+ * by Sequence each frame for direct-child Blocks; nested Blocks are laid out
44
+ * by their parent Flex instead.
45
+ */
46
+ computeLayout(): void;
47
+ /** @internal — {@link KMLayoutNode}: lay self out as a flex root (Sequence calls this). */
48
+ _kmComputeLayout(): void;
49
+ /** @internal — {@link KMLayoutNode}: write the computed box back + restyle the background. */
50
+ _kmPlace(box: LayoutBox): void;
51
+ /** @internal */
52
+ _layoutBackground(): void;
53
+ }
54
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/layout/block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvF,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,CAAC,MAAM,EAAE,MAAM,CAAC,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,kBAAkB,CAAC;AAE1D,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC,GACnE,SAAS,GACT,cAAc,GAAG;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAClC,CAAC;AAsCJ,qBAAa,KAAM,SAAQ,KAAK,CAAC,KAAM,YAAW,YAAY;IAC5D,QAAQ,CAAC,OAAO,EAAG,WAAW,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,MAAM,EAAE,WAAW;IAuC/B;;;;;OAKG;IACH,aAAa,IAAI,IAAI;IAKrB,2FAA2F;IAC3F,gBAAgB,IAAI,IAAI;IAIxB,8FAA8F;IAC9F,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAQ9B,gBAAgB;IAChB,iBAAiB,IAAI,IAAI;CAmB1B"}
@@ -0,0 +1,186 @@
1
+ import Konva from "konva";
2
+ import { normalizeEdges, parseSize } from "./flex/engine.js";
3
+ import { layoutRoot } from "./flex/flex.js";
4
+ const BLOCK_KEYS = [
5
+ "flexDirection",
6
+ "justifyContent",
7
+ "alignItems",
8
+ "gap",
9
+ "padding",
10
+ "flexGrow",
11
+ "flexShrink",
12
+ "flexBasis",
13
+ "alignSelf",
14
+ "margin",
15
+ "borderSize",
16
+ "borderColor",
17
+ "borderStyle",
18
+ "shadow",
19
+ "background",
20
+ ];
21
+ function pickKonvaConfig(config) {
22
+ const out = { ...config };
23
+ for (const k of BLOCK_KEYS)
24
+ delete out[k];
25
+ const w = parseSize(config.width);
26
+ const h = parseSize(config.height);
27
+ out.width = w?.kind === "px" ? w.value : undefined;
28
+ out.height = h?.kind === "px" ? h.value : undefined;
29
+ out.cornerRadius = undefined;
30
+ return out;
31
+ }
32
+ function firstColor(c) {
33
+ if (c === undefined)
34
+ return undefined;
35
+ if (typeof c === "string")
36
+ return c;
37
+ if (Array.isArray(c))
38
+ return c[0];
39
+ return c.top ?? c.right ?? c.bottom ?? c.left;
40
+ }
41
+ export class Block extends Konva.Group {
42
+ _kmRole = "container";
43
+ _bg;
44
+ constructor(config) {
45
+ super(pickKonvaConfig(config));
46
+ this._bg = new Konva.Rect({
47
+ x: 0,
48
+ y: 0,
49
+ width: 0,
50
+ height: 0,
51
+ listening: false,
52
+ cornerRadius: config.cornerRadius,
53
+ });
54
+ this._bg.setAttr("__blockBg", true);
55
+ super.add(this._bg);
56
+ this.setAttrs({
57
+ flexDirection: config.flexDirection,
58
+ justifyContent: config.justifyContent,
59
+ alignItems: config.alignItems,
60
+ gap: config.gap,
61
+ padding: config.padding,
62
+ flexGrow: config.flexGrow,
63
+ flexShrink: config.flexShrink,
64
+ flexBasis: config.flexBasis,
65
+ alignSelf: config.alignSelf,
66
+ margin: config.margin,
67
+ borderSize: config.borderSize,
68
+ borderColor: config.borderColor,
69
+ borderStyle: config.borderStyle ?? "solid",
70
+ shadow: config.shadow,
71
+ background: config.background,
72
+ cornerRadius: config.cornerRadius,
73
+ flexWidth: config.width,
74
+ flexHeight: config.height,
75
+ });
76
+ this.on("widthChange heightChange", () => this._layoutBackground());
77
+ this._layoutBackground();
78
+ }
79
+ /**
80
+ * Lay this Block out as a standalone Flexily root, sizing it to its children
81
+ * (hug) or to its explicit width/height, then restyle the background. Called
82
+ * by Sequence each frame for direct-child Blocks; nested Blocks are laid out
83
+ * by their parent Flex instead.
84
+ */
85
+ computeLayout() {
86
+ layoutRoot(this, true);
87
+ this._layoutBackground();
88
+ }
89
+ /** @internal — {@link KMLayoutNode}: lay self out as a flex root (Sequence calls this). */
90
+ _kmComputeLayout() {
91
+ this.computeLayout();
92
+ }
93
+ /** @internal — {@link KMLayoutNode}: write the computed box back + restyle the background. */
94
+ _kmPlace(box) {
95
+ this.x(box.left);
96
+ this.y(box.top);
97
+ this.width(box.width);
98
+ this.height(box.height);
99
+ this._layoutBackground();
100
+ }
101
+ /** @internal */
102
+ _layoutBackground() {
103
+ const w = this.width();
104
+ const h = this.height();
105
+ this._bg.x(0);
106
+ this._bg.y(0);
107
+ this._bg.width(w);
108
+ this._bg.height(h);
109
+ applyBackground(this._bg, this.attrs.background, w, h);
110
+ applyBorder(this._bg, normalizeEdges(this.attrs.borderSize), this.attrs.borderColor, this.attrs.borderStyle);
111
+ applyShadow(this._bg, this.attrs.shadow);
112
+ this._bg.cornerRadius(this.attrs.cornerRadius ?? 0);
113
+ this._bg.moveToBottom();
114
+ }
115
+ }
116
+ function applyBackground(rect, bg, w, h) {
117
+ rect.fill("");
118
+ rect.fillLinearGradientColorStops([]);
119
+ rect.fillRadialGradientColorStops([]);
120
+ if (bg === undefined)
121
+ return;
122
+ if (typeof bg === "string") {
123
+ rect.fill(bg);
124
+ return;
125
+ }
126
+ const g = bg.gradient;
127
+ if (!g)
128
+ return;
129
+ const stops = [];
130
+ for (const [pos, color] of g.stops) {
131
+ stops.push(pos, color);
132
+ }
133
+ if (g.type === "linear") {
134
+ const angle = ((g.angle ?? 0) * Math.PI) / 180;
135
+ const cx = w / 2;
136
+ const cy = h / 2;
137
+ const r = Math.max(w, h);
138
+ const dx = (Math.cos(angle) * r) / 2;
139
+ const dy = (Math.sin(angle) * r) / 2;
140
+ rect.fillLinearGradientStartPoint({ x: cx - dx, y: cy - dy });
141
+ rect.fillLinearGradientEndPoint({ x: cx + dx, y: cy + dy });
142
+ rect.fillLinearGradientColorStops(stops);
143
+ }
144
+ else {
145
+ rect.fillRadialGradientStartPoint({ x: w / 2, y: h / 2 });
146
+ rect.fillRadialGradientEndPoint({ x: w / 2, y: h / 2 });
147
+ rect.fillRadialGradientStartRadius(0);
148
+ rect.fillRadialGradientEndRadius(Math.max(w, h) / 2);
149
+ rect.fillRadialGradientColorStops(stops);
150
+ }
151
+ }
152
+ function applyBorder(rect, edges, color, style) {
153
+ if (!edges) {
154
+ rect.strokeWidth(0);
155
+ rect.stroke("");
156
+ rect.dashEnabled(false);
157
+ return;
158
+ }
159
+ const width = Math.max(...edges);
160
+ rect.strokeWidth(width);
161
+ rect.stroke(firstColor(color) ?? "#000");
162
+ if (style === "dashed") {
163
+ rect.dash([Math.max(2, width * 2), Math.max(2, width * 1.5)]);
164
+ rect.dashEnabled(true);
165
+ }
166
+ else {
167
+ rect.dashEnabled(false);
168
+ }
169
+ }
170
+ function applyShadow(rect, shadow) {
171
+ if (!shadow) {
172
+ rect.shadowEnabled(false);
173
+ return;
174
+ }
175
+ rect.shadowEnabled(true);
176
+ if (shadow.color !== undefined)
177
+ rect.shadowColor(shadow.color);
178
+ if (shadow.blur !== undefined)
179
+ rect.shadowBlur(shadow.blur);
180
+ if (shadow.offsetX !== undefined || shadow.offsetY !== undefined) {
181
+ rect.shadowOffset({ x: shadow.offsetX ?? 0, y: shadow.offsetY ?? 0 });
182
+ }
183
+ if (shadow.opacity !== undefined)
184
+ rect.shadowOpacity(shadow.opacity);
185
+ }
186
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/layout/block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Node as FlexilyNode } from "flexily/classic";
2
+ import type Konva from "konva";
3
+ /** A computed layout rectangle, in the parent's local coordinate space. */
4
+ export type LayoutBox = {
5
+ left: number;
6
+ top: number;
7
+ width: number;
8
+ height: number;
9
+ };
10
+ /** Context handed to {@link KMLayoutNode._kmMeasure}. */
11
+ export type MeasureContext = {
12
+ parentIsColumn: boolean;
13
+ };
14
+ /**
15
+ * The open contract that lets the flex engine ({@link buildChildren} /
16
+ * {@link writeBack} in `flex/flex.ts`) handle a node without an `instanceof`
17
+ * switch. Any wrapper that implements it self-describes how it participates in
18
+ * layout, so adding a new wrapped Konva element never requires editing the
19
+ * engine.
20
+ *
21
+ * - **container** (Flex/Block): the engine recurses into its children and reads
22
+ * its flex-container attrs; it usually also exposes {@link _kmComputeLayout}.
23
+ * - **leaf** (Image/Text/Video/shapes): the engine asks it to configure its own
24
+ * flexily sizing via {@link _kmMeasure}.
25
+ *
26
+ * After layout, every node gets {@link _kmPlace} to write the computed geometry
27
+ * back (position, size, and any internal restyle).
28
+ */
29
+ export interface KMLayoutNode {
30
+ readonly _kmRole: "container" | "leaf";
31
+ /** Leaf-only: configure this node's flexily size + intrinsic measure func. */
32
+ _kmMeasure?(flexNode: FlexilyNode, ctx: MeasureContext): void;
33
+ /** Write the computed box back onto the Konva node (+ internal relayout). */
34
+ _kmPlace(box: LayoutBox): void;
35
+ /** Container-only: lay self out as a standalone flex root (called by Sequence). */
36
+ _kmComputeLayout?(): void;
37
+ }
38
+ export declare function isKMLayoutNode(n: Konva.Node): n is Konva.Node & KMLayoutNode;
39
+ /** A container that can lay itself out as a flex root (Flex/Block). */
40
+ export declare function isKMLayoutRoot(n: Konva.Node): n is Konva.Node & Required<Pick<KMLayoutNode, "_kmComputeLayout">>;
41
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/layout/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,2EAA2E;AAC3E,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC;IACvC,8EAA8E;IAC9E,UAAU,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9D,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,mFAAmF;IACnF,gBAAgB,CAAC,IAAI,IAAI,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,YAAY,CAE5E;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAC5B,CAAC,EAAE,KAAK,CAAC,IAAI,GACZ,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAEpE"}
@@ -0,0 +1,8 @@
1
+ export function isKMLayoutNode(n) {
2
+ return typeof n._kmPlace === "function";
3
+ }
4
+ /** A container that can lay itself out as a flex root (Flex/Block). */
5
+ export function isKMLayoutRoot(n) {
6
+ return typeof n._kmComputeLayout === "function";
7
+ }
8
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/layout/contract.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,cAAc,CAAC,CAAa;IAC1C,OAAO,OAAQ,CAA2B,CAAC,QAAQ,KAAK,UAAU,CAAC;AACrE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAC5B,CAAa;IAEb,OAAO,OAAQ,CAA2B,CAAC,gBAAgB,KAAK,UAAU,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Node as FlexilyNode } from "flexily/classic";
2
+ import type Konva from "konva";
3
+ import type { EdgeValue, FlexChildProps, FlexProps, SizeValue } from "./types.js";
4
+ export type Edges = [number, number, number, number];
5
+ export declare function normalizeEdges(v: EdgeValue | undefined): Edges | null;
6
+ export declare function parseSize(v: SizeValue | undefined): {
7
+ kind: "px";
8
+ value: number;
9
+ } | {
10
+ kind: "pct";
11
+ value: number;
12
+ } | null;
13
+ export declare function applyEdges(node: FlexilyNode, edges: Edges | null, setter: "setPadding" | "setMargin" | "setBorder"): void;
14
+ export declare function applySize(node: FlexilyNode, w: SizeValue | undefined, h: SizeValue | undefined): void;
15
+ export declare function applyContainerProps(node: FlexilyNode, props: FlexProps): void;
16
+ export declare function applyChildProps(node: FlexilyNode, props: FlexChildProps): void;
17
+ export declare function setTextMeasure(node: FlexilyNode, text: Konva.Text, parentIsColumn: boolean): void;
18
+ /**
19
+ * Structural view of the `Text` wrapper — typed here (rather than imported)
20
+ * so this leaf module stays free of a cycle through `text.ts`.
21
+ */
22
+ type TextWrapper = {
23
+ _measureForFlex: (avail: number) => {
24
+ width: number;
25
+ height: number;
26
+ };
27
+ };
28
+ export declare function setTextWrapperMeasure(node: FlexilyNode, wrapper: TextWrapper, parentIsColumn: boolean): void;
29
+ export declare function setImageMeasure(node: FlexilyNode, image: Konva.Image): void;
30
+ export { FlexilyNode };
31
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/layout/flex/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAcL,IAAI,IAAI,WAAW,EAQpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAGV,SAAS,EACT,cAAc,EAEd,SAAS,EAET,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAErD,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,IAAI,CAUrE;AAED,wBAAgB,SAAS,CACvB,CAAC,EAAE,SAAS,GAAG,SAAS,GACvB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMvE;AAmDD,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,WAAW,GAC/C,IAAI,CAON;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,WAAW,EACjB,CAAC,EAAE,SAAS,GAAG,SAAS,EACxB,CAAC,EAAE,SAAS,GAAG,SAAS,GACvB,IAAI,CAWN;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAM7E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAM9E;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI,CAgCjG;AAED;;;GAGG;AACH,KAAK,WAAW,GAAG;IACjB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,OAAO,GACtB,IAAI,CAeN;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAc3E;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,186 @@
1
+ import { ALIGN_AUTO, ALIGN_CENTER, ALIGN_FLEX_END, ALIGN_FLEX_START, ALIGN_STRETCH, EDGE_BOTTOM, EDGE_LEFT, EDGE_RIGHT, EDGE_TOP, FLEX_DIRECTION_COLUMN, FLEX_DIRECTION_COLUMN_REVERSE, FLEX_DIRECTION_ROW, FLEX_DIRECTION_ROW_REVERSE, Node as FlexilyNode, GUTTER_ALL, JUSTIFY_CENTER, JUSTIFY_FLEX_END, JUSTIFY_FLEX_START, JUSTIFY_SPACE_AROUND, JUSTIFY_SPACE_BETWEEN, JUSTIFY_SPACE_EVENLY, } from "flexily/classic";
2
+ export function normalizeEdges(v) {
3
+ if (v === undefined)
4
+ return null;
5
+ if (typeof v === "number")
6
+ return [v, v, v, v];
7
+ if (Array.isArray(v)) {
8
+ if (v.length === 2)
9
+ return [v[0], v[1], v[0], v[1]];
10
+ if (v.length === 4)
11
+ return [v[0], v[1], v[2], v[3]];
12
+ }
13
+ else {
14
+ return [v.top ?? 0, v.right ?? 0, v.bottom ?? 0, v.left ?? 0];
15
+ }
16
+ return null;
17
+ }
18
+ export function parseSize(v) {
19
+ if (v === undefined)
20
+ return null;
21
+ if (typeof v === "number")
22
+ return { kind: "px", value: v };
23
+ const m = /^(-?\d+(?:\.\d+)?)%$/.exec(v);
24
+ if (m)
25
+ return { kind: "pct", value: Number.parseFloat(m[1] ?? "0") };
26
+ return null;
27
+ }
28
+ function flexDirection(v) {
29
+ switch (v) {
30
+ case "row":
31
+ return FLEX_DIRECTION_ROW;
32
+ case "column":
33
+ return FLEX_DIRECTION_COLUMN;
34
+ case "row-reverse":
35
+ return FLEX_DIRECTION_ROW_REVERSE;
36
+ case "column-reverse":
37
+ return FLEX_DIRECTION_COLUMN_REVERSE;
38
+ }
39
+ }
40
+ function justifyContent(v) {
41
+ switch (v) {
42
+ case "flex-start":
43
+ return JUSTIFY_FLEX_START;
44
+ case "center":
45
+ return JUSTIFY_CENTER;
46
+ case "flex-end":
47
+ return JUSTIFY_FLEX_END;
48
+ case "space-between":
49
+ return JUSTIFY_SPACE_BETWEEN;
50
+ case "space-around":
51
+ return JUSTIFY_SPACE_AROUND;
52
+ case "space-evenly":
53
+ return JUSTIFY_SPACE_EVENLY;
54
+ }
55
+ }
56
+ function alignItems(v) {
57
+ switch (v) {
58
+ case "flex-start":
59
+ return ALIGN_FLEX_START;
60
+ case "center":
61
+ return ALIGN_CENTER;
62
+ case "flex-end":
63
+ return ALIGN_FLEX_END;
64
+ case "stretch":
65
+ return ALIGN_STRETCH;
66
+ }
67
+ }
68
+ function alignSelfValue(v) {
69
+ return v === "auto" ? ALIGN_AUTO : alignItems(v);
70
+ }
71
+ const EDGE_BY_INDEX = [EDGE_TOP, EDGE_RIGHT, EDGE_BOTTOM, EDGE_LEFT];
72
+ export function applyEdges(node, edges, setter) {
73
+ if (!edges)
74
+ return;
75
+ for (let i = 0; i < 4; i++) {
76
+ const e = EDGE_BY_INDEX[i];
77
+ const val = edges[i];
78
+ if (e !== undefined && val !== undefined)
79
+ node[setter](e, val);
80
+ }
81
+ }
82
+ export function applySize(node, w, h) {
83
+ const pw = parseSize(w);
84
+ const ph = parseSize(h);
85
+ if (pw) {
86
+ if (pw.kind === "px")
87
+ node.setWidth(pw.value);
88
+ else
89
+ node.setWidthPercent(pw.value);
90
+ }
91
+ if (ph) {
92
+ if (ph.kind === "px")
93
+ node.setHeight(ph.value);
94
+ else
95
+ node.setHeightPercent(ph.value);
96
+ }
97
+ }
98
+ export function applyContainerProps(node, props) {
99
+ node.setFlexDirection(flexDirection(props.flexDirection ?? "row"));
100
+ if (props.justifyContent)
101
+ node.setJustifyContent(justifyContent(props.justifyContent));
102
+ if (props.alignItems)
103
+ node.setAlignItems(alignItems(props.alignItems));
104
+ if (props.gap !== undefined)
105
+ node.setGap(GUTTER_ALL, props.gap);
106
+ applyEdges(node, normalizeEdges(props.padding), "setPadding");
107
+ }
108
+ export function applyChildProps(node, props) {
109
+ if (props.flexGrow !== undefined)
110
+ node.setFlexGrow(props.flexGrow);
111
+ if (props.flexShrink !== undefined)
112
+ node.setFlexShrink(props.flexShrink);
113
+ if (props.flexBasis !== undefined)
114
+ node.setFlexBasis(props.flexBasis);
115
+ if (props.alignSelf !== undefined)
116
+ node.setAlignSelf(alignSelfValue(props.alignSelf));
117
+ applyEdges(node, normalizeEdges(props.margin), "setMargin");
118
+ }
119
+ export function setTextMeasure(node, text, parentIsColumn) {
120
+ if (text.attrs.wrap === undefined)
121
+ text.wrap("word");
122
+ node.setMeasureFunc((arg0, _wMode, arg2) => {
123
+ // flexily quirk: from the flex-basis path, args are (mainAxis, mainMode, crossAxis, crossMode).
124
+ // For a column parent, the cross-axis (width we want to wrap to) is the THIRD arg.
125
+ const widthCandidates = parentIsColumn ? [arg2, arg0] : [arg0, arg2];
126
+ let avail = 0;
127
+ for (const c of widthCandidates) {
128
+ if (Number.isFinite(c) && c > 0) {
129
+ avail = c;
130
+ break;
131
+ }
132
+ }
133
+ const w = avail > 0 ? avail : 1e9;
134
+ const prevWidth = text.attrs.width;
135
+ text.width(w);
136
+ const ti = text;
137
+ ti._setTextData();
138
+ const lines = ti.textArr.length || 1;
139
+ const fontSize = text.fontSize();
140
+ const lineHeight = text.lineHeight();
141
+ const padding = text.padding() ?? 0;
142
+ const longest = ti.textArr.reduce((m, l) => Math.max(m, l.width), 0);
143
+ // Konva's per-line width (a sum of word widths) can fall a subpixel short of
144
+ // the width actually needed to render that line without wrapping. Writing the
145
+ // measured width back verbatim would then force a spurious extra wrap (e.g. a
146
+ // short label spilling its last word onto a second line), so round up.
147
+ const measuredW = Math.ceil(longest) + padding * 2 + 1;
148
+ const measuredH = lines * fontSize * lineHeight + padding * 2;
149
+ text.setAttr("width", prevWidth);
150
+ return { width: Math.min(measuredW, w), height: measuredH };
151
+ });
152
+ }
153
+ export function setTextWrapperMeasure(node, wrapper, parentIsColumn) {
154
+ node.setMeasureFunc((arg0, _wMode, arg2) => {
155
+ // Same flexily arg quirk as setTextMeasure: for a column parent the wrap
156
+ // width is the cross-axis (third) arg.
157
+ const widthCandidates = parentIsColumn ? [arg2, arg0] : [arg0, arg2];
158
+ let avail = 0;
159
+ for (const c of widthCandidates) {
160
+ if (Number.isFinite(c) && c > 0) {
161
+ avail = c;
162
+ break;
163
+ }
164
+ }
165
+ const { width, height } = wrapper._measureForFlex(avail > 0 ? avail : 1e9);
166
+ return { width: avail > 0 ? Math.min(width, avail) : width, height };
167
+ });
168
+ }
169
+ export function setImageMeasure(node, image) {
170
+ const src = image.image();
171
+ let w = 0;
172
+ let h = 0;
173
+ if (src && "naturalWidth" in src) {
174
+ w = src.naturalWidth;
175
+ h = src.naturalHeight;
176
+ }
177
+ else if (src) {
178
+ w = src.width;
179
+ h = src.height;
180
+ }
181
+ if (w > 0 && h > 0) {
182
+ node.setMeasureFunc(() => ({ width: w, height: h }));
183
+ }
184
+ }
185
+ export { FlexilyNode };
186
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/layout/flex/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import Konva from "konva";
2
+ import { type KMLayoutNode, type LayoutBox } from "../contract.js";
3
+ import { FlexilyNode } from "./engine.js";
4
+ import type { FlexConfig } from "./types.js";
5
+ export declare class Flex extends Konva.Group implements KMLayoutNode {
6
+ readonly _kmRole: "container";
7
+ constructor(config: FlexConfig);
8
+ computeLayout(): void;
9
+ /** @internal — {@link KMLayoutNode}: lay self out as a flex root (Sequence calls this). */
10
+ _kmComputeLayout(): void;
11
+ /** @internal — {@link KMLayoutNode}: write the computed box back (nested in a parent flex). */
12
+ _kmPlace(box: LayoutBox): void;
13
+ }
14
+ /**
15
+ * Lay out a Konva.Group as a Flexily root: build the layout tree from the
16
+ * group's attrs + children, compute, and write positions/sizes back.
17
+ *
18
+ * When `alwaysSetSize` is true the group's own width/height are always pulled
19
+ * from the computed content size — needed for a hug-content root that draws a
20
+ * background (Block) so the background isn't 0×0. Flex passes false, preserving
21
+ * its behavior of only writing self-size when an explicit px size is given.
22
+ */
23
+ export declare function layoutRoot(group: Konva.Group, alwaysSetSize: boolean): void;
24
+ type Pair = {
25
+ konva: Konva.Node;
26
+ flex: ReturnType<typeof FlexilyNode.create>;
27
+ };
28
+ export declare function buildChildren(children: readonly Konva.Node[], parentFlex: ReturnType<typeof FlexilyNode.create>, pairs: Pair[], parentDirection?: string): void;
29
+ export declare function writeBack(pairs: Pair[]): void;
30
+ export {};
31
+ //# sourceMappingURL=flex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flex.d.ts","sourceRoot":"","sources":["../../../src/layout/flex/flex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAkB,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAIL,WAAW,EAIZ,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAkB,UAAU,EAAwB,MAAM,YAAY,CAAC;AAyBnF,qBAAa,IAAK,SAAQ,KAAK,CAAC,KAAM,YAAW,YAAY;IAC3D,QAAQ,CAAC,OAAO,EAAG,WAAW,CAAU;gBAE5B,MAAM,EAAE,UAAU;IAkB9B,aAAa,IAAI,IAAI;IAIrB,2FAA2F;IAC3F,gBAAgB,IAAI,IAAI;IAIxB,+FAA+F;IAC/F,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;CAM/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CAkB3E;AAED,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;CAC7C,CAAC;AAWF,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,SAAS,KAAK,CAAC,IAAI,EAAE,EAC/B,UAAU,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,MAAM,CAAC,EACjD,KAAK,EAAE,IAAI,EAAE,EACb,eAAe,SAAQ,GACtB,IAAI,CA+CN;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CA2B7C"}