@gtkx/react 1.0.0-rc.1 → 1.0.0-rc.2

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 (381) hide show
  1. package/dist/adw/config.d.ts +2 -0
  2. package/dist/adw/config.d.ts.map +1 -0
  3. package/dist/adw/config.js +2 -0
  4. package/dist/adw/config.js.map +1 -0
  5. package/dist/{libraries/adw → adw}/dialog.d.ts +2 -2
  6. package/dist/adw/dialog.d.ts.map +1 -0
  7. package/dist/adw/dialog.js +25 -0
  8. package/dist/adw/dialog.js.map +1 -0
  9. package/dist/adw/element-behaviors.d.ts +2 -0
  10. package/dist/adw/element-behaviors.d.ts.map +1 -0
  11. package/dist/adw/element-behaviors.js +299 -0
  12. package/dist/adw/element-behaviors.js.map +1 -0
  13. package/dist/adw/element-config.d.ts +9 -0
  14. package/dist/adw/element-config.d.ts.map +1 -0
  15. package/dist/adw/element-config.js +137 -0
  16. package/dist/adw/element-config.js.map +1 -0
  17. package/dist/adw/index.d.ts +4 -0
  18. package/dist/adw/index.d.ts.map +1 -0
  19. package/dist/adw/index.js +3 -0
  20. package/dist/adw/index.js.map +1 -0
  21. package/dist/adw/prop-types.d.ts +29 -0
  22. package/dist/adw/prop-types.d.ts.map +1 -0
  23. package/dist/adw/prop-types.js +2 -0
  24. package/dist/adw/prop-types.js.map +1 -0
  25. package/dist/bootstrap.d.ts +2 -0
  26. package/dist/bootstrap.d.ts.map +1 -0
  27. package/dist/bootstrap.js +5 -0
  28. package/dist/bootstrap.js.map +1 -0
  29. package/dist/components/application.d.ts +2 -2
  30. package/dist/components/application.d.ts.map +1 -1
  31. package/dist/components/application.js +31 -18
  32. package/dist/components/application.js.map +1 -1
  33. package/dist/components/element.d.ts +6 -0
  34. package/dist/components/element.d.ts.map +1 -0
  35. package/dist/components/element.js +29 -0
  36. package/dist/components/element.js.map +1 -0
  37. package/dist/components/window.d.ts +2 -2
  38. package/dist/components/window.d.ts.map +1 -1
  39. package/dist/components/window.js +10 -11
  40. package/dist/components/window.js.map +1 -1
  41. package/dist/config.d.ts +4 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +3 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/element-behaviors.d.ts +2 -0
  46. package/dist/element-behaviors.d.ts.map +1 -0
  47. package/dist/element-behaviors.js +348 -0
  48. package/dist/element-behaviors.js.map +1 -0
  49. package/dist/element-config.d.ts +10 -0
  50. package/dist/element-config.d.ts.map +1 -0
  51. package/dist/element-config.js +146 -0
  52. package/dist/element-config.js.map +1 -0
  53. package/dist/hooks/use-application.d.ts +4 -3
  54. package/dist/hooks/use-application.d.ts.map +1 -1
  55. package/dist/hooks/use-application.js +5 -4
  56. package/dist/hooks/use-application.js.map +1 -1
  57. package/dist/hooks/use-bind-setting.d.ts +21 -4
  58. package/dist/hooks/use-bind-setting.d.ts.map +1 -1
  59. package/dist/hooks/use-bind-setting.js +27 -16
  60. package/dist/hooks/use-bind-setting.js.map +1 -1
  61. package/dist/hooks/use-merged-refs.d.ts +8 -0
  62. package/dist/hooks/use-merged-refs.d.ts.map +1 -0
  63. package/dist/hooks/use-merged-refs.js +48 -0
  64. package/dist/hooks/use-merged-refs.js.map +1 -0
  65. package/dist/hooks/use-object-value.d.ts +3 -2
  66. package/dist/hooks/use-object-value.d.ts.map +1 -1
  67. package/dist/hooks/use-object-value.js +18 -21
  68. package/dist/hooks/use-object-value.js.map +1 -1
  69. package/dist/hooks/use-parent-window.d.ts +3 -2
  70. package/dist/hooks/use-parent-window.d.ts.map +1 -1
  71. package/dist/hooks/use-parent-window.js +3 -2
  72. package/dist/hooks/use-parent-window.js.map +1 -1
  73. package/dist/hooks/use-property.d.ts +5 -5
  74. package/dist/hooks/use-property.d.ts.map +1 -1
  75. package/dist/hooks/use-property.js +4 -3
  76. package/dist/hooks/use-property.js.map +1 -1
  77. package/dist/hooks/use-setting.d.ts +5 -16
  78. package/dist/hooks/use-setting.d.ts.map +1 -1
  79. package/dist/hooks/use-setting.js +16 -11
  80. package/dist/hooks/use-setting.js.map +1 -1
  81. package/dist/hooks/use-signal.d.ts +10 -7
  82. package/dist/hooks/use-signal.d.ts.map +1 -1
  83. package/dist/hooks/use-signal.js +29 -18
  84. package/dist/hooks/use-signal.js.map +1 -1
  85. package/dist/index.d.ts +7 -8
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2 -3
  88. package/dist/index.js.map +1 -1
  89. package/dist/internal.d.ts +6 -7
  90. package/dist/internal.d.ts.map +1 -1
  91. package/dist/internal.js +5 -7
  92. package/dist/internal.js.map +1 -1
  93. package/dist/prop-types.d.ts +110 -0
  94. package/dist/prop-types.d.ts.map +1 -0
  95. package/dist/prop-types.js +2 -0
  96. package/dist/prop-types.js.map +1 -0
  97. package/dist/reconciler/apply-props.d.ts +10 -7
  98. package/dist/reconciler/apply-props.d.ts.map +1 -1
  99. package/dist/reconciler/apply-props.js +182 -84
  100. package/dist/reconciler/apply-props.js.map +1 -1
  101. package/dist/reconciler/behaviors.d.ts +59 -0
  102. package/dist/reconciler/behaviors.d.ts.map +1 -0
  103. package/dist/reconciler/behaviors.js +172 -0
  104. package/dist/reconciler/behaviors.js.map +1 -0
  105. package/dist/reconciler/child-routing.d.ts +5 -0
  106. package/dist/reconciler/child-routing.d.ts.map +1 -0
  107. package/dist/reconciler/child-routing.js +156 -0
  108. package/dist/reconciler/child-routing.js.map +1 -0
  109. package/dist/reconciler/host-config.d.ts +8 -12
  110. package/dist/reconciler/host-config.d.ts.map +1 -1
  111. package/dist/reconciler/host-config.js +175 -270
  112. package/dist/reconciler/host-config.js.map +1 -1
  113. package/dist/reconciler/instance.d.ts +4 -5
  114. package/dist/reconciler/instance.d.ts.map +1 -1
  115. package/dist/reconciler/instance.js +44 -22
  116. package/dist/reconciler/instance.js.map +1 -1
  117. package/dist/reconciler/metadata.d.ts +17 -0
  118. package/dist/reconciler/metadata.d.ts.map +1 -0
  119. package/dist/reconciler/metadata.js +82 -0
  120. package/dist/reconciler/metadata.js.map +1 -0
  121. package/dist/reconciler/node.d.ts +76 -0
  122. package/dist/reconciler/node.d.ts.map +1 -0
  123. package/dist/reconciler/node.js +53 -0
  124. package/dist/reconciler/node.js.map +1 -0
  125. package/dist/reconciler/placement.d.ts +5 -0
  126. package/dist/reconciler/placement.d.ts.map +1 -0
  127. package/dist/reconciler/placement.js +175 -0
  128. package/dist/reconciler/placement.js.map +1 -0
  129. package/dist/reconciler/registry.d.ts +92 -0
  130. package/dist/reconciler/registry.d.ts.map +1 -0
  131. package/dist/reconciler/registry.js +64 -0
  132. package/dist/reconciler/registry.js.map +1 -0
  133. package/dist/reconciler/root-element.d.ts +9 -12
  134. package/dist/reconciler/root-element.d.ts.map +1 -1
  135. package/dist/reconciler/root-element.js +6 -6
  136. package/dist/reconciler/root-element.js.map +1 -1
  137. package/dist/reconciler/root.d.ts +56 -0
  138. package/dist/reconciler/root.d.ts.map +1 -0
  139. package/dist/reconciler/root.js +109 -0
  140. package/dist/reconciler/root.js.map +1 -0
  141. package/dist/reconciler/signals.d.ts +10 -0
  142. package/dist/reconciler/signals.d.ts.map +1 -0
  143. package/dist/reconciler/signals.js +70 -0
  144. package/dist/reconciler/signals.js.map +1 -0
  145. package/dist/reconciler/text.d.ts +19 -0
  146. package/dist/reconciler/text.d.ts.map +1 -0
  147. package/dist/reconciler/text.js +276 -0
  148. package/dist/reconciler/text.js.map +1 -0
  149. package/dist/utils/accessible-metadata.d.ts +11 -4
  150. package/dist/utils/accessible-metadata.d.ts.map +1 -1
  151. package/dist/utils/accessible-metadata.js +20 -17
  152. package/dist/utils/accessible-metadata.js.map +1 -1
  153. package/dist/{reconciler/accessible.d.ts → utils/accessible-props.d.ts} +7 -6
  154. package/dist/utils/accessible-props.d.ts.map +1 -0
  155. package/dist/utils/accessible-props.js +181 -0
  156. package/dist/utils/accessible-props.js.map +1 -0
  157. package/dist/utils/ref-prop.d.ts +15 -0
  158. package/dist/utils/ref-prop.d.ts.map +1 -0
  159. package/dist/utils/ref-prop.js +18 -0
  160. package/dist/utils/ref-prop.js.map +1 -0
  161. package/dist/utils/settings.d.ts +17 -0
  162. package/dist/utils/settings.d.ts.map +1 -0
  163. package/dist/utils/settings.js +37 -0
  164. package/dist/utils/settings.js.map +1 -0
  165. package/dist/utils/variant.d.ts +57 -0
  166. package/dist/utils/variant.d.ts.map +1 -0
  167. package/dist/utils/variant.js +197 -0
  168. package/dist/utils/variant.js.map +1 -0
  169. package/env.d.ts +9 -0
  170. package/package.json +36 -11
  171. package/src/adw/config.ts +1 -0
  172. package/src/adw/dialog.tsx +35 -0
  173. package/src/adw/element-behaviors.ts +379 -0
  174. package/src/adw/element-config.ts +140 -0
  175. package/src/adw/index.ts +4 -0
  176. package/src/adw/prop-types.ts +42 -0
  177. package/src/bootstrap.ts +5 -0
  178. package/src/components/application.tsx +42 -23
  179. package/src/components/element.tsx +47 -0
  180. package/src/components/window.tsx +12 -13
  181. package/src/config.ts +3 -0
  182. package/src/element-behaviors.ts +424 -0
  183. package/src/element-config.ts +148 -0
  184. package/src/env.d.ts +1 -0
  185. package/src/hooks/use-application.ts +6 -4
  186. package/src/hooks/use-bind-setting.ts +47 -31
  187. package/src/hooks/use-merged-refs.ts +64 -0
  188. package/src/hooks/use-object-value.ts +27 -23
  189. package/src/hooks/use-parent-window.ts +4 -2
  190. package/src/hooks/use-property.ts +11 -10
  191. package/src/hooks/use-setting.ts +20 -33
  192. package/src/hooks/use-signal.ts +37 -48
  193. package/src/index.ts +7 -8
  194. package/src/internal.ts +7 -18
  195. package/src/prop-types.ts +142 -0
  196. package/src/reconciler/apply-props.ts +233 -85
  197. package/src/reconciler/behaviors.ts +324 -0
  198. package/src/reconciler/child-routing.ts +202 -0
  199. package/src/reconciler/host-config.ts +239 -366
  200. package/src/reconciler/instance.ts +76 -24
  201. package/src/reconciler/metadata.ts +119 -0
  202. package/src/reconciler/node.ts +161 -0
  203. package/src/reconciler/placement.ts +255 -0
  204. package/src/reconciler/registry.ts +161 -0
  205. package/src/reconciler/root-element.ts +9 -11
  206. package/src/reconciler/root.ts +175 -0
  207. package/src/reconciler/signals.ts +113 -0
  208. package/src/reconciler/text.ts +407 -0
  209. package/src/utils/accessible-metadata.ts +23 -18
  210. package/src/utils/accessible-props.ts +279 -0
  211. package/src/utils/ref-prop.ts +30 -0
  212. package/src/utils/settings.ts +69 -0
  213. package/src/utils/variant.ts +368 -0
  214. package/dist/hooks/use-merge-refs.d.ts +0 -3
  215. package/dist/hooks/use-merge-refs.d.ts.map +0 -1
  216. package/dist/hooks/use-merge-refs.js +0 -48
  217. package/dist/hooks/use-merge-refs.js.map +0 -1
  218. package/dist/hooks/use-object-attachment.d.ts +0 -10
  219. package/dist/hooks/use-object-attachment.d.ts.map +0 -1
  220. package/dist/hooks/use-object-attachment.js +0 -24
  221. package/dist/hooks/use-object-attachment.js.map +0 -1
  222. package/dist/libraries/adw/dialog.d.ts.map +0 -1
  223. package/dist/libraries/adw/dialog.js +0 -25
  224. package/dist/libraries/adw/dialog.js.map +0 -1
  225. package/dist/libraries/adw/index.d.ts +0 -2
  226. package/dist/libraries/adw/index.d.ts.map +0 -1
  227. package/dist/libraries/adw/index.js +0 -2
  228. package/dist/libraries/adw/index.js.map +0 -1
  229. package/dist/reconciler/accessible.d.ts.map +0 -1
  230. package/dist/reconciler/accessible.js +0 -143
  231. package/dist/reconciler/accessible.js.map +0 -1
  232. package/dist/reconciler/commit-flush.d.ts +0 -3
  233. package/dist/reconciler/commit-flush.d.ts.map +0 -1
  234. package/dist/reconciler/commit-flush.js +0 -13
  235. package/dist/reconciler/commit-flush.js.map +0 -1
  236. package/dist/reconciler/container-attach.d.ts +0 -10
  237. package/dist/reconciler/container-attach.d.ts.map +0 -1
  238. package/dist/reconciler/container-attach.js +0 -216
  239. package/dist/reconciler/container-attach.js.map +0 -1
  240. package/dist/reconciler/content-rebuild.d.ts +0 -3
  241. package/dist/reconciler/content-rebuild.d.ts.map +0 -1
  242. package/dist/reconciler/content-rebuild.js +0 -15
  243. package/dist/reconciler/content-rebuild.js.map +0 -1
  244. package/dist/reconciler/dispatch.d.ts +0 -6
  245. package/dist/reconciler/dispatch.d.ts.map +0 -1
  246. package/dist/reconciler/dispatch.js +0 -61
  247. package/dist/reconciler/dispatch.js.map +0 -1
  248. package/dist/reconciler/element-prop-appliers.d.ts +0 -5
  249. package/dist/reconciler/element-prop-appliers.d.ts.map +0 -1
  250. package/dist/reconciler/element-prop-appliers.js +0 -104
  251. package/dist/reconciler/element-prop-appliers.js.map +0 -1
  252. package/dist/reconciler/element-props.d.ts +0 -25
  253. package/dist/reconciler/element-props.d.ts.map +0 -1
  254. package/dist/reconciler/element-props.js +0 -157
  255. package/dist/reconciler/element-props.js.map +0 -1
  256. package/dist/reconciler/label-text-rebuild.d.ts +0 -3
  257. package/dist/reconciler/label-text-rebuild.d.ts.map +0 -1
  258. package/dist/reconciler/label-text-rebuild.js +0 -22
  259. package/dist/reconciler/label-text-rebuild.js.map +0 -1
  260. package/dist/reconciler/portal.d.ts +0 -11
  261. package/dist/reconciler/portal.d.ts.map +0 -1
  262. package/dist/reconciler/portal.js +0 -20
  263. package/dist/reconciler/portal.js.map +0 -1
  264. package/dist/reconciler/reconciler-error-handler.d.ts +0 -7
  265. package/dist/reconciler/reconciler-error-handler.d.ts.map +0 -1
  266. package/dist/reconciler/reconciler-error-handler.js +0 -24
  267. package/dist/reconciler/reconciler-error-handler.js.map +0 -1
  268. package/dist/reconciler/reconciler-root.d.ts +0 -19
  269. package/dist/reconciler/reconciler-root.d.ts.map +0 -1
  270. package/dist/reconciler/reconciler-root.js +0 -24
  271. package/dist/reconciler/reconciler-root.js.map +0 -1
  272. package/dist/reconciler/reconciler.d.ts +0 -3
  273. package/dist/reconciler/reconciler.d.ts.map +0 -1
  274. package/dist/reconciler/reconciler.js +0 -12
  275. package/dist/reconciler/reconciler.js.map +0 -1
  276. package/dist/reconciler/render.d.ts +0 -23
  277. package/dist/reconciler/render.d.ts.map +0 -1
  278. package/dist/reconciler/render.js +0 -46
  279. package/dist/reconciler/render.js.map +0 -1
  280. package/dist/reconciler/signal-store.d.ts +0 -22
  281. package/dist/reconciler/signal-store.d.ts.map +0 -1
  282. package/dist/reconciler/signal-store.js +0 -84
  283. package/dist/reconciler/signal-store.js.map +0 -1
  284. package/dist/reconciler/state.d.ts +0 -36
  285. package/dist/reconciler/state.d.ts.map +0 -1
  286. package/dist/reconciler/state.js +0 -38
  287. package/dist/reconciler/state.js.map +0 -1
  288. package/dist/reconciler/text-buffer-controller.d.ts +0 -17
  289. package/dist/reconciler/text-buffer-controller.d.ts.map +0 -1
  290. package/dist/reconciler/text-buffer-controller.js +0 -102
  291. package/dist/reconciler/text-buffer-controller.js.map +0 -1
  292. package/dist/reconciler/text-buffer-rebuild.d.ts +0 -3
  293. package/dist/reconciler/text-buffer-rebuild.d.ts.map +0 -1
  294. package/dist/reconciler/text-buffer-rebuild.js +0 -7
  295. package/dist/reconciler/text-buffer-rebuild.js.map +0 -1
  296. package/dist/reconciler/text-node.d.ts +0 -7
  297. package/dist/reconciler/text-node.d.ts.map +0 -1
  298. package/dist/reconciler/text-node.js +0 -8
  299. package/dist/reconciler/text-node.js.map +0 -1
  300. package/dist/reconciler/types.d.ts +0 -5
  301. package/dist/reconciler/types.d.ts.map +0 -1
  302. package/dist/reconciler/types.js +0 -2
  303. package/dist/reconciler/types.js.map +0 -1
  304. package/dist/reconciler/visibility.d.ts +0 -6
  305. package/dist/reconciler/visibility.d.ts.map +0 -1
  306. package/dist/reconciler/visibility.js +0 -57
  307. package/dist/reconciler/visibility.js.map +0 -1
  308. package/dist/reconciler/wrapper-apply.d.ts +0 -6
  309. package/dist/reconciler/wrapper-apply.d.ts.map +0 -1
  310. package/dist/reconciler/wrapper-apply.js +0 -287
  311. package/dist/reconciler/wrapper-apply.js.map +0 -1
  312. package/dist/reconciler/wrapper-content.d.ts +0 -8
  313. package/dist/reconciler/wrapper-content.d.ts.map +0 -1
  314. package/dist/reconciler/wrapper-content.js +0 -19
  315. package/dist/reconciler/wrapper-content.js.map +0 -1
  316. package/dist/reconciler/wrapper-node.d.ts +0 -8
  317. package/dist/reconciler/wrapper-node.d.ts.map +0 -1
  318. package/dist/reconciler/wrapper-node.js +0 -4
  319. package/dist/reconciler/wrapper-node.js.map +0 -1
  320. package/dist/reconciler/wrapper-protocol.d.ts +0 -13
  321. package/dist/reconciler/wrapper-protocol.d.ts.map +0 -1
  322. package/dist/reconciler/wrapper-protocol.js +0 -20
  323. package/dist/reconciler/wrapper-protocol.js.map +0 -1
  324. package/dist/utils/create-element-component.d.ts +0 -4
  325. package/dist/utils/create-element-component.d.ts.map +0 -1
  326. package/dist/utils/create-element-component.js +0 -54
  327. package/dist/utils/create-element-component.js.map +0 -1
  328. package/dist/utils/gtype.d.ts +0 -16
  329. package/dist/utils/gtype.d.ts.map +0 -1
  330. package/dist/utils/gtype.js +0 -127
  331. package/dist/utils/gtype.js.map +0 -1
  332. package/dist/utils/notify-name.d.ts +0 -5
  333. package/dist/utils/notify-name.d.ts.map +0 -1
  334. package/dist/utils/notify-name.js +0 -6
  335. package/dist/utils/notify-name.js.map +0 -1
  336. package/dist/utils/object-prop.d.ts +0 -8
  337. package/dist/utils/object-prop.d.ts.map +0 -1
  338. package/dist/utils/object-prop.js +0 -9
  339. package/dist/utils/object-prop.js.map +0 -1
  340. package/dist/utils/settings-accessor.d.ts +0 -8
  341. package/dist/utils/settings-accessor.d.ts.map +0 -1
  342. package/dist/utils/settings-accessor.js +0 -69
  343. package/dist/utils/settings-accessor.js.map +0 -1
  344. package/dist/utils/wrapper-node-jsx.d.ts +0 -32
  345. package/dist/utils/wrapper-node-jsx.d.ts.map +0 -1
  346. package/dist/utils/wrapper-node-jsx.js +0 -2
  347. package/dist/utils/wrapper-node-jsx.js.map +0 -1
  348. package/src/hooks/use-merge-refs.ts +0 -53
  349. package/src/hooks/use-object-attachment.ts +0 -35
  350. package/src/libraries/adw/dialog.tsx +0 -34
  351. package/src/libraries/adw/index.ts +0 -1
  352. package/src/reconciler/accessible.ts +0 -232
  353. package/src/reconciler/commit-flush.ts +0 -13
  354. package/src/reconciler/container-attach.ts +0 -219
  355. package/src/reconciler/content-rebuild.ts +0 -19
  356. package/src/reconciler/dispatch.ts +0 -58
  357. package/src/reconciler/element-prop-appliers.ts +0 -110
  358. package/src/reconciler/element-props.ts +0 -192
  359. package/src/reconciler/label-text-rebuild.ts +0 -26
  360. package/src/reconciler/portal.ts +0 -28
  361. package/src/reconciler/reconciler-error-handler.ts +0 -29
  362. package/src/reconciler/reconciler-root.ts +0 -57
  363. package/src/reconciler/reconciler.ts +0 -13
  364. package/src/reconciler/render.ts +0 -61
  365. package/src/reconciler/signal-store.ts +0 -103
  366. package/src/reconciler/state.ts +0 -72
  367. package/src/reconciler/text-buffer-controller.ts +0 -107
  368. package/src/reconciler/text-buffer-rebuild.ts +0 -12
  369. package/src/reconciler/text-node.ts +0 -13
  370. package/src/reconciler/types.ts +0 -6
  371. package/src/reconciler/visibility.ts +0 -52
  372. package/src/reconciler/wrapper-apply.ts +0 -308
  373. package/src/reconciler/wrapper-content.ts +0 -24
  374. package/src/reconciler/wrapper-node.ts +0 -8
  375. package/src/reconciler/wrapper-protocol.ts +0 -32
  376. package/src/utils/create-element-component.ts +0 -77
  377. package/src/utils/gtype.ts +0 -166
  378. package/src/utils/notify-name.ts +0 -10
  379. package/src/utils/object-prop.ts +0 -13
  380. package/src/utils/settings-accessor.ts +0 -89
  381. package/src/utils/wrapper-node-jsx.ts +0 -34
