@tachui/core 0.7.0-alpha1

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 (1327) hide show
  1. package/LICENSE +363 -0
  2. package/dist/assets/Asset.cjs +2 -0
  3. package/dist/assets/Asset.cjs.map +1 -0
  4. package/dist/assets/Asset.d.ts +11 -0
  5. package/dist/assets/Asset.d.ts.map +1 -0
  6. package/dist/assets/Asset.js +9 -0
  7. package/dist/assets/Asset.js.map +1 -0
  8. package/dist/assets/AssetCollection.cjs +2 -0
  9. package/dist/assets/AssetCollection.cjs.map +1 -0
  10. package/dist/assets/AssetCollection.d.ts +14 -0
  11. package/dist/assets/AssetCollection.d.ts.map +1 -0
  12. package/dist/assets/AssetCollection.js +44 -0
  13. package/dist/assets/AssetCollection.js.map +1 -0
  14. package/dist/assets/ColorAsset.cjs +2 -0
  15. package/dist/assets/ColorAsset.cjs.map +1 -0
  16. package/dist/assets/ColorAsset.d.ts +31 -0
  17. package/dist/assets/ColorAsset.d.ts.map +1 -0
  18. package/dist/assets/ColorAsset.js +114 -0
  19. package/dist/assets/ColorAsset.js.map +1 -0
  20. package/dist/assets/FontAsset.cjs +9 -0
  21. package/dist/assets/FontAsset.cjs.map +1 -0
  22. package/dist/assets/FontAsset.d.ts +114 -0
  23. package/dist/assets/FontAsset.d.ts.map +1 -0
  24. package/dist/assets/FontAsset.js +173 -0
  25. package/dist/assets/FontAsset.js.map +1 -0
  26. package/dist/assets/ImageAsset.cjs +2 -0
  27. package/dist/assets/ImageAsset.cjs.map +1 -0
  28. package/dist/assets/ImageAsset.d.ts +35 -0
  29. package/dist/assets/ImageAsset.d.ts.map +1 -0
  30. package/dist/assets/ImageAsset.js +39 -0
  31. package/dist/assets/ImageAsset.js.map +1 -0
  32. package/dist/assets/index.cjs +2 -0
  33. package/dist/assets/index.cjs.map +1 -0
  34. package/dist/assets/index.d.ts +26 -0
  35. package/dist/assets/index.d.ts.map +1 -0
  36. package/dist/assets/index.js +119 -0
  37. package/dist/assets/index.js.map +1 -0
  38. package/dist/assets/types.d.ts +70 -0
  39. package/dist/assets/types.d.ts.map +1 -0
  40. package/dist/bundles/common.d.ts +24 -0
  41. package/dist/bundles/common.d.ts.map +1 -0
  42. package/dist/bundles/complete.d.ts +27 -0
  43. package/dist/bundles/complete.d.ts.map +1 -0
  44. package/dist/bundles/essential.d.ts +24 -0
  45. package/dist/bundles/essential.d.ts.map +1 -0
  46. package/dist/bundles/minimal.d.ts +24 -0
  47. package/dist/bundles/minimal.d.ts.map +1 -0
  48. package/dist/bundles/production-minimal.d.ts +35 -0
  49. package/dist/bundles/production-minimal.d.ts.map +1 -0
  50. package/dist/common.cjs +2 -0
  51. package/dist/common.cjs.map +1 -0
  52. package/dist/common.js +985 -0
  53. package/dist/common.js.map +1 -0
  54. package/dist/compiler/advanced-parser.cjs +5 -0
  55. package/dist/compiler/advanced-parser.cjs.map +1 -0
  56. package/dist/compiler/advanced-parser.d.ts +113 -0
  57. package/dist/compiler/advanced-parser.d.ts.map +1 -0
  58. package/dist/compiler/advanced-parser.js +440 -0
  59. package/dist/compiler/advanced-parser.js.map +1 -0
  60. package/dist/compiler/codegen.cjs +6 -0
  61. package/dist/compiler/codegen.cjs.map +1 -0
  62. package/dist/compiler/codegen.d.ts +20 -0
  63. package/dist/compiler/codegen.d.ts.map +1 -0
  64. package/dist/compiler/codegen.js +241 -0
  65. package/dist/compiler/codegen.js.map +1 -0
  66. package/dist/compiler/enhanced-codegen.cjs +6 -0
  67. package/dist/compiler/enhanced-codegen.cjs.map +1 -0
  68. package/dist/compiler/enhanced-codegen.d.ts +121 -0
  69. package/dist/compiler/enhanced-codegen.d.ts.map +1 -0
  70. package/dist/compiler/enhanced-codegen.js +347 -0
  71. package/dist/compiler/enhanced-codegen.js.map +1 -0
  72. package/dist/compiler/index.cjs +2 -0
  73. package/dist/compiler/index.cjs.map +1 -0
  74. package/dist/compiler/index.d.ts +14 -0
  75. package/dist/compiler/index.d.ts.map +1 -0
  76. package/dist/compiler/index.js +13 -0
  77. package/dist/compiler/index.js.map +1 -0
  78. package/dist/compiler/parser.cjs +5 -0
  79. package/dist/compiler/parser.cjs.map +1 -0
  80. package/dist/compiler/parser.d.ts +12 -0
  81. package/dist/compiler/parser.d.ts.map +1 -0
  82. package/dist/compiler/parser.js +275 -0
  83. package/dist/compiler/parser.js.map +1 -0
  84. package/dist/compiler/plugin.cjs +33 -0
  85. package/dist/compiler/plugin.cjs.map +1 -0
  86. package/dist/compiler/plugin.d.ts +13 -0
  87. package/dist/compiler/plugin.d.ts.map +1 -0
  88. package/dist/compiler/plugin.js +103 -0
  89. package/dist/compiler/plugin.js.map +1 -0
  90. package/dist/compiler/types.d.ts +149 -0
  91. package/dist/compiler/types.d.ts.map +1 -0
  92. package/dist/components/BasicInput.cjs +2 -0
  93. package/dist/components/BasicInput.cjs.map +1 -0
  94. package/dist/components/BasicInput.d.ts +116 -0
  95. package/dist/components/BasicInput.d.ts.map +1 -0
  96. package/dist/components/BasicInput.js +182 -0
  97. package/dist/components/BasicInput.js.map +1 -0
  98. package/dist/components/Button.cjs +7 -0
  99. package/dist/components/Button.cjs.map +1 -0
  100. package/dist/components/Button.d.ts +252 -0
  101. package/dist/components/Button.d.ts.map +1 -0
  102. package/dist/components/Button.js +408 -0
  103. package/dist/components/Button.js.map +1 -0
  104. package/dist/components/Divider.cjs +2 -0
  105. package/dist/components/Divider.cjs.map +1 -0
  106. package/dist/components/Divider.d.ts +141 -0
  107. package/dist/components/Divider.d.ts.map +1 -0
  108. package/dist/components/Divider.js +187 -0
  109. package/dist/components/Divider.js.map +1 -0
  110. package/dist/components/EnhancedLink.cjs +2 -0
  111. package/dist/components/EnhancedLink.cjs.map +1 -0
  112. package/dist/components/EnhancedLink.d.ts +365 -0
  113. package/dist/components/EnhancedLink.d.ts.map +1 -0
  114. package/dist/components/EnhancedLink.js +345 -0
  115. package/dist/components/EnhancedLink.js.map +1 -0
  116. package/dist/components/Form.cjs +2 -0
  117. package/dist/components/Form.cjs.map +1 -0
  118. package/dist/components/Form.d.ts +141 -0
  119. package/dist/components/Form.d.ts.map +1 -0
  120. package/dist/components/Form.js +244 -0
  121. package/dist/components/Form.js.map +1 -0
  122. package/dist/components/Grid.cjs +2 -0
  123. package/dist/components/Grid.cjs.map +1 -0
  124. package/dist/components/Grid.d.ts +698 -0
  125. package/dist/components/Grid.d.ts.map +1 -0
  126. package/dist/components/Grid.js +1045 -0
  127. package/dist/components/Grid.js.map +1 -0
  128. package/dist/components/GridResponsive.cjs +2 -0
  129. package/dist/components/GridResponsive.cjs.map +1 -0
  130. package/dist/components/GridResponsive.d.ts +214 -0
  131. package/dist/components/GridResponsive.d.ts.map +1 -0
  132. package/dist/components/GridResponsive.js +382 -0
  133. package/dist/components/GridResponsive.js.map +1 -0
  134. package/dist/components/Image.cjs +2 -0
  135. package/dist/components/Image.cjs.map +1 -0
  136. package/dist/components/Image.d.ts +162 -0
  137. package/dist/components/Image.d.ts.map +1 -0
  138. package/dist/components/Image.js +212 -0
  139. package/dist/components/Image.js.map +1 -0
  140. package/dist/components/List.cjs +2 -0
  141. package/dist/components/List.cjs.map +1 -0
  142. package/dist/components/List.d.ts +287 -0
  143. package/dist/components/List.d.ts.map +1 -0
  144. package/dist/components/List.js +561 -0
  145. package/dist/components/List.js.map +1 -0
  146. package/dist/components/Menu.cjs +2 -0
  147. package/dist/components/Menu.cjs.map +1 -0
  148. package/dist/components/Menu.d.ts +159 -0
  149. package/dist/components/Menu.d.ts.map +1 -0
  150. package/dist/components/Menu.js +443 -0
  151. package/dist/components/Menu.js.map +1 -0
  152. package/dist/components/Picker.cjs +2 -0
  153. package/dist/components/Picker.cjs.map +1 -0
  154. package/dist/components/Picker.d.ts +153 -0
  155. package/dist/components/Picker.d.ts.map +1 -0
  156. package/dist/components/Picker.js +478 -0
  157. package/dist/components/Picker.js.map +1 -0
  158. package/dist/components/ScrollView.cjs +6 -0
  159. package/dist/components/ScrollView.cjs.map +1 -0
  160. package/dist/components/ScrollView.d.ts +222 -0
  161. package/dist/components/ScrollView.d.ts.map +1 -0
  162. package/dist/components/ScrollView.js +363 -0
  163. package/dist/components/ScrollView.js.map +1 -0
  164. package/dist/components/Section.cjs +2 -0
  165. package/dist/components/Section.cjs.map +1 -0
  166. package/dist/components/Section.d.ts +153 -0
  167. package/dist/components/Section.d.ts.map +1 -0
  168. package/dist/components/Section.js +323 -0
  169. package/dist/components/Section.js.map +1 -0
  170. package/dist/components/Show.cjs +2 -0
  171. package/dist/components/Show.cjs.map +1 -0
  172. package/dist/components/Show.d.ts +64 -0
  173. package/dist/components/Show.d.ts.map +1 -0
  174. package/dist/components/Show.js +112 -0
  175. package/dist/components/Show.js.map +1 -0
  176. package/dist/components/Spacer.cjs +2 -0
  177. package/dist/components/Spacer.cjs.map +1 -0
  178. package/dist/components/Spacer.d.ts +35 -0
  179. package/dist/components/Spacer.d.ts.map +1 -0
  180. package/dist/components/Spacer.js +53 -0
  181. package/dist/components/Spacer.js.map +1 -0
  182. package/dist/components/Text.cjs +2 -0
  183. package/dist/components/Text.cjs.map +1 -0
  184. package/dist/components/Text.d.ts +242 -0
  185. package/dist/components/Text.d.ts.map +1 -0
  186. package/dist/components/Text.js +193 -0
  187. package/dist/components/Text.js.map +1 -0
  188. package/dist/components/Toggle.cjs +2 -0
  189. package/dist/components/Toggle.cjs.map +1 -0
  190. package/dist/components/Toggle.d.ts +207 -0
  191. package/dist/components/Toggle.d.ts.map +1 -0
  192. package/dist/components/Toggle.js +477 -0
  193. package/dist/components/Toggle.js.map +1 -0
  194. package/dist/components/index.cjs +2 -0
  195. package/dist/components/index.cjs.map +1 -0
  196. package/dist/components/index.d.ts +45 -0
  197. package/dist/components/index.d.ts.map +1 -0
  198. package/dist/components/index.js +104 -0
  199. package/dist/components/index.js.map +1 -0
  200. package/dist/components/wrapper.cjs +2 -0
  201. package/dist/components/wrapper.cjs.map +1 -0
  202. package/dist/components/wrapper.d.ts +249 -0
  203. package/dist/components/wrapper.d.ts.map +1 -0
  204. package/dist/components/wrapper.js +484 -0
  205. package/dist/components/wrapper.js.map +1 -0
  206. package/dist/concatenation/concatenatable.cjs +2 -0
  207. package/dist/concatenation/concatenatable.cjs.map +1 -0
  208. package/dist/concatenation/concatenatable.d.ts +63 -0
  209. package/dist/concatenation/concatenatable.d.ts.map +1 -0
  210. package/dist/concatenation/concatenatable.js +118 -0
  211. package/dist/concatenation/concatenatable.js.map +1 -0
  212. package/dist/concatenation/concatenated-component.cjs +2 -0
  213. package/dist/concatenation/concatenated-component.cjs.map +1 -0
  214. package/dist/concatenation/concatenated-component.d.ts +110 -0
  215. package/dist/concatenation/concatenated-component.d.ts.map +1 -0
  216. package/dist/concatenation/concatenated-component.js +276 -0
  217. package/dist/concatenation/concatenated-component.js.map +1 -0
  218. package/dist/concatenation/index.d.ts +13 -0
  219. package/dist/concatenation/index.d.ts.map +1 -0
  220. package/dist/concatenation/text-optimizer.cjs +2 -0
  221. package/dist/concatenation/text-optimizer.cjs.map +1 -0
  222. package/dist/concatenation/text-optimizer.d.ts +104 -0
  223. package/dist/concatenation/text-optimizer.d.ts.map +1 -0
  224. package/dist/concatenation/text-optimizer.js +236 -0
  225. package/dist/concatenation/text-optimizer.js.map +1 -0
  226. package/dist/concatenation/types.cjs +2 -0
  227. package/dist/concatenation/types.cjs.map +1 -0
  228. package/dist/concatenation/types.d.ts +88 -0
  229. package/dist/concatenation/types.d.ts.map +1 -0
  230. package/dist/concatenation/types.js +13 -0
  231. package/dist/concatenation/types.js.map +1 -0
  232. package/dist/constants/frame-utils.cjs +2 -0
  233. package/dist/constants/frame-utils.cjs.map +1 -0
  234. package/dist/constants/frame-utils.d.ts +68 -0
  235. package/dist/constants/frame-utils.d.ts.map +1 -0
  236. package/dist/constants/frame-utils.js +116 -0
  237. package/dist/constants/frame-utils.js.map +1 -0
  238. package/dist/constants/index.d.ts +8 -0
  239. package/dist/constants/index.d.ts.map +1 -0
  240. package/dist/constants/layout.cjs +2 -0
  241. package/dist/constants/layout.cjs.map +1 -0
  242. package/dist/constants/layout.d.ts +60 -0
  243. package/dist/constants/layout.d.ts.map +1 -0
  244. package/dist/constants/layout.js +46 -0
  245. package/dist/constants/layout.js.map +1 -0
  246. package/dist/css-classes/component-base.cjs +2 -0
  247. package/dist/css-classes/component-base.cjs.map +1 -0
  248. package/dist/css-classes/component-base.d.ts +40 -0
  249. package/dist/css-classes/component-base.d.ts.map +1 -0
  250. package/dist/css-classes/component-base.js +62 -0
  251. package/dist/css-classes/component-base.js.map +1 -0
  252. package/dist/css-classes/css-class-manager.cjs +2 -0
  253. package/dist/css-classes/css-class-manager.cjs.map +1 -0
  254. package/dist/css-classes/css-class-manager.d.ts +89 -0
  255. package/dist/css-classes/css-class-manager.d.ts.map +1 -0
  256. package/dist/css-classes/css-class-manager.js +209 -0
  257. package/dist/css-classes/css-class-manager.js.map +1 -0
  258. package/dist/css-classes/dom-integration.cjs +2 -0
  259. package/dist/css-classes/dom-integration.cjs.map +1 -0
  260. package/dist/css-classes/dom-integration.d.ts +76 -0
  261. package/dist/css-classes/dom-integration.d.ts.map +1 -0
  262. package/dist/css-classes/dom-integration.js +67 -0
  263. package/dist/css-classes/dom-integration.js.map +1 -0
  264. package/dist/css-classes/enhanced-renderer.cjs +2 -0
  265. package/dist/css-classes/enhanced-renderer.cjs.map +1 -0
  266. package/dist/css-classes/enhanced-renderer.d.ts +42 -0
  267. package/dist/css-classes/enhanced-renderer.d.ts.map +1 -0
  268. package/dist/css-classes/enhanced-renderer.js +73 -0
  269. package/dist/css-classes/enhanced-renderer.js.map +1 -0
  270. package/dist/css-classes/index.d.ts +14 -0
  271. package/dist/css-classes/index.d.ts.map +1 -0
  272. package/dist/css-classes/types.d.ts +59 -0
  273. package/dist/css-classes/types.d.ts.map +1 -0
  274. package/dist/css-classes/utilities.cjs +2 -0
  275. package/dist/css-classes/utilities.cjs.map +1 -0
  276. package/dist/css-classes/utilities.d.ts +104 -0
  277. package/dist/css-classes/utilities.d.ts.map +1 -0
  278. package/dist/css-classes/utilities.js +41 -0
  279. package/dist/css-classes/utilities.js.map +1 -0
  280. package/dist/debug/index.d.ts +61 -0
  281. package/dist/debug/index.d.ts.map +1 -0
  282. package/dist/debug.cjs +52 -0
  283. package/dist/debug.cjs.map +1 -0
  284. package/dist/debug.js +179 -0
  285. package/dist/debug.js.map +1 -0
  286. package/dist/developer-experience/enhanced-errors.d.ts +128 -0
  287. package/dist/developer-experience/enhanced-errors.d.ts.map +1 -0
  288. package/dist/developer-experience/enhanced-types.d.ts +281 -0
  289. package/dist/developer-experience/enhanced-types.d.ts.map +1 -0
  290. package/dist/developer-experience/index.d.ts +44 -0
  291. package/dist/developer-experience/index.d.ts.map +1 -0
  292. package/dist/essential.cjs +2 -0
  293. package/dist/essential.cjs.map +1 -0
  294. package/dist/essential.js +968 -0
  295. package/dist/essential.js.map +1 -0
  296. package/dist/gradients/css-generator.cjs +2 -0
  297. package/dist/gradients/css-generator.cjs.map +1 -0
  298. package/dist/gradients/css-generator.d.ts +10 -0
  299. package/dist/gradients/css-generator.d.ts.map +1 -0
  300. package/dist/gradients/css-generator.js +100 -0
  301. package/dist/gradients/css-generator.js.map +1 -0
  302. package/dist/gradients/examples.cjs +2 -0
  303. package/dist/gradients/examples.cjs.map +1 -0
  304. package/dist/gradients/examples.d.ts +432 -0
  305. package/dist/gradients/examples.d.ts.map +1 -0
  306. package/dist/gradients/examples.js +555 -0
  307. package/dist/gradients/examples.js.map +1 -0
  308. package/dist/gradients/gradient-asset.cjs +2 -0
  309. package/dist/gradients/gradient-asset.cjs.map +1 -0
  310. package/dist/gradients/gradient-asset.d.ts +10 -0
  311. package/dist/gradients/gradient-asset.d.ts.map +1 -0
  312. package/dist/gradients/gradient-asset.js +22 -0
  313. package/dist/gradients/gradient-asset.js.map +1 -0
  314. package/dist/gradients/index.cjs +2 -0
  315. package/dist/gradients/index.cjs.map +1 -0
  316. package/dist/gradients/index.d.ts +19 -0
  317. package/dist/gradients/index.d.ts.map +1 -0
  318. package/dist/gradients/index.js +78 -0
  319. package/dist/gradients/index.js.map +1 -0
  320. package/dist/gradients/performance.cjs +2 -0
  321. package/dist/gradients/performance.cjs.map +1 -0
  322. package/dist/gradients/performance.d.ts +146 -0
  323. package/dist/gradients/performance.d.ts.map +1 -0
  324. package/dist/gradients/performance.js +237 -0
  325. package/dist/gradients/performance.js.map +1 -0
  326. package/dist/gradients/presets.cjs +2 -0
  327. package/dist/gradients/presets.cjs.map +1 -0
  328. package/dist/gradients/presets.d.ts +165 -0
  329. package/dist/gradients/presets.d.ts.map +1 -0
  330. package/dist/gradients/presets.js +254 -0
  331. package/dist/gradients/presets.js.map +1 -0
  332. package/dist/gradients/reactive.cjs +2 -0
  333. package/dist/gradients/reactive.cjs.map +1 -0
  334. package/dist/gradients/reactive.d.ts +167 -0
  335. package/dist/gradients/reactive.d.ts.map +1 -0
  336. package/dist/gradients/reactive.js +239 -0
  337. package/dist/gradients/reactive.js.map +1 -0
  338. package/dist/gradients/state-gradient-asset.cjs +2 -0
  339. package/dist/gradients/state-gradient-asset.cjs.map +1 -0
  340. package/dist/gradients/state-gradient-asset.d.ts +67 -0
  341. package/dist/gradients/state-gradient-asset.d.ts.map +1 -0
  342. package/dist/gradients/state-gradient-asset.js +111 -0
  343. package/dist/gradients/state-gradient-asset.js.map +1 -0
  344. package/dist/gradients/types.d.ts +94 -0
  345. package/dist/gradients/types.d.ts.map +1 -0
  346. package/dist/gradients/utils.cjs +2 -0
  347. package/dist/gradients/utils.cjs.map +1 -0
  348. package/dist/gradients/utils.d.ts +313 -0
  349. package/dist/gradients/utils.d.ts.map +1 -0
  350. package/dist/gradients/utils.js +385 -0
  351. package/dist/gradients/utils.js.map +1 -0
  352. package/dist/gradients/validation.cjs +2 -0
  353. package/dist/gradients/validation.cjs.map +1 -0
  354. package/dist/gradients/validation.d.ts +156 -0
  355. package/dist/gradients/validation.d.ts.map +1 -0
  356. package/dist/gradients/validation.js +209 -0
  357. package/dist/gradients/validation.js.map +1 -0
  358. package/dist/index.cjs +2 -0
  359. package/dist/index.cjs.map +1 -0
  360. package/dist/index.d.ts +26 -0
  361. package/dist/index.d.ts.map +1 -0
  362. package/dist/index.js +965 -0
  363. package/dist/index.js.map +1 -0
  364. package/dist/index2.cjs +2 -0
  365. package/dist/index2.cjs.map +1 -0
  366. package/dist/index2.js +293 -0
  367. package/dist/index2.js.map +1 -0
  368. package/dist/lifecycle/hooks.cjs +2 -0
  369. package/dist/lifecycle/hooks.cjs.map +1 -0
  370. package/dist/lifecycle/hooks.d.ts +101 -0
  371. package/dist/lifecycle/hooks.d.ts.map +1 -0
  372. package/dist/lifecycle/hooks.js +159 -0
  373. package/dist/lifecycle/hooks.js.map +1 -0
  374. package/dist/minimal-prod.cjs +2 -0
  375. package/dist/minimal-prod.cjs.map +1 -0
  376. package/dist/minimal-prod.js +193 -0
  377. package/dist/minimal-prod.js.map +1 -0
  378. package/dist/minimal.cjs +2 -0
  379. package/dist/minimal.cjs.map +1 -0
  380. package/dist/minimal.js +968 -0
  381. package/dist/minimal.js.map +1 -0
  382. package/dist/modifiers/as-html-validator.cjs +2 -0
  383. package/dist/modifiers/as-html-validator.cjs.map +1 -0
  384. package/dist/modifiers/as-html-validator.d.ts +20 -0
  385. package/dist/modifiers/as-html-validator.d.ts.map +1 -0
  386. package/dist/modifiers/as-html-validator.js +47 -0
  387. package/dist/modifiers/as-html-validator.js.map +1 -0
  388. package/dist/modifiers/as-html.cjs +2 -0
  389. package/dist/modifiers/as-html.cjs.map +1 -0
  390. package/dist/modifiers/as-html.d.ts +65 -0
  391. package/dist/modifiers/as-html.d.ts.map +1 -0
  392. package/dist/modifiers/as-html.js +71 -0
  393. package/dist/modifiers/as-html.js.map +1 -0
  394. package/dist/modifiers/attributes.cjs +2 -0
  395. package/dist/modifiers/attributes.cjs.map +1 -0
  396. package/dist/modifiers/attributes.d.ts +203 -0
  397. package/dist/modifiers/attributes.d.ts.map +1 -0
  398. package/dist/modifiers/attributes.js +272 -0
  399. package/dist/modifiers/attributes.js.map +1 -0
  400. package/dist/modifiers/backdrop.cjs +2 -0
  401. package/dist/modifiers/backdrop.cjs.map +1 -0
  402. package/dist/modifiers/backdrop.d.ts +59 -0
  403. package/dist/modifiers/backdrop.d.ts.map +1 -0
  404. package/dist/modifiers/backdrop.js +109 -0
  405. package/dist/modifiers/backdrop.js.map +1 -0
  406. package/dist/modifiers/background.cjs +2 -0
  407. package/dist/modifiers/background.cjs.map +1 -0
  408. package/dist/modifiers/background.d.ts +21 -0
  409. package/dist/modifiers/background.d.ts.map +1 -0
  410. package/dist/modifiers/background.js +67 -0
  411. package/dist/modifiers/background.js.map +1 -0
  412. package/dist/modifiers/base.cjs +25 -0
  413. package/dist/modifiers/base.cjs.map +1 -0
  414. package/dist/modifiers/base.d.ts +156 -0
  415. package/dist/modifiers/base.d.ts.map +1 -0
  416. package/dist/modifiers/base.js +745 -0
  417. package/dist/modifiers/base.js.map +1 -0
  418. package/dist/modifiers/basic-sanitizer.cjs +2 -0
  419. package/dist/modifiers/basic-sanitizer.cjs.map +1 -0
  420. package/dist/modifiers/basic-sanitizer.d.ts +54 -0
  421. package/dist/modifiers/basic-sanitizer.d.ts.map +1 -0
  422. package/dist/modifiers/basic-sanitizer.js +162 -0
  423. package/dist/modifiers/basic-sanitizer.js.map +1 -0
  424. package/dist/modifiers/border.cjs +2 -0
  425. package/dist/modifiers/border.cjs.map +1 -0
  426. package/dist/modifiers/border.d.ts +217 -0
  427. package/dist/modifiers/border.d.ts.map +1 -0
  428. package/dist/modifiers/border.js +160 -0
  429. package/dist/modifiers/border.js.map +1 -0
  430. package/dist/modifiers/builder.cjs +2 -0
  431. package/dist/modifiers/builder.cjs.map +1 -0
  432. package/dist/modifiers/builder.d.ts +377 -0
  433. package/dist/modifiers/builder.d.ts.map +1 -0
  434. package/dist/modifiers/builder.js +930 -0
  435. package/dist/modifiers/builder.js.map +1 -0
  436. package/dist/modifiers/core.cjs +2 -0
  437. package/dist/modifiers/core.cjs.map +1 -0
  438. package/dist/modifiers/core.d.ts +407 -0
  439. package/dist/modifiers/core.d.ts.map +1 -0
  440. package/dist/modifiers/core.js +398 -0
  441. package/dist/modifiers/core.js.map +1 -0
  442. package/dist/modifiers/css.cjs +2 -0
  443. package/dist/modifiers/css.cjs.map +1 -0
  444. package/dist/modifiers/css.d.ts +86 -0
  445. package/dist/modifiers/css.d.ts.map +1 -0
  446. package/dist/modifiers/css.js +50 -0
  447. package/dist/modifiers/css.js.map +1 -0
  448. package/dist/modifiers/effects.cjs +2 -0
  449. package/dist/modifiers/effects.cjs.map +1 -0
  450. package/dist/modifiers/effects.d.ts +159 -0
  451. package/dist/modifiers/effects.d.ts.map +1 -0
  452. package/dist/modifiers/effects.js +178 -0
  453. package/dist/modifiers/effects.js.map +1 -0
  454. package/dist/modifiers/elements.cjs +2 -0
  455. package/dist/modifiers/elements.cjs.map +1 -0
  456. package/dist/modifiers/elements.d.ts +240 -0
  457. package/dist/modifiers/elements.d.ts.map +1 -0
  458. package/dist/modifiers/elements.js +216 -0
  459. package/dist/modifiers/elements.js.map +1 -0
  460. package/dist/modifiers/filters.cjs +2 -0
  461. package/dist/modifiers/filters.cjs.map +1 -0
  462. package/dist/modifiers/filters.d.ts +275 -0
  463. package/dist/modifiers/filters.d.ts.map +1 -0
  464. package/dist/modifiers/filters.js +223 -0
  465. package/dist/modifiers/filters.js.map +1 -0
  466. package/dist/modifiers/flexbox.cjs +2 -0
  467. package/dist/modifiers/flexbox.cjs.map +1 -0
  468. package/dist/modifiers/flexbox.d.ts +82 -0
  469. package/dist/modifiers/flexbox.d.ts.map +1 -0
  470. package/dist/modifiers/flexbox.js +56 -0
  471. package/dist/modifiers/flexbox.js.map +1 -0
  472. package/dist/modifiers/font.cjs +2 -0
  473. package/dist/modifiers/font.cjs.map +1 -0
  474. package/dist/modifiers/font.d.ts +71 -0
  475. package/dist/modifiers/font.d.ts.map +1 -0
  476. package/dist/modifiers/font.js +60 -0
  477. package/dist/modifiers/font.js.map +1 -0
  478. package/dist/modifiers/grid.cjs +2 -0
  479. package/dist/modifiers/grid.cjs.map +1 -0
  480. package/dist/modifiers/grid.d.ts +92 -0
  481. package/dist/modifiers/grid.d.ts.map +1 -0
  482. package/dist/modifiers/grid.js +92 -0
  483. package/dist/modifiers/grid.js.map +1 -0
  484. package/dist/modifiers/index.d.ts +58 -0
  485. package/dist/modifiers/index.d.ts.map +1 -0
  486. package/dist/modifiers/margin.cjs +2 -0
  487. package/dist/modifiers/margin.cjs.map +1 -0
  488. package/dist/modifiers/margin.d.ts +128 -0
  489. package/dist/modifiers/margin.d.ts.map +1 -0
  490. package/dist/modifiers/margin.js +65 -0
  491. package/dist/modifiers/margin.js.map +1 -0
  492. package/dist/modifiers/padding.cjs +2 -0
  493. package/dist/modifiers/padding.cjs.map +1 -0
  494. package/dist/modifiers/padding.d.ts +204 -0
  495. package/dist/modifiers/padding.d.ts.map +1 -0
  496. package/dist/modifiers/padding.js +109 -0
  497. package/dist/modifiers/padding.js.map +1 -0
  498. package/dist/modifiers/registry.cjs +2 -0
  499. package/dist/modifiers/registry.cjs.map +1 -0
  500. package/dist/modifiers/registry.d.ts +69 -0
  501. package/dist/modifiers/registry.d.ts.map +1 -0
  502. package/dist/modifiers/registry.js +163 -0
  503. package/dist/modifiers/registry.js.map +1 -0
  504. package/dist/modifiers/responsive/advanced-utilities.cjs +2 -0
  505. package/dist/modifiers/responsive/advanced-utilities.cjs.map +1 -0
  506. package/dist/modifiers/responsive/advanced-utilities.d.ts +118 -0
  507. package/dist/modifiers/responsive/advanced-utilities.d.ts.map +1 -0
  508. package/dist/modifiers/responsive/advanced-utilities.js +291 -0
  509. package/dist/modifiers/responsive/advanced-utilities.js.map +1 -0
  510. package/dist/modifiers/responsive/breakpoints.cjs +2 -0
  511. package/dist/modifiers/responsive/breakpoints.cjs.map +1 -0
  512. package/dist/modifiers/responsive/breakpoints.d.ts +81 -0
  513. package/dist/modifiers/responsive/breakpoints.d.ts.map +1 -0
  514. package/dist/modifiers/responsive/breakpoints.js +168 -0
  515. package/dist/modifiers/responsive/breakpoints.js.map +1 -0
  516. package/dist/modifiers/responsive/css-generator.cjs +5 -0
  517. package/dist/modifiers/responsive/css-generator.cjs.map +1 -0
  518. package/dist/modifiers/responsive/css-generator.d.ts +100 -0
  519. package/dist/modifiers/responsive/css-generator.d.ts.map +1 -0
  520. package/dist/modifiers/responsive/css-generator.js +261 -0
  521. package/dist/modifiers/responsive/css-generator.js.map +1 -0
  522. package/dist/modifiers/responsive/dev-tools.cjs +77 -0
  523. package/dist/modifiers/responsive/dev-tools.cjs.map +1 -0
  524. package/dist/modifiers/responsive/dev-tools.d.ts +107 -0
  525. package/dist/modifiers/responsive/dev-tools.d.ts.map +1 -0
  526. package/dist/modifiers/responsive/dev-tools.js +380 -0
  527. package/dist/modifiers/responsive/dev-tools.js.map +1 -0
  528. package/dist/modifiers/responsive/index.d.ts +28 -0
  529. package/dist/modifiers/responsive/index.d.ts.map +1 -0
  530. package/dist/modifiers/responsive/layout-patterns.cjs +2 -0
  531. package/dist/modifiers/responsive/layout-patterns.cjs.map +1 -0
  532. package/dist/modifiers/responsive/layout-patterns.d.ts +230 -0
  533. package/dist/modifiers/responsive/layout-patterns.d.ts.map +1 -0
  534. package/dist/modifiers/responsive/layout-patterns.js +254 -0
  535. package/dist/modifiers/responsive/layout-patterns.js.map +1 -0
  536. package/dist/modifiers/responsive/performance.cjs +3 -0
  537. package/dist/modifiers/responsive/performance.cjs.map +1 -0
  538. package/dist/modifiers/responsive/performance.d.ts +130 -0
  539. package/dist/modifiers/responsive/performance.d.ts.map +1 -0
  540. package/dist/modifiers/responsive/performance.js +212 -0
  541. package/dist/modifiers/responsive/performance.js.map +1 -0
  542. package/dist/modifiers/responsive/responsive-builder.cjs +2 -0
  543. package/dist/modifiers/responsive/responsive-builder.cjs.map +1 -0
  544. package/dist/modifiers/responsive/responsive-builder.d.ts +133 -0
  545. package/dist/modifiers/responsive/responsive-builder.d.ts.map +1 -0
  546. package/dist/modifiers/responsive/responsive-builder.js +272 -0
  547. package/dist/modifiers/responsive/responsive-builder.js.map +1 -0
  548. package/dist/modifiers/responsive/responsive-modifier.cjs +3 -0
  549. package/dist/modifiers/responsive/responsive-modifier.cjs.map +1 -0
  550. package/dist/modifiers/responsive/responsive-modifier.d.ts +123 -0
  551. package/dist/modifiers/responsive/responsive-modifier.d.ts.map +1 -0
  552. package/dist/modifiers/responsive/responsive-modifier.js +204 -0
  553. package/dist/modifiers/responsive/responsive-modifier.js.map +1 -0
  554. package/dist/modifiers/responsive/types.cjs +2 -0
  555. package/dist/modifiers/responsive/types.cjs.map +1 -0
  556. package/dist/modifiers/responsive/types.d.ts +183 -0
  557. package/dist/modifiers/responsive/types.d.ts.map +1 -0
  558. package/dist/modifiers/responsive/types.js +26 -0
  559. package/dist/modifiers/responsive/types.js.map +1 -0
  560. package/dist/modifiers/responsive/utilities.cjs +16 -0
  561. package/dist/modifiers/responsive/utilities.cjs.map +1 -0
  562. package/dist/modifiers/responsive/utilities.d.ts +149 -0
  563. package/dist/modifiers/responsive/utilities.d.ts.map +1 -0
  564. package/dist/modifiers/responsive/utilities.js +273 -0
  565. package/dist/modifiers/responsive/utilities.js.map +1 -0
  566. package/dist/modifiers/scroll.cjs +2 -0
  567. package/dist/modifiers/scroll.cjs.map +1 -0
  568. package/dist/modifiers/scroll.d.ts +143 -0
  569. package/dist/modifiers/scroll.d.ts.map +1 -0
  570. package/dist/modifiers/scroll.js +82 -0
  571. package/dist/modifiers/scroll.js.map +1 -0
  572. package/dist/modifiers/shadows.cjs +2 -0
  573. package/dist/modifiers/shadows.cjs.map +1 -0
  574. package/dist/modifiers/shadows.d.ts +114 -0
  575. package/dist/modifiers/shadows.d.ts.map +1 -0
  576. package/dist/modifiers/shadows.js +147 -0
  577. package/dist/modifiers/shadows.js.map +1 -0
  578. package/dist/modifiers/size.cjs +2 -0
  579. package/dist/modifiers/size.cjs.map +1 -0
  580. package/dist/modifiers/size.d.ts +113 -0
  581. package/dist/modifiers/size.d.ts.map +1 -0
  582. package/dist/modifiers/size.js +74 -0
  583. package/dist/modifiers/size.js.map +1 -0
  584. package/dist/modifiers/text.cjs +2 -0
  585. package/dist/modifiers/text.cjs.map +1 -0
  586. package/dist/modifiers/text.d.ts +147 -0
  587. package/dist/modifiers/text.d.ts.map +1 -0
  588. package/dist/modifiers/text.js +166 -0
  589. package/dist/modifiers/text.js.map +1 -0
  590. package/dist/modifiers/transformations.cjs +2 -0
  591. package/dist/modifiers/transformations.cjs.map +1 -0
  592. package/dist/modifiers/transformations.d.ts +329 -0
  593. package/dist/modifiers/transformations.d.ts.map +1 -0
  594. package/dist/modifiers/transformations.js +216 -0
  595. package/dist/modifiers/transformations.js.map +1 -0
  596. package/dist/modifiers/transitions.cjs +2 -0
  597. package/dist/modifiers/transitions.cjs.map +1 -0
  598. package/dist/modifiers/transitions.d.ts +98 -0
  599. package/dist/modifiers/transitions.d.ts.map +1 -0
  600. package/dist/modifiers/transitions.js +102 -0
  601. package/dist/modifiers/transitions.js.map +1 -0
  602. package/dist/modifiers/types.cjs +2 -0
  603. package/dist/modifiers/types.cjs.map +1 -0
  604. package/dist/modifiers/types.d.ts +655 -0
  605. package/dist/modifiers/types.d.ts.map +1 -0
  606. package/dist/modifiers/types.js +5 -0
  607. package/dist/modifiers/types.js.map +1 -0
  608. package/dist/modifiers/typography.cjs +2 -0
  609. package/dist/modifiers/typography.cjs.map +1 -0
  610. package/dist/modifiers/typography.d.ts +192 -0
  611. package/dist/modifiers/typography.d.ts.map +1 -0
  612. package/dist/modifiers/typography.js +76 -0
  613. package/dist/modifiers/typography.js.map +1 -0
  614. package/dist/modifiers/utility.cjs +2 -0
  615. package/dist/modifiers/utility.cjs.map +1 -0
  616. package/dist/modifiers/utility.d.ts +69 -0
  617. package/dist/modifiers/utility.d.ts.map +1 -0
  618. package/dist/modifiers/utility.js +71 -0
  619. package/dist/modifiers/utility.js.map +1 -0
  620. package/dist/modifiers/utils.cjs +2 -0
  621. package/dist/modifiers/utils.cjs.map +1 -0
  622. package/dist/modifiers/utils.d.ts +75 -0
  623. package/dist/modifiers/utils.d.ts.map +1 -0
  624. package/dist/modifiers/utils.js +250 -0
  625. package/dist/modifiers/utils.js.map +1 -0
  626. package/dist/plugins/component-loader-registry.d.ts +143 -0
  627. package/dist/plugins/component-loader-registry.d.ts.map +1 -0
  628. package/dist/plugins/index.cjs +2 -0
  629. package/dist/plugins/index.cjs.map +1 -0
  630. package/dist/plugins/index.d.ts +17 -0
  631. package/dist/plugins/index.d.ts.map +1 -0
  632. package/dist/plugins/index.js +34 -0
  633. package/dist/plugins/index.js.map +1 -0
  634. package/dist/plugins/legacy-adapter.cjs +2 -0
  635. package/dist/plugins/legacy-adapter.cjs.map +1 -0
  636. package/dist/plugins/legacy-adapter.d.ts +35 -0
  637. package/dist/plugins/legacy-adapter.d.ts.map +1 -0
  638. package/dist/plugins/legacy-adapter.js +30 -0
  639. package/dist/plugins/legacy-adapter.js.map +1 -0
  640. package/dist/plugins/simplified-component-registry.cjs +2 -0
  641. package/dist/plugins/simplified-component-registry.cjs.map +1 -0
  642. package/dist/plugins/simplified-component-registry.d.ts +40 -0
  643. package/dist/plugins/simplified-component-registry.d.ts.map +1 -0
  644. package/dist/plugins/simplified-component-registry.js +71 -0
  645. package/dist/plugins/simplified-component-registry.js.map +1 -0
  646. package/dist/plugins/simplified-error-handler.cjs +2 -0
  647. package/dist/plugins/simplified-error-handler.cjs.map +1 -0
  648. package/dist/plugins/simplified-error-handler.d.ts +83 -0
  649. package/dist/plugins/simplified-error-handler.d.ts.map +1 -0
  650. package/dist/plugins/simplified-error-handler.js +154 -0
  651. package/dist/plugins/simplified-error-handler.js.map +1 -0
  652. package/dist/plugins/simplified-index.d.ts +17 -0
  653. package/dist/plugins/simplified-index.d.ts.map +1 -0
  654. package/dist/plugins/simplified-lazy-loader.cjs +2 -0
  655. package/dist/plugins/simplified-lazy-loader.cjs.map +1 -0
  656. package/dist/plugins/simplified-lazy-loader.d.ts +65 -0
  657. package/dist/plugins/simplified-lazy-loader.d.ts.map +1 -0
  658. package/dist/plugins/simplified-lazy-loader.js +129 -0
  659. package/dist/plugins/simplified-lazy-loader.js.map +1 -0
  660. package/dist/plugins/simplified-plugin-manager.cjs +2 -0
  661. package/dist/plugins/simplified-plugin-manager.cjs.map +1 -0
  662. package/dist/plugins/simplified-plugin-manager.d.ts +24 -0
  663. package/dist/plugins/simplified-plugin-manager.d.ts.map +1 -0
  664. package/dist/plugins/simplified-plugin-manager.js +51 -0
  665. package/dist/plugins/simplified-plugin-manager.js.map +1 -0
  666. package/dist/plugins/simplified-tachui-instance.cjs +2 -0
  667. package/dist/plugins/simplified-tachui-instance.cjs.map +1 -0
  668. package/dist/plugins/simplified-tachui-instance.d.ts +54 -0
  669. package/dist/plugins/simplified-tachui-instance.d.ts.map +1 -0
  670. package/dist/plugins/simplified-tachui-instance.js +88 -0
  671. package/dist/plugins/simplified-tachui-instance.js.map +1 -0
  672. package/dist/plugins/simplified-types.cjs +2 -0
  673. package/dist/plugins/simplified-types.cjs.map +1 -0
  674. package/dist/plugins/simplified-types.d.ts +63 -0
  675. package/dist/plugins/simplified-types.d.ts.map +1 -0
  676. package/dist/plugins/simplified-types.js +9 -0
  677. package/dist/plugins/simplified-types.js.map +1 -0
  678. package/dist/plugins/simplified-utils.cjs +2 -0
  679. package/dist/plugins/simplified-utils.cjs.map +1 -0
  680. package/dist/plugins/simplified-utils.d.ts +39 -0
  681. package/dist/plugins/simplified-utils.d.ts.map +1 -0
  682. package/dist/plugins/simplified-utils.js +40 -0
  683. package/dist/plugins/simplified-utils.js.map +1 -0
  684. package/dist/reactive/cleanup.cjs +2 -0
  685. package/dist/reactive/cleanup.cjs.map +1 -0
  686. package/dist/reactive/cleanup.d.ts +115 -0
  687. package/dist/reactive/cleanup.d.ts.map +1 -0
  688. package/dist/reactive/cleanup.js +62 -0
  689. package/dist/reactive/cleanup.js.map +1 -0
  690. package/dist/reactive/computed.cjs +2 -0
  691. package/dist/reactive/computed.cjs.map +1 -0
  692. package/dist/reactive/computed.d.ts +115 -0
  693. package/dist/reactive/computed.d.ts.map +1 -0
  694. package/dist/reactive/computed.js +121 -0
  695. package/dist/reactive/computed.js.map +1 -0
  696. package/dist/reactive/context.cjs +2 -0
  697. package/dist/reactive/context.cjs.map +1 -0
  698. package/dist/reactive/context.d.ts +82 -0
  699. package/dist/reactive/context.d.ts.map +1 -0
  700. package/dist/reactive/context.js +143 -0
  701. package/dist/reactive/context.js.map +1 -0
  702. package/dist/reactive/effect.cjs +2 -0
  703. package/dist/reactive/effect.cjs.map +1 -0
  704. package/dist/reactive/effect.d.ts +79 -0
  705. package/dist/reactive/effect.d.ts.map +1 -0
  706. package/dist/reactive/effect.js +67 -0
  707. package/dist/reactive/effect.js.map +1 -0
  708. package/dist/reactive/enhanced-effect.cjs +2 -0
  709. package/dist/reactive/enhanced-effect.cjs.map +1 -0
  710. package/dist/reactive/enhanced-effect.d.ts +108 -0
  711. package/dist/reactive/enhanced-effect.d.ts.map +1 -0
  712. package/dist/reactive/enhanced-effect.js +153 -0
  713. package/dist/reactive/enhanced-effect.js.map +1 -0
  714. package/dist/reactive/enhanced-signal.cjs +2 -0
  715. package/dist/reactive/enhanced-signal.cjs.map +1 -0
  716. package/dist/reactive/enhanced-signal.d.ts +91 -0
  717. package/dist/reactive/enhanced-signal.d.ts.map +1 -0
  718. package/dist/reactive/enhanced-signal.js +117 -0
  719. package/dist/reactive/enhanced-signal.js.map +1 -0
  720. package/dist/reactive/equality.cjs +2 -0
  721. package/dist/reactive/equality.cjs.map +1 -0
  722. package/dist/reactive/equality.d.ts +51 -0
  723. package/dist/reactive/equality.d.ts.map +1 -0
  724. package/dist/reactive/equality.js +66 -0
  725. package/dist/reactive/equality.js.map +1 -0
  726. package/dist/reactive/index.cjs +2 -0
  727. package/dist/reactive/index.cjs.map +1 -0
  728. package/dist/reactive/index.d.ts +21 -0
  729. package/dist/reactive/index.d.ts.map +1 -0
  730. package/dist/reactive/index.js +95 -0
  731. package/dist/reactive/index.js.map +1 -0
  732. package/dist/reactive/migration.cjs +18 -0
  733. package/dist/reactive/migration.cjs.map +1 -0
  734. package/dist/reactive/migration.d.ts +104 -0
  735. package/dist/reactive/migration.d.ts.map +1 -0
  736. package/dist/reactive/migration.js +164 -0
  737. package/dist/reactive/migration.js.map +1 -0
  738. package/dist/reactive/ownership.cjs +2 -0
  739. package/dist/reactive/ownership.cjs.map +1 -0
  740. package/dist/reactive/ownership.d.ts +75 -0
  741. package/dist/reactive/ownership.d.ts.map +1 -0
  742. package/dist/reactive/ownership.js +34 -0
  743. package/dist/reactive/ownership.js.map +1 -0
  744. package/dist/reactive/scheduler.cjs +2 -0
  745. package/dist/reactive/scheduler.cjs.map +1 -0
  746. package/dist/reactive/scheduler.d.ts +56 -0
  747. package/dist/reactive/scheduler.d.ts.map +1 -0
  748. package/dist/reactive/scheduler.js +111 -0
  749. package/dist/reactive/scheduler.js.map +1 -0
  750. package/dist/reactive/signal.cjs +2 -0
  751. package/dist/reactive/signal.cjs.map +1 -0
  752. package/dist/reactive/signal.d.ts +82 -0
  753. package/dist/reactive/signal.d.ts.map +1 -0
  754. package/dist/reactive/signal.js +96 -0
  755. package/dist/reactive/signal.js.map +1 -0
  756. package/dist/reactive/theme.cjs +2 -0
  757. package/dist/reactive/theme.cjs.map +1 -0
  758. package/dist/reactive/theme.d.ts +12 -0
  759. package/dist/reactive/theme.d.ts.map +1 -0
  760. package/dist/reactive/theme.js +27 -0
  761. package/dist/reactive/theme.js.map +1 -0
  762. package/dist/reactive/types.cjs +2 -0
  763. package/dist/reactive/types.cjs.map +1 -0
  764. package/dist/reactive/types.d.ts +93 -0
  765. package/dist/reactive/types.d.ts.map +1 -0
  766. package/dist/reactive/types.js +5 -0
  767. package/dist/reactive/types.js.map +1 -0
  768. package/dist/reactive/unified-scheduler.cjs +2 -0
  769. package/dist/reactive/unified-scheduler.cjs.map +1 -0
  770. package/dist/reactive/unified-scheduler.d.ts +112 -0
  771. package/dist/reactive/unified-scheduler.d.ts.map +1 -0
  772. package/dist/reactive/unified-scheduler.js +219 -0
  773. package/dist/reactive/unified-scheduler.js.map +1 -0
  774. package/dist/runtime/component-context.cjs +2 -0
  775. package/dist/runtime/component-context.cjs.map +1 -0
  776. package/dist/runtime/component-context.d.ts +73 -0
  777. package/dist/runtime/component-context.d.ts.map +1 -0
  778. package/dist/runtime/component-context.js +177 -0
  779. package/dist/runtime/component-context.js.map +1 -0
  780. package/dist/runtime/component.cjs +2 -0
  781. package/dist/runtime/component.cjs.map +1 -0
  782. package/dist/runtime/component.d.ts +112 -0
  783. package/dist/runtime/component.d.ts.map +1 -0
  784. package/dist/runtime/component.js +238 -0
  785. package/dist/runtime/component.js.map +1 -0
  786. package/dist/runtime/context.cjs +2 -0
  787. package/dist/runtime/context.cjs.map +1 -0
  788. package/dist/runtime/context.d.ts +138 -0
  789. package/dist/runtime/context.d.ts.map +1 -0
  790. package/dist/runtime/context.js +289 -0
  791. package/dist/runtime/context.js.map +1 -0
  792. package/dist/runtime/dev-tools.cjs +2 -0
  793. package/dist/runtime/dev-tools.cjs.map +1 -0
  794. package/dist/runtime/dev-tools.d.ts +240 -0
  795. package/dist/runtime/dev-tools.d.ts.map +1 -0
  796. package/dist/runtime/dev-tools.js +391 -0
  797. package/dist/runtime/dev-tools.js.map +1 -0
  798. package/dist/runtime/development-warnings.cjs +2 -0
  799. package/dist/runtime/development-warnings.cjs.map +1 -0
  800. package/dist/runtime/development-warnings.d.ts +42 -0
  801. package/dist/runtime/development-warnings.d.ts.map +1 -0
  802. package/dist/runtime/development-warnings.js +69 -0
  803. package/dist/runtime/development-warnings.js.map +1 -0
  804. package/dist/runtime/dom-bridge.cjs +2 -0
  805. package/dist/runtime/dom-bridge.cjs.map +1 -0
  806. package/dist/runtime/dom-bridge.d.ts +70 -0
  807. package/dist/runtime/dom-bridge.d.ts.map +1 -0
  808. package/dist/runtime/dom-bridge.js +241 -0
  809. package/dist/runtime/dom-bridge.js.map +1 -0
  810. package/dist/runtime/element-override.cjs +2 -0
  811. package/dist/runtime/element-override.cjs.map +1 -0
  812. package/dist/runtime/element-override.d.ts +82 -0
  813. package/dist/runtime/element-override.d.ts.map +1 -0
  814. package/dist/runtime/element-override.js +214 -0
  815. package/dist/runtime/element-override.js.map +1 -0
  816. package/dist/runtime/error-boundary.cjs +2 -0
  817. package/dist/runtime/error-boundary.cjs.map +1 -0
  818. package/dist/runtime/error-boundary.d.ts +302 -0
  819. package/dist/runtime/error-boundary.d.ts.map +1 -0
  820. package/dist/runtime/error-boundary.js +559 -0
  821. package/dist/runtime/error-boundary.js.map +1 -0
  822. package/dist/runtime/error-recovery.cjs +2 -0
  823. package/dist/runtime/error-recovery.cjs.map +1 -0
  824. package/dist/runtime/error-recovery.d.ts +267 -0
  825. package/dist/runtime/error-recovery.d.ts.map +1 -0
  826. package/dist/runtime/error-recovery.js +385 -0
  827. package/dist/runtime/error-recovery.js.map +1 -0
  828. package/dist/runtime/error-reporting.cjs +3 -0
  829. package/dist/runtime/error-reporting.cjs.map +1 -0
  830. package/dist/runtime/error-reporting.d.ts +287 -0
  831. package/dist/runtime/error-reporting.d.ts.map +1 -0
  832. package/dist/runtime/error-reporting.js +479 -0
  833. package/dist/runtime/error-reporting.js.map +1 -0
  834. package/dist/runtime/error-utils.cjs +3 -0
  835. package/dist/runtime/error-utils.cjs.map +1 -0
  836. package/dist/runtime/error-utils.d.ts +204 -0
  837. package/dist/runtime/error-utils.d.ts.map +1 -0
  838. package/dist/runtime/error-utils.js +352 -0
  839. package/dist/runtime/error-utils.js.map +1 -0
  840. package/dist/runtime/index.d.ts +29 -0
  841. package/dist/runtime/index.d.ts.map +1 -0
  842. package/dist/runtime/lazy-component.cjs +2 -0
  843. package/dist/runtime/lazy-component.cjs.map +1 -0
  844. package/dist/runtime/lazy-component.d.ts +58 -0
  845. package/dist/runtime/lazy-component.d.ts.map +1 -0
  846. package/dist/runtime/lazy-component.js +129 -0
  847. package/dist/runtime/lazy-component.js.map +1 -0
  848. package/dist/runtime/lifecycle.cjs +2 -0
  849. package/dist/runtime/lifecycle.cjs.map +1 -0
  850. package/dist/runtime/lifecycle.d.ts +8 -0
  851. package/dist/runtime/lifecycle.d.ts.map +1 -0
  852. package/dist/runtime/lifecycle.js +7 -0
  853. package/dist/runtime/lifecycle.js.map +1 -0
  854. package/dist/runtime/mounting.cjs +2 -0
  855. package/dist/runtime/mounting.cjs.map +1 -0
  856. package/dist/runtime/mounting.d.ts +9 -0
  857. package/dist/runtime/mounting.d.ts.map +1 -0
  858. package/dist/runtime/mounting.js +12 -0
  859. package/dist/runtime/mounting.js.map +1 -0
  860. package/dist/runtime/optimization.cjs +2 -0
  861. package/dist/runtime/optimization.cjs.map +1 -0
  862. package/dist/runtime/optimization.d.ts +8 -0
  863. package/dist/runtime/optimization.d.ts.map +1 -0
  864. package/dist/runtime/optimization.js +6 -0
  865. package/dist/runtime/optimization.js.map +1 -0
  866. package/dist/runtime/performance.cjs +2 -0
  867. package/dist/runtime/performance.cjs.map +1 -0
  868. package/dist/runtime/performance.d.ts +217 -0
  869. package/dist/runtime/performance.d.ts.map +1 -0
  870. package/dist/runtime/performance.js +399 -0
  871. package/dist/runtime/performance.js.map +1 -0
  872. package/dist/runtime/props.cjs +2 -0
  873. package/dist/runtime/props.cjs.map +1 -0
  874. package/dist/runtime/props.d.ts +154 -0
  875. package/dist/runtime/props.d.ts.map +1 -0
  876. package/dist/runtime/props.js +265 -0
  877. package/dist/runtime/props.js.map +1 -0
  878. package/dist/runtime/refs.d.ts +8 -0
  879. package/dist/runtime/refs.d.ts.map +1 -0
  880. package/dist/runtime/renderer.cjs +2 -0
  881. package/dist/runtime/renderer.cjs.map +1 -0
  882. package/dist/runtime/renderer.d.ts +116 -0
  883. package/dist/runtime/renderer.d.ts.map +1 -0
  884. package/dist/runtime/renderer.js +390 -0
  885. package/dist/runtime/renderer.js.map +1 -0
  886. package/dist/runtime/semantic-role-manager.cjs +2 -0
  887. package/dist/runtime/semantic-role-manager.cjs.map +1 -0
  888. package/dist/runtime/semantic-role-manager.d.ts +37 -0
  889. package/dist/runtime/semantic-role-manager.d.ts.map +1 -0
  890. package/dist/runtime/semantic-role-manager.js +82 -0
  891. package/dist/runtime/semantic-role-manager.js.map +1 -0
  892. package/dist/runtime/types.d.ts +230 -0
  893. package/dist/runtime/types.d.ts.map +1 -0
  894. package/dist/state/binding.cjs +2 -0
  895. package/dist/state/binding.cjs.map +1 -0
  896. package/dist/state/binding.d.ts +96 -0
  897. package/dist/state/binding.d.ts.map +1 -0
  898. package/dist/state/binding.js +155 -0
  899. package/dist/state/binding.js.map +1 -0
  900. package/dist/state/environment-object.d.ts +130 -0
  901. package/dist/state/environment-object.d.ts.map +1 -0
  902. package/dist/state/environment.cjs +2 -0
  903. package/dist/state/environment.cjs.map +1 -0
  904. package/dist/state/environment.d.ts +178 -0
  905. package/dist/state/environment.d.ts.map +1 -0
  906. package/dist/state/environment.js +115 -0
  907. package/dist/state/environment.js.map +1 -0
  908. package/dist/state/index.cjs +2 -0
  909. package/dist/state/index.cjs.map +1 -0
  910. package/dist/state/index.d.ts +108 -0
  911. package/dist/state/index.d.ts.map +1 -0
  912. package/dist/state/index.js +63 -0
  913. package/dist/state/index.js.map +1 -0
  914. package/dist/state/observed-object.cjs +2 -0
  915. package/dist/state/observed-object.cjs.map +1 -0
  916. package/dist/state/observed-object.d.ts +126 -0
  917. package/dist/state/observed-object.d.ts.map +1 -0
  918. package/dist/state/observed-object.js +163 -0
  919. package/dist/state/observed-object.js.map +1 -0
  920. package/dist/state/state-manager.cjs +2 -0
  921. package/dist/state/state-manager.cjs.map +1 -0
  922. package/dist/state/state-manager.d.ts +97 -0
  923. package/dist/state/state-manager.d.ts.map +1 -0
  924. package/dist/state/state-manager.js +233 -0
  925. package/dist/state/state-manager.js.map +1 -0
  926. package/dist/state/state.cjs +2 -0
  927. package/dist/state/state.cjs.map +1 -0
  928. package/dist/state/state.d.ts +78 -0
  929. package/dist/state/state.d.ts.map +1 -0
  930. package/dist/state/state.js +159 -0
  931. package/dist/state/state.js.map +1 -0
  932. package/dist/state/types.d.ts +159 -0
  933. package/dist/state/types.d.ts.map +1 -0
  934. package/dist/sui-compat.cjs +2 -0
  935. package/dist/sui-compat.cjs.map +1 -0
  936. package/dist/sui-compat.d.ts +110 -0
  937. package/dist/sui-compat.d.ts.map +1 -0
  938. package/dist/sui-compat.js +88 -0
  939. package/dist/sui-compat.js.map +1 -0
  940. package/dist/validation/advanced-debugging.cjs +44 -0
  941. package/dist/validation/advanced-debugging.cjs.map +1 -0
  942. package/dist/validation/advanced-debugging.d.ts +319 -0
  943. package/dist/validation/advanced-debugging.d.ts.map +1 -0
  944. package/dist/validation/advanced-debugging.js +455 -0
  945. package/dist/validation/advanced-debugging.js.map +1 -0
  946. package/dist/validation/build-time/detection.cjs +2 -0
  947. package/dist/validation/build-time/detection.cjs.map +1 -0
  948. package/dist/validation/build-time/detection.d.ts +32 -0
  949. package/dist/validation/build-time/detection.d.ts.map +1 -0
  950. package/dist/validation/build-time/detection.js +199 -0
  951. package/dist/validation/build-time/detection.js.map +1 -0
  952. package/dist/validation/build-time/index.cjs +2 -0
  953. package/dist/validation/build-time/index.cjs.map +1 -0
  954. package/dist/validation/build-time/index.d.ts +84 -0
  955. package/dist/validation/build-time/index.d.ts.map +1 -0
  956. package/dist/validation/build-time/index.js +122 -0
  957. package/dist/validation/build-time/index.js.map +1 -0
  958. package/dist/validation/build-time/plugins.cjs +3 -0
  959. package/dist/validation/build-time/plugins.cjs.map +1 -0
  960. package/dist/validation/build-time/plugins.d.ts +75 -0
  961. package/dist/validation/build-time/plugins.d.ts.map +1 -0
  962. package/dist/validation/build-time/plugins.js +282 -0
  963. package/dist/validation/build-time/plugins.js.map +1 -0
  964. package/dist/validation/build-time/rules.cjs +2 -0
  965. package/dist/validation/build-time/rules.cjs.map +1 -0
  966. package/dist/validation/build-time/rules.d.ts +73 -0
  967. package/dist/validation/build-time/rules.d.ts.map +1 -0
  968. package/dist/validation/build-time/rules.js +576 -0
  969. package/dist/validation/build-time/rules.js.map +1 -0
  970. package/dist/validation/build-time/transformer.cjs +3 -0
  971. package/dist/validation/build-time/transformer.cjs.map +1 -0
  972. package/dist/validation/build-time/transformer.d.ts +23 -0
  973. package/dist/validation/build-time/transformer.d.ts.map +1 -0
  974. package/dist/validation/build-time/transformer.js +177 -0
  975. package/dist/validation/build-time/transformer.js.map +1 -0
  976. package/dist/validation/build-time/types.d.ts +212 -0
  977. package/dist/validation/build-time/types.d.ts.map +1 -0
  978. package/dist/validation/comprehensive.cjs +9 -0
  979. package/dist/validation/comprehensive.cjs.map +1 -0
  980. package/dist/validation/comprehensive.d.ts +160 -0
  981. package/dist/validation/comprehensive.d.ts.map +1 -0
  982. package/dist/validation/comprehensive.js +916 -0
  983. package/dist/validation/comprehensive.js.map +1 -0
  984. package/dist/validation/debug-tools.cjs +16 -0
  985. package/dist/validation/debug-tools.cjs.map +1 -0
  986. package/dist/validation/debug-tools.d.ts +251 -0
  987. package/dist/validation/debug-tools.d.ts.map +1 -0
  988. package/dist/validation/debug-tools.js +405 -0
  989. package/dist/validation/debug-tools.js.map +1 -0
  990. package/dist/validation/developer-experience.cjs +17 -0
  991. package/dist/validation/developer-experience.cjs.map +1 -0
  992. package/dist/validation/developer-experience.d.ts +243 -0
  993. package/dist/validation/developer-experience.d.ts.map +1 -0
  994. package/dist/validation/developer-experience.js +433 -0
  995. package/dist/validation/developer-experience.js.map +1 -0
  996. package/dist/validation/documentation-integration.cjs +7 -0
  997. package/dist/validation/documentation-integration.cjs.map +1 -0
  998. package/dist/validation/documentation-integration.d.ts +269 -0
  999. package/dist/validation/documentation-integration.d.ts.map +1 -0
  1000. package/dist/validation/documentation-integration.js +440 -0
  1001. package/dist/validation/documentation-integration.js.map +1 -0
  1002. package/dist/validation/enhanced-runtime.cjs +6 -0
  1003. package/dist/validation/enhanced-runtime.cjs.map +1 -0
  1004. package/dist/validation/enhanced-runtime.d.ts +279 -0
  1005. package/dist/validation/enhanced-runtime.d.ts.map +1 -0
  1006. package/dist/validation/enhanced-runtime.js +465 -0
  1007. package/dist/validation/enhanced-runtime.js.map +1 -0
  1008. package/dist/validation/error-reporting.cjs +32 -0
  1009. package/dist/validation/error-reporting.cjs.map +1 -0
  1010. package/dist/validation/error-reporting.d.ts +186 -0
  1011. package/dist/validation/error-reporting.d.ts.map +1 -0
  1012. package/dist/validation/error-reporting.js +370 -0
  1013. package/dist/validation/error-reporting.js.map +1 -0
  1014. package/dist/validation/ide-integration.cjs +85 -0
  1015. package/dist/validation/ide-integration.cjs.map +1 -0
  1016. package/dist/validation/ide-integration.d.ts +328 -0
  1017. package/dist/validation/ide-integration.d.ts.map +1 -0
  1018. package/dist/validation/ide-integration.js +557 -0
  1019. package/dist/validation/ide-integration.js.map +1 -0
  1020. package/dist/validation/index.cjs +6 -0
  1021. package/dist/validation/index.cjs.map +1 -0
  1022. package/dist/validation/index.d.ts +171 -0
  1023. package/dist/validation/index.d.ts.map +1 -0
  1024. package/dist/validation/index.js +309 -0
  1025. package/dist/validation/index.js.map +1 -0
  1026. package/dist/validation/lifecycle-validation.cjs +2 -0
  1027. package/dist/validation/lifecycle-validation.cjs.map +1 -0
  1028. package/dist/validation/lifecycle-validation.d.ts +165 -0
  1029. package/dist/validation/lifecycle-validation.d.ts.map +1 -0
  1030. package/dist/validation/lifecycle-validation.js +314 -0
  1031. package/dist/validation/lifecycle-validation.js.map +1 -0
  1032. package/dist/validation/performance-optimizer.cjs +2 -0
  1033. package/dist/validation/performance-optimizer.cjs.map +1 -0
  1034. package/dist/validation/performance-optimizer.d.ts +218 -0
  1035. package/dist/validation/performance-optimizer.d.ts.map +1 -0
  1036. package/dist/validation/performance-optimizer.js +338 -0
  1037. package/dist/validation/performance-optimizer.js.map +1 -0
  1038. package/dist/validation/plugin-registration.cjs +2 -0
  1039. package/dist/validation/plugin-registration.cjs.map +1 -0
  1040. package/dist/validation/plugin-registration.d.ts +88 -0
  1041. package/dist/validation/plugin-registration.d.ts.map +1 -0
  1042. package/dist/validation/plugin-registration.js +126 -0
  1043. package/dist/validation/plugin-registration.js.map +1 -0
  1044. package/dist/validation/production-bypass.cjs +2 -0
  1045. package/dist/validation/production-bypass.cjs.map +1 -0
  1046. package/dist/validation/production-bypass.d.ts +175 -0
  1047. package/dist/validation/production-bypass.d.ts.map +1 -0
  1048. package/dist/validation/production-bypass.js +218 -0
  1049. package/dist/validation/production-bypass.js.map +1 -0
  1050. package/dist/validation/simple.cjs +9 -0
  1051. package/dist/validation/simple.cjs.map +1 -0
  1052. package/dist/validation/simple.d.ts +111 -0
  1053. package/dist/validation/simple.d.ts.map +1 -0
  1054. package/dist/validation/simple.js +146 -0
  1055. package/dist/validation/simple.js.map +1 -0
  1056. package/dist/viewport/adapters/web-adapter.cjs +70 -0
  1057. package/dist/viewport/adapters/web-adapter.cjs.map +1 -0
  1058. package/dist/viewport/adapters/web-adapter.d.ts +227 -0
  1059. package/dist/viewport/adapters/web-adapter.d.ts.map +1 -0
  1060. package/dist/viewport/adapters/web-adapter.js +823 -0
  1061. package/dist/viewport/adapters/web-adapter.js.map +1 -0
  1062. package/dist/viewport/components.cjs +2 -0
  1063. package/dist/viewport/components.cjs.map +1 -0
  1064. package/dist/viewport/components.d.ts +131 -0
  1065. package/dist/viewport/components.d.ts.map +1 -0
  1066. package/dist/viewport/components.js +298 -0
  1067. package/dist/viewport/components.js.map +1 -0
  1068. package/dist/viewport/environment.cjs +2 -0
  1069. package/dist/viewport/environment.cjs.map +1 -0
  1070. package/dist/viewport/environment.d.ts +75 -0
  1071. package/dist/viewport/environment.d.ts.map +1 -0
  1072. package/dist/viewport/environment.js +86 -0
  1073. package/dist/viewport/environment.js.map +1 -0
  1074. package/dist/viewport/index.cjs +2 -0
  1075. package/dist/viewport/index.cjs.map +1 -0
  1076. package/dist/viewport/index.d.ts +138 -0
  1077. package/dist/viewport/index.d.ts.map +1 -0
  1078. package/dist/viewport/index.js +166 -0
  1079. package/dist/viewport/index.js.map +1 -0
  1080. package/dist/viewport/platform-detection.cjs +2 -0
  1081. package/dist/viewport/platform-detection.cjs.map +1 -0
  1082. package/dist/viewport/platform-detection.d.ts +59 -0
  1083. package/dist/viewport/platform-detection.d.ts.map +1 -0
  1084. package/dist/viewport/platform-detection.js +205 -0
  1085. package/dist/viewport/platform-detection.js.map +1 -0
  1086. package/dist/viewport/types.cjs +2 -0
  1087. package/dist/viewport/types.cjs.map +1 -0
  1088. package/dist/viewport/types.d.ts +301 -0
  1089. package/dist/viewport/types.d.ts.map +1 -0
  1090. package/dist/viewport/types.js +13 -0
  1091. package/dist/viewport/types.js.map +1 -0
  1092. package/dist/viewport/viewport-manager.cjs +2 -0
  1093. package/dist/viewport/viewport-manager.cjs.map +1 -0
  1094. package/dist/viewport/viewport-manager.d.ts +118 -0
  1095. package/dist/viewport/viewport-manager.d.ts.map +1 -0
  1096. package/dist/viewport/viewport-manager.js +524 -0
  1097. package/dist/viewport/viewport-manager.js.map +1 -0
  1098. package/package.json +128 -0
  1099. package/src/assets/Asset.ts +11 -0
  1100. package/src/assets/AssetCollection.ts +99 -0
  1101. package/src/assets/ColorAsset.ts +210 -0
  1102. package/src/assets/FontAsset.ts +380 -0
  1103. package/src/assets/ImageAsset.ts +91 -0
  1104. package/src/assets/README.md +190 -0
  1105. package/src/assets/index.ts +175 -0
  1106. package/src/assets/test-assets.ts +69 -0
  1107. package/src/assets/test-integration.ts +46 -0
  1108. package/src/assets/test-simple.ts +28 -0
  1109. package/src/assets/types.ts +79 -0
  1110. package/src/bundles/common.ts +30 -0
  1111. package/src/bundles/complete.ts +29 -0
  1112. package/src/bundles/essential.ts +26 -0
  1113. package/src/bundles/minimal.ts +26 -0
  1114. package/src/bundles/production-minimal.ts +67 -0
  1115. package/src/compiler/advanced-parser.ts +871 -0
  1116. package/src/compiler/codegen.ts +450 -0
  1117. package/src/compiler/enhanced-codegen.ts +729 -0
  1118. package/src/compiler/index.ts +25 -0
  1119. package/src/compiler/parser.ts +461 -0
  1120. package/src/compiler/plugin.ts +181 -0
  1121. package/src/compiler/types.ts +177 -0
  1122. package/src/components/BasicInput.ts +352 -0
  1123. package/src/components/Button.ts +963 -0
  1124. package/src/components/Divider.ts +341 -0
  1125. package/src/components/EnhancedLink.ts +676 -0
  1126. package/src/components/Form.ts +414 -0
  1127. package/src/components/Grid.ts +2507 -0
  1128. package/src/components/GridResponsive.ts +637 -0
  1129. package/src/components/Image.ts +426 -0
  1130. package/src/components/List.ts +1084 -0
  1131. package/src/components/Menu.ts +807 -0
  1132. package/src/components/Picker.ts +678 -0
  1133. package/src/components/ScrollView.ts +725 -0
  1134. package/src/components/Section.ts +472 -0
  1135. package/src/components/Show.ts +205 -0
  1136. package/src/components/Spacer.ts +93 -0
  1137. package/src/components/Text.ts +447 -0
  1138. package/src/components/Toggle.ts +700 -0
  1139. package/src/components/index.ts +231 -0
  1140. package/src/components/wrapper.ts +828 -0
  1141. package/src/concatenation/concatenatable.ts +211 -0
  1142. package/src/concatenation/concatenated-component.ts +471 -0
  1143. package/src/concatenation/index.ts +41 -0
  1144. package/src/concatenation/styles.css +120 -0
  1145. package/src/concatenation/text-optimizer.ts +440 -0
  1146. package/src/concatenation/types.ts +116 -0
  1147. package/src/constants/README.md +339 -0
  1148. package/src/constants/__tests__/frame-utils.test.ts +276 -0
  1149. package/src/constants/__tests__/layout.test.ts +215 -0
  1150. package/src/constants/frame-utils.ts +174 -0
  1151. package/src/constants/index.ts +8 -0
  1152. package/src/constants/layout.ts +120 -0
  1153. package/src/css-classes/component-base.ts +117 -0
  1154. package/src/css-classes/css-class-manager.ts +372 -0
  1155. package/src/css-classes/dom-integration.ts +162 -0
  1156. package/src/css-classes/enhanced-renderer.ts +166 -0
  1157. package/src/css-classes/index.ts +45 -0
  1158. package/src/css-classes/types.ts +73 -0
  1159. package/src/css-classes/utilities.ts +175 -0
  1160. package/src/debug/index.ts +267 -0
  1161. package/src/developer-experience/enhanced-errors.ts +556 -0
  1162. package/src/developer-experience/enhanced-types.ts +427 -0
  1163. package/src/developer-experience/index.ts +220 -0
  1164. package/src/globals.d.ts +43 -0
  1165. package/src/gradients/__tests__/angular-gradient.test.ts +111 -0
  1166. package/src/gradients/__tests__/background-modifier.test.ts +81 -0
  1167. package/src/gradients/__tests__/comprehensive-gradients.test.ts +296 -0
  1168. package/src/gradients/__tests__/gradient-asset.test.ts +144 -0
  1169. package/src/gradients/__tests__/linear-gradient.test.ts +92 -0
  1170. package/src/gradients/__tests__/phase4-features.test.ts +386 -0
  1171. package/src/gradients/__tests__/radial-gradient.test.ts +110 -0
  1172. package/src/gradients/__tests__/repeating-gradients.test.ts +125 -0
  1173. package/src/gradients/__tests__/state-background-modifier.test.ts +340 -0
  1174. package/src/gradients/__tests__/state-gradient-asset.test.ts +262 -0
  1175. package/src/gradients/__tests__/state-gradient-integration.test.ts +277 -0
  1176. package/src/gradients/css-generator.ts +158 -0
  1177. package/src/gradients/examples.ts +632 -0
  1178. package/src/gradients/gradient-asset.ts +30 -0
  1179. package/src/gradients/index.ts +85 -0
  1180. package/src/gradients/performance.ts +521 -0
  1181. package/src/gradients/presets.ts +422 -0
  1182. package/src/gradients/reactive.ts +470 -0
  1183. package/src/gradients/state-gradient-asset.ts +179 -0
  1184. package/src/gradients/types.ts +148 -0
  1185. package/src/gradients/utils.ts +579 -0
  1186. package/src/gradients/validation.ts +489 -0
  1187. package/src/index.ts +168 -0
  1188. package/src/lifecycle/hooks.ts +332 -0
  1189. package/src/modifiers/__tests__/as-html-integration.test.ts +204 -0
  1190. package/src/modifiers/__tests__/as-html.test.ts +437 -0
  1191. package/src/modifiers/__tests__/basic-sanitizer-security.test.ts +294 -0
  1192. package/src/modifiers/__tests__/border.test.ts +371 -0
  1193. package/src/modifiers/__tests__/margin-string-support.test.ts +41 -0
  1194. package/src/modifiers/__tests__/padding-string-support.test.ts +41 -0
  1195. package/src/modifiers/as-html-validator.ts +68 -0
  1196. package/src/modifiers/as-html.ts +216 -0
  1197. package/src/modifiers/attributes.ts +574 -0
  1198. package/src/modifiers/backdrop.ts +290 -0
  1199. package/src/modifiers/background.ts +165 -0
  1200. package/src/modifiers/base.ts +1815 -0
  1201. package/src/modifiers/basic-sanitizer.ts +227 -0
  1202. package/src/modifiers/border.ts +574 -0
  1203. package/src/modifiers/builder.ts +1747 -0
  1204. package/src/modifiers/core.ts +521 -0
  1205. package/src/modifiers/css.ts +148 -0
  1206. package/src/modifiers/effects.ts +412 -0
  1207. package/src/modifiers/elements.ts +541 -0
  1208. package/src/modifiers/filters.ts +501 -0
  1209. package/src/modifiers/flexbox.ts +180 -0
  1210. package/src/modifiers/font.ts +149 -0
  1211. package/src/modifiers/grid.ts +238 -0
  1212. package/src/modifiers/index.ts +481 -0
  1213. package/src/modifiers/margin.ts +218 -0
  1214. package/src/modifiers/padding.ts +318 -0
  1215. package/src/modifiers/registry.ts +444 -0
  1216. package/src/modifiers/responsive/__tests__/advanced-media-queries.test.ts +392 -0
  1217. package/src/modifiers/responsive/__tests__/advanced-utilities.test.ts +368 -0
  1218. package/src/modifiers/responsive/__tests__/comprehensive-browser-tests.test.ts +556 -0
  1219. package/src/modifiers/responsive/__tests__/layout-patterns.test.ts +558 -0
  1220. package/src/modifiers/responsive/advanced-utilities.ts +562 -0
  1221. package/src/modifiers/responsive/breakpoints.ts +330 -0
  1222. package/src/modifiers/responsive/css-generator.ts +432 -0
  1223. package/src/modifiers/responsive/dev-tools.ts +650 -0
  1224. package/src/modifiers/responsive/index.ts +119 -0
  1225. package/src/modifiers/responsive/layout-patterns.ts +592 -0
  1226. package/src/modifiers/responsive/performance.ts +385 -0
  1227. package/src/modifiers/responsive/responsive-builder.ts +620 -0
  1228. package/src/modifiers/responsive/responsive-modifier.ts +410 -0
  1229. package/src/modifiers/responsive/types.ts +226 -0
  1230. package/src/modifiers/responsive/utilities.ts +478 -0
  1231. package/src/modifiers/scroll.ts +297 -0
  1232. package/src/modifiers/shadows.ts +321 -0
  1233. package/src/modifiers/size.ts +208 -0
  1234. package/src/modifiers/text.ts +416 -0
  1235. package/src/modifiers/transformations.ts +640 -0
  1236. package/src/modifiers/transitions.ts +218 -0
  1237. package/src/modifiers/types.ts +889 -0
  1238. package/src/modifiers/typography.ts +341 -0
  1239. package/src/modifiers/utility.ts +209 -0
  1240. package/src/modifiers/utils.ts +413 -0
  1241. package/src/plugins/__tests__/simplified-plugin-system.test.ts +190 -0
  1242. package/src/plugins/component-loader-registry.ts +371 -0
  1243. package/src/plugins/index.ts +61 -0
  1244. package/src/plugins/legacy-adapter.ts +84 -0
  1245. package/src/plugins/simplified-component-registry.ts +130 -0
  1246. package/src/plugins/simplified-error-handler.ts +372 -0
  1247. package/src/plugins/simplified-index.ts +61 -0
  1248. package/src/plugins/simplified-lazy-loader.ts +242 -0
  1249. package/src/plugins/simplified-plugin-manager.ts +93 -0
  1250. package/src/plugins/simplified-tachui-instance.ts +142 -0
  1251. package/src/plugins/simplified-types.ts +79 -0
  1252. package/src/plugins/simplified-utils.ts +118 -0
  1253. package/src/reactive/cleanup.ts +241 -0
  1254. package/src/reactive/computed.ts +281 -0
  1255. package/src/reactive/context.ts +287 -0
  1256. package/src/reactive/effect.ts +194 -0
  1257. package/src/reactive/enhanced-effect.ts +318 -0
  1258. package/src/reactive/enhanced-signal.ts +227 -0
  1259. package/src/reactive/equality.ts +188 -0
  1260. package/src/reactive/globals.d.ts +5 -0
  1261. package/src/reactive/index.ts +150 -0
  1262. package/src/reactive/migration.ts +335 -0
  1263. package/src/reactive/ownership.ts +182 -0
  1264. package/src/reactive/scheduler.ts +300 -0
  1265. package/src/reactive/signal.ts +201 -0
  1266. package/src/reactive/theme.ts +49 -0
  1267. package/src/reactive/types.ts +103 -0
  1268. package/src/reactive/unified-scheduler.ts +357 -0
  1269. package/src/runtime/component-context.ts +343 -0
  1270. package/src/runtime/component.ts +499 -0
  1271. package/src/runtime/context.ts +527 -0
  1272. package/src/runtime/dev-tools.ts +752 -0
  1273. package/src/runtime/development-warnings.ts +114 -0
  1274. package/src/runtime/dom-bridge.ts +570 -0
  1275. package/src/runtime/element-override.ts +282 -0
  1276. package/src/runtime/error-boundary.ts +955 -0
  1277. package/src/runtime/error-recovery.ts +638 -0
  1278. package/src/runtime/error-reporting.ts +808 -0
  1279. package/src/runtime/error-utils.ts +698 -0
  1280. package/src/runtime/index.ts +202 -0
  1281. package/src/runtime/lazy-component.ts +268 -0
  1282. package/src/runtime/lifecycle.ts +10 -0
  1283. package/src/runtime/mounting.ts +17 -0
  1284. package/src/runtime/optimization.ts +13 -0
  1285. package/src/runtime/performance.ts +693 -0
  1286. package/src/runtime/props.ts +434 -0
  1287. package/src/runtime/refs.ts +13 -0
  1288. package/src/runtime/renderer.ts +674 -0
  1289. package/src/runtime/semantic-role-manager.ts +140 -0
  1290. package/src/runtime/types.ts +282 -0
  1291. package/src/state/binding.ts +381 -0
  1292. package/src/state/environment-object.ts +444 -0
  1293. package/src/state/environment.ts +351 -0
  1294. package/src/state/index.ts +179 -0
  1295. package/src/state/observed-object.ts +405 -0
  1296. package/src/state/state-manager.ts +366 -0
  1297. package/src/state/state.ts +339 -0
  1298. package/src/state/types.ts +192 -0
  1299. package/src/sui-compat.ts +163 -0
  1300. package/src/validation/__tests__/phase-1d-integration.test.ts +558 -0
  1301. package/src/validation/advanced-debugging.ts +860 -0
  1302. package/src/validation/build-time/detection.ts +373 -0
  1303. package/src/validation/build-time/index.ts +222 -0
  1304. package/src/validation/build-time/plugins.ts +515 -0
  1305. package/src/validation/build-time/rules.ts +624 -0
  1306. package/src/validation/build-time/transformer.ts +372 -0
  1307. package/src/validation/build-time/types.ts +232 -0
  1308. package/src/validation/comprehensive.ts +1272 -0
  1309. package/src/validation/debug-tools.ts +724 -0
  1310. package/src/validation/developer-experience.ts +712 -0
  1311. package/src/validation/documentation-integration.ts +835 -0
  1312. package/src/validation/enhanced-runtime.ts +765 -0
  1313. package/src/validation/error-reporting.ts +587 -0
  1314. package/src/validation/ide-integration.ts +845 -0
  1315. package/src/validation/index.ts +353 -0
  1316. package/src/validation/lifecycle-validation.ts +636 -0
  1317. package/src/validation/performance-optimizer.ts +599 -0
  1318. package/src/validation/plugin-registration.ts +249 -0
  1319. package/src/validation/production-bypass.ts +466 -0
  1320. package/src/validation/simple.ts +465 -0
  1321. package/src/viewport/adapters/web-adapter.ts +1385 -0
  1322. package/src/viewport/components.ts +505 -0
  1323. package/src/viewport/environment.ts +173 -0
  1324. package/src/viewport/index.ts +290 -0
  1325. package/src/viewport/platform-detection.ts +431 -0
  1326. package/src/viewport/types.ts +371 -0
  1327. package/src/viewport/viewport-manager.ts +979 -0
