@symbiote-native/angular 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/build/angular/components/activity-indicator/index.android.d.ts +12 -0
  4. package/build/angular/components/activity-indicator/index.android.js +21 -0
  5. package/build/angular/components/activity-indicator/index.android.js.map +1 -0
  6. package/build/angular/components/activity-indicator/index.d.ts +1 -0
  7. package/build/angular/components/activity-indicator/index.ios.d.ts +8 -0
  8. package/build/angular/components/activity-indicator/index.ios.js +21 -0
  9. package/build/angular/components/activity-indicator/index.ios.js.map +1 -0
  10. package/build/angular/components/activity-indicator/index.js +4 -0
  11. package/build/angular/components/activity-indicator/index.js.map +1 -0
  12. package/build/angular/components/activity-indicator/shared.d.ts +67 -0
  13. package/build/angular/components/activity-indicator/shared.js +260 -0
  14. package/build/angular/components/activity-indicator/shared.js.map +1 -0
  15. package/build/angular/components/button.d.ts +63 -0
  16. package/build/angular/components/button.js +332 -0
  17. package/build/angular/components/button.js.map +1 -0
  18. package/build/angular/components/drawer-layout-android/index.android.d.ts +34 -0
  19. package/build/angular/components/drawer-layout-android/index.android.js +291 -0
  20. package/build/angular/components/drawer-layout-android/index.android.js.map +1 -0
  21. package/build/angular/components/drawer-layout-android/index.d.ts +11 -0
  22. package/build/angular/components/drawer-layout-android/index.js +109 -0
  23. package/build/angular/components/drawer-layout-android/index.js.map +1 -0
  24. package/build/angular/components/drawer-layout-android/shared.d.ts +74 -0
  25. package/build/angular/components/drawer-layout-android/shared.js +138 -0
  26. package/build/angular/components/drawer-layout-android/shared.js.map +1 -0
  27. package/build/angular/components/flat-list/index.d.ts +122 -0
  28. package/build/angular/components/flat-list/index.js +689 -0
  29. package/build/angular/components/flat-list/index.js.map +1 -0
  30. package/build/angular/components/image/index.android.d.ts +10 -0
  31. package/build/angular/components/image/index.android.js +59 -0
  32. package/build/angular/components/image/index.android.js.map +1 -0
  33. package/build/angular/components/image/index.d.ts +1 -0
  34. package/build/angular/components/image/index.ios.d.ts +10 -0
  35. package/build/angular/components/image/index.ios.js +59 -0
  36. package/build/angular/components/image/index.ios.js.map +1 -0
  37. package/build/angular/components/image/index.js +3 -0
  38. package/build/angular/components/image/index.js.map +1 -0
  39. package/build/angular/components/image/shared.d.ts +101 -0
  40. package/build/angular/components/image/shared.js +408 -0
  41. package/build/angular/components/image/shared.js.map +1 -0
  42. package/build/angular/components/image-background.d.ts +81 -0
  43. package/build/angular/components/image-background.js +418 -0
  44. package/build/angular/components/image-background.js.map +1 -0
  45. package/build/angular/components/input-accessory-view.d.ts +59 -0
  46. package/build/angular/components/input-accessory-view.js +266 -0
  47. package/build/angular/components/input-accessory-view.js.map +1 -0
  48. package/build/angular/components/keyboard-avoiding-view.d.ts +82 -0
  49. package/build/angular/components/keyboard-avoiding-view.js +363 -0
  50. package/build/angular/components/keyboard-avoiding-view.js.map +1 -0
  51. package/build/angular/components/modal.d.ts +92 -0
  52. package/build/angular/components/modal.js +365 -0
  53. package/build/angular/components/modal.js.map +1 -0
  54. package/build/angular/components/pressable/index.d.ts +123 -0
  55. package/build/angular/components/pressable/index.js +421 -0
  56. package/build/angular/components/pressable/index.js.map +1 -0
  57. package/build/angular/components/refresh-control.d.ts +86 -0
  58. package/build/angular/components/refresh-control.js +347 -0
  59. package/build/angular/components/refresh-control.js.map +1 -0
  60. package/build/angular/components/safe-area-view.d.ts +57 -0
  61. package/build/angular/components/safe-area-view.js +253 -0
  62. package/build/angular/components/safe-area-view.js.map +1 -0
  63. package/build/angular/components/scroll-view/index.android.d.ts +21 -0
  64. package/build/angular/components/scroll-view/index.android.js +235 -0
  65. package/build/angular/components/scroll-view/index.android.js.map +1 -0
  66. package/build/angular/components/scroll-view/index.d.ts +3 -0
  67. package/build/angular/components/scroll-view/index.ios.d.ts +9 -0
  68. package/build/angular/components/scroll-view/index.ios.js +86 -0
  69. package/build/angular/components/scroll-view/index.ios.js.map +1 -0
  70. package/build/angular/components/scroll-view/index.js +6 -0
  71. package/build/angular/components/scroll-view/index.js.map +1 -0
  72. package/build/angular/components/scroll-view/projection.d.ts +32 -0
  73. package/build/angular/components/scroll-view/projection.js +312 -0
  74. package/build/angular/components/scroll-view/projection.js.map +1 -0
  75. package/build/angular/components/scroll-view/shared.d.ts +230 -0
  76. package/build/angular/components/scroll-view/shared.js +679 -0
  77. package/build/angular/components/scroll-view/shared.js.map +1 -0
  78. package/build/angular/components/scroll-view/sticky-header.d.ts +41 -0
  79. package/build/angular/components/scroll-view/sticky-header.js +208 -0
  80. package/build/angular/components/scroll-view/sticky-header.js.map +1 -0
  81. package/build/angular/components/section-list/index.d.ts +116 -0
  82. package/build/angular/components/section-list/index.js +641 -0
  83. package/build/angular/components/section-list/index.js.map +1 -0
  84. package/build/angular/components/switch/index.android.d.ts +20 -0
  85. package/build/angular/components/switch/index.android.js +70 -0
  86. package/build/angular/components/switch/index.android.js.map +1 -0
  87. package/build/angular/components/switch/index.d.ts +1 -0
  88. package/build/angular/components/switch/index.ios.d.ts +19 -0
  89. package/build/angular/components/switch/index.ios.js +69 -0
  90. package/build/angular/components/switch/index.ios.js.map +1 -0
  91. package/build/angular/components/switch/index.js +4 -0
  92. package/build/angular/components/switch/index.js.map +1 -0
  93. package/build/angular/components/switch/shared.d.ts +40 -0
  94. package/build/angular/components/switch/shared.js +127 -0
  95. package/build/angular/components/switch/shared.js.map +1 -0
  96. package/build/angular/components/text-input.d.ts +153 -0
  97. package/build/angular/components/text-input.js +604 -0
  98. package/build/angular/components/text-input.js.map +1 -0
  99. package/build/angular/components/touchable-native-feedback.d.ts +83 -0
  100. package/build/angular/components/touchable-native-feedback.js +376 -0
  101. package/build/angular/components/touchable-native-feedback.js.map +1 -0
  102. package/build/angular/components/touchable.d.ts +248 -0
  103. package/build/angular/components/touchable.js +1206 -0
  104. package/build/angular/components/touchable.js.map +1 -0
  105. package/build/angular/components/virtualized-list/directives.d.ts +54 -0
  106. package/build/angular/components/virtualized-list/directives.js +154 -0
  107. package/build/angular/components/virtualized-list/directives.js.map +1 -0
  108. package/build/angular/components/virtualized-list/index.d.ts +268 -0
  109. package/build/angular/components/virtualized-list/index.js +1162 -0
  110. package/build/angular/components/virtualized-list/index.js.map +1 -0
  111. package/build/angular/components/virtualized-section-list/directives.d.ts +37 -0
  112. package/build/angular/components/virtualized-section-list/directives.js +77 -0
  113. package/build/angular/components/virtualized-section-list/directives.js.map +1 -0
  114. package/build/angular/components/virtualized-section-list/index.d.ts +178 -0
  115. package/build/angular/components/virtualized-section-list/index.js +722 -0
  116. package/build/angular/components/virtualized-section-list/index.js.map +1 -0
  117. package/build/angular/components.d.ts +39 -0
  118. package/build/angular/components.js +38 -0
  119. package/build/angular/components.js.map +1 -0
  120. package/build/angular/create-portal.d.ts +22 -0
  121. package/build/angular/create-portal.js +74 -0
  122. package/build/angular/create-portal.js.map +1 -0
  123. package/build/angular/create-tunnel.d.ts +34 -0
  124. package/build/angular/create-tunnel.js +126 -0
  125. package/build/angular/create-tunnel.js.map +1 -0
  126. package/build/angular/descriptor-to-angular/index.d.ts +22 -0
  127. package/build/angular/descriptor-to-angular/index.js +142 -0
  128. package/build/angular/descriptor-to-angular/index.js.map +1 -0
  129. package/build/angular/host-instance/index.d.ts +2 -0
  130. package/build/angular/host-instance/index.js +37 -0
  131. package/build/angular/host-instance/index.js.map +1 -0
  132. package/build/angular/index.d.ts +21 -0
  133. package/build/angular/index.js +42 -0
  134. package/build/angular/index.js.map +1 -0
  135. package/build/angular/modules/animated/create-animated-component.d.ts +68 -0
  136. package/build/angular/modules/animated/create-animated-component.js +429 -0
  137. package/build/angular/modules/animated/create-animated-component.js.map +1 -0
  138. package/build/angular/modules/animated/index.d.ts +51 -0
  139. package/build/angular/modules/animated/index.js +59 -0
  140. package/build/angular/modules/animated/index.js.map +1 -0
  141. package/build/angular/modules/app-registry/index.d.ts +7 -0
  142. package/build/angular/modules/app-registry/index.js +23 -0
  143. package/build/angular/modules/app-registry/index.js.map +1 -0
  144. package/build/angular/modules/status-bar.d.ts +20 -0
  145. package/build/angular/modules/status-bar.js +59 -0
  146. package/build/angular/modules/status-bar.js.map +1 -0
  147. package/build/angular/primitives/index.d.ts +63 -0
  148. package/build/angular/primitives/index.js +189 -0
  149. package/build/angular/primitives/index.js.map +1 -0
  150. package/build/angular/primitives/shared.d.ts +89 -0
  151. package/build/angular/primitives/shared.js +172 -0
  152. package/build/angular/primitives/shared.js.map +1 -0
  153. package/build/angular/render.d.ts +11 -0
  154. package/build/angular/render.js +161 -0
  155. package/build/angular/render.js.map +1 -0
  156. package/build/angular/renderer.d.ts +38 -0
  157. package/build/angular/renderer.js +360 -0
  158. package/build/angular/renderer.js.map +1 -0
  159. package/build/angular/services/color-scheme.service.d.ts +16 -0
  160. package/build/angular/services/color-scheme.service.js +31 -0
  161. package/build/angular/services/color-scheme.service.js.map +1 -0
  162. package/build/angular/services/index.d.ts +2 -0
  163. package/build/angular/services/index.js +3 -0
  164. package/build/angular/services/index.js.map +1 -0
  165. package/build/angular/services/window-dimensions.service.d.ts +16 -0
  166. package/build/angular/services/window-dimensions.service.js +42 -0
  167. package/build/angular/services/window-dimensions.service.js.map +1 -0
  168. package/build/components/activity-indicator/index.android.d.ts +9 -0
  169. package/build/components/activity-indicator/index.android.js +64 -0
  170. package/build/components/activity-indicator/index.d.ts +1 -0
  171. package/build/components/activity-indicator/index.ios.d.ts +5 -0
  172. package/build/components/activity-indicator/index.ios.js +64 -0
  173. package/build/components/activity-indicator/index.js +3 -0
  174. package/build/components/activity-indicator/shared.d.ts +64 -0
  175. package/build/components/activity-indicator/shared.js +424 -0
  176. package/build/components/button.d.ts +60 -0
  177. package/build/components/button.js +456 -0
  178. package/build/components/drawer-layout-android/index.android.d.ts +29 -0
  179. package/build/components/drawer-layout-android/index.android.js +326 -0
  180. package/build/components/drawer-layout-android/index.d.ts +8 -0
  181. package/build/components/drawer-layout-android/index.js +145 -0
  182. package/build/components/drawer-layout-android/shared.d.ts +71 -0
  183. package/build/components/drawer-layout-android/shared.js +205 -0
  184. package/build/components/flat-list/index.d.ts +119 -0
  185. package/build/components/flat-list/index.js +692 -0
  186. package/build/components/image/index.android.d.ts +7 -0
  187. package/build/components/image/index.android.js +88 -0
  188. package/build/components/image/index.d.ts +1 -0
  189. package/build/components/image/index.ios.d.ts +7 -0
  190. package/build/components/image/index.ios.js +88 -0
  191. package/build/components/image/index.js +2 -0
  192. package/build/components/image/shared.d.ts +101 -0
  193. package/build/components/image/shared.js +407 -0
  194. package/build/components/image-background.d.ts +78 -0
  195. package/build/components/image-background.js +583 -0
  196. package/build/components/input-accessory-view.d.ts +56 -0
  197. package/build/components/input-accessory-view.js +407 -0
  198. package/build/components/keyboard-avoiding-view.d.ts +79 -0
  199. package/build/components/keyboard-avoiding-view.js +509 -0
  200. package/build/components/modal.d.ts +89 -0
  201. package/build/components/modal.js +534 -0
  202. package/build/components/pressable/index.d.ts +120 -0
  203. package/build/components/pressable/index.js +640 -0
  204. package/build/components/refresh-control.d.ts +83 -0
  205. package/build/components/refresh-control.js +514 -0
  206. package/build/components/safe-area-view.d.ts +54 -0
  207. package/build/components/safe-area-view.js +393 -0
  208. package/build/components/scroll-view/index.android.d.ts +16 -0
  209. package/build/components/scroll-view/index.android.js +228 -0
  210. package/build/components/scroll-view/index.d.ts +3 -0
  211. package/build/components/scroll-view/index.ios.d.ts +6 -0
  212. package/build/components/scroll-view/index.ios.js +113 -0
  213. package/build/components/scroll-view/index.js +5 -0
  214. package/build/components/scroll-view/projection.d.ts +32 -0
  215. package/build/components/scroll-view/projection.js +311 -0
  216. package/build/components/scroll-view/shared.d.ts +225 -0
  217. package/build/components/scroll-view/shared.js +757 -0
  218. package/build/components/scroll-view/sticky-header.d.ts +38 -0
  219. package/build/components/scroll-view/sticky-header.js +257 -0
  220. package/build/components/section-list/index.d.ts +113 -0
  221. package/build/components/section-list/index.js +768 -0
  222. package/build/components/switch/index.android.d.ts +17 -0
  223. package/build/components/switch/index.android.js +107 -0
  224. package/build/components/switch/index.d.ts +1 -0
  225. package/build/components/switch/index.ios.d.ts +16 -0
  226. package/build/components/switch/index.ios.js +106 -0
  227. package/build/components/switch/index.js +3 -0
  228. package/build/components/switch/shared.d.ts +37 -0
  229. package/build/components/switch/shared.js +176 -0
  230. package/build/components/text-input.d.ts +150 -0
  231. package/build/components/text-input.js +826 -0
  232. package/build/components/touchable-native-feedback.d.ts +80 -0
  233. package/build/components/touchable-native-feedback.js +550 -0
  234. package/build/components/touchable.d.ts +241 -0
  235. package/build/components/touchable.js +1672 -0
  236. package/build/components/virtualized-list/directives.d.ts +41 -0
  237. package/build/components/virtualized-list/directives.js +250 -0
  238. package/build/components/virtualized-list/index.d.ts +265 -0
  239. package/build/components/virtualized-list/index.js +1344 -0
  240. package/build/components/virtualized-section-list/directives.d.ts +28 -0
  241. package/build/components/virtualized-section-list/directives.js +149 -0
  242. package/build/components/virtualized-section-list/index.d.ts +175 -0
  243. package/build/components/virtualized-section-list/index.js +854 -0
  244. package/build/components.d.ts +39 -0
  245. package/build/components.js +37 -0
  246. package/build/create-portal.d.ts +17 -0
  247. package/build/create-portal.js +128 -0
  248. package/build/create-tunnel.d.ts +29 -0
  249. package/build/create-tunnel.js +181 -0
  250. package/build/descriptor-to-angular/index.d.ts +19 -0
  251. package/build/descriptor-to-angular/index.js +186 -0
  252. package/build/host-instance/index.d.ts +2 -0
  253. package/build/host-instance/index.js +36 -0
  254. package/build/index.d.ts +21 -0
  255. package/build/index.js +41 -0
  256. package/build/modules/animated/create-animated-component.d.ts +57 -0
  257. package/build/modules/animated/create-animated-component.js +490 -0
  258. package/build/modules/animated/index.d.ts +51 -0
  259. package/build/modules/animated/index.js +58 -0
  260. package/build/modules/app-registry/index.d.ts +7 -0
  261. package/build/modules/app-registry/index.js +22 -0
  262. package/build/modules/status-bar.d.ts +17 -0
  263. package/build/modules/status-bar.js +121 -0
  264. package/build/primitives/index.d.ts +32 -0
  265. package/build/primitives/index.js +386 -0
  266. package/build/primitives/shared.d.ts +84 -0
  267. package/build/primitives/shared.js +231 -0
  268. package/build/render.d.ts +11 -0
  269. package/build/render.js +160 -0
  270. package/build/renderer.d.ts +38 -0
  271. package/build/renderer.js +359 -0
  272. package/build/services/color-scheme.service.d.ts +13 -0
  273. package/build/services/color-scheme.service.js +72 -0
  274. package/build/services/index.d.ts +2 -0
  275. package/build/services/index.js +2 -0
  276. package/build/services/window-dimensions.service.d.ts +13 -0
  277. package/build/services/window-dimensions.service.js +83 -0
  278. package/metro-css-parser.cjs +11 -0
  279. package/package.json +57 -0
  280. package/src/__tests__/responder-change-detection.test.ts +102 -0
  281. package/src/__tests__/responder-nested-cd.test.ts +113 -0
  282. package/src/angular-gaps.test.ts +142 -0
  283. package/src/angular-imports.test.ts +100 -0
  284. package/src/components/activity-indicator/activity-indicator-class-style.test.ts +44 -0
  285. package/src/components/activity-indicator/activity-indicator.test.ts +131 -0
  286. package/src/components/activity-indicator/index.android.ts +16 -0
  287. package/src/components/activity-indicator/index.ios.ts +17 -0
  288. package/src/components/activity-indicator/index.ts +4 -0
  289. package/src/components/activity-indicator/shared.ts +206 -0
  290. package/src/components/button.ts +193 -0
  291. package/src/components/flat-list/column-wrapper-style-class.test.ts +116 -0
  292. package/src/components/flat-list/flat-list-array-style.test.ts +131 -0
  293. package/src/components/flat-list/flat-list-class-style.test.ts +74 -0
  294. package/src/components/flat-list/flat-list-scroll-containment.test.ts +107 -0
  295. package/src/components/flat-list/flat-list.test.ts +99 -0
  296. package/src/components/flat-list/index.ts +575 -0
  297. package/src/components/image/image-class-style.test.ts +46 -0
  298. package/src/components/image/index.android.ts +48 -0
  299. package/src/components/image/index.ios.ts +48 -0
  300. package/src/components/image/index.ts +3 -0
  301. package/src/components/image/shared.ts +478 -0
  302. package/src/components/image-background-class-style.test.ts +48 -0
  303. package/src/components/image-background-style-class.test.ts +79 -0
  304. package/src/components/image-background.ts +270 -0
  305. package/src/components/input-accessory-view.test.ts +43 -0
  306. package/src/components/input-accessory-view.ts +191 -0
  307. package/src/components/keyboard-avoiding-view.test.ts +54 -0
  308. package/src/components/keyboard-avoiding-view.ts +308 -0
  309. package/src/components/modal.test.ts +43 -0
  310. package/src/components/modal.ts +304 -0
  311. package/src/components/pressable/index.ts +371 -0
  312. package/src/components/pressable/pressable.test.ts +85 -0
  313. package/src/components/refresh-control.test.ts +41 -0
  314. package/src/components/refresh-control.ts +288 -0
  315. package/src/components/safe-area-view.test.ts +43 -0
  316. package/src/components/safe-area-view.ts +178 -0
  317. package/src/components/scroll-view/android-scroll-view-axis-projection.test.ts +123 -0
  318. package/src/components/scroll-view/content-container-style-class.test.ts +75 -0
  319. package/src/components/scroll-view/index.android.ts +190 -0
  320. package/src/components/scroll-view/index.ios.ts +79 -0
  321. package/src/components/scroll-view/index.ts +7 -0
  322. package/src/components/scroll-view/projection.ts +384 -0
  323. package/src/components/scroll-view/scroll-view-class-style.test.ts +134 -0
  324. package/src/components/scroll-view/scroll-view-projection.test.ts +194 -0
  325. package/src/components/scroll-view/shared.ts +836 -0
  326. package/src/components/scroll-view/sticky-header.ts +230 -0
  327. package/src/components/section-list/index.ts +445 -0
  328. package/src/components/switch/android-switch-class.test.ts +42 -0
  329. package/src/components/switch/index.android.ts +61 -0
  330. package/src/components/switch/index.ios.ts +60 -0
  331. package/src/components/switch/index.ts +4 -0
  332. package/src/components/switch/shared.ts +197 -0
  333. package/src/components/switch/switch.test.ts +92 -0
  334. package/src/components/text-input-class-style.test.ts +54 -0
  335. package/src/components/text-input.ts +536 -0
  336. package/src/components/touchable-native-feedback.test.ts +49 -0
  337. package/src/components/touchable-native-feedback.ts +260 -0
  338. package/src/components/touchable.test.ts +102 -0
  339. package/src/components/touchable.ts +643 -0
  340. package/src/components/virtualized-list/directives.ts +169 -0
  341. package/src/components/virtualized-list/index.ts +1204 -0
  342. package/src/components/virtualized-list/virtualized-list-class-style.test.ts +76 -0
  343. package/src/components/virtualized-section-list/directives.ts +91 -0
  344. package/src/components/virtualized-section-list/index.ts +598 -0
  345. package/src/components/virtualized-section-list/virtualized-section-list-class-style.test.ts +60 -0
  346. package/src/components.ts +149 -0
  347. package/src/create-portal.test.ts +90 -0
  348. package/src/create-portal.ts +74 -0
  349. package/src/create-tunnel.test.ts +120 -0
  350. package/src/create-tunnel.ts +136 -0
  351. package/src/descriptor-to-angular/descriptor-outlet.test.ts +94 -0
  352. package/src/descriptor-to-angular/index.ts +190 -0
  353. package/src/host-instance/host-instance.test.ts +49 -0
  354. package/src/host-instance/index.ts +36 -0
  355. package/src/index.ts +257 -0
  356. package/src/modules/animated/animated-scroll-view.test.ts +85 -0
  357. package/src/modules/animated/create-animated-component.ts +435 -0
  358. package/src/modules/animated/index.ts +105 -0
  359. package/src/modules/app-registry/app-registry.test.ts +106 -0
  360. package/src/modules/app-registry/index.ts +60 -0
  361. package/src/modules/status-bar.test.ts +50 -0
  362. package/src/modules/status-bar.ts +57 -0
  363. package/src/primitives/index.ts +119 -0
  364. package/src/primitives/shared.ts +191 -0
  365. package/src/render.test.ts +147 -0
  366. package/src/render.ts +224 -0
  367. package/src/renderer.test.ts +179 -0
  368. package/src/renderer.ts +407 -0
  369. package/src/services/color-scheme.service.ts +27 -0
  370. package/src/services/index.ts +2 -0
  371. package/src/services/services.test.ts +163 -0
  372. package/src/services/window-dimensions.service.ts +41 -0