@@ -1,12 +0,0 @@
1
- import * as Gtk from "@gtkx/gi/gtk";
2
- import { scheduleContentRebuild } from "./content-rebuild.js";
3
- import type { Node } from "./state.js";
4
- import { TextBufferController } from "./text-buffer-controller.js";
5
-
6
- export const scheduleBufferRebuild = (node: Node): void => {
7
- scheduleContentRebuild(
8
- node,
9
- (candidate): candidate is Gtk.TextBuffer => candidate instanceof Gtk.TextBuffer,
10
- (owner) => new TextBufferController(owner).rebuild,
11
- );
12
- };
@@ -1,13 +0,0 @@
1
- import { hasWrapperKind, type Node } from "./state.js";
2
- import { BUFFER_TEXT_KIND, LABEL_TEXT_KIND, TEXT_ANCHOR_KIND, TEXT_PAINTABLE_KIND } from "./wrapper-protocol.js";
3
-
4
- export const isBufferTextNode = (node: Node): boolean => hasWrapperKind(node, BUFFER_TEXT_KIND);
5
-
6
- export const isPaintableNode = (node: Node): boolean => hasWrapperKind(node, TEXT_PAINTABLE_KIND);
7
-
8
- export const isAnchorNode = (node: Node): boolean => hasWrapperKind(node, TEXT_ANCHOR_KIND);
9
-
10
- export const isBufferContentNode = (node: Node): boolean =>
11
- isBufferTextNode(node) || isPaintableNode(node) || isAnchorNode(node);
12
-
13
- export const isLabelTextNode = (node: Node): boolean => hasWrapperKind(node, LABEL_TEXT_KIND);
@@ -1,6 +0,0 @@
1
- import type * as GObject from "@gtkx/gi/gobject";
2
- import type { RootElement } from "./root-element.js";
3
-
4
- export type Container = GObject.Object | RootElement;
5
-
6
- export type Props = Record<string, unknown>;
@@ -1,52 +0,0 @@
1
- import * as Gtk from "@gtkx/gi/gtk";
2
- import { scheduleLabelTextRebuild } from "./label-text-rebuild.js";
3
- import { type Node, stateOf } from "./state.js";
4
- import { scheduleBufferRebuild } from "./text-buffer-rebuild.js";
5
- import { isBufferContentNode } from "./text-node.js";
6
-
7
- const widgetOf = (node: Node): Gtk.Widget | null => {
8
- if (node instanceof Gtk.Widget) return node;
9
- const adopted = stateOf(node).adoptedInstance;
10
- return adopted instanceof Gtk.Widget ? adopted : null;
11
- };
12
-
13
- export const hideNode = (node: Node): void => {
14
- const state = stateOf(node);
15
- if (state.hidden) return;
16
- state.hidden = true;
17
- const widget = widgetOf(node);
18
- if (!widget) return;
19
- state.visibleWhenShown = widget.getVisible();
20
- widget.setVisible(false);
21
- };
22
-
23
- export const unhideNode = (node: Node): void => {
24
- const state = stateOf(node);
25
- if (!state.hidden) return;
26
- state.hidden = false;
27
- const widget = widgetOf(node);
28
- if (!widget) return;
29
- widget.setVisible(state.visibleWhenShown ?? true);
30
- state.visibleWhenShown = undefined;
31
- };
32
-
33
- export const reassertHidden = (node: Node): void => {
34
- const state = stateOf(node);
35
- if (!state.hidden) return;
36
- const widget = widgetOf(node);
37
- if (!widget?.getVisible()) return;
38
- state.visibleWhenShown = true;
39
- widget.setVisible(false);
40
- };
41
-
42
- const scheduleTextNodeRebuild = (node: Node): void => {
43
- if (isBufferContentNode(node)) scheduleBufferRebuild(node);
44
- else scheduleLabelTextRebuild(node);
45
- };
46
-
47
- export const setTextNodeHidden = (node: Node, hidden: boolean): void => {
48
- const state = stateOf(node);
49
- if ((state.hidden ?? false) === hidden) return;
50
- state.hidden = hidden;
51
- scheduleTextNodeRebuild(node);
52
- };
@@ -1,308 +0,0 @@
1
- import type { ContainerProp } from "@gtkx/config";
2
- import * as GObject from "@gtkx/gi/gobject";
3
- import * as Gtk from "@gtkx/gi/gtk";
4
- import { applyProps } from "./apply-props.js";
5
- import { attachChild, detachChild, getFocusWidget, isDescendantOf, unparentWidget } from "./container-attach.js";
6
- import {
7
- adoptContainerPropFor,
8
- type CallScope,
9
- nullSetterCurrentHolder,
10
- resolveContainerProp,
11
- runCall,
12
- runCallValue,
13
- } from "./element-props.js";
14
- import { type ElementMapping, hasWrapperKind, type Node, registeredStateOf, registerState, stateOf } from "./state.js";
15
- import type { Props } from "./types.js";
16
- import { trackedInstance, trackedWidget, wrapperChildInstances } from "./wrapper-content.js";
17
- import { CONTAINER_PROP_KIND, LAZY_ELEMENT_KIND, OBJECT_PROP_KIND } from "./wrapper-protocol.js";
18
-
19
- const attachedParent = new WeakMap<GObject.Object, GObject.Object>();
20
-
21
- const scopeFor = (child: GObject.Object, extra?: Partial<CallScope>): CallScope => ({
22
- child,
23
- props: stateOf(child).props,
24
- ...extra,
25
- });
26
-
27
- const runRemove = (parent: GObject.Object, child: GObject.Object, cp: ContainerProp): void => {
28
- if (cp.remove !== undefined) runCall(parent, cp.remove, [child], scopeFor(child));
29
- };
30
-
31
- const collectContainerSiblings = (parent: GObject.Object, cp: ContainerProp): GObject.Object[] => {
32
- const siblings: GObject.Object[] = [];
33
- for (const sibling of stateOf(parent).children) {
34
- if (!(sibling instanceof GObject.Object) || sibling instanceof Gtk.Widget) continue;
35
- if (resolveContainerProp(parent.__type__, sibling.__type__, undefined) === cp) siblings.push(sibling);
36
- }
37
- return siblings;
38
- };
39
-
40
- const insertContainerChildAt = (
41
- parent: GObject.Object,
42
- child: GObject.Object,
43
- cp: ContainerProp,
44
- index: number,
45
- ): void => {
46
- if (cp.insert !== undefined && runCall(parent, cp.insert, [child, index], scopeFor(child, { index }))) {
47
- attachedParent.set(child, parent);
48
- }
49
- };
50
-
51
- const attachContainerChild = (
52
- parent: GObject.Object,
53
- child: GObject.Object,
54
- cp: ContainerProp,
55
- anchor: GObject.Object | null | undefined,
56
- ): void => {
57
- const isMove = attachedParent.get(child) === parent;
58
- if (cp.insert !== undefined && (anchor != null || isMove)) {
59
- if (isMove) runRemove(parent, child, cp);
60
- const siblings = collectContainerSiblings(parent, cp);
61
- const index = siblings.indexOf(child);
62
- insertContainerChildAt(parent, child, cp, index);
63
- if (!isMove) {
64
- for (const trailing of siblings.slice(index + 1)) {
65
- runRemove(parent, trailing, cp);
66
- insertContainerChildAt(parent, trailing, cp, siblings.indexOf(trailing));
67
- }
68
- }
69
- return;
70
- }
71
- if (isMove) return;
72
- if (cp.append !== undefined && runCall(parent, cp.append, [child], scopeFor(child))) {
73
- attachedParent.set(child, parent);
74
- }
75
- };
76
-
77
- const detachContainerChild = (parent: GObject.Object, child: GObject.Object, cp: ContainerProp): void => {
78
- if (attachedParent.get(child) !== parent) return;
79
- const holder = cp.remove !== undefined ? nullSetterCurrentHolder(parent, cp.remove) : undefined;
80
- if (holder === undefined || holder === child) runRemove(parent, child, cp);
81
- attachedParent.delete(child);
82
- };
83
-
84
- type ContainerChildMatch = { child: GObject.Object; parent: GObject.Object; cp: ContainerProp };
85
-
86
- const resolveContainerChild = (child: Node, parent: Node): ContainerChildMatch | null => {
87
- if (!(child instanceof GObject.Object) || child instanceof Gtk.Widget) return null;
88
- if (!(parent instanceof GObject.Object)) return null;
89
- const cp = resolveContainerProp(parent.__type__, child.__type__, undefined);
90
- return cp === null ? null : { child, parent, cp };
91
- };
92
-
93
- export const containerChildMapping: ElementMapping = (child, parent) => {
94
- const match = resolveContainerChild(child, parent);
95
- if (match === null) return null;
96
- return {
97
- attach: (anchor) => attachContainerChild(match.parent, match.child, match.cp, anchor),
98
- detach: () => detachContainerChild(match.parent, match.child, match.cp),
99
- };
100
- };
101
-
102
- const attachPropChild = (parent: GObject.Object, child: GObject.Object, propName: string): void => {
103
- const cp = resolveContainerProp(parent.__type__, child.__type__, propName);
104
- if (cp !== null) attachContainerChild(parent, child, cp, null);
105
- };
106
-
107
- const detachPropChild = (parent: GObject.Object, child: GObject.Object, propName: string): void => {
108
- const cp = resolveContainerProp(parent.__type__, child.__type__, propName);
109
- if (cp !== null) detachContainerChild(parent, child, cp);
110
- };
111
-
112
- const isRooted = (instance: GObject.Object): boolean =>
113
- instance instanceof Gtk.Widget ? instance.getRoot() !== null : true;
114
-
115
- const rescueFocus = (parent: GObject.Object, child: GObject.Object | undefined): void => {
116
- if (!(parent instanceof Gtk.Widget) || !(child instanceof Gtk.Widget)) return;
117
- const focus = getFocusWidget(child);
118
- if (focus && isDescendantOf(focus, child)) parent.grabFocus();
119
- };
120
-
121
- type ObjectPropState = { prop: string; value: GObject.Object };
122
-
123
- const objectPropState = new WeakMap<Node, ObjectPropState>();
124
-
125
- export const objectPropMapping: ElementMapping = (child, parent) => {
126
- if (!hasWrapperKind(child, OBJECT_PROP_KIND) || !(parent instanceof GObject.Object)) return null;
127
- return {
128
- attach: () => {
129
- const prop = propNameOf(child);
130
- if (prop === undefined) return;
131
- const value = trackedInstance(child);
132
- const state = objectPropState.get(child);
133
- if (state && state.value === value) return;
134
- Reflect.set(parent, prop, value ?? null);
135
- if (value) objectPropState.set(child, { prop, value });
136
- else objectPropState.delete(child);
137
- },
138
- detach: () => {
139
- const state = objectPropState.get(child);
140
- objectPropState.delete(child);
141
- if (!state || !isRooted(parent)) return;
142
- rescueFocus(parent, state.value);
143
- Reflect.set(parent, state.prop, null);
144
- },
145
- };
146
- };
147
-
148
- const sameInstances = (a: Node[], b: Node[]): boolean =>
149
- a.length === b.length && a.every((instance, index) => instance === b[index]);
150
-
151
- const propNameOf = (node: Node): string | undefined => {
152
- const propName = stateOf(node).props.propName;
153
- return typeof propName === "string" ? propName : undefined;
154
- };
155
-
156
- const containerPropState = new WeakMap<Node, GObject.Object[]>();
157
-
158
- const detachContainerPropChild = (instance: GObject.Object, parent: GObject.Object, propName: string): void => {
159
- detachPropChild(parent, instance, propName);
160
- if (instance instanceof Gtk.Widget && instance.getParent() !== null) unparentWidget(instance);
161
- };
162
-
163
- export const containerPropMapping: ElementMapping = (child, parent) => {
164
- if (!hasWrapperKind(child, CONTAINER_PROP_KIND) || !(parent instanceof GObject.Object)) return null;
165
- return {
166
- attach: () => {
167
- const propName = propNameOf(child);
168
- if (propName === undefined) return;
169
- const desired = wrapperChildInstances(child);
170
- const prev = containerPropState.get(child) ?? [];
171
- if (sameInstances(prev, desired)) return;
172
- for (const instance of prev) detachContainerPropChild(instance, parent, propName);
173
- for (const instance of desired) attachPropChild(parent, instance, propName);
174
- containerPropState.set(child, desired);
175
- },
176
- detach: () => {
177
- const propName = propNameOf(child);
178
- const instances = containerPropState.get(child) ?? [];
179
- containerPropState.delete(child);
180
- if (propName === undefined) return;
181
- for (const instance of instances) detachContainerPropChild(instance, parent, propName);
182
- },
183
- };
184
- };
185
-
186
- type LazyState = { content: Gtk.Widget | null; instance: GObject.Object | null; appliedProps: Props; ordinal: number };
187
-
188
- const lazyState = new WeakMap<Node, LazyState>();
189
-
190
- const freshLazyState = (): LazyState => ({ content: null, instance: null, appliedProps: {}, ordinal: -1 });
191
-
192
- const RESERVED_LAZY_PROPS = new Set(["children", "ref", "key", "kind"]);
193
-
194
- const lazyPropsOf = (nodeProps: Props): Props => {
195
- const built: Props = {};
196
- for (const [name, value] of Object.entries(nodeProps)) {
197
- if (RESERVED_LAZY_PROPS.has(name)) continue;
198
- built[name] = value;
199
- }
200
- return built;
201
- };
202
-
203
- const lazyOrdinal = (parent: Node, node: Node): number => {
204
- let ordinal = 0;
205
- for (const sibling of stateOf(parent).children) {
206
- if (sibling === node) return ordinal;
207
- if (hasWrapperKind(sibling, LAZY_ELEMENT_KIND)) ordinal++;
208
- }
209
- return ordinal;
210
- };
211
-
212
- const appendLazyContent = (
213
- parent: GObject.Object,
214
- cp: ContainerProp,
215
- node: Node,
216
- content: Gtk.Widget,
217
- ): GObject.Object | undefined => {
218
- let appended: unknown;
219
- if (cp.insert !== undefined) {
220
- const ordinal = lazyOrdinal(parent, node);
221
- appended = runCallValue(parent, cp.insert, [content, ordinal], {
222
- child: content,
223
- index: ordinal,
224
- props: stateOf(node).props,
225
- }).value;
226
- } else if (cp.append !== undefined) {
227
- appended = runCallValue(parent, cp.append, [content], { child: content, props: stateOf(node).props }).value;
228
- } else {
229
- attachChild(content, parent);
230
- }
231
- const accessor = typeof cp.adopt === "string" ? cp.adopt : undefined;
232
- const acquired =
233
- accessor !== undefined ? runCallValue(parent, accessor, [content], { child: content }).value : appended;
234
- return acquired instanceof GObject.Object ? acquired : undefined;
235
- };
236
-
237
- const applyAdoptedProps = (state: LazyState, node: Node): void => {
238
- if (state.instance === null) return;
239
- const built = lazyPropsOf(stateOf(node).props);
240
- applyProps(state.instance, state.appliedProps, built, {});
241
- state.appliedProps = built;
242
- };
243
-
244
- const releaseLazyContent = (node: Node, state: LazyState, parent: GObject.Object, cp: ContainerProp): void => {
245
- const { content, instance } = state;
246
- if (instance !== null) {
247
- registeredStateOf(instance)?.signalStore.clear(instance);
248
- stateOf(node).adoptedInstance = undefined;
249
- }
250
- state.instance = null;
251
- state.appliedProps = {};
252
- if (content !== null) {
253
- if (cp.remove !== undefined) {
254
- const stillInside =
255
- !(parent instanceof Gtk.Widget) || (content.getParent() !== null && isDescendantOf(content, parent));
256
- if (stillInside) runCall(parent, cp.remove, [content], { child: content, adopted: instance ?? undefined });
257
- } else {
258
- detachChild(content, parent);
259
- }
260
- }
261
- state.content = null;
262
- };
263
-
264
- const syncLazyElement = (parent: GObject.Object, cp: ContainerProp, node: Node): void => {
265
- const state = lazyState.get(node) ?? freshLazyState();
266
- lazyState.set(node, state);
267
- const content = trackedWidget(node);
268
- if (state.content !== null && state.content !== content) releaseLazyContent(node, state, parent, cp);
269
- if (content === null) return;
270
- if (state.instance === null) {
271
- const instance = appendLazyContent(parent, cp, node, content);
272
- state.content = content;
273
- state.ordinal = lazyOrdinal(parent, node);
274
- if (instance !== undefined) {
275
- state.instance = instance;
276
- stateOf(node).adoptedInstance = instance;
277
- if (!registeredStateOf(instance)) {
278
- registerState(instance, { props: {}, rootContainer: stateOf(node).rootContainer });
279
- }
280
- }
281
- } else if (cp.reorder !== undefined) {
282
- const ordinal = lazyOrdinal(parent, node);
283
- if (ordinal !== state.ordinal) {
284
- runCall(parent, cp.reorder, [content, ordinal], {
285
- child: content,
286
- index: ordinal,
287
- adopted: state.instance ?? undefined,
288
- });
289
- state.ordinal = ordinal;
290
- }
291
- }
292
- applyAdoptedProps(state, node);
293
- };
294
-
295
- export const lazyElementMapping: ElementMapping = (child, parent) => {
296
- if (!hasWrapperKind(child, LAZY_ELEMENT_KIND) || !(parent instanceof GObject.Object)) return null;
297
- const cp = adoptContainerPropFor(parent.__type__);
298
- if (cp === null) return null;
299
- return {
300
- attach: () => syncLazyElement(parent, cp, child),
301
- detach: () => {
302
- const state = lazyState.get(child);
303
- lazyState.delete(child);
304
- if (!state) return;
305
- releaseLazyContent(child, state, parent, cp);
306
- },
307
- };
308
- };
@@ -1,24 +0,0 @@
1
- import * as GObject from "@gtkx/gi/gobject";
2
- import * as Gtk from "@gtkx/gi/gtk";
3
- import { type Node, stateOf } from "./state.js";
4
- import { isWrapperNode } from "./wrapper-node.js";
5
-
6
- export const childWidget = (instance: Node): Gtk.Widget | null => (instance instanceof Gtk.Widget ? instance : null);
7
-
8
- const trackedChild = (node: Node): Node | null => {
9
- const { children } = stateOf(node);
10
- return children.find((child) => !isWrapperNode(child)) ?? children[0] ?? null;
11
- };
12
-
13
- export const trackedWidget = (node: Node): Gtk.Widget | null => {
14
- const child = trackedChild(node);
15
- return child instanceof Gtk.Widget ? child : null;
16
- };
17
-
18
- export const trackedInstance = (node: Node): GObject.Object | undefined => {
19
- const child = trackedChild(node);
20
- return child instanceof GObject.Object ? child : undefined;
21
- };
22
-
23
- export const wrapperChildInstances = (node: Node): GObject.Object[] =>
24
- stateOf(node).children.filter((child): child is GObject.Object => child instanceof GObject.Object);
@@ -1,8 +0,0 @@
1
- const WRAPPER_NODE: unique symbol = Symbol.for("gtkx.wrapperNode");
2
-
3
- export type WrapperNode = { [WRAPPER_NODE]: true };
4
-
5
- export const createWrapperNode = (): WrapperNode => ({ [WRAPPER_NODE]: true });
6
-
7
- export const isWrapperNode = (value: unknown): value is WrapperNode =>
8
- typeof value === "object" && value !== null && WRAPPER_NODE in value;
@@ -1,32 +0,0 @@
1
- export const WRAPPER_NODE_ELEMENT = "__GTKX_WRAPPER_NODE__";
2
-
3
- const WRAPPER_KINDS = [
4
- "lazy-element",
5
- "object-prop",
6
- "container-prop",
7
- "text-anchor",
8
- "text-paintable",
9
- "buffer-text",
10
- "label-text",
11
- ] as const;
12
-
13
- export type WrapperKind = (typeof WRAPPER_KINDS)[number];
14
-
15
- const WRAPPER_KIND_SET: Set<string> = new Set(WRAPPER_KINDS);
16
-
17
- export const isWrapperKind = (value: unknown): value is WrapperKind =>
18
- typeof value === "string" && WRAPPER_KIND_SET.has(value);
19
-
20
- export const LAZY_ELEMENT_KIND: WrapperKind = "lazy-element";
21
-
22
- export const OBJECT_PROP_KIND: WrapperKind = "object-prop";
23
-
24
- export const CONTAINER_PROP_KIND: WrapperKind = "container-prop";
25
-
26
- export const TEXT_ANCHOR_KIND: WrapperKind = "text-anchor";
27
-
28
- export const TEXT_PAINTABLE_KIND: WrapperKind = "text-paintable";
29
-
30
- export const BUFFER_TEXT_KIND: WrapperKind = "buffer-text";
31
-
32
- export const LABEL_TEXT_KIND: WrapperKind = "label-text";
@@ -1,77 +0,0 @@
1
- import { createElement, isValidElement, type ReactNode } from "react";
2
- import { containerPropNamesFor } from "../reconciler/element-props.js";
3
- import {
4
- CONTAINER_PROP_KIND,
5
- LAZY_ELEMENT_KIND,
6
- OBJECT_PROP_KIND,
7
- WRAPPER_NODE_ELEMENT,
8
- } from "../reconciler/wrapper-protocol.js";
9
-
10
- const needsSplit = (props: object, containerPropNames: Set<string>): boolean => {
11
- for (const [name, value] of Object.entries(props)) {
12
- if (name === "children") continue;
13
- if (containerPropNames.has(name)) return true;
14
- if (isValidElement(value)) return true;
15
- }
16
- return false;
17
- };
18
-
19
- type SplitProps = {
20
- rest: Record<string, unknown>;
21
- wrappers: ReactNode[];
22
- children: ReactNode;
23
- };
24
-
25
- const splitProps = (props: object, containerPropNames: Set<string>): SplitProps => {
26
- const rest: Record<string, unknown> = {};
27
- const wrappers: ReactNode[] = [];
28
- let children: ReactNode = null;
29
- for (const [name, value] of Object.entries(props)) {
30
- if (name === "children") {
31
- children = value as ReactNode;
32
- continue;
33
- }
34
- if (containerPropNames.has(name)) {
35
- if (value != null) {
36
- wrappers.push(
37
- createElement(
38
- WRAPPER_NODE_ELEMENT,
39
- { kind: CONTAINER_PROP_KIND, propName: name, key: `container-prop:${name}` },
40
- value as ReactNode,
41
- ),
42
- );
43
- }
44
- continue;
45
- }
46
- if (isValidElement(value)) {
47
- wrappers.push(
48
- createElement(
49
- WRAPPER_NODE_ELEMENT,
50
- { kind: OBJECT_PROP_KIND, propName: name, key: `object-prop:${name}` },
51
- value as ReactNode,
52
- ),
53
- );
54
- continue;
55
- }
56
- rest[name] = value;
57
- }
58
- return { rest, wrappers, children };
59
- };
60
-
61
- export const createElementComponent = <P extends object>(elementName: string): ((props: P) => ReactNode) => {
62
- const containerPropNames = containerPropNamesFor(elementName);
63
- return (props: P): ReactNode => {
64
- if (!needsSplit(props, containerPropNames)) return createElement(elementName, props);
65
- const { rest, wrappers, children } = splitProps(props, containerPropNames);
66
- return createElement(elementName, rest, children, ...wrappers);
67
- };
68
- };
69
-
70
- const NO_CONTAINER_PROPS: Set<string> = new Set();
71
-
72
- export const createLazyElementComponent = <P extends object>(): ((props: P) => ReactNode) => {
73
- return (props: P): ReactNode => {
74
- const { rest, wrappers, children } = splitProps(props, NO_CONTAINER_PROPS);
75
- return createElement(WRAPPER_NODE_ELEMENT, { kind: LAZY_ELEMENT_KIND, ...rest }, children, ...wrappers);
76
- };
77
- };