@@ -0,0 +1,1815 @@
1
+ /**
2
+ * Base Modifier System Implementation
3
+ *
4
+ * Core modifier classes and utilities for the SwiftUI-inspired modifier system.
5
+ */
6
+
7
+ import { createEffect, isComputed, isSignal, getThemeSignal } from '../reactive'
8
+ import type { Signal } from '../reactive/types'
9
+ import type { DOMNode } from '../runtime/types'
10
+ import type {
11
+ CSSStyleProperties,
12
+ LifecycleModifierProps,
13
+ Modifier,
14
+ ModifierContext,
15
+ ReactiveModifierProps,
16
+ StyleComputationContext,
17
+ } from './types'
18
+ import { ModifierPriority } from './types'
19
+ import { isInfinity, dimensionToCSS, shouldExpandForInfinity } from '../constants/layout'
20
+
21
+ /**
22
+ * Abstract base modifier class
23
+ */
24
+ export abstract class BaseModifier<TProps = {}> implements Modifier<TProps> {
25
+ abstract readonly type: string
26
+ abstract readonly priority: number
27
+
28
+ constructor(public readonly properties: TProps) {}
29
+
30
+ /**
31
+ * Apply the modifier to a DOM node
32
+ */
33
+ abstract apply(node: DOMNode, context: ModifierContext): DOMNode | undefined
34
+
35
+ /**
36
+ * Helper to resolve reactive properties
37
+ */
38
+ protected resolveReactiveProps<T extends Record<string, any>>(
39
+ props: ReactiveModifierProps<T>,
40
+ context: StyleComputationContext
41
+ ): T {
42
+ const resolved = {} as T
43
+
44
+ for (const [key, value] of Object.entries(props)) {
45
+ if (isSignal(value) || isComputed(value)) {
46
+ // Preserve the signal/computed - let applyStyles handle reactivity
47
+ resolved[key as keyof T] = value as T[keyof T]
48
+ } else {
49
+ // Static value
50
+ resolved[key as keyof T] = value
51
+ }
52
+ }
53
+
54
+ // Context parameter is kept for compatibility but not used in new approach
55
+ void context
56
+
57
+ return resolved
58
+ }
59
+
60
+ /**
61
+ * Apply a single style change to an element with reactive support
62
+ */
63
+ protected applyStyleChange(element: Element, property: string, value: any): void {
64
+ if (element instanceof HTMLElement) {
65
+ const cssProperty = this.toCSSProperty(property)
66
+
67
+ // Handle reactive values (signals and computed)
68
+ if (isSignal(value) || isComputed(value)) {
69
+ // Create reactive effect for this style property
70
+ createEffect(() => {
71
+ const currentValue = value()
72
+ const cssValue = String(currentValue)
73
+
74
+ // Check if value contains !important and handle it properly
75
+ if (cssValue.includes('!important')) {
76
+ const actualValue = cssValue.replace(/\s*!important\s*$/, '').trim()
77
+ element.style.setProperty(cssProperty, actualValue, 'important')
78
+ } else {
79
+ element.style.setProperty(cssProperty, cssValue)
80
+ }
81
+ })
82
+ } else {
83
+ // Handle static values
84
+ const cssValue = String(value)
85
+
86
+ // Check if value contains !important and handle it properly
87
+ if (cssValue.includes('!important')) {
88
+ const actualValue = cssValue.replace(/\s*!important\s*$/, '').trim()
89
+ element.style.setProperty(cssProperty, actualValue, 'important')
90
+ } else {
91
+ element.style.setProperty(cssProperty, cssValue)
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Convert camelCase property to CSS kebab-case
99
+ */
100
+ protected toCSSProperty(property: string): string {
101
+ return property.replace(/([A-Z])/g, '-$1').toLowerCase()
102
+ }
103
+
104
+ /**
105
+ * Convert value to CSS value string
106
+ */
107
+ protected toCSSValue(value: any): string {
108
+ if (typeof value === 'number') {
109
+ return `${value}px`
110
+ }
111
+ return String(value)
112
+ }
113
+
114
+ /**
115
+ * Convert value to CSS value string with property-specific handling
116
+ */
117
+ protected toCSSValueForProperty(property: string, value: any): string {
118
+ if (typeof value === 'number') {
119
+ // Properties that should be unitless
120
+ const unitlessProperties = [
121
+ 'opacity',
122
+ 'z-index',
123
+ 'line-height',
124
+ 'flex-grow',
125
+ 'flex-shrink',
126
+ 'order',
127
+ 'column-count',
128
+ 'font-weight',
129
+ ]
130
+
131
+ if (unitlessProperties.includes(property)) {
132
+ return String(value)
133
+ }
134
+
135
+ return `${value}px`
136
+ }
137
+
138
+ // Properties that should be passed through as-is (no processing)
139
+ const passthroughProperties = [
140
+ 'filter', // CSS filter strings should not be processed
141
+ 'transform', // CSS transform strings
142
+ 'clip-path' // CSS clip-path strings
143
+ ]
144
+
145
+ if (passthroughProperties.includes(property)) {
146
+ return String(value)
147
+ }
148
+
149
+ return String(value)
150
+ }
151
+
152
+ /**
153
+ * Apply multiple CSS properties to an element with reactive support
154
+ */
155
+ protected applyStyles(element: Element, styles: CSSStyleProperties): void {
156
+ // Check if element has a style property (for testing and real elements)
157
+ if (element instanceof HTMLElement || (element as any).style) {
158
+ const styleTarget = element instanceof HTMLElement ? element.style : (element as any).style
159
+
160
+ for (const [property, value] of Object.entries(styles)) {
161
+ if (value !== undefined) {
162
+ const cssProperty = this.toCSSProperty(property)
163
+
164
+ // Handle reactive values (signals and computed)
165
+ if (isSignal(value) || isComputed(value)) {
166
+ // Create reactive effect for this style property
167
+ createEffect(() => {
168
+ const currentValue = value()
169
+ const cssValue = this.toCSSValueForProperty(cssProperty, currentValue)
170
+
171
+ if (styleTarget.setProperty) {
172
+ // Check if value contains !important and handle it properly
173
+ if (typeof cssValue === 'string' && cssValue.includes('!important')) {
174
+ const actualValue = cssValue.replace(/\s*!important\s*$/, '').trim()
175
+ styleTarget.setProperty(cssProperty, actualValue, 'important')
176
+ } else {
177
+ styleTarget.setProperty(cssProperty, cssValue)
178
+ }
179
+ } else {
180
+ ;(styleTarget as any)[cssProperty] = cssValue
181
+ }
182
+ })
183
+ } else {
184
+ // Handle static values
185
+ const cssValue = this.toCSSValueForProperty(cssProperty, value)
186
+
187
+ if (styleTarget.setProperty) {
188
+ // Check if value contains !important and handle it properly
189
+ if (typeof cssValue === 'string' && cssValue.includes('!important')) {
190
+ const actualValue = cssValue.replace(/\s*!important\s*$/, '').trim()
191
+ styleTarget.setProperty(cssProperty, actualValue, 'important')
192
+ } else {
193
+ styleTarget.setProperty(cssProperty, cssValue)
194
+ }
195
+ } else {
196
+ ;(styleTarget as any)[cssProperty] = cssValue
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Add CSS classes to an element
206
+ */
207
+ protected addClasses(element: Element, classes: string[]): void {
208
+ if (element instanceof HTMLElement) {
209
+ element.classList.add(...classes)
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Remove CSS classes from an element
215
+ */
216
+ protected removeClasses(element: Element, classes: string[]): void {
217
+ if (element instanceof HTMLElement) {
218
+ element.classList.remove(...classes)
219
+ }
220
+ }
221
+
222
+ /**
223
+ * Create a style computation context
224
+ */
225
+ protected createStyleContext(
226
+ componentId: string,
227
+ element: Element,
228
+ modifiers: Modifier[]
229
+ ): StyleComputationContext {
230
+ return {
231
+ componentId,
232
+ element,
233
+ modifiers,
234
+ signals: new Set(),
235
+ cleanup: [],
236
+ }
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Layout modifier for frame, padding, margin
242
+ */
243
+ export class LayoutModifier extends BaseModifier {
244
+ readonly type = 'layout'
245
+ readonly priority = ModifierPriority.LAYOUT
246
+
247
+ apply(node: DOMNode, context: ModifierContext): DOMNode | undefined {
248
+ if (!node.element || !context.element) return
249
+
250
+ const styleContext = this.createStyleContext(context.componentId, context.element, [])
251
+
252
+ const styles = this.computeLayoutStyles(this.properties as any, styleContext)
253
+
254
+ this.applyStyles(context.element, styles)
255
+
256
+ // Handle offset separately for proper transform combining
257
+ const props = this.properties as any
258
+ if (props.offset && context.element instanceof HTMLElement) {
259
+ this.applyOffsetTransform(context.element, props.offset)
260
+ }
261
+
262
+ // Handle aspectRatio separately for reactive support
263
+ if (props.aspectRatio && context.element instanceof HTMLElement) {
264
+ this.applyAspectRatio(context.element, props.aspectRatio)
265
+ }
266
+
267
+ // Handle scaleEffect separately for proper transform combining (Phase 3 - Epic: Butternut)
268
+ if (props.scaleEffect && context.element instanceof HTMLElement) {
269
+ this.applyScaleTransform(context.element, props.scaleEffect)
270
+ }
271
+
272
+ // Handle absolutePosition separately for proper positioning (Phase 3 - Epic: Butternut)
273
+ if (props.position && context.element instanceof HTMLElement) {
274
+ this.applyAbsolutePosition(context.element, props.position)
275
+ }
276
+
277
+ // Handle zIndex separately for proper layering (Phase 3 - Epic: Butternut)
278
+ if (props.zIndex !== undefined && context.element instanceof HTMLElement) {
279
+ this.applyZIndex(context.element, props.zIndex)
280
+ }
281
+
282
+ return undefined
283
+ }
284
+
285
+ private applyOffsetTransform(element: HTMLElement, offset: { x?: any; y?: any }): void {
286
+ const { x, y } = offset
287
+
288
+ // Handle reactive values
289
+ if (isSignal(x) || isComputed(x) || isSignal(y) || isComputed(y)) {
290
+ createEffect(() => {
291
+ const currentX = isSignal(x) || isComputed(x) ? x() : (x ?? 0)
292
+ const currentY = isSignal(y) || isComputed(y) ? y() : (y ?? 0)
293
+
294
+ const offsetX = this.toCSSValue(currentX)
295
+ const offsetY = this.toCSSValue(currentY)
296
+ const translateValue = `translate(${offsetX}, ${offsetY})`
297
+
298
+ // Preserve existing transforms but replace any existing translate
299
+ const existingTransform = element.style.transform || ''
300
+ const existingTransforms = existingTransform
301
+ .split(' ')
302
+ .filter((t) => t && !t.startsWith('translate('))
303
+ .join(' ')
304
+
305
+ const newTransform = existingTransforms
306
+ ? `${existingTransforms} ${translateValue}`
307
+ : translateValue
308
+
309
+ element.style.transform = newTransform
310
+ })
311
+ } else {
312
+ // Handle static values
313
+ const currentX = x ?? 0
314
+ const currentY = y ?? 0
315
+
316
+ const offsetX = this.toCSSValue(currentX)
317
+ const offsetY = this.toCSSValue(currentY)
318
+ const translateValue = `translate(${offsetX}, ${offsetY})`
319
+
320
+ // Preserve existing transforms but replace any existing translate
321
+ const existingTransform = element.style.transform || ''
322
+ const existingTransforms = existingTransform
323
+ .split(' ')
324
+ .filter((t) => t && !t.startsWith('translate('))
325
+ .join(' ')
326
+
327
+ const newTransform = existingTransforms
328
+ ? `${existingTransforms} ${translateValue}`
329
+ : translateValue
330
+
331
+ element.style.transform = newTransform
332
+ }
333
+ }
334
+
335
+ private applyAspectRatio(
336
+ element: HTMLElement,
337
+ aspectRatio: { ratio?: any; contentMode?: 'fit' | 'fill' }
338
+ ): void {
339
+ const { ratio, contentMode } = aspectRatio
340
+
341
+ if (ratio !== undefined) {
342
+ // Handle reactive aspect ratio
343
+ if (isSignal(ratio) || isComputed(ratio)) {
344
+ createEffect(() => {
345
+ const currentRatio = typeof ratio === 'function' ? ratio() : ratio
346
+ element.style.aspectRatio = String(currentRatio)
347
+ })
348
+ } else {
349
+ element.style.aspectRatio = String(ratio)
350
+ }
351
+
352
+ // Set content mode
353
+ if (contentMode === 'fill') {
354
+ element.style.objectFit = 'cover'
355
+ } else {
356
+ element.style.objectFit = 'contain'
357
+ }
358
+ }
359
+ }
360
+
361
+ // Phase 3 - Epic: Butternut Transform Methods
362
+
363
+ private applyScaleTransform(
364
+ element: HTMLElement,
365
+ scaleEffect: { x?: any; y?: any; anchor?: string }
366
+ ): void {
367
+ const { x, y, anchor } = scaleEffect
368
+ const scaleX = x ?? 1
369
+ const scaleY = y ?? scaleX // Default to uniform scaling if y not provided
370
+
371
+ // Handle reactive values
372
+ if (isSignal(scaleX) || isComputed(scaleX) || isSignal(scaleY) || isComputed(scaleY)) {
373
+ createEffect(() => {
374
+ const currentX = isSignal(scaleX) || isComputed(scaleX) ? scaleX() : scaleX
375
+ const currentY = isSignal(scaleY) || isComputed(scaleY) ? scaleY() : scaleY
376
+
377
+ const scaleValue = `scale(${currentX}, ${currentY})`
378
+
379
+ // Set transform-origin based on anchor
380
+ element.style.transformOrigin = this.getTransformOrigin(anchor || 'center')
381
+
382
+ // Preserve existing transforms but replace any existing scale
383
+ const existingTransform = element.style.transform || ''
384
+ const existingTransforms = existingTransform
385
+ .replace(/\s*scale\([^)]*\)\s*/g, ' ')
386
+ .replace(/\s+/g, ' ')
387
+ .trim()
388
+
389
+ const newTransform = existingTransforms
390
+ ? `${existingTransforms} ${scaleValue}`
391
+ : scaleValue
392
+
393
+ element.style.transform = newTransform
394
+ })
395
+ } else {
396
+ // Handle static values
397
+ const scaleValue = `scale(${scaleX}, ${scaleY})`
398
+
399
+ // Set transform-origin based on anchor
400
+ element.style.transformOrigin = this.getTransformOrigin(anchor || 'center')
401
+
402
+ // Preserve existing transforms but replace any existing scale
403
+ const existingTransform = element.style.transform || ''
404
+ const existingTransforms = existingTransform
405
+ .replace(/\s*scale\([^)]*\)\s*/g, ' ')
406
+ .replace(/\s+/g, ' ')
407
+ .trim()
408
+
409
+ const newTransform = existingTransforms
410
+ ? `${existingTransforms} ${scaleValue}`
411
+ : scaleValue
412
+
413
+ element.style.transform = newTransform
414
+ }
415
+ }
416
+
417
+ private applyAbsolutePosition(element: HTMLElement, position: { x?: any; y?: any }): void {
418
+ const { x, y } = position
419
+
420
+ // Set position to absolute for SwiftUI-style absolute positioning
421
+ element.style.position = 'absolute'
422
+
423
+ // Handle reactive values
424
+ if (isSignal(x) || isComputed(x) || isSignal(y) || isComputed(y)) {
425
+ createEffect(() => {
426
+ const currentX = isSignal(x) || isComputed(x) ? x() : (x ?? 0)
427
+ const currentY = isSignal(y) || isComputed(y) ? y() : (y ?? 0)
428
+
429
+ element.style.left = this.toCSSValue(currentX)
430
+ element.style.top = this.toCSSValue(currentY)
431
+ })
432
+ } else {
433
+ // Handle static values
434
+ const currentX = x ?? 0
435
+ const currentY = y ?? 0
436
+
437
+ element.style.left = this.toCSSValue(currentX)
438
+ element.style.top = this.toCSSValue(currentY)
439
+ }
440
+ }
441
+
442
+ private applyZIndex(element: HTMLElement, zIndex: any): void {
443
+ // Handle reactive values
444
+ if (isSignal(zIndex) || isComputed(zIndex)) {
445
+ createEffect(() => {
446
+ const currentZIndex = zIndex()
447
+ element.style.zIndex = String(currentZIndex)
448
+ })
449
+ } else {
450
+ // Handle static values
451
+ element.style.zIndex = String(zIndex)
452
+ }
453
+ }
454
+
455
+ private getTransformOrigin(anchor: string): string {
456
+ const anchorMap: Record<string, string> = {
457
+ center: 'center center',
458
+ top: 'center top',
459
+ topLeading: 'left top',
460
+ topTrailing: 'right top',
461
+ bottom: 'center bottom',
462
+ bottomLeading: 'left bottom',
463
+ bottomTrailing: 'right bottom',
464
+ leading: 'left center',
465
+ trailing: 'right center',
466
+ }
467
+
468
+ return anchorMap[anchor] || 'center center'
469
+ }
470
+
471
+ private computeLayoutStyles(props: any, _context: StyleComputationContext): CSSStyleProperties {
472
+ const styles: CSSStyleProperties = {}
473
+
474
+ // Frame properties - handle infinity values properly
475
+ if (props.frame) {
476
+ const frame = props.frame
477
+
478
+ // Check for infinity constraints and apply appropriate flex/size styles
479
+ const infinityResult = shouldExpandForInfinity(frame)
480
+ Object.assign(styles, infinityResult.cssProps)
481
+
482
+ // Convert dimensions to CSS, handling infinity appropriately
483
+ // Don't apply explicit width/height if infinity expansion is happening
484
+ if (frame.width !== undefined) {
485
+ const cssValue = dimensionToCSS(frame.width)
486
+ if (cssValue !== undefined && !isInfinity(frame.width) && !infinityResult.expandWidth) {
487
+ styles.width = cssValue
488
+ }
489
+ }
490
+
491
+ if (frame.height !== undefined) {
492
+ const cssValue = dimensionToCSS(frame.height)
493
+ if (cssValue !== undefined && !isInfinity(frame.height) && !infinityResult.expandHeight) {
494
+ styles.height = cssValue
495
+ }
496
+ }
497
+
498
+ if (frame.minWidth !== undefined) {
499
+ const cssValue = dimensionToCSS(frame.minWidth)
500
+ if (cssValue !== undefined) {
501
+ styles.minWidth = cssValue
502
+ }
503
+ }
504
+
505
+ if (frame.maxWidth !== undefined && !isInfinity(frame.maxWidth)) {
506
+ const cssValue = dimensionToCSS(frame.maxWidth)
507
+ if (cssValue !== undefined) {
508
+ styles.maxWidth = cssValue
509
+ }
510
+ } else if (isInfinity(frame.maxWidth)) {
511
+ // SwiftUI compatibility: maxWidth infinity means expand to fill available width
512
+ // Remove maxWidth constraint and use flex properties for expansion
513
+ styles.maxWidth = 'none'
514
+ styles.flexGrow = '1 !important'
515
+ styles.flexShrink = '1 !important'
516
+ styles.flexBasis = '0% !important'
517
+ styles.alignSelf = 'stretch !important'
518
+ }
519
+
520
+ if (frame.minHeight !== undefined) {
521
+ const cssValue = dimensionToCSS(frame.minHeight)
522
+ if (cssValue !== undefined) {
523
+ styles.minHeight = cssValue
524
+ }
525
+ }
526
+
527
+ if (frame.maxHeight !== undefined && !isInfinity(frame.maxHeight)) {
528
+ const cssValue = dimensionToCSS(frame.maxHeight)
529
+ if (cssValue !== undefined) {
530
+ styles.maxHeight = cssValue
531
+ }
532
+ } else if (isInfinity(frame.maxHeight)) {
533
+ // SwiftUI compatibility: maxHeight infinity means expand to fill available height
534
+ // Remove maxHeight constraint and use flex properties for expansion
535
+ styles.maxHeight = 'none'
536
+ styles.flexGrow = '1 !important'
537
+ styles.flexShrink = '1 !important'
538
+ styles.flexBasis = '0% !important'
539
+ styles.alignSelf = 'stretch !important'
540
+ }
541
+ }
542
+
543
+ // Padding
544
+ if (props.padding !== undefined) {
545
+ if (typeof props.padding === 'number') {
546
+ styles.padding = this.toCSSValue(props.padding)
547
+ } else {
548
+ const p = props.padding
549
+ if (p.top !== undefined) styles.paddingTop = this.toCSSValue(p.top)
550
+ if (p.right !== undefined) styles.paddingRight = this.toCSSValue(p.right)
551
+ if (p.bottom !== undefined) styles.paddingBottom = this.toCSSValue(p.bottom)
552
+ if (p.left !== undefined) styles.paddingLeft = this.toCSSValue(p.left)
553
+ }
554
+ }
555
+
556
+ // Margin
557
+ if (props.margin !== undefined) {
558
+ if (typeof props.margin === 'number') {
559
+ styles.margin = this.toCSSValue(props.margin)
560
+ } else {
561
+ const m = props.margin
562
+ if (m.top !== undefined) styles.marginTop = this.toCSSValue(m.top)
563
+ if (m.right !== undefined) styles.marginRight = this.toCSSValue(m.right)
564
+ if (m.bottom !== undefined) styles.marginBottom = this.toCSSValue(m.bottom)
565
+ if (m.left !== undefined) styles.marginLeft = this.toCSSValue(m.left)
566
+ }
567
+ }
568
+
569
+ // Alignment
570
+ if (props.alignment) {
571
+ switch (props.alignment) {
572
+ case 'leading':
573
+ styles.textAlign = 'left'
574
+ styles.alignItems = 'flex-start'
575
+ break
576
+ case 'center':
577
+ styles.textAlign = 'center'
578
+ styles.alignItems = 'center'
579
+ break
580
+ case 'trailing':
581
+ styles.textAlign = 'right'
582
+ styles.alignItems = 'flex-end'
583
+ break
584
+ case 'top':
585
+ styles.alignItems = 'flex-start'
586
+ break
587
+ case 'bottom':
588
+ styles.alignItems = 'flex-end'
589
+ break
590
+ }
591
+ }
592
+
593
+ // Layout Priority
594
+ // In SwiftUI, layoutPriority determines which views get priority in sizing
595
+ // Higher priority views determine container size in ZStack
596
+ // We implement this using CSS flexbox properties for flexible layouts
597
+ if (props.layoutPriority !== undefined) {
598
+ const priority = Number(props.layoutPriority)
599
+
600
+ // Set flex properties based on priority
601
+ // Higher priority = less flex shrink, more flex grow
602
+ if (priority > 0) {
603
+ // High priority: Don't shrink, allow growth
604
+ styles.flexShrink = '0'
605
+ styles.flexGrow = String(Math.max(1, priority / 10))
606
+
607
+ // For ZStack containers, higher priority elements determine size
608
+ // We use z-index for layering and flex properties for sizing behavior
609
+ styles.zIndex = String(priority)
610
+
611
+ // In grid layouts, higher priority gets more space
612
+ styles.gridRowEnd = `span ${String(Math.min(10, Math.max(1, Math.ceil(priority / 10))))}`
613
+ styles.gridColumnEnd = `span ${String(Math.min(10, Math.max(1, Math.ceil(priority / 10))))}`
614
+ } else if (priority === 0) {
615
+ // Default priority: Normal flex behavior
616
+ styles.flexShrink = '1'
617
+ styles.flexGrow = '1'
618
+ } else {
619
+ // Low priority: Shrink more, grow less
620
+ styles.flexShrink = String(Math.abs(priority))
621
+ styles.flexGrow = '0'
622
+ styles.zIndex = String(priority)
623
+ }
624
+
625
+ // For containers that need to size based on highest priority child
626
+ // We use CSS custom properties that can be read by parent containers
627
+ if (styles && typeof styles === 'object' && 'setProperty' in styles) {
628
+ ;(styles as any).setProperty('--layout-priority', String(priority))
629
+ }
630
+ }
631
+
632
+ // Offset modifier (SwiftUI .offset(x, y))
633
+ // Note: Offset handling is done in the apply method with proper reactive support
634
+ // This is just for setting up the basic structure
635
+ if (props.offset) {
636
+ // The actual transform application happens in apply() method
637
+ // to handle both reactive and static values properly
638
+ }
639
+
640
+ // Aspect Ratio modifier (SwiftUI .aspectRatio(ratio, contentMode))
641
+ if (props.aspectRatio) {
642
+ const { ratio, contentMode } = props.aspectRatio
643
+
644
+ if (ratio !== undefined) {
645
+ // Apply CSS aspect-ratio property
646
+ styles.aspectRatio = typeof ratio === 'number' ? String(ratio) : ratio
647
+
648
+ // Handle content mode
649
+ if (contentMode === 'fill') {
650
+ styles.objectFit = 'cover'
651
+ } else {
652
+ styles.objectFit = 'contain'
653
+ }
654
+ }
655
+ }
656
+
657
+ // Fixed Size modifier (SwiftUI .fixedSize())
658
+ if (props.fixedSize) {
659
+ const { horizontal, vertical } = props.fixedSize
660
+
661
+ if (horizontal) {
662
+ styles.flexShrink = '0'
663
+ styles.width = 'max-content'
664
+ }
665
+ if (vertical) {
666
+ styles.flexShrink = '0'
667
+ styles.height = 'max-content'
668
+ }
669
+ }
670
+
671
+ return styles
672
+ }
673
+ }
674
+
675
+ /**
676
+ * Appearance modifier for colors, fonts, borders, shadows
677
+ */
678
+ export class AppearanceModifier extends BaseModifier {
679
+ readonly type = 'appearance'
680
+ readonly priority = ModifierPriority.APPEARANCE
681
+
682
+ apply(node: DOMNode, context: ModifierContext): DOMNode | undefined {
683
+ if (!node.element || !context.element) {
684
+ return
685
+ }
686
+
687
+ const styleContext = this.createStyleContext(context.componentId, context.element, [])
688
+
689
+ const resolved = this.resolveReactiveProps(this.properties as any, styleContext)
690
+
691
+ // Handle Assets separately with theme reactivity
692
+ this.applyAssetBasedStyles(context.element, resolved)
693
+
694
+ // Handle non-Asset styles normally
695
+ const styles = this.computeAppearanceStyles(resolved)
696
+ this.applyStyles(context.element, styles)
697
+
698
+ return undefined
699
+ }
700
+
701
+ /**
702
+ * Apply Asset-based styles with theme reactivity
703
+ */
704
+ private applyAssetBasedStyles(element: Element, props: any): void {
705
+ // Get the shared theme signal
706
+ const themeSignal = getThemeSignal()
707
+
708
+ // Handle foregroundColor Asset
709
+ if (props.foregroundColor && this.isAsset(props.foregroundColor)) {
710
+ createEffect(() => {
711
+ // Watch theme changes to trigger re-resolution
712
+ themeSignal()
713
+ // Re-resolve Asset when theme changes
714
+ const resolvedColor = props.foregroundColor.resolve()
715
+ this.applyStyleChange(element, 'color', resolvedColor)
716
+ })
717
+ }
718
+
719
+ // Handle backgroundColor Asset
720
+ if (props.backgroundColor && this.isAsset(props.backgroundColor)) {
721
+ createEffect(() => {
722
+ // Watch theme changes to trigger re-resolution
723
+ themeSignal()
724
+ // Re-resolve Asset when theme changes
725
+ const resolvedColor = props.backgroundColor.resolve()
726
+ this.applyStyleChange(element, 'backgroundColor', resolvedColor)
727
+ })
728
+ }
729
+
730
+ // Handle border color Asset
731
+ if (props.border?.color && this.isAsset(props.border.color)) {
732
+ createEffect(() => {
733
+ // Watch theme changes
734
+ themeSignal()
735
+ // Re-resolve Asset when theme changes
736
+ const resolvedColor = props.border.color.resolve()
737
+ this.applyStyleChange(element, 'borderColor', resolvedColor)
738
+ })
739
+ }
740
+ }
741
+
742
+ /**
743
+ * Check if a value is an Asset object (including Asset proxies)
744
+ */
745
+ private isAsset(value: any): boolean {
746
+ return (
747
+ value !== null &&
748
+ value !== undefined &&
749
+ typeof value === 'object' &&
750
+ 'resolve' in value &&
751
+ typeof value.resolve === 'function'
752
+ )
753
+ }
754
+
755
+ private computeAppearanceStyles(props: any): CSSStyleProperties {
756
+ const styles: CSSStyleProperties = {}
757
+
758
+ // Colors (skip Assets - they're handled reactively in applyAssetBasedStyles)
759
+ if (props.foregroundColor && !this.isAsset(props.foregroundColor)) {
760
+ styles.color = props.foregroundColor
761
+ }
762
+ if (props.backgroundColor && !this.isAsset(props.backgroundColor)) {
763
+ styles.backgroundColor = props.backgroundColor
764
+ }
765
+ if (props.opacity !== undefined) styles.opacity = props.opacity
766
+
767
+ // Font
768
+ if (props.font) {
769
+ const font = props.font
770
+ if (font.family) {
771
+ // Handle FontAsset objects that need to be resolved
772
+ if (typeof font.family === 'object' && font.family !== null && 'resolve' in font.family) {
773
+ styles.fontFamily = (font.family as any).resolve()
774
+ } else {
775
+ styles.fontFamily = font.family as string
776
+ }
777
+ }
778
+ if (font.size) styles.fontSize = this.toCSSValue(font.size)
779
+ if (font.weight) styles.fontWeight = String(font.weight)
780
+ if (font.style) styles.fontStyle = font.style
781
+ }
782
+
783
+ // Corner radius
784
+ if (props.cornerRadius !== undefined) {
785
+ styles.borderRadius = this.toCSSValue(props.cornerRadius)
786
+ }
787
+
788
+ // Border
789
+ if (props.border) {
790
+ const border = props.border
791
+ if (border.width !== undefined) styles.borderWidth = this.toCSSValue(border.width)
792
+ if (border.color && !this.isAsset(border.color)) {
793
+ styles.borderColor = border.color as string
794
+ }
795
+ if (border.style) styles.borderStyle = border.style
796
+ }
797
+
798
+ // Shadow
799
+ if (props.shadow) {
800
+ const shadow = props.shadow
801
+ const x = shadow.x || 0
802
+ const y = shadow.y || 0
803
+ const radius = shadow.radius || 0
804
+ const color = shadow.color || 'rgba(0,0,0,0.25)'
805
+ styles.boxShadow = `${x}px ${y}px ${radius}px ${color}`
806
+ }
807
+
808
+ // Clipped modifier (SwiftUI .clipped())
809
+ if (props.clipped) {
810
+ styles.overflow = 'hidden'
811
+ }
812
+
813
+ // Clip Shape modifier (SwiftUI .clipShape())
814
+ if (props.clipShape) {
815
+ const { shape, parameters } = props.clipShape
816
+
817
+ switch (shape) {
818
+ case 'circle':
819
+ styles.clipPath = 'circle(50%)'
820
+ break
821
+ case 'ellipse': {
822
+ const radiusX = parameters?.radiusX || '50%'
823
+ const radiusY = parameters?.radiusY || '50%'
824
+ styles.clipPath = `ellipse(${radiusX} ${radiusY} at center)`
825
+ break
826
+ }
827
+ case 'rect': {
828
+ const inset = parameters?.inset || 0
829
+ styles.clipPath = `inset(${inset}px)`
830
+ break
831
+ }
832
+ case 'polygon': {
833
+ const points = parameters?.points || '0% 0%, 100% 0%, 100% 100%, 0% 100%'
834
+ styles.clipPath = `polygon(${points})`
835
+ break
836
+ }
837
+ }
838
+ }
839
+
840
+ // Visual Effects (Phase 2 - Epic: Butternut)
841
+ const filters: string[] = []
842
+
843
+ if (props.blur !== undefined) {
844
+ filters.push(`blur(${props.blur}px)`)
845
+ }
846
+ if (props.brightness !== undefined) {
847
+ filters.push(`brightness(${props.brightness})`)
848
+ }
849
+ if (props.contrast !== undefined) {
850
+ filters.push(`contrast(${props.contrast})`)
851
+ }
852
+ if (props.saturation !== undefined) {
853
+ filters.push(`saturate(${props.saturation})`)
854
+ }
855
+ if (props.hueRotation !== undefined) {
856
+ filters.push(`hue-rotate(${props.hueRotation}deg)`)
857
+ }
858
+ if (props.grayscale !== undefined) {
859
+ filters.push(`grayscale(${props.grayscale})`)
860
+ }
861
+ if (props.colorInvert !== undefined) {
862
+ filters.push(`invert(${props.colorInvert})`)
863
+ }
864
+
865
+ if (filters.length > 0) {
866
+ styles.filter = filters.join(' ')
867
+ }
868
+
869
+ return styles
870
+ }
871
+ }
872
+
873
+ /**
874
+ * Interaction modifier for events and accessibility
875
+ */
876
+ export class InteractionModifier extends BaseModifier {
877
+ readonly type = 'interaction'
878
+ readonly priority = ModifierPriority.INTERACTION
879
+
880
+ apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {
881
+ if (!context.element) return
882
+
883
+ const props = this.properties as any
884
+
885
+ // Event handlers
886
+ if (props.onTap) {
887
+ context.element.addEventListener('click', props.onTap)
888
+ }
889
+
890
+ if (props.onHover) {
891
+ context.element.addEventListener('mouseenter', () => props.onHover(true))
892
+ context.element.addEventListener('mouseleave', () => props.onHover(false))
893
+ }
894
+
895
+ if (props.onMouseEnter) {
896
+ context.element.addEventListener('mouseenter', props.onMouseEnter)
897
+ }
898
+
899
+ if (props.onMouseLeave) {
900
+ context.element.addEventListener('mouseleave', props.onMouseLeave)
901
+ }
902
+
903
+ if (props.onMouseDown) {
904
+ context.element.addEventListener('mousedown', props.onMouseDown)
905
+ }
906
+
907
+ if (props.onMouseUp) {
908
+ context.element.addEventListener('mouseup', props.onMouseUp)
909
+ }
910
+
911
+ if (props.onDragStart) {
912
+ context.element.addEventListener('dragstart', props.onDragStart)
913
+ }
914
+
915
+ if (props.onDragOver) {
916
+ context.element.addEventListener('dragover', props.onDragOver)
917
+ }
918
+
919
+ if (props.onDragLeave) {
920
+ context.element.addEventListener('dragleave', props.onDragLeave)
921
+ }
922
+
923
+ if (props.onDrop) {
924
+ context.element.addEventListener('drop', props.onDrop)
925
+ }
926
+
927
+ // Additional mouse events
928
+ if (props.onDoubleClick) {
929
+ context.element.addEventListener('dblclick', props.onDoubleClick)
930
+ }
931
+
932
+ if (props.onContextMenu) {
933
+ context.element.addEventListener('contextmenu', props.onContextMenu)
934
+ }
935
+
936
+ // Focus events
937
+ if (props.onFocus) {
938
+ context.element.addEventListener('focus', () => props.onFocus(true))
939
+ context.element.addEventListener('blur', () => props.onFocus(false))
940
+ }
941
+
942
+ if (props.onBlur) {
943
+ context.element.addEventListener('blur', () => props.onBlur(false))
944
+ }
945
+
946
+ // Keyboard events
947
+ if (props.onKeyPress) {
948
+ context.element.addEventListener('keypress', props.onKeyPress)
949
+ }
950
+
951
+ if (props.onKeyDown) {
952
+ context.element.addEventListener('keydown', props.onKeyDown)
953
+ }
954
+
955
+ if (props.onKeyUp) {
956
+ context.element.addEventListener('keyup', props.onKeyUp)
957
+ }
958
+
959
+ // Scroll and wheel events
960
+ if (props.onScroll) {
961
+ context.element.addEventListener('scroll', props.onScroll, { passive: true })
962
+ }
963
+
964
+ if (props.onWheel) {
965
+ context.element.addEventListener('wheel', props.onWheel, { passive: false })
966
+ }
967
+
968
+ // Input events
969
+ if (props.onInput) {
970
+ context.element.addEventListener('input', props.onInput)
971
+ }
972
+
973
+ if (props.onChange) {
974
+ context.element.addEventListener('change', (event) => {
975
+ const target = event.target as HTMLInputElement
976
+ const value = target.value || target.textContent || ''
977
+ props.onChange(value, event)
978
+ })
979
+ }
980
+
981
+ // Clipboard events
982
+ if (props.onCopy) {
983
+ context.element.addEventListener('copy', props.onCopy)
984
+ }
985
+
986
+ if (props.onCut) {
987
+ context.element.addEventListener('cut', props.onCut)
988
+ }
989
+
990
+ if (props.onPaste) {
991
+ context.element.addEventListener('paste', props.onPaste)
992
+ }
993
+
994
+ // Selection events
995
+ if (props.onSelect) {
996
+ context.element.addEventListener('select', props.onSelect)
997
+ }
998
+
999
+ // Disabled state
1000
+ if (props.disabled !== undefined) {
1001
+ if (context.element instanceof HTMLElement) {
1002
+ if (props.disabled) {
1003
+ context.element.setAttribute('disabled', 'true')
1004
+ context.element.style.pointerEvents = 'none'
1005
+ context.element.style.opacity = '0.6'
1006
+ } else {
1007
+ context.element.removeAttribute('disabled')
1008
+ context.element.style.pointerEvents = ''
1009
+ context.element.style.opacity = ''
1010
+ }
1011
+ }
1012
+ }
1013
+
1014
+ // Draggable state
1015
+ if (props.draggable !== undefined) {
1016
+ if (context.element instanceof HTMLElement) {
1017
+ context.element.draggable = props.draggable
1018
+ }
1019
+ }
1020
+
1021
+ // Accessibility
1022
+ if (props.accessibilityLabel) {
1023
+ context.element.setAttribute('aria-label', props.accessibilityLabel)
1024
+ }
1025
+
1026
+ if (props.accessibilityHint) {
1027
+ context.element.setAttribute('aria-describedby', props.accessibilityHint)
1028
+ }
1029
+
1030
+ // Advanced Gesture Modifiers (Phase 4 - Epic: Butternut)
1031
+ if (props.onLongPressGesture) {
1032
+ this.setupLongPressGesture(context.element, props.onLongPressGesture)
1033
+ }
1034
+
1035
+ if (props.keyboardShortcut) {
1036
+ this.setupKeyboardShortcut(context.element, props.keyboardShortcut)
1037
+ }
1038
+
1039
+ if (props.focused !== undefined) {
1040
+ this.setupFocusManagement(context.element, props.focused)
1041
+ }
1042
+
1043
+ if (props.focusable) {
1044
+ this.setupFocusable(context.element, props.focusable)
1045
+ }
1046
+
1047
+ if (props.onContinuousHover) {
1048
+ this.setupContinuousHover(context.element, props.onContinuousHover)
1049
+ }
1050
+
1051
+ if (props.allowsHitTesting !== undefined) {
1052
+ this.setupHitTesting(context.element, props.allowsHitTesting)
1053
+ }
1054
+
1055
+ return undefined
1056
+ }
1057
+
1058
+ // Phase 4 Advanced Gesture Methods
1059
+
1060
+ /**
1061
+ * Setup long press gesture with timing and distance constraints
1062
+ */
1063
+ private setupLongPressGesture(
1064
+ element: Element,
1065
+ options: {
1066
+ minimumDuration?: number
1067
+ maximumDistance?: number
1068
+ perform: () => void
1069
+ onPressingChanged?: (isPressing: boolean) => void
1070
+ }
1071
+ ): void {
1072
+ const minimumDuration = options.minimumDuration ?? 500 // ms
1073
+ const maximumDistance = options.maximumDistance ?? 10 // px
1074
+
1075
+ let timeoutId: number | undefined
1076
+ let startPoint: { x: number; y: number } | null = null
1077
+ let isPressing = false
1078
+
1079
+ const cleanup = () => {
1080
+ if (timeoutId) {
1081
+ clearTimeout(timeoutId)
1082
+ timeoutId = undefined
1083
+ }
1084
+ if (isPressing && options.onPressingChanged) {
1085
+ options.onPressingChanged(false)
1086
+ }
1087
+ isPressing = false
1088
+ startPoint = null
1089
+ }
1090
+
1091
+ const handlePointerDown = (event: Event) => {
1092
+ const pointerEvent = event as PointerEvent
1093
+ startPoint = { x: pointerEvent.clientX, y: pointerEvent.clientY }
1094
+ isPressing = true
1095
+
1096
+ if (options.onPressingChanged) {
1097
+ options.onPressingChanged(true)
1098
+ }
1099
+
1100
+ timeoutId = window.setTimeout(() => {
1101
+ if (isPressing && startPoint) {
1102
+ options.perform()
1103
+ cleanup()
1104
+ }
1105
+ }, minimumDuration)
1106
+ }
1107
+
1108
+ const handlePointerMove = (event: Event) => {
1109
+ const pointerEvent = event as PointerEvent
1110
+ if (!startPoint || !isPressing) return
1111
+
1112
+ const distance = Math.sqrt(
1113
+ Math.pow(pointerEvent.clientX - startPoint.x, 2) +
1114
+ Math.pow(pointerEvent.clientY - startPoint.y, 2)
1115
+ )
1116
+
1117
+ if (distance > maximumDistance) {
1118
+ cleanup()
1119
+ }
1120
+ }
1121
+
1122
+ const handlePointerUp = () => {
1123
+ cleanup()
1124
+ }
1125
+
1126
+ const handlePointerCancel = () => {
1127
+ cleanup()
1128
+ }
1129
+
1130
+ // Use pointer events for better touch/mouse compatibility
1131
+ element.addEventListener('pointerdown', handlePointerDown as EventListener)
1132
+ element.addEventListener('pointermove', handlePointerMove as EventListener)
1133
+ element.addEventListener('pointerup', handlePointerUp as EventListener)
1134
+ element.addEventListener('pointercancel', handlePointerCancel as EventListener)
1135
+
1136
+ // Store cleanup function for later removal
1137
+ ;(element as any)._longPressCleanup = cleanup
1138
+ }
1139
+
1140
+ /**
1141
+ * Setup keyboard shortcut handling
1142
+ */
1143
+ private setupKeyboardShortcut(
1144
+ element: Element,
1145
+ shortcut: {
1146
+ key: string
1147
+ modifiers?: ('cmd' | 'ctrl' | 'shift' | 'alt' | 'meta')[]
1148
+ action: () => void
1149
+ }
1150
+ ): void {
1151
+ const modifiers = shortcut.modifiers ?? []
1152
+
1153
+ const handleKeyDown = (event: KeyboardEvent) => {
1154
+ // Check if all required modifiers are pressed
1155
+ const requiredModifiers = {
1156
+ cmd: modifiers.includes('cmd') || modifiers.includes('meta'),
1157
+ ctrl: modifiers.includes('ctrl'),
1158
+ shift: modifiers.includes('shift'),
1159
+ alt: modifiers.includes('alt')
1160
+ }
1161
+
1162
+ const actualModifiers = {
1163
+ cmd: event.metaKey || event.ctrlKey, // Handle both Mac (meta) and PC (ctrl)
1164
+ ctrl: event.ctrlKey,
1165
+ shift: event.shiftKey,
1166
+ alt: event.altKey
1167
+ }
1168
+
1169
+ // Check key match (case insensitive)
1170
+ const keyMatches = event.key.toLowerCase() === shortcut.key.toLowerCase()
1171
+
1172
+ // Check modifier requirements
1173
+ const modifiersMatch = Object.entries(requiredModifiers).every(
1174
+ ([mod, required]) => required === actualModifiers[mod as keyof typeof actualModifiers]
1175
+ )
1176
+
1177
+ if (keyMatches && modifiersMatch) {
1178
+ event.preventDefault()
1179
+ shortcut.action()
1180
+ }
1181
+ }
1182
+
1183
+ // Add keyboard event listener to document for global shortcuts
1184
+ document.addEventListener('keydown', handleKeyDown)
1185
+
1186
+ // Store cleanup function
1187
+ ;(element as any)._keyboardShortcutCleanup = () => {
1188
+ document.removeEventListener('keydown', handleKeyDown)
1189
+ }
1190
+ }
1191
+
1192
+ /**
1193
+ * Setup focus management with reactive binding
1194
+ */
1195
+ private setupFocusManagement(element: Element, focused: boolean | Signal<boolean>): void {
1196
+ if (!(element instanceof HTMLElement)) return
1197
+
1198
+ const htmlElement = element as HTMLElement
1199
+
1200
+ // Make element focusable if it's not naturally focusable
1201
+ if (!htmlElement.hasAttribute('tabindex')) {
1202
+ htmlElement.setAttribute('tabindex', '0')
1203
+ }
1204
+
1205
+ if (isSignal(focused) || isComputed(focused)) {
1206
+ // Reactive focus management
1207
+ createEffect(() => {
1208
+ const shouldFocus = focused()
1209
+ if (shouldFocus) {
1210
+ htmlElement.focus()
1211
+ } else {
1212
+ htmlElement.blur()
1213
+ }
1214
+ })
1215
+ } else {
1216
+ // Static focus management
1217
+ if (focused) {
1218
+ htmlElement.focus()
1219
+ }
1220
+ }
1221
+ }
1222
+
1223
+ /**
1224
+ * Setup focusable behavior
1225
+ */
1226
+ private setupFocusable(
1227
+ element: Element,
1228
+ options: {
1229
+ isFocusable?: boolean
1230
+ interactions?: ('activate' | 'edit')[]
1231
+ }
1232
+ ): void {
1233
+ if (!(element instanceof HTMLElement)) return
1234
+
1235
+ const htmlElement = element as HTMLElement
1236
+
1237
+ if (options.isFocusable === false) {
1238
+ htmlElement.setAttribute('tabindex', '-1')
1239
+ } else {
1240
+ if (!htmlElement.hasAttribute('tabindex')) {
1241
+ htmlElement.setAttribute('tabindex', '0')
1242
+ }
1243
+ }
1244
+
1245
+ // Setup interaction behaviors
1246
+ if (options.interactions?.includes('activate')) {
1247
+ htmlElement.addEventListener('keydown', (event) => {
1248
+ if (event.key === 'Enter' || event.key === ' ') {
1249
+ event.preventDefault()
1250
+ htmlElement.click()
1251
+ }
1252
+ })
1253
+ }
1254
+
1255
+ if (options.interactions?.includes('edit')) {
1256
+ htmlElement.setAttribute('role', 'textbox')
1257
+ htmlElement.setAttribute('contenteditable', 'true')
1258
+ }
1259
+ }
1260
+
1261
+ /**
1262
+ * Setup continuous hover tracking with coordinates
1263
+ */
1264
+ private setupContinuousHover(
1265
+ element: Element,
1266
+ options: {
1267
+ coordinateSpace?: 'local' | 'global'
1268
+ perform: (location: { x: number; y: number } | null) => void
1269
+ }
1270
+ ): void {
1271
+ const coordinateSpace = options.coordinateSpace ?? 'local'
1272
+
1273
+ const handleMouseMove = (event: Event) => {
1274
+ const mouseEvent = event as MouseEvent
1275
+ let x: number, y: number
1276
+
1277
+ if (coordinateSpace === 'local') {
1278
+ const rect = element.getBoundingClientRect()
1279
+ x = mouseEvent.clientX - rect.left
1280
+ y = mouseEvent.clientY - rect.top
1281
+ } else {
1282
+ x = mouseEvent.clientX
1283
+ y = mouseEvent.clientY
1284
+ }
1285
+
1286
+ options.perform({ x, y })
1287
+ }
1288
+
1289
+ const handleMouseLeave = () => {
1290
+ options.perform(null)
1291
+ }
1292
+
1293
+ element.addEventListener('mousemove', handleMouseMove as EventListener)
1294
+ element.addEventListener('mouseleave', handleMouseLeave as EventListener)
1295
+
1296
+ // Store cleanup
1297
+ ;(element as any)._continuousHoverCleanup = () => {
1298
+ element.removeEventListener('mousemove', handleMouseMove as EventListener)
1299
+ element.removeEventListener('mouseleave', handleMouseLeave as EventListener)
1300
+ }
1301
+ }
1302
+
1303
+ /**
1304
+ * Setup hit testing control
1305
+ */
1306
+ private setupHitTesting(element: Element, enabled: boolean): void {
1307
+ if (element instanceof HTMLElement) {
1308
+ element.style.pointerEvents = enabled ? '' : 'none'
1309
+ }
1310
+ }
1311
+ }
1312
+
1313
+ /**
1314
+ * Animation modifier for transitions and animations
1315
+ */
1316
+ export class AnimationModifier extends BaseModifier {
1317
+ readonly type = 'animation'
1318
+ readonly priority = ModifierPriority.ANIMATION
1319
+
1320
+ apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {
1321
+ if (!context.element) return
1322
+
1323
+ const props = this.properties as any
1324
+
1325
+ // Transition
1326
+ if (props.transition) {
1327
+ const t = props.transition
1328
+ const property = t.property || 'all'
1329
+ const duration = t.duration || 300
1330
+ const easing = t.easing || 'ease'
1331
+ const delay = t.delay || 0
1332
+
1333
+ if (context.element instanceof HTMLElement) {
1334
+ context.element.style.transition = `${property} ${duration}ms ${easing} ${delay}ms`
1335
+ }
1336
+ }
1337
+
1338
+ // Animation
1339
+ if (props.animation && context.element instanceof HTMLElement) {
1340
+ const anim = props.animation
1341
+
1342
+ if (anim.keyframes) {
1343
+ // Create keyframes
1344
+ const keyframeName = `tachui-animation-${context.componentId}-${Date.now()}`
1345
+ const keyframeRule = this.createKeyframeRule(keyframeName, anim.keyframes)
1346
+
1347
+ // Add keyframes to stylesheet
1348
+ this.addKeyframesToStylesheet(keyframeRule)
1349
+
1350
+ // Apply animation
1351
+ const duration = anim.duration || 1000
1352
+ const easing = anim.easing || 'ease'
1353
+ const iterations = anim.iterations || 1
1354
+ const direction = anim.direction || 'normal'
1355
+
1356
+ context.element.style.animation = `${keyframeName} ${duration}ms ${easing} ${iterations} ${direction}`
1357
+ }
1358
+ }
1359
+
1360
+ // Transform
1361
+ if (props.transform && context.element instanceof HTMLElement) {
1362
+ if (isSignal(props.transform) || isComputed(props.transform)) {
1363
+ // Create reactive effect for transform
1364
+ createEffect(() => {
1365
+ const transformValue = props.transform()
1366
+ if (context.element instanceof HTMLElement) {
1367
+ context.element.style.transform = transformValue
1368
+ }
1369
+ })
1370
+ } else {
1371
+ context.element.style.transform = props.transform
1372
+ }
1373
+ }
1374
+
1375
+ // Rotation Effect (SwiftUI .rotationEffect(angle))
1376
+ if (props.rotationEffect && context.element instanceof HTMLElement) {
1377
+ const { angle, anchor } = props.rotationEffect
1378
+
1379
+ // Convert anchor to CSS transform-origin
1380
+ const anchorOrigins: Record<string, string> = {
1381
+ center: '50% 50%',
1382
+ top: '50% 0%',
1383
+ topLeading: '0% 0%',
1384
+ topTrailing: '100% 0%',
1385
+ bottom: '50% 100%',
1386
+ bottomLeading: '0% 100%',
1387
+ bottomTrailing: '100% 100%',
1388
+ leading: '0% 50%',
1389
+ trailing: '100% 50%',
1390
+ }
1391
+
1392
+ const transformOrigin = anchorOrigins[anchor || 'center'] || '50% 50%'
1393
+
1394
+ // Create rotation transform
1395
+ const rotationTransform = `rotate(${angle}deg)`
1396
+
1397
+ if (isSignal(angle) || isComputed(angle)) {
1398
+ // Reactive rotation
1399
+ createEffect(() => {
1400
+ const currentAngle = typeof angle === 'function' ? angle() : angle
1401
+ const currentRotation = `rotate(${currentAngle}deg)`
1402
+
1403
+ if (context.element instanceof HTMLElement) {
1404
+ context.element.style.transformOrigin = transformOrigin
1405
+
1406
+ // Combine with existing transforms if any
1407
+ const existingTransform = context.element.style.transform || ''
1408
+ const existingTransforms = existingTransform
1409
+ .split(' ')
1410
+ .filter((t) => t && !t.startsWith('rotate('))
1411
+ .join(' ')
1412
+
1413
+ const newTransform = existingTransforms
1414
+ ? `${existingTransforms} ${currentRotation}`
1415
+ : currentRotation
1416
+
1417
+ context.element.style.transform = newTransform
1418
+ }
1419
+ })
1420
+ } else {
1421
+ // Static rotation
1422
+ if (context.element instanceof HTMLElement) {
1423
+ context.element.style.transformOrigin = transformOrigin
1424
+
1425
+ // Combine with existing transforms if any
1426
+ const existingTransform = context.element.style.transform || ''
1427
+ const existingTransforms = existingTransform
1428
+ .split(' ')
1429
+ .filter((t) => t && !t.startsWith('rotate('))
1430
+ .join(' ')
1431
+
1432
+ const newTransform = existingTransforms
1433
+ ? `${existingTransforms} ${rotationTransform}`
1434
+ : rotationTransform
1435
+
1436
+ context.element.style.transform = newTransform
1437
+ }
1438
+ }
1439
+ }
1440
+
1441
+ // Overlay modifier (SwiftUI .overlay())
1442
+ if (props.overlay && context.element instanceof HTMLElement) {
1443
+ this.applyOverlay(context.element, props.overlay, context)
1444
+ }
1445
+
1446
+ return undefined
1447
+ }
1448
+
1449
+ private applyOverlay(
1450
+ element: HTMLElement,
1451
+ overlay: { content: any; alignment?: string },
1452
+ _context: ModifierContext
1453
+ ): void {
1454
+ const { content, alignment = 'center' } = overlay
1455
+
1456
+ // Make the element a positioned container
1457
+ if (element.style.position === '' || element.style.position === 'static') {
1458
+ element.style.position = 'relative'
1459
+ }
1460
+
1461
+ // Create overlay container
1462
+ const overlayContainer = document.createElement('div')
1463
+ overlayContainer.style.position = 'absolute'
1464
+ overlayContainer.style.pointerEvents = 'none' // Allow clicks to pass through by default
1465
+
1466
+ // Apply alignment positioning
1467
+ const alignmentStyles = this.getOverlayAlignment(alignment)
1468
+ Object.assign(overlayContainer.style, alignmentStyles)
1469
+
1470
+ // Render content
1471
+ if (typeof content === 'function') {
1472
+ // If content is a function, call it to get component
1473
+ const contentComponent = content()
1474
+ if (contentComponent && typeof contentComponent.render === 'function') {
1475
+ const contentNode = contentComponent.render()
1476
+ if (contentNode.element) {
1477
+ overlayContainer.appendChild(contentNode.element)
1478
+ }
1479
+ }
1480
+ } else if (content && typeof content.render === 'function') {
1481
+ // If content is a component instance
1482
+ const contentNode = content.render()
1483
+ if (contentNode.element) {
1484
+ overlayContainer.appendChild(contentNode.element)
1485
+ }
1486
+ } else if (content instanceof HTMLElement) {
1487
+ // If content is already a DOM element
1488
+ overlayContainer.appendChild(content)
1489
+ }
1490
+
1491
+ // Add overlay to the element
1492
+ element.appendChild(overlayContainer)
1493
+ }
1494
+
1495
+ private getOverlayAlignment(alignment: string): Record<string, string> {
1496
+ const alignments: Record<string, Record<string, string>> = {
1497
+ center: {
1498
+ top: '50%',
1499
+ left: '50%',
1500
+ transform: 'translate(-50%, -50%)',
1501
+ },
1502
+ top: {
1503
+ top: '0',
1504
+ left: '50%',
1505
+ transform: 'translateX(-50%)',
1506
+ },
1507
+ bottom: {
1508
+ bottom: '0',
1509
+ left: '50%',
1510
+ transform: 'translateX(-50%)',
1511
+ },
1512
+ leading: {
1513
+ top: '50%',
1514
+ left: '0',
1515
+ transform: 'translateY(-50%)',
1516
+ },
1517
+ trailing: {
1518
+ top: '50%',
1519
+ right: '0',
1520
+ transform: 'translateY(-50%)',
1521
+ },
1522
+ topLeading: {
1523
+ top: '0',
1524
+ left: '0',
1525
+ },
1526
+ topTrailing: {
1527
+ top: '0',
1528
+ right: '0',
1529
+ },
1530
+ bottomLeading: {
1531
+ bottom: '0',
1532
+ left: '0',
1533
+ },
1534
+ bottomTrailing: {
1535
+ bottom: '0',
1536
+ right: '0',
1537
+ },
1538
+ }
1539
+
1540
+ return alignments[alignment] || alignments.center
1541
+ }
1542
+
1543
+ private createKeyframeRule(
1544
+ name: string,
1545
+ keyframes: Record<string, Record<string, string>>
1546
+ ): string {
1547
+ let rule = `@keyframes ${name} {\n`
1548
+
1549
+ for (const [percentage, styles] of Object.entries(keyframes)) {
1550
+ rule += ` ${percentage} {\n`
1551
+ for (const [property, value] of Object.entries(styles)) {
1552
+ const cssProperty = this.toCSSProperty(property)
1553
+ rule += ` ${cssProperty}: ${value};\n`
1554
+ }
1555
+ rule += ` }\n`
1556
+ }
1557
+
1558
+ rule += '}'
1559
+ return rule
1560
+ }
1561
+
1562
+ private addKeyframesToStylesheet(rule: string): void {
1563
+ let stylesheet = document.querySelector('#tachui-animations') as HTMLStyleElement
1564
+
1565
+ if (!stylesheet) {
1566
+ stylesheet = document.createElement('style')
1567
+ stylesheet.id = 'tachui-animations'
1568
+ document.head.appendChild(stylesheet)
1569
+ }
1570
+
1571
+ stylesheet.appendChild(document.createTextNode(rule))
1572
+ }
1573
+ }
1574
+
1575
+ /**
1576
+ * Lifecycle modifier for component lifecycle events
1577
+ */
1578
+ export class LifecycleModifier extends BaseModifier {
1579
+ readonly type = 'lifecycle'
1580
+ readonly priority = ModifierPriority.CUSTOM
1581
+
1582
+ private activeAbortController?: AbortController
1583
+
1584
+ apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {
1585
+ if (!context.element) return
1586
+
1587
+ const props = this.properties as LifecycleModifierProps
1588
+
1589
+ // Clean up any existing tasks on re-application
1590
+ if (this.activeAbortController) {
1591
+ this.activeAbortController.abort()
1592
+ }
1593
+
1594
+ // Set up intersection observer for onAppear/onDisappear
1595
+ if (props.onAppear || props.onDisappear) {
1596
+ this.setupLifecycleObserver(context.element, props)
1597
+ }
1598
+
1599
+ // Set up async task with cancellation
1600
+ if (props.task) {
1601
+ this.setupTask(context, props.task)
1602
+ }
1603
+
1604
+ // Set up refreshable behavior
1605
+ if (props.refreshable) {
1606
+ this.setupRefreshable(context.element, props.refreshable)
1607
+ }
1608
+
1609
+ return undefined
1610
+ }
1611
+
1612
+ private setupLifecycleObserver(element: Element, props: LifecycleModifierProps): void {
1613
+ const observer = new IntersectionObserver(
1614
+ (entries) => {
1615
+ entries.forEach((entry) => {
1616
+ if (entry.isIntersecting && props.onAppear) {
1617
+ // Element has appeared in viewport
1618
+ props.onAppear()
1619
+ } else if (!entry.isIntersecting && props.onDisappear) {
1620
+ // Element has disappeared from viewport
1621
+ props.onDisappear()
1622
+ }
1623
+ })
1624
+ },
1625
+ {
1626
+ threshold: 0.1, // Trigger when 10% of element is visible
1627
+ rootMargin: '10px', // Add some margin for better UX
1628
+ }
1629
+ )
1630
+
1631
+ observer.observe(element)
1632
+
1633
+ // Store cleanup function
1634
+ this.addCleanup(() => {
1635
+ observer.disconnect()
1636
+ })
1637
+ }
1638
+
1639
+ private setupTask(_context: ModifierContext, task: LifecycleModifierProps['task']): void {
1640
+ if (!task) return
1641
+
1642
+ // Create abort controller for task cancellation
1643
+ this.activeAbortController = new AbortController()
1644
+ const { signal } = this.activeAbortController
1645
+
1646
+ // Execute the task operation
1647
+ const executeTask = async () => {
1648
+ try {
1649
+ if (signal.aborted) return
1650
+
1651
+ const result = task.operation()
1652
+
1653
+ // Handle both sync and async operations
1654
+ if (result instanceof Promise) {
1655
+ await result
1656
+ }
1657
+ } catch (error) {
1658
+ if (signal.aborted) return
1659
+ console.error('TachUI Task Error:', error)
1660
+ }
1661
+ }
1662
+
1663
+ // Start task execution
1664
+ executeTask()
1665
+
1666
+ // Add cleanup to cancel task on component unmount
1667
+ this.addCleanup(() => {
1668
+ if (this.activeAbortController) {
1669
+ this.activeAbortController.abort()
1670
+ }
1671
+ })
1672
+ }
1673
+
1674
+ private setupRefreshable(
1675
+ element: Element,
1676
+ refreshable: LifecycleModifierProps['refreshable']
1677
+ ): void {
1678
+ if (!refreshable) return
1679
+
1680
+ let isRefreshing = false
1681
+ let pullDistance = 0
1682
+ let startY = 0
1683
+
1684
+ const threshold = 70 // Pull threshold in pixels
1685
+
1686
+ // Create refresh indicator element
1687
+ const refreshIndicator = document.createElement('div')
1688
+ refreshIndicator.style.cssText = `
1689
+ position: absolute;
1690
+ top: -50px;
1691
+ left: 50%;
1692
+ transform: translateX(-50%);
1693
+ width: 30px;
1694
+ height: 30px;
1695
+ border: 2px solid #ccc;
1696
+ border-top: 2px solid #007AFF;
1697
+ border-radius: 50%;
1698
+ animation: tachui-spin 1s linear infinite;
1699
+ opacity: 0;
1700
+ transition: opacity 0.3s ease;
1701
+ z-index: 1000;
1702
+ `
1703
+
1704
+ // Add spinner animation
1705
+ if (!document.querySelector('#tachui-refresh-styles')) {
1706
+ const style = document.createElement('style')
1707
+ style.id = 'tachui-refresh-styles'
1708
+ style.textContent = `
1709
+ @keyframes tachui-spin {
1710
+ 0% { transform: translateX(-50%) rotate(0deg); }
1711
+ 100% { transform: translateX(-50%) rotate(360deg); }
1712
+ }
1713
+ `
1714
+ document.head.appendChild(style)
1715
+ }
1716
+
1717
+ const container = element.parentElement || element
1718
+ if (container instanceof HTMLElement) {
1719
+ container.style.position = 'relative'
1720
+ container.appendChild(refreshIndicator)
1721
+ }
1722
+
1723
+ // Touch event handlers
1724
+ const handleTouchStart = (e: TouchEvent) => {
1725
+ if (isRefreshing) return
1726
+ startY = e.touches[0].clientY
1727
+ }
1728
+
1729
+ const handleTouchMove = (e: TouchEvent) => {
1730
+ if (isRefreshing) return
1731
+
1732
+ const currentY = e.touches[0].clientY
1733
+ pullDistance = Math.max(0, currentY - startY)
1734
+
1735
+ if (pullDistance > 20) {
1736
+ e.preventDefault() // Prevent default scrolling
1737
+
1738
+ const progress = Math.min(pullDistance / threshold, 1)
1739
+ refreshIndicator.style.opacity = String(progress * 0.8)
1740
+ refreshIndicator.style.top = `${-50 + progress * 20}px`
1741
+ }
1742
+ }
1743
+
1744
+ const handleTouchEnd = async () => {
1745
+ if (isRefreshing || pullDistance < threshold) {
1746
+ // Reset if threshold not met
1747
+ refreshIndicator.style.opacity = '0'
1748
+ refreshIndicator.style.top = '-50px'
1749
+ pullDistance = 0
1750
+ return
1751
+ }
1752
+
1753
+ // Trigger refresh
1754
+ isRefreshing = true
1755
+ refreshIndicator.style.opacity = '1'
1756
+ refreshIndicator.style.top = '10px'
1757
+
1758
+ try {
1759
+ await refreshable.onRefresh()
1760
+ } catch (error) {
1761
+ console.error('TachUI Refresh Error:', error)
1762
+ } finally {
1763
+ isRefreshing = false
1764
+ refreshIndicator.style.opacity = '0'
1765
+ refreshIndicator.style.top = '-50px'
1766
+ pullDistance = 0
1767
+ }
1768
+ }
1769
+
1770
+ // Add event listeners with proper typing
1771
+ element.addEventListener('touchstart', handleTouchStart as EventListener, { passive: false })
1772
+ element.addEventListener('touchmove', handleTouchMove as EventListener, { passive: false })
1773
+ element.addEventListener('touchend', handleTouchEnd as EventListener)
1774
+
1775
+ // Cleanup
1776
+ this.addCleanup(() => {
1777
+ element.removeEventListener('touchstart', handleTouchStart as EventListener)
1778
+ element.removeEventListener('touchmove', handleTouchMove as EventListener)
1779
+ element.removeEventListener('touchend', handleTouchEnd as EventListener)
1780
+
1781
+ if (refreshIndicator.parentElement) {
1782
+ refreshIndicator.parentElement.removeChild(refreshIndicator)
1783
+ }
1784
+ })
1785
+ }
1786
+
1787
+ private addCleanup(cleanup: () => void): void {
1788
+ // Store cleanup functions for proper disposal
1789
+ if (!(this.properties as any)._cleanupFunctions) {
1790
+ ;(this.properties as any)._cleanupFunctions = []
1791
+ }
1792
+ ;(this.properties as any)._cleanupFunctions.push(cleanup)
1793
+ }
1794
+ }
1795
+
1796
+ /**
1797
+ * Resizable modifier for making images resizable
1798
+ * In SwiftUI, .resizable() allows images to be scaled to fit their container
1799
+ */
1800
+ export class ResizableModifier extends BaseModifier {
1801
+ readonly type = 'resizable'
1802
+ readonly priority = ModifierPriority.APPEARANCE
1803
+
1804
+ apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {
1805
+ if (!context.element) return
1806
+
1807
+ // For images, resizable means they can be scaled to fit their container
1808
+ // This is typically achieved with object-fit: fill in CSS
1809
+ if (context.element instanceof HTMLImageElement) {
1810
+ context.element.style.objectFit = 'fill'
1811
+ }
1812
+
1813
+ return undefined
1814
+ }
1815
+ }