@@ -0,0 +1,371 @@
1
+ import {
2
+ CUSTOM_ELEMENTS_SCHEMA,
3
+ ChangeDetectionStrategy,
4
+ ChangeDetectorRef,
5
+ Component,
6
+ ElementRef,
7
+ EventEmitter,
8
+ inject,
9
+ Input,
10
+ Output,
11
+ ViewChild,
12
+ } from '@angular/core';
13
+ import {
14
+ createPressHandlers,
15
+ createPressRuntime,
16
+ DEFAULT_DELAY_LONG_PRESS_MS,
17
+ resolveAccessibilityProps,
18
+ resolveDisabledAccessibilityState,
19
+ rippleProps,
20
+ type IAccessibilityProps,
21
+ type IAccessibilityStateValue,
22
+ type IAriaProps,
23
+ type IPressableAndroidRippleConfig,
24
+ type IPressHandler,
25
+ type IPressHost,
26
+ type IPressMachineConfig,
27
+ type IPressRuntime,
28
+ type IPressState,
29
+ type IRectOffset,
30
+ } from '@symbiote-native/components';
31
+ import {
32
+ dlog,
33
+ isSymbioteNode,
34
+ measure,
35
+ type ISymbioteEvent,
36
+ type ISymbioteNode,
37
+ type IStyleProp,
38
+ type IViewStyle,
39
+ } from '@symbiote-native/engine';
40
+ import { anchorHostStyle, SymbioteHostPropsDirective, ViewHost } from '../../primitives';
41
+
42
+ export type { IPressState, IPressableAndroidRippleConfig } from '@symbiote-native/components';
43
+
44
+ // The full logical Pressable surface, callback-shaped press/hover events included. Touchable* and
45
+ // TouchableNativeFeedback still take their OWN onPress/onPressIn/... as @Input() callbacks (that is
46
+ // a separate, not-yet-converted decision) and derive their public prop types from this — so it keeps
47
+ // the callback fields even though the Pressable component below no longer implements them directly.
48
+ export interface IAngularPressableProps extends IAccessibilityProps, IAriaProps {
49
+ onPress?: IPressHandler;
50
+ onPressIn?: IPressHandler;
51
+ onPressOut?: IPressHandler;
52
+ onPressMove?: IPressHandler;
53
+ onLongPress?: IPressHandler;
54
+ delayLongPress?: number;
55
+ disabled?: boolean;
56
+ cancelable?: boolean;
57
+ hitSlop?: IRectOffset;
58
+ pressRetentionOffset?: IRectOffset;
59
+ unstable_pressDelay?: number;
60
+ android_ripple?: IPressableAndroidRippleConfig;
61
+ android_disableSound?: boolean;
62
+ onHoverIn?: IPressHandler;
63
+ onHoverOut?: IPressHandler;
64
+ delayHoverIn?: number;
65
+ delayHoverOut?: number;
66
+ testID?: string;
67
+ nativeID?: string;
68
+ hasTVPreferredFocus?: boolean;
69
+ nextFocusDown?: number;
70
+ nextFocusForward?: number;
71
+ nextFocusLeft?: number;
72
+ nextFocusRight?: number;
73
+ nextFocusUp?: number;
74
+ style?: IStyleProp<IViewStyle> | ((state: IPressState) => IStyleProp<IViewStyle>);
75
+ }
76
+
77
+ // What the Pressable component itself takes as plain @Input()s: the full surface minus the press/
78
+ // hover events and the four accessibility callbacks, all of which it exposes as real @Output()
79
+ // EventEmitters instead (see the class below) — the one place in the family where the
80
+ // callback-vs-EventEmitter tradeoff is actually fixed.
81
+ export type IAngularPressableInputs = Omit<
82
+ IAngularPressableProps,
83
+ | 'onPress'
84
+ | 'onPressIn'
85
+ | 'onPressOut'
86
+ | 'onPressMove'
87
+ | 'onLongPress'
88
+ | 'onHoverIn'
89
+ | 'onHoverOut'
90
+ | 'onAccessibilityAction'
91
+ | 'onAccessibilityTap'
92
+ | 'onMagicTap'
93
+ | 'onAccessibilityEscape'
94
+ >;
95
+
96
+ function isStyleFn(value: unknown): value is (state: IPressState) => IStyleProp<IViewStyle> {
97
+ return typeof value === 'function';
98
+ }
99
+
100
+ function asSymbioteEvent(event: unknown): ISymbioteEvent | undefined {
101
+ return typeof event === 'object' && event !== null && 'nativeEvent' in event
102
+ ? (event as ISymbioteEvent)
103
+ : undefined;
104
+ }
105
+
106
+ @Component({
107
+ selector: 'Pressable, symbiote-pressable',
108
+ standalone: true,
109
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
110
+ imports: [ViewHost, SymbioteHostPropsDirective],
111
+ template: `
112
+ <symbiote-view
113
+ #host
114
+ [symbioteHostProps]="hostProps"
115
+ (accessibilityAction)="emit(accessibilityAction, $event)"
116
+ (accessibilityTap)="emit(accessibilityTap, $event)"
117
+ (magicTap)="emit(magicTap, $event)"
118
+ (accessibilityEscape)="emit(accessibilityEscape, $event)"
119
+ (press)="handlePress($event)"
120
+ (pressIn)="handlePressIn($event)"
121
+ (pressOut)="handlePressOut($event)"
122
+ (responderMove)="handleResponderMove($event)"
123
+ (startShouldSetResponder)="claimResponder()"
124
+ (responderTerminationRequest)="allowTermination()"
125
+ >
126
+ <ng-content></ng-content>
127
+ </symbiote-view>
128
+ `,
129
+ changeDetection: ChangeDetectionStrategy.OnPush,
130
+ })
131
+ export class Pressable implements IAngularPressableInputs {
132
+ // The press/hover lifecycle as real Angular events: `(press)="onTap($event)"`, not
133
+ // `[onPress]="onTap"`. createPressHandlers still wants plain IPressHandler callbacks, so
134
+ // emitterHandler() below adapts each EventEmitter into one — only while something is actually
135
+ // subscribed (`.observed`), so an unbound onLongPress still skips arming the timer, exactly as
136
+ // the old @Input()-absent case did.
137
+ @Output() readonly press = new EventEmitter<ISymbioteEvent>();
138
+ @Output() readonly pressIn = new EventEmitter<ISymbioteEvent>();
139
+ @Output() readonly pressOut = new EventEmitter<ISymbioteEvent>();
140
+ @Output() readonly pressMove = new EventEmitter<ISymbioteEvent>();
141
+ @Output() readonly longPress = new EventEmitter<ISymbioteEvent>();
142
+ @Output() readonly hoverIn = new EventEmitter<ISymbioteEvent>();
143
+ @Output() readonly hoverOut = new EventEmitter<ISymbioteEvent>();
144
+ // The four accessibility callbacks as real Angular events too, same tradeoff as press/hover
145
+ // above: `(accessibilityAction)="emit(accessibilityAction, $event)"`, not
146
+ // `[onAccessibilityAction]="onAccessibilityAction"`.
147
+ @Output() readonly accessibilityAction = new EventEmitter<ISymbioteEvent>();
148
+ @Output() readonly accessibilityTap = new EventEmitter<ISymbioteEvent>();
149
+ @Output() readonly magicTap = new EventEmitter<ISymbioteEvent>();
150
+ @Output() readonly accessibilityEscape = new EventEmitter<ISymbioteEvent>();
151
+ @Input() delayLongPress?: number;
152
+ @Input() disabled?: boolean;
153
+ @Input() cancelable?: boolean;
154
+ @Input() hitSlop?: IRectOffset;
155
+ @Input() pressRetentionOffset?: IRectOffset;
156
+ @Input() unstable_pressDelay?: number;
157
+ @Input() android_ripple?: IPressableAndroidRippleConfig;
158
+ @Input() android_disableSound?: boolean;
159
+ @Input() delayHoverIn?: number;
160
+ @Input() delayHoverOut?: number;
161
+ @Input() testID?: string;
162
+ @Input() nativeID?: string;
163
+ @Input() hasTVPreferredFocus?: boolean;
164
+ @Input() nextFocusDown?: number;
165
+ @Input() nextFocusForward?: number;
166
+ @Input() nextFocusLeft?: number;
167
+ @Input() nextFocusRight?: number;
168
+ @Input() nextFocusUp?: number;
169
+ @Input() style?: IAngularPressableProps['style'];
170
+ @Input() accessible?: boolean;
171
+ @Input() accessibilityLabel?: string;
172
+ @Input() accessibilityHint?: string;
173
+ @Input() accessibilityRole?: IAngularPressableProps['accessibilityRole'];
174
+ @Input() accessibilityState?: IAccessibilityStateValue;
175
+ @Input() accessibilityValue?: IAngularPressableProps['accessibilityValue'];
176
+ @Input() accessibilityActions?: IAngularPressableProps['accessibilityActions'];
177
+ @Input() accessibilityLabelledBy?: string | string[];
178
+ @Input() importantForAccessibility?: IAccessibilityProps['importantForAccessibility'];
179
+ @Input() accessibilityLiveRegion?: IAccessibilityProps['accessibilityLiveRegion'];
180
+ @Input() screenReaderFocusable?: boolean;
181
+ @Input() accessibilityViewIsModal?: boolean;
182
+ @Input() accessibilityElementsHidden?: boolean;
183
+ @Input() accessibilityIgnoresInvertColors?: boolean;
184
+ @Input() accessibilityLanguage?: string;
185
+ @Input() accessibilityRespondsToUserInteraction?: boolean;
186
+ @Input() accessibilityShowsLargeContentViewer?: boolean;
187
+ @Input() accessibilityLargeContentTitle?: string;
188
+ @Input() ariaLabel?: string;
189
+ @Input() ariaBusy?: boolean;
190
+ @Input() ariaChecked?: boolean | 'mixed';
191
+ @Input() ariaDisabled?: boolean;
192
+ @Input() ariaExpanded?: boolean;
193
+ @Input() ariaHidden?: boolean;
194
+ @Input() ariaLabelledBy?: string;
195
+ @Input() ariaLive?: IAriaProps['aria-live'];
196
+ @Input() ariaSelected?: boolean;
197
+ @Input() ariaModal?: boolean;
198
+ @Input() ariaValueMax?: number;
199
+ @Input() ariaValueMin?: number;
200
+ @Input() ariaValueNow?: number;
201
+ @Input() ariaValueText?: string;
202
+ @Input() id?: string;
203
+ @Input() role?: IAngularPressableProps['role'];
204
+
205
+ @ViewChild('host', { read: ElementRef }) private hostElement?: ElementRef<unknown>;
206
+
207
+ pressed = false;
208
+ private readonly runtime: IPressRuntime = createPressRuntime();
209
+ private readonly host: IPressHost = {
210
+ setPressed: pressed => {
211
+ this.pressed = pressed;
212
+ this.changeDetector.detectChanges();
213
+ },
214
+ getMeasureFn: () => {
215
+ const node = this.hostNode;
216
+ if (node === undefined) return undefined;
217
+ return callback => measure(node, callback);
218
+ },
219
+ schedule: (callback, ms) => {
220
+ const id = setTimeout(callback, ms);
221
+ return () => clearTimeout(id);
222
+ },
223
+ };
224
+
225
+ private readonly changeDetector = inject(ChangeDetectorRef);
226
+ // This component's OWN host — the non-painting anchor `class="..."` at the use site resolves
227
+ // onto (see anchorHostStyle's doc comment) — NOT `hostElement` above, which targets the real
228
+ // inner `symbiote-view` one level down.
229
+ private readonly elementRef = inject(ElementRef);
230
+
231
+ get resolvedStyle(): IStyleProp<IViewStyle> | undefined {
232
+ const state: IPressState = { pressed: this.pressed };
233
+ return isStyleFn(this.style) ? this.style(state) : this.style;
234
+ }
235
+
236
+ get foldedAccessibility(): Partial<IAngularPressableProps> {
237
+ return resolveAccessibilityProps({
238
+ accessibilityLabel: this.accessibilityLabel,
239
+ accessibilityHint: this.accessibilityHint,
240
+ accessibilityRole: this.accessibilityRole,
241
+ accessibilityState: resolveDisabledAccessibilityState(this.accessibilityState, this.disabled),
242
+ accessibilityValue: this.accessibilityValue,
243
+ accessibilityActions: this.accessibilityActions,
244
+ accessibilityLabelledBy: this.accessibilityLabelledBy,
245
+ importantForAccessibility: this.importantForAccessibility,
246
+ accessibilityLiveRegion: this.accessibilityLiveRegion,
247
+ screenReaderFocusable: this.screenReaderFocusable,
248
+ accessibilityViewIsModal: this.accessibilityViewIsModal,
249
+ accessibilityElementsHidden: this.accessibilityElementsHidden,
250
+ accessibilityIgnoresInvertColors: this.accessibilityIgnoresInvertColors,
251
+ accessibilityLanguage: this.accessibilityLanguage,
252
+ accessibilityRespondsToUserInteraction: this.accessibilityRespondsToUserInteraction,
253
+ accessibilityShowsLargeContentViewer: this.accessibilityShowsLargeContentViewer,
254
+ accessibilityLargeContentTitle: this.accessibilityLargeContentTitle,
255
+ 'aria-label': this.ariaLabel,
256
+ 'aria-busy': this.ariaBusy,
257
+ 'aria-checked': this.ariaChecked,
258
+ 'aria-disabled': this.ariaDisabled,
259
+ 'aria-expanded': this.ariaExpanded,
260
+ 'aria-hidden': this.ariaHidden,
261
+ 'aria-labelledby': this.ariaLabelledBy,
262
+ 'aria-live': this.ariaLive,
263
+ 'aria-selected': this.ariaSelected,
264
+ 'aria-modal': this.ariaModal,
265
+ 'aria-valuemax': this.ariaValueMax,
266
+ 'aria-valuemin': this.ariaValueMin,
267
+ 'aria-valuenow': this.ariaValueNow,
268
+ 'aria-valuetext': this.ariaValueText,
269
+ id: this.id,
270
+ role: this.role,
271
+ });
272
+ }
273
+
274
+ get resolvedRippleProps(): Record<string, unknown> | undefined {
275
+ return this.android_ripple === undefined ? undefined : rippleProps(this.android_ripple);
276
+ }
277
+
278
+ // Assembles the SAME resolved values the template used to bind one-by-one into a single
279
+ // flat bag for `[symbioteHostProps]` (Renderer2.setProperty per key) — see primitives/shared.ts.
280
+ get hostProps(): Record<string, unknown> {
281
+ return {
282
+ testID: this.testID,
283
+ nativeID: this.nativeID,
284
+ hasTVPreferredFocus: this.hasTVPreferredFocus,
285
+ nextFocusDown: this.nextFocusDown,
286
+ nextFocusForward: this.nextFocusForward,
287
+ nextFocusLeft: this.nextFocusLeft,
288
+ nextFocusRight: this.nextFocusRight,
289
+ nextFocusUp: this.nextFocusUp,
290
+ style: [anchorHostStyle(this.elementRef), this.resolvedStyle],
291
+ accessible: this.accessible,
292
+ ...this.foldedAccessibility,
293
+ android_disableSound: this.android_disableSound,
294
+ nativeBackgroundAndroid: this.resolvedRippleProps?.nativeBackgroundAndroid,
295
+ nativeForegroundAndroid: this.resolvedRippleProps?.nativeForegroundAndroid,
296
+ };
297
+ }
298
+
299
+ handlePressIn(event: unknown): void {
300
+ const symbioteEvent = asSymbioteEvent(event);
301
+ if (this.disabled === true || symbioteEvent === undefined) return;
302
+ this.handlers.handlePressIn(symbioteEvent);
303
+ }
304
+
305
+ handlePressOut(event: unknown): void {
306
+ const symbioteEvent = asSymbioteEvent(event);
307
+ if (this.disabled === true || symbioteEvent === undefined) return;
308
+ this.handlers.handlePressOut(symbioteEvent);
309
+ }
310
+
311
+ handlePress(event: unknown): void {
312
+ const symbioteEvent = asSymbioteEvent(event);
313
+ if (this.disabled === true || symbioteEvent === undefined) return;
314
+ this.handlers.handlePress(symbioteEvent);
315
+ }
316
+
317
+ handleResponderMove(event: unknown): void {
318
+ const symbioteEvent = asSymbioteEvent(event);
319
+ if (this.disabled === true || symbioteEvent === undefined) return;
320
+ this.handlers.handleResponderMove(symbioteEvent);
321
+ }
322
+
323
+ claimResponder(): boolean {
324
+ return this.disabled !== true;
325
+ }
326
+
327
+ allowTermination(): boolean {
328
+ return this.cancelable !== false;
329
+ }
330
+
331
+ emit(emitter: EventEmitter<ISymbioteEvent>, event: unknown): void {
332
+ const symbioteEvent = asSymbioteEvent(event);
333
+ if (symbioteEvent !== undefined) emitter.emit(symbioteEvent);
334
+ }
335
+
336
+ // Hover has no event on a touch host (no pointer-enter/leave); this only records that someone
337
+ // is listening anyway, mirroring core's noteHoverNoop but off `.observed` instead of an @Input.
338
+ private noteHoverNoop(): void {
339
+ if (this.hoverIn.observed || this.hoverOut.observed) {
340
+ dlog('Pressable hover is a no-op on this host (no pointer-enter/leave event)');
341
+ }
342
+ }
343
+
344
+ // Wraps an @Output() as an IPressHandler only while it has a subscriber, so an unbound
345
+ // (longPress) still skips arming the timer — the same "undefined means nobody cares" contract
346
+ // createPressHandlers had with the old @Input() callbacks.
347
+ private emitterHandler(emitter: EventEmitter<ISymbioteEvent>): IPressHandler | undefined {
348
+ return emitter.observed ? event => emitter.emit(event) : undefined;
349
+ }
350
+
351
+ private get handlers() {
352
+ this.noteHoverNoop();
353
+ const config: IPressMachineConfig = {
354
+ onPress: this.emitterHandler(this.press),
355
+ onPressIn: this.emitterHandler(this.pressIn),
356
+ onPressOut: this.emitterHandler(this.pressOut),
357
+ onPressMove: this.emitterHandler(this.pressMove),
358
+ onLongPress: this.emitterHandler(this.longPress),
359
+ delayLongPress: this.delayLongPress ?? DEFAULT_DELAY_LONG_PRESS_MS,
360
+ unstable_pressDelay: this.unstable_pressDelay ?? 0,
361
+ hitSlop: this.hitSlop,
362
+ pressRetentionOffset: this.pressRetentionOffset,
363
+ };
364
+ return createPressHandlers(config, this.runtime, this.host);
365
+ }
366
+
367
+ private get hostNode(): ISymbioteNode | undefined {
368
+ const native = this.hostElement?.nativeElement;
369
+ return isSymbioteNode(native) ? native : undefined;
370
+ }
371
+ }
@@ -0,0 +1,85 @@
1
+ import '@angular/compiler';
2
+ import { Component } from '@angular/core';
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
+ import { clearGlobalStyles, registerStyles } from '@symbiote-native/engine';
5
+ import { installFabric } from '@symbiote-native/test-utils';
6
+
7
+ import { mount, unmount } from '../../render';
8
+ import { Pressable } from './index';
9
+
10
+ const ROOT_TAG = 903;
11
+ const fabric = installFabric();
12
+
13
+ let capturedHost: PressableHost | undefined;
14
+
15
+ @Component({
16
+ selector: 'symbiote-pressable-host',
17
+ standalone: true,
18
+ imports: [Pressable],
19
+ template: `
20
+ <Pressable
21
+ [testID]="'pressable'"
22
+ class="card"
23
+ (press)="onPress($event)"
24
+ (pressIn)="onPressIn($event)"
25
+ (pressOut)="onPressOut($event)"
26
+ >
27
+ <symbiote-text>Press me</symbiote-text>
28
+ </Pressable>
29
+ `,
30
+ })
31
+ class PressableHost {
32
+ onPress = vi.fn();
33
+ onPressIn = vi.fn();
34
+ onPressOut = vi.fn();
35
+
36
+ constructor() {
37
+ // Captures the live component instance so the test can drive its signals after mount.
38
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
39
+ capturedHost = this;
40
+ }
41
+ }
42
+
43
+ beforeEach(() => {
44
+ capturedHost = undefined;
45
+ fabric.reset();
46
+ });
47
+ afterEach(() => {
48
+ unmount(ROOT_TAG);
49
+ clearGlobalStyles();
50
+ });
51
+
52
+ describe('Pressable', () => {
53
+ it('synthesizes a press from a touch sequence and fires the lifecycle handlers', async () => {
54
+ mount(ROOT_TAG, PressableHost);
55
+ await new Promise<void>(resolve => setTimeout(resolve, 0));
56
+
57
+ const node = fabric.find(n => n.props.testID === 'pressable');
58
+ expect(node, 'Pressable view committed').toBeDefined();
59
+
60
+ const now = Date.now();
61
+ const touch = { identifier: 1, pageX: 10, pageY: 10, timestamp: now };
62
+ const nativeEvent = { touches: [touch], changedTouches: [touch] };
63
+
64
+ fabric.fireEvent(node?.instanceHandle, 'topTouchStart', nativeEvent);
65
+ await new Promise<void>(resolve => setTimeout(resolve, 0));
66
+
67
+ expect(capturedHost?.onPressIn).toHaveBeenCalledOnce();
68
+
69
+ fabric.fireEvent(node?.instanceHandle, 'topTouchEnd', nativeEvent);
70
+ await new Promise<void>(resolve => setTimeout(resolve, 0));
71
+
72
+ expect(capturedHost?.onPress).toHaveBeenCalledOnce();
73
+ expect(capturedHost?.onPressOut).toHaveBeenCalledOnce();
74
+ });
75
+
76
+ it('resolves a class= on the Pressable use site onto the real committed view, not the anchor', async () => {
77
+ registerStyles({ card: { backgroundColor: 'red' } });
78
+
79
+ mount(ROOT_TAG, PressableHost);
80
+ await new Promise<void>(resolve => setTimeout(resolve, 0));
81
+
82
+ const node = fabric.find(n => n.props.testID === 'pressable');
83
+ expect(node?.props.backgroundColor).toBe('red');
84
+ });
85
+ });
@@ -0,0 +1,41 @@
1
+ import '@angular/compiler';
2
+ import { Component } from '@angular/core';
3
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
4
+ import { clearGlobalStyles, registerStyles } from '@symbiote-native/engine';
5
+ import { installFabric } from '@symbiote-native/test-utils';
6
+
7
+ import { mount, unmount } from '../render';
8
+ import { RefreshControl } from './refresh-control';
9
+
10
+ const ROOT_TAG = 914;
11
+ const fabric = installFabric();
12
+
13
+ @Component({
14
+ selector: 'symbiote-refresh-control-host',
15
+ standalone: true,
16
+ imports: [RefreshControl],
17
+ template: `
18
+ <RefreshControl [refreshing]="false" [testID]="'refresh'" class="spinner"></RefreshControl>
19
+ `,
20
+ })
21
+ class RefreshControlHostFixture {}
22
+
23
+ beforeEach(() => {
24
+ fabric.reset();
25
+ });
26
+ afterEach(() => {
27
+ unmount(ROOT_TAG);
28
+ clearGlobalStyles();
29
+ });
30
+
31
+ describe('RefreshControl', () => {
32
+ it('resolves a class= on the RefreshControl use site onto the real committed view, not the anchor', async () => {
33
+ registerStyles({ spinner: { backgroundColor: 'green' } });
34
+
35
+ mount(ROOT_TAG, RefreshControlHostFixture);
36
+ await new Promise<void>(resolve => setTimeout(resolve, 0));
37
+
38
+ const node = fabric.find(n => n.props.testID === 'refresh');
39
+ expect(node?.props.backgroundColor).toBe('green');
40
+ });
41
+ });