@gtkx/react 0.21.0 → 1.0.0-rc.1

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 (636) hide show
  1. package/README.md +137 -34
  2. package/dist/components/application.d.ts +10 -0
  3. package/dist/components/application.d.ts.map +1 -0
  4. package/dist/components/application.js +26 -0
  5. package/dist/components/application.js.map +1 -0
  6. package/dist/components/window.d.ts +8 -0
  7. package/dist/components/window.d.ts.map +1 -0
  8. package/dist/components/window.js +23 -0
  9. package/dist/components/window.js.map +1 -0
  10. package/dist/hooks/use-application.d.ts +8 -0
  11. package/dist/hooks/use-application.d.ts.map +1 -0
  12. package/dist/hooks/use-application.js +13 -0
  13. package/dist/hooks/use-application.js.map +1 -0
  14. package/dist/hooks/use-bind-setting.d.ts +6 -0
  15. package/dist/hooks/use-bind-setting.d.ts.map +1 -0
  16. package/dist/hooks/use-bind-setting.js +19 -0
  17. package/dist/hooks/use-bind-setting.js.map +1 -0
  18. package/dist/hooks/use-merge-refs.d.ts +3 -0
  19. package/dist/hooks/use-merge-refs.d.ts.map +1 -0
  20. package/dist/hooks/use-merge-refs.js +48 -0
  21. package/dist/hooks/use-merge-refs.js.map +1 -0
  22. package/dist/hooks/use-object-attachment.d.ts +10 -0
  23. package/dist/hooks/use-object-attachment.d.ts.map +1 -0
  24. package/dist/hooks/use-object-attachment.js +24 -0
  25. package/dist/hooks/use-object-attachment.js.map +1 -0
  26. package/dist/hooks/use-object-value.d.ts +4 -0
  27. package/dist/hooks/use-object-value.d.ts.map +1 -0
  28. package/dist/hooks/use-object-value.js +32 -0
  29. package/dist/hooks/use-object-value.js.map +1 -0
  30. package/dist/hooks/use-parent-window.d.ts +8 -0
  31. package/dist/hooks/use-parent-window.d.ts.map +1 -0
  32. package/dist/hooks/use-parent-window.js +7 -0
  33. package/dist/hooks/use-parent-window.js.map +1 -0
  34. package/dist/hooks/use-property.d.ts +14 -0
  35. package/dist/hooks/use-property.d.ts.map +1 -0
  36. package/dist/hooks/use-property.js +13 -0
  37. package/dist/hooks/use-property.js.map +1 -0
  38. package/dist/hooks/use-setting.d.ts +25 -0
  39. package/dist/hooks/use-setting.d.ts.map +1 -0
  40. package/dist/hooks/use-setting.js +15 -0
  41. package/dist/hooks/use-setting.js.map +1 -0
  42. package/dist/hooks/use-signal.d.ts +21 -0
  43. package/dist/hooks/use-signal.d.ts.map +1 -0
  44. package/dist/hooks/use-signal.js +20 -0
  45. package/dist/hooks/use-signal.js.map +1 -0
  46. package/dist/index.d.ts +14 -7
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +10 -7
  49. package/dist/index.js.map +1 -1
  50. package/dist/internal.d.ts +14 -0
  51. package/dist/internal.d.ts.map +1 -0
  52. package/dist/internal.js +14 -0
  53. package/dist/internal.js.map +1 -0
  54. package/dist/libraries/adw/dialog.d.ts +8 -0
  55. package/dist/libraries/adw/dialog.d.ts.map +1 -0
  56. package/dist/libraries/adw/dialog.js +25 -0
  57. package/dist/libraries/adw/dialog.js.map +1 -0
  58. package/dist/libraries/adw/index.d.ts +2 -0
  59. package/dist/libraries/adw/index.d.ts.map +1 -0
  60. package/dist/libraries/adw/index.js +2 -0
  61. package/dist/libraries/adw/index.js.map +1 -0
  62. package/dist/reconciler/accessible.d.ts +59 -0
  63. package/dist/reconciler/accessible.d.ts.map +1 -0
  64. package/dist/reconciler/accessible.js +143 -0
  65. package/dist/reconciler/accessible.js.map +1 -0
  66. package/dist/reconciler/apply-props.d.ts +8 -0
  67. package/dist/reconciler/apply-props.d.ts.map +1 -0
  68. package/dist/reconciler/apply-props.js +92 -0
  69. package/dist/reconciler/apply-props.js.map +1 -0
  70. package/dist/reconciler/commit-flush.d.ts +3 -0
  71. package/dist/reconciler/commit-flush.d.ts.map +1 -0
  72. package/dist/reconciler/commit-flush.js +13 -0
  73. package/dist/reconciler/commit-flush.js.map +1 -0
  74. package/dist/reconciler/container-attach.d.ts +10 -0
  75. package/dist/reconciler/container-attach.d.ts.map +1 -0
  76. package/dist/reconciler/container-attach.js +216 -0
  77. package/dist/reconciler/container-attach.js.map +1 -0
  78. package/dist/reconciler/content-rebuild.d.ts +3 -0
  79. package/dist/reconciler/content-rebuild.d.ts.map +1 -0
  80. package/dist/reconciler/content-rebuild.js +15 -0
  81. package/dist/reconciler/content-rebuild.js.map +1 -0
  82. package/dist/reconciler/dispatch.d.ts +6 -0
  83. package/dist/reconciler/dispatch.d.ts.map +1 -0
  84. package/dist/reconciler/dispatch.js +61 -0
  85. package/dist/reconciler/dispatch.js.map +1 -0
  86. package/dist/reconciler/element-prop-appliers.d.ts +5 -0
  87. package/dist/reconciler/element-prop-appliers.d.ts.map +1 -0
  88. package/dist/reconciler/element-prop-appliers.js +104 -0
  89. package/dist/reconciler/element-prop-appliers.js.map +1 -0
  90. package/dist/reconciler/element-props.d.ts +25 -0
  91. package/dist/reconciler/element-props.d.ts.map +1 -0
  92. package/dist/reconciler/element-props.js +157 -0
  93. package/dist/reconciler/element-props.js.map +1 -0
  94. package/dist/reconciler/host-config.d.ts +13 -0
  95. package/dist/reconciler/host-config.d.ts.map +1 -0
  96. package/dist/reconciler/host-config.js +309 -0
  97. package/dist/reconciler/host-config.js.map +1 -0
  98. package/dist/reconciler/instance.d.ts +6 -0
  99. package/dist/reconciler/instance.d.ts.map +1 -0
  100. package/dist/reconciler/instance.js +27 -0
  101. package/dist/reconciler/instance.js.map +1 -0
  102. package/dist/reconciler/label-text-rebuild.d.ts +3 -0
  103. package/dist/reconciler/label-text-rebuild.d.ts.map +1 -0
  104. package/dist/reconciler/label-text-rebuild.js +22 -0
  105. package/dist/reconciler/label-text-rebuild.js.map +1 -0
  106. package/dist/reconciler/portal.d.ts +11 -0
  107. package/dist/reconciler/portal.d.ts.map +1 -0
  108. package/dist/reconciler/portal.js +20 -0
  109. package/dist/reconciler/portal.js.map +1 -0
  110. package/dist/reconciler/reconciler-error-handler.d.ts +7 -0
  111. package/dist/reconciler/reconciler-error-handler.d.ts.map +1 -0
  112. package/dist/reconciler/reconciler-error-handler.js +24 -0
  113. package/dist/reconciler/reconciler-error-handler.js.map +1 -0
  114. package/dist/reconciler/reconciler-root.d.ts +19 -0
  115. package/dist/reconciler/reconciler-root.d.ts.map +1 -0
  116. package/dist/reconciler/reconciler-root.js +24 -0
  117. package/dist/reconciler/reconciler-root.js.map +1 -0
  118. package/dist/reconciler/reconciler.d.ts +3 -0
  119. package/dist/reconciler/reconciler.d.ts.map +1 -0
  120. package/dist/reconciler/reconciler.js +12 -0
  121. package/dist/reconciler/reconciler.js.map +1 -0
  122. package/dist/reconciler/render.d.ts +23 -0
  123. package/dist/reconciler/render.d.ts.map +1 -0
  124. package/dist/reconciler/render.js +46 -0
  125. package/dist/reconciler/render.js.map +1 -0
  126. package/dist/reconciler/root-element.d.ts +14 -0
  127. package/dist/reconciler/root-element.d.ts.map +1 -0
  128. package/dist/reconciler/root-element.js +7 -0
  129. package/dist/reconciler/root-element.js.map +1 -0
  130. package/dist/reconciler/signal-store.d.ts +22 -0
  131. package/dist/reconciler/signal-store.d.ts.map +1 -0
  132. package/dist/reconciler/signal-store.js +84 -0
  133. package/dist/reconciler/signal-store.js.map +1 -0
  134. package/dist/reconciler/state.d.ts +36 -0
  135. package/dist/reconciler/state.d.ts.map +1 -0
  136. package/dist/reconciler/state.js +38 -0
  137. package/dist/reconciler/state.js.map +1 -0
  138. package/dist/reconciler/text-buffer-controller.d.ts +17 -0
  139. package/dist/reconciler/text-buffer-controller.d.ts.map +1 -0
  140. package/dist/reconciler/text-buffer-controller.js +102 -0
  141. package/dist/reconciler/text-buffer-controller.js.map +1 -0
  142. package/dist/reconciler/text-buffer-rebuild.d.ts +3 -0
  143. package/dist/reconciler/text-buffer-rebuild.d.ts.map +1 -0
  144. package/dist/reconciler/text-buffer-rebuild.js +7 -0
  145. package/dist/reconciler/text-buffer-rebuild.js.map +1 -0
  146. package/dist/reconciler/text-node.d.ts +7 -0
  147. package/dist/reconciler/text-node.d.ts.map +1 -0
  148. package/dist/reconciler/text-node.js +8 -0
  149. package/dist/reconciler/text-node.js.map +1 -0
  150. package/dist/reconciler/types.d.ts +5 -0
  151. package/dist/reconciler/types.d.ts.map +1 -0
  152. package/dist/reconciler/types.js.map +1 -0
  153. package/dist/reconciler/visibility.d.ts +6 -0
  154. package/dist/reconciler/visibility.d.ts.map +1 -0
  155. package/dist/reconciler/visibility.js +57 -0
  156. package/dist/reconciler/visibility.js.map +1 -0
  157. package/dist/reconciler/wrapper-apply.d.ts +6 -0
  158. package/dist/reconciler/wrapper-apply.d.ts.map +1 -0
  159. package/dist/reconciler/wrapper-apply.js +287 -0
  160. package/dist/reconciler/wrapper-apply.js.map +1 -0
  161. package/dist/reconciler/wrapper-content.d.ts +8 -0
  162. package/dist/reconciler/wrapper-content.d.ts.map +1 -0
  163. package/dist/reconciler/wrapper-content.js +19 -0
  164. package/dist/reconciler/wrapper-content.js.map +1 -0
  165. package/dist/reconciler/wrapper-node.d.ts +8 -0
  166. package/dist/reconciler/wrapper-node.d.ts.map +1 -0
  167. package/dist/reconciler/wrapper-node.js +4 -0
  168. package/dist/reconciler/wrapper-node.js.map +1 -0
  169. package/dist/reconciler/wrapper-protocol.d.ts +13 -0
  170. package/dist/reconciler/wrapper-protocol.d.ts.map +1 -0
  171. package/dist/reconciler/wrapper-protocol.js +20 -0
  172. package/dist/reconciler/wrapper-protocol.js.map +1 -0
  173. package/dist/utils/accessible-metadata.d.ts +5 -0
  174. package/dist/utils/accessible-metadata.d.ts.map +1 -0
  175. package/dist/utils/accessible-metadata.js +22 -0
  176. package/dist/utils/accessible-metadata.js.map +1 -0
  177. package/dist/utils/create-element-component.d.ts +4 -0
  178. package/dist/utils/create-element-component.d.ts.map +1 -0
  179. package/dist/utils/create-element-component.js +54 -0
  180. package/dist/utils/create-element-component.js.map +1 -0
  181. package/dist/utils/gtype.d.ts +16 -0
  182. package/dist/utils/gtype.d.ts.map +1 -0
  183. package/dist/utils/gtype.js +127 -0
  184. package/dist/utils/gtype.js.map +1 -0
  185. package/dist/utils/notify-name.d.ts +5 -0
  186. package/dist/utils/notify-name.d.ts.map +1 -0
  187. package/dist/utils/notify-name.js +6 -0
  188. package/dist/utils/notify-name.js.map +1 -0
  189. package/dist/utils/object-prop.d.ts +8 -0
  190. package/dist/utils/object-prop.d.ts.map +1 -0
  191. package/dist/utils/object-prop.js +9 -0
  192. package/dist/utils/object-prop.js.map +1 -0
  193. package/dist/utils/settings-accessor.d.ts +8 -0
  194. package/dist/utils/settings-accessor.d.ts.map +1 -0
  195. package/dist/utils/settings-accessor.js +69 -0
  196. package/dist/utils/settings-accessor.js.map +1 -0
  197. package/dist/utils/wrapper-node-jsx.d.ts +32 -0
  198. package/dist/utils/wrapper-node-jsx.d.ts.map +1 -0
  199. package/dist/utils/wrapper-node-jsx.js +2 -0
  200. package/dist/utils/wrapper-node-jsx.js.map +1 -0
  201. package/package.json +22 -8
  202. package/src/components/application.tsx +43 -0
  203. package/src/components/window.tsx +36 -0
  204. package/src/hooks/use-application.ts +17 -0
  205. package/src/hooks/use-bind-setting.ts +35 -0
  206. package/src/hooks/use-merge-refs.ts +53 -0
  207. package/src/hooks/use-object-attachment.ts +35 -0
  208. package/src/hooks/use-object-value.ts +50 -0
  209. package/src/hooks/use-parent-window.ts +9 -0
  210. package/src/hooks/use-property.ts +22 -0
  211. package/src/hooks/use-setting.ts +47 -0
  212. package/src/hooks/use-signal.ts +71 -0
  213. package/src/index.ts +15 -14
  214. package/src/internal.ts +24 -0
  215. package/src/libraries/adw/dialog.tsx +34 -0
  216. package/src/libraries/adw/index.ts +1 -0
  217. package/src/reconciler/accessible.ts +232 -0
  218. package/src/reconciler/apply-props.ts +117 -0
  219. package/src/reconciler/commit-flush.ts +13 -0
  220. package/src/reconciler/container-attach.ts +219 -0
  221. package/src/reconciler/content-rebuild.ts +19 -0
  222. package/src/reconciler/dispatch.ts +58 -0
  223. package/src/reconciler/element-prop-appliers.ts +110 -0
  224. package/src/reconciler/element-props.ts +192 -0
  225. package/src/reconciler/host-config.ts +405 -0
  226. package/src/reconciler/instance.ts +30 -0
  227. package/src/reconciler/label-text-rebuild.ts +26 -0
  228. package/src/reconciler/portal.ts +28 -0
  229. package/src/reconciler/reconciler-error-handler.ts +29 -0
  230. package/src/reconciler/reconciler-root.ts +57 -0
  231. package/src/reconciler/reconciler.ts +13 -0
  232. package/src/reconciler/render.ts +61 -0
  233. package/src/reconciler/root-element.ts +14 -0
  234. package/src/reconciler/signal-store.ts +103 -0
  235. package/src/reconciler/state.ts +72 -0
  236. package/src/reconciler/text-buffer-controller.ts +107 -0
  237. package/src/reconciler/text-buffer-rebuild.ts +12 -0
  238. package/src/reconciler/text-node.ts +13 -0
  239. package/src/reconciler/types.ts +6 -0
  240. package/src/reconciler/visibility.ts +52 -0
  241. package/src/reconciler/wrapper-apply.ts +308 -0
  242. package/src/reconciler/wrapper-content.ts +24 -0
  243. package/src/reconciler/wrapper-node.ts +8 -0
  244. package/src/reconciler/wrapper-protocol.ts +32 -0
  245. package/src/utils/accessible-metadata.ts +26 -0
  246. package/src/utils/create-element-component.ts +77 -0
  247. package/src/utils/gtype.ts +166 -0
  248. package/src/utils/notify-name.ts +10 -0
  249. package/src/utils/object-prop.ts +13 -0
  250. package/src/utils/settings-accessor.ts +89 -0
  251. package/src/utils/wrapper-node-jsx.ts +34 -0
  252. package/dist/components/compound.d.ts +0 -40
  253. package/dist/components/compound.d.ts.map +0 -1
  254. package/dist/components/compound.js +0 -46
  255. package/dist/components/compound.js.map +0 -1
  256. package/dist/components/list.d.ts +0 -75
  257. package/dist/components/list.d.ts.map +0 -1
  258. package/dist/components/list.js +0 -81
  259. package/dist/components/list.js.map +0 -1
  260. package/dist/components/slot-widget.d.ts +0 -15
  261. package/dist/components/slot-widget.d.ts.map +0 -1
  262. package/dist/components/slot-widget.js +0 -37
  263. package/dist/components/slot-widget.js.map +0 -1
  264. package/dist/errors.d.ts +0 -15
  265. package/dist/errors.d.ts.map +0 -1
  266. package/dist/errors.js +0 -44
  267. package/dist/errors.js.map +0 -1
  268. package/dist/factory.d.ts +0 -5
  269. package/dist/factory.d.ts.map +0 -1
  270. package/dist/factory.js +0 -37
  271. package/dist/factory.js.map +0 -1
  272. package/dist/generated/compounds.d.ts +0 -2672
  273. package/dist/generated/compounds.d.ts.map +0 -1
  274. package/dist/generated/compounds.js +0 -2624
  275. package/dist/generated/compounds.js.map +0 -1
  276. package/dist/generated/internal.d.ts +0 -16
  277. package/dist/generated/internal.d.ts.map +0 -1
  278. package/dist/generated/internal.js +0 -3638
  279. package/dist/generated/internal.js.map +0 -1
  280. package/dist/generated/jsx.d.ts +0 -17074
  281. package/dist/generated/jsx.d.ts.map +0 -1
  282. package/dist/generated/jsx.js +0 -6715
  283. package/dist/generated/jsx.js.map +0 -1
  284. package/dist/generated/registry.d.ts +0 -5
  285. package/dist/generated/registry.d.ts.map +0 -1
  286. package/dist/generated/registry.js +0 -13
  287. package/dist/generated/registry.js.map +0 -1
  288. package/dist/host-config.d.ts +0 -24
  289. package/dist/host-config.d.ts.map +0 -1
  290. package/dist/host-config.js +0 -172
  291. package/dist/host-config.js.map +0 -1
  292. package/dist/jsx.d.ts +0 -974
  293. package/dist/jsx.d.ts.map +0 -1
  294. package/dist/jsx.js +0 -8
  295. package/dist/jsx.js.map +0 -1
  296. package/dist/metadata.d.ts +0 -5
  297. package/dist/metadata.d.ts.map +0 -1
  298. package/dist/metadata.js +0 -33
  299. package/dist/metadata.js.map +0 -1
  300. package/dist/node.d.ts +0 -25
  301. package/dist/node.d.ts.map +0 -1
  302. package/dist/node.js +0 -85
  303. package/dist/node.js.map +0 -1
  304. package/dist/nodes/adjustable.d.ts +0 -11
  305. package/dist/nodes/adjustable.d.ts.map +0 -1
  306. package/dist/nodes/adjustable.js +0 -46
  307. package/dist/nodes/adjustable.js.map +0 -1
  308. package/dist/nodes/alert-dialog-response.d.ts +0 -15
  309. package/dist/nodes/alert-dialog-response.d.ts.map +0 -1
  310. package/dist/nodes/alert-dialog-response.js +0 -61
  311. package/dist/nodes/alert-dialog-response.js.map +0 -1
  312. package/dist/nodes/alert-dialog.d.ts +0 -14
  313. package/dist/nodes/alert-dialog.d.ts.map +0 -1
  314. package/dist/nodes/alert-dialog.js +0 -41
  315. package/dist/nodes/alert-dialog.js.map +0 -1
  316. package/dist/nodes/animation.d.ts +0 -39
  317. package/dist/nodes/animation.d.ts.map +0 -1
  318. package/dist/nodes/animation.js +0 -326
  319. package/dist/nodes/animation.js.map +0 -1
  320. package/dist/nodes/application.d.ts +0 -12
  321. package/dist/nodes/application.d.ts.map +0 -1
  322. package/dist/nodes/application.js +0 -51
  323. package/dist/nodes/application.js.map +0 -1
  324. package/dist/nodes/calendar.d.ts +0 -18
  325. package/dist/nodes/calendar.d.ts.map +0 -1
  326. package/dist/nodes/calendar.js +0 -28
  327. package/dist/nodes/calendar.js.map +0 -1
  328. package/dist/nodes/color-dialog-button.d.ts +0 -15
  329. package/dist/nodes/color-dialog-button.d.ts.map +0 -1
  330. package/dist/nodes/color-dialog-button.js +0 -43
  331. package/dist/nodes/color-dialog-button.js.map +0 -1
  332. package/dist/nodes/column-view-column.d.ts +0 -36
  333. package/dist/nodes/column-view-column.d.ts.map +0 -1
  334. package/dist/nodes/column-view-column.js +0 -168
  335. package/dist/nodes/column-view-column.js.map +0 -1
  336. package/dist/nodes/container-slot.d.ts +0 -18
  337. package/dist/nodes/container-slot.d.ts.map +0 -1
  338. package/dist/nodes/container-slot.js +0 -81
  339. package/dist/nodes/container-slot.js.map +0 -1
  340. package/dist/nodes/dialog.d.ts +0 -10
  341. package/dist/nodes/dialog.d.ts.map +0 -1
  342. package/dist/nodes/dialog.js +0 -20
  343. package/dist/nodes/dialog.js.map +0 -1
  344. package/dist/nodes/drawing-area.d.ts +0 -19
  345. package/dist/nodes/drawing-area.d.ts.map +0 -1
  346. package/dist/nodes/drawing-area.js +0 -40
  347. package/dist/nodes/drawing-area.js.map +0 -1
  348. package/dist/nodes/event-controller.d.ts +0 -15
  349. package/dist/nodes/event-controller.d.ts.map +0 -1
  350. package/dist/nodes/event-controller.js +0 -73
  351. package/dist/nodes/event-controller.js.map +0 -1
  352. package/dist/nodes/fixed-child.d.ts +0 -19
  353. package/dist/nodes/fixed-child.d.ts.map +0 -1
  354. package/dist/nodes/fixed-child.js +0 -99
  355. package/dist/nodes/fixed-child.js.map +0 -1
  356. package/dist/nodes/font-dialog-button.d.ts +0 -15
  357. package/dist/nodes/font-dialog-button.d.ts.map +0 -1
  358. package/dist/nodes/font-dialog-button.js +0 -76
  359. package/dist/nodes/font-dialog-button.js.map +0 -1
  360. package/dist/nodes/grid-child.d.ts +0 -19
  361. package/dist/nodes/grid-child.d.ts.map +0 -1
  362. package/dist/nodes/grid-child.js +0 -94
  363. package/dist/nodes/grid-child.js.map +0 -1
  364. package/dist/nodes/internal/accessible.d.ts +0 -5
  365. package/dist/nodes/internal/accessible.d.ts.map +0 -1
  366. package/dist/nodes/internal/accessible.js +0 -119
  367. package/dist/nodes/internal/accessible.js.map +0 -1
  368. package/dist/nodes/internal/bound-item.d.ts +0 -4
  369. package/dist/nodes/internal/bound-item.d.ts.map +0 -1
  370. package/dist/nodes/internal/bound-item.js +0 -2
  371. package/dist/nodes/internal/bound-item.js.map +0 -1
  372. package/dist/nodes/internal/construct.d.ts +0 -3
  373. package/dist/nodes/internal/construct.d.ts.map +0 -1
  374. package/dist/nodes/internal/construct.js +0 -44
  375. package/dist/nodes/internal/construct.js.map +0 -1
  376. package/dist/nodes/internal/predicates.d.ts +0 -51
  377. package/dist/nodes/internal/predicates.d.ts.map +0 -1
  378. package/dist/nodes/internal/predicates.js +0 -36
  379. package/dist/nodes/internal/predicates.js.map +0 -1
  380. package/dist/nodes/internal/props.d.ts +0 -6
  381. package/dist/nodes/internal/props.d.ts.map +0 -1
  382. package/dist/nodes/internal/props.js +0 -43
  383. package/dist/nodes/internal/props.js.map +0 -1
  384. package/dist/nodes/internal/signal-store.d.ts +0 -22
  385. package/dist/nodes/internal/signal-store.d.ts.map +0 -1
  386. package/dist/nodes/internal/signal-store.js +0 -98
  387. package/dist/nodes/internal/signal-store.js.map +0 -1
  388. package/dist/nodes/internal/text-buffer-controller.d.ts +0 -40
  389. package/dist/nodes/internal/text-buffer-controller.d.ts.map +0 -1
  390. package/dist/nodes/internal/text-buffer-controller.js +0 -327
  391. package/dist/nodes/internal/text-buffer-controller.js.map +0 -1
  392. package/dist/nodes/internal/widget.d.ts +0 -8
  393. package/dist/nodes/internal/widget.d.ts.map +0 -1
  394. package/dist/nodes/internal/widget.js +0 -68
  395. package/dist/nodes/internal/widget.js.map +0 -1
  396. package/dist/nodes/level-bar.d.ts +0 -12
  397. package/dist/nodes/level-bar.d.ts.map +0 -1
  398. package/dist/nodes/level-bar.js +0 -24
  399. package/dist/nodes/level-bar.js.map +0 -1
  400. package/dist/nodes/list-item-node.d.ts +0 -12
  401. package/dist/nodes/list-item-node.d.ts.map +0 -1
  402. package/dist/nodes/list-item-node.js +0 -45
  403. package/dist/nodes/list-item-node.js.map +0 -1
  404. package/dist/nodes/list.d.ts +0 -100
  405. package/dist/nodes/list.d.ts.map +0 -1
  406. package/dist/nodes/list.js +0 -950
  407. package/dist/nodes/list.js.map +0 -1
  408. package/dist/nodes/menu.d.ts +0 -7
  409. package/dist/nodes/menu.d.ts.map +0 -1
  410. package/dist/nodes/menu.js +0 -20
  411. package/dist/nodes/menu.js.map +0 -1
  412. package/dist/nodes/models/menu.d.ts +0 -47
  413. package/dist/nodes/models/menu.d.ts.map +0 -1
  414. package/dist/nodes/models/menu.js +0 -240
  415. package/dist/nodes/models/menu.js.map +0 -1
  416. package/dist/nodes/navigation-page.d.ts +0 -19
  417. package/dist/nodes/navigation-page.d.ts.map +0 -1
  418. package/dist/nodes/navigation-page.js +0 -129
  419. package/dist/nodes/navigation-page.js.map +0 -1
  420. package/dist/nodes/navigation-view.d.ts +0 -19
  421. package/dist/nodes/navigation-view.d.ts.map +0 -1
  422. package/dist/nodes/navigation-view.js +0 -51
  423. package/dist/nodes/navigation-view.js.map +0 -1
  424. package/dist/nodes/notebook-page-tab.d.ts +0 -15
  425. package/dist/nodes/notebook-page-tab.d.ts.map +0 -1
  426. package/dist/nodes/notebook-page-tab.js +0 -40
  427. package/dist/nodes/notebook-page-tab.js.map +0 -1
  428. package/dist/nodes/notebook-page.d.ts +0 -29
  429. package/dist/nodes/notebook-page.d.ts.map +0 -1
  430. package/dist/nodes/notebook-page.js +0 -151
  431. package/dist/nodes/notebook-page.js.map +0 -1
  432. package/dist/nodes/notebook.d.ts +0 -16
  433. package/dist/nodes/notebook.d.ts.map +0 -1
  434. package/dist/nodes/notebook.js +0 -31
  435. package/dist/nodes/notebook.js.map +0 -1
  436. package/dist/nodes/overlay-child.d.ts +0 -20
  437. package/dist/nodes/overlay-child.d.ts.map +0 -1
  438. package/dist/nodes/overlay-child.js +0 -109
  439. package/dist/nodes/overlay-child.js.map +0 -1
  440. package/dist/nodes/popover-menu.d.ts +0 -19
  441. package/dist/nodes/popover-menu.d.ts.map +0 -1
  442. package/dist/nodes/popover-menu.js +0 -54
  443. package/dist/nodes/popover-menu.js.map +0 -1
  444. package/dist/nodes/scale.d.ts +0 -10
  445. package/dist/nodes/scale.d.ts.map +0 -1
  446. package/dist/nodes/scale.js +0 -19
  447. package/dist/nodes/scale.js.map +0 -1
  448. package/dist/nodes/scrolled-window.d.ts +0 -11
  449. package/dist/nodes/scrolled-window.d.ts.map +0 -1
  450. package/dist/nodes/scrolled-window.js +0 -18
  451. package/dist/nodes/scrolled-window.js.map +0 -1
  452. package/dist/nodes/search-bar.d.ts +0 -11
  453. package/dist/nodes/search-bar.d.ts.map +0 -1
  454. package/dist/nodes/search-bar.js +0 -16
  455. package/dist/nodes/search-bar.js.map +0 -1
  456. package/dist/nodes/shortcut.d.ts +0 -19
  457. package/dist/nodes/shortcut.d.ts.map +0 -1
  458. package/dist/nodes/shortcut.js +0 -72
  459. package/dist/nodes/shortcut.js.map +0 -1
  460. package/dist/nodes/slot.d.ts +0 -21
  461. package/dist/nodes/slot.d.ts.map +0 -1
  462. package/dist/nodes/slot.js +0 -102
  463. package/dist/nodes/slot.js.map +0 -1
  464. package/dist/nodes/source-view.d.ts +0 -18
  465. package/dist/nodes/source-view.d.ts.map +0 -1
  466. package/dist/nodes/source-view.js +0 -94
  467. package/dist/nodes/source-view.js.map +0 -1
  468. package/dist/nodes/spin-row.d.ts +0 -14
  469. package/dist/nodes/spin-row.d.ts.map +0 -1
  470. package/dist/nodes/spin-row.js +0 -46
  471. package/dist/nodes/spin-row.js.map +0 -1
  472. package/dist/nodes/stack-page.d.ts +0 -22
  473. package/dist/nodes/stack-page.d.ts.map +0 -1
  474. package/dist/nodes/stack-page.js +0 -140
  475. package/dist/nodes/stack-page.js.map +0 -1
  476. package/dist/nodes/stack.d.ts +0 -13
  477. package/dist/nodes/stack.d.ts.map +0 -1
  478. package/dist/nodes/stack.js +0 -21
  479. package/dist/nodes/stack.js.map +0 -1
  480. package/dist/nodes/switch-row.d.ts +0 -11
  481. package/dist/nodes/switch-row.d.ts.map +0 -1
  482. package/dist/nodes/switch-row.js +0 -15
  483. package/dist/nodes/switch-row.js.map +0 -1
  484. package/dist/nodes/text-anchor.d.ts +0 -23
  485. package/dist/nodes/text-anchor.d.ts.map +0 -1
  486. package/dist/nodes/text-anchor.js +0 -74
  487. package/dist/nodes/text-anchor.js.map +0 -1
  488. package/dist/nodes/text-content.d.ts +0 -12
  489. package/dist/nodes/text-content.d.ts.map +0 -1
  490. package/dist/nodes/text-content.js +0 -2
  491. package/dist/nodes/text-content.js.map +0 -1
  492. package/dist/nodes/text-paintable.d.ts +0 -19
  493. package/dist/nodes/text-paintable.d.ts.map +0 -1
  494. package/dist/nodes/text-paintable.js +0 -42
  495. package/dist/nodes/text-paintable.js.map +0 -1
  496. package/dist/nodes/text-segment.d.ts +0 -18
  497. package/dist/nodes/text-segment.d.ts.map +0 -1
  498. package/dist/nodes/text-segment.js +0 -38
  499. package/dist/nodes/text-segment.js.map +0 -1
  500. package/dist/nodes/text-tag.d.ts +0 -38
  501. package/dist/nodes/text-tag.d.ts.map +0 -1
  502. package/dist/nodes/text-tag.js +0 -247
  503. package/dist/nodes/text-tag.js.map +0 -1
  504. package/dist/nodes/text-view.d.ts +0 -29
  505. package/dist/nodes/text-view.d.ts.map +0 -1
  506. package/dist/nodes/text-view.js +0 -80
  507. package/dist/nodes/text-view.js.map +0 -1
  508. package/dist/nodes/toggle-group.d.ts +0 -17
  509. package/dist/nodes/toggle-group.d.ts.map +0 -1
  510. package/dist/nodes/toggle-group.js +0 -65
  511. package/dist/nodes/toggle-group.js.map +0 -1
  512. package/dist/nodes/toggle.d.ts +0 -16
  513. package/dist/nodes/toggle.d.ts.map +0 -1
  514. package/dist/nodes/toggle.js +0 -61
  515. package/dist/nodes/toggle.js.map +0 -1
  516. package/dist/nodes/virtual.d.ts +0 -7
  517. package/dist/nodes/virtual.d.ts.map +0 -1
  518. package/dist/nodes/virtual.js +0 -9
  519. package/dist/nodes/virtual.js.map +0 -1
  520. package/dist/nodes/web-view.d.ts +0 -11
  521. package/dist/nodes/web-view.d.ts.map +0 -1
  522. package/dist/nodes/web-view.js +0 -16
  523. package/dist/nodes/web-view.js.map +0 -1
  524. package/dist/nodes/widget.d.ts +0 -26
  525. package/dist/nodes/widget.d.ts.map +0 -1
  526. package/dist/nodes/widget.js +0 -308
  527. package/dist/nodes/widget.js.map +0 -1
  528. package/dist/nodes/window.d.ts +0 -31
  529. package/dist/nodes/window.d.ts.map +0 -1
  530. package/dist/nodes/window.js +0 -122
  531. package/dist/nodes/window.js.map +0 -1
  532. package/dist/portal.d.ts +0 -29
  533. package/dist/portal.d.ts.map +0 -1
  534. package/dist/portal.js +0 -35
  535. package/dist/portal.js.map +0 -1
  536. package/dist/reconciler.d.ts +0 -34
  537. package/dist/reconciler.d.ts.map +0 -1
  538. package/dist/reconciler.js +0 -48
  539. package/dist/reconciler.js.map +0 -1
  540. package/dist/registry.d.ts +0 -18
  541. package/dist/registry.d.ts.map +0 -1
  542. package/dist/registry.js +0 -98
  543. package/dist/registry.js.map +0 -1
  544. package/dist/render.d.ts +0 -117
  545. package/dist/render.d.ts.map +0 -1
  546. package/dist/render.js +0 -159
  547. package/dist/render.js.map +0 -1
  548. package/dist/types.d.ts +0 -6
  549. package/dist/types.d.ts.map +0 -1
  550. package/dist/types.js.map +0 -1
  551. package/dist/use-property.d.ts +0 -29
  552. package/dist/use-property.d.ts.map +0 -1
  553. package/dist/use-property.js +0 -44
  554. package/dist/use-property.js.map +0 -1
  555. package/dist/use-setting.d.ts +0 -36
  556. package/dist/use-setting.d.ts.map +0 -1
  557. package/dist/use-setting.js +0 -68
  558. package/dist/use-setting.js.map +0 -1
  559. package/src/components/compound.tsx +0 -57
  560. package/src/components/list.tsx +0 -140
  561. package/src/components/slot-widget.tsx +0 -46
  562. package/src/errors.ts +0 -53
  563. package/src/factory.ts +0 -62
  564. package/src/generated/compounds.ts +0 -2741
  565. package/src/generated/internal.ts +0 -3642
  566. package/src/generated/jsx.ts +0 -17383
  567. package/src/generated/registry.ts +0 -17
  568. package/src/host-config.ts +0 -219
  569. package/src/jsx.ts +0 -1033
  570. package/src/metadata.ts +0 -43
  571. package/src/node.ts +0 -107
  572. package/src/nodes/adjustable.ts +0 -68
  573. package/src/nodes/alert-dialog-response.ts +0 -78
  574. package/src/nodes/alert-dialog.ts +0 -55
  575. package/src/nodes/animation.ts +0 -409
  576. package/src/nodes/application.ts +0 -61
  577. package/src/nodes/calendar.ts +0 -42
  578. package/src/nodes/color-dialog-button.ts +0 -69
  579. package/src/nodes/column-view-column.ts +0 -189
  580. package/src/nodes/container-slot.ts +0 -100
  581. package/src/nodes/dialog.ts +0 -25
  582. package/src/nodes/drawing-area.ts +0 -53
  583. package/src/nodes/event-controller.ts +0 -96
  584. package/src/nodes/fixed-child.ts +0 -122
  585. package/src/nodes/font-dialog-button.ts +0 -107
  586. package/src/nodes/grid-child.ts +0 -116
  587. package/src/nodes/internal/accessible.ts +0 -155
  588. package/src/nodes/internal/bound-item.ts +0 -4
  589. package/src/nodes/internal/construct.ts +0 -60
  590. package/src/nodes/internal/predicates.ts +0 -80
  591. package/src/nodes/internal/props.ts +0 -51
  592. package/src/nodes/internal/signal-store.ts +0 -141
  593. package/src/nodes/internal/text-buffer-controller.ts +0 -417
  594. package/src/nodes/internal/widget.ts +0 -74
  595. package/src/nodes/level-bar.ts +0 -36
  596. package/src/nodes/list-item-node.ts +0 -53
  597. package/src/nodes/list.ts +0 -1082
  598. package/src/nodes/menu.ts +0 -27
  599. package/src/nodes/models/menu.ts +0 -314
  600. package/src/nodes/navigation-page.ts +0 -154
  601. package/src/nodes/navigation-view.ts +0 -66
  602. package/src/nodes/notebook-page-tab.ts +0 -55
  603. package/src/nodes/notebook-page.ts +0 -189
  604. package/src/nodes/notebook.ts +0 -42
  605. package/src/nodes/overlay-child.ts +0 -130
  606. package/src/nodes/popover-menu.ts +0 -67
  607. package/src/nodes/scale.ts +0 -28
  608. package/src/nodes/scrolled-window.ts +0 -23
  609. package/src/nodes/search-bar.ts +0 -27
  610. package/src/nodes/shortcut.ts +0 -86
  611. package/src/nodes/slot.ts +0 -138
  612. package/src/nodes/source-view.ts +0 -130
  613. package/src/nodes/spin-row.ts +0 -72
  614. package/src/nodes/stack-page.ts +0 -170
  615. package/src/nodes/stack.ts +0 -35
  616. package/src/nodes/switch-row.ts +0 -26
  617. package/src/nodes/text-anchor.ts +0 -88
  618. package/src/nodes/text-content.ts +0 -14
  619. package/src/nodes/text-paintable.ts +0 -51
  620. package/src/nodes/text-segment.ts +0 -55
  621. package/src/nodes/text-tag.ts +0 -298
  622. package/src/nodes/text-view.ts +0 -100
  623. package/src/nodes/toggle-group.ts +0 -81
  624. package/src/nodes/toggle.ts +0 -72
  625. package/src/nodes/virtual.ts +0 -16
  626. package/src/nodes/web-view.ts +0 -22
  627. package/src/nodes/widget.ts +0 -369
  628. package/src/nodes/window.ts +0 -172
  629. package/src/portal.ts +0 -37
  630. package/src/reconciler.ts +0 -52
  631. package/src/registry.ts +0 -119
  632. package/src/render.tsx +0 -192
  633. package/src/types.ts +0 -13
  634. package/src/use-property.ts +0 -58
  635. package/src/use-setting.ts +0 -96
  636. /package/dist/{types.js → reconciler/types.js} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gtkx/react",
3
- "version": "0.21.0",
4
- "description": "Build GTK4 desktop applications with React and TypeScript",
3
+ "version": "1.0.0-rc.1",
4
+ "description": "React reconciler that renders GTK4 object trees, with the portals, signal handling, and hooks GTKX apps use",
5
5
  "keywords": [
6
6
  "gtkx",
7
7
  "gtk",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",
22
- "url": "https://github.com/gtkx-org/gtkx.git",
22
+ "url": "git+https://github.com/gtkx-org/gtkx.git",
23
23
  "directory": "packages/react"
24
24
  },
25
25
  "license": "MPL-2.0",
@@ -30,17 +30,30 @@
30
30
  ".": {
31
31
  "types": "./dist/index.d.ts",
32
32
  "default": "./dist/index.js"
33
+ },
34
+ "./internal": {
35
+ "types": "./dist/internal.d.ts",
36
+ "default": "./dist/internal.js"
37
+ },
38
+ "./adw": {
39
+ "types": "./dist/libraries/adw/index.d.ts",
40
+ "default": "./dist/libraries/adw/index.js"
33
41
  }
34
42
  },
35
43
  "sideEffects": false,
36
44
  "files": [
37
45
  "dist",
38
- "src"
46
+ "src",
47
+ "!**/*.tsbuildinfo"
39
48
  ],
49
+ "engines": {
50
+ "node": ">=24"
51
+ },
40
52
  "dependencies": {
41
53
  "react-reconciler": "^0.33.0",
42
- "@gtkx/ffi": "0.21.0",
43
- "@gtkx/gir": "0.21.0"
54
+ "@gtkx/config": "1.0.0-rc.1",
55
+ "@gtkx/runtime": "1.0.0-rc.1",
56
+ "@gtkx/utils": "1.0.0-rc.1"
44
57
  },
45
58
  "devDependencies": {
46
59
  "@types/react-reconciler": "^0.33.0"
@@ -49,7 +62,8 @@
49
62
  "react": "^19"
50
63
  },
51
64
  "scripts": {
52
- "build": "tsc -b && cp ../../README.md .",
53
- "typecheck": "tsc -b --emitDeclarationOnly"
65
+ "build": "tsc -b tsconfig.lib.json",
66
+ "typecheck": "tsc -b --emitDeclarationOnly",
67
+ "release": "tsx ../../scripts/release-package.ts"
54
68
  }
55
69
  }
@@ -0,0 +1,43 @@
1
+ import { applicationId as defaultApplicationId } from "virtual:gtkx-config";
2
+ import type * as Gtk from "@gtkx/gi/gtk";
3
+ import { quitApplication, runApplication } from "@gtkx/runtime";
4
+ import { type ElementType, type ReactNode, type Ref, useCallback, useState } from "react";
5
+ import { ApplicationContext } from "../hooks/use-application.js";
6
+ import { useMergeRefs } from "../hooks/use-merge-refs.js";
7
+
8
+ const POST_ACTIVATE_PROPS = new Set(["menubar"]);
9
+
10
+ type ApplicationComponentProps = {
11
+ applicationId?: string | null | undefined;
12
+ children?: ReactNode | undefined;
13
+ ref?: Ref<Gtk.Application | null> | undefined;
14
+ };
15
+
16
+ export const createApplicationComponent = (
17
+ Component: ElementType,
18
+ ): ((props: ApplicationComponentProps) => ReactNode) => {
19
+ return ({ applicationId = defaultApplicationId, children, ref, ...rest }: ApplicationComponentProps): ReactNode => {
20
+ const [app, setApp] = useState<Gtk.Application | null>(null);
21
+
22
+ const handleMount = useCallback((instance: Gtk.Application) => {
23
+ runApplication(instance);
24
+ setApp(instance);
25
+
26
+ return () => {
27
+ quitApplication(instance);
28
+ setApp(null);
29
+ };
30
+ }, []);
31
+
32
+ const mergedRef = useMergeRefs<Gtk.Application>(ref, handleMount);
33
+ const appliedProps = app
34
+ ? rest
35
+ : Object.fromEntries(Object.entries(rest).filter(([key]) => !POST_ACTIVATE_PROPS.has(key)));
36
+
37
+ return (
38
+ <Component ref={mergedRef} applicationId={applicationId} {...appliedProps}>
39
+ {app ? <ApplicationContext.Provider value={app}>{children}</ApplicationContext.Provider> : null}
40
+ </Component>
41
+ );
42
+ };
43
+ };
@@ -0,0 +1,36 @@
1
+ import type * as Gtk from "@gtkx/gi/gtk";
2
+ import { type ElementType, type ReactNode, type Ref, useCallback, useLayoutEffect, useState } from "react";
3
+ import { useMergeRefs } from "../hooks/use-merge-refs.js";
4
+ import { ParentWindowContext } from "../hooks/use-parent-window.js";
5
+
6
+ type WindowComponentProps = {
7
+ ref?: Ref<Gtk.Window | null> | undefined;
8
+ };
9
+
10
+ export const createWindowComponent = (Component: ElementType): ((props: WindowComponentProps) => ReactNode) => {
11
+ return ({ ref, ...rest }: WindowComponentProps): ReactNode => {
12
+ const [window, setWindow] = useState<Gtk.Window | null>(null);
13
+
14
+ const handleMount = useCallback((window: Gtk.Window) => {
15
+ setWindow(window);
16
+
17
+ return () => {
18
+ window.setDefaultWidget(null);
19
+ window.destroy();
20
+ setWindow(null);
21
+ };
22
+ }, []);
23
+
24
+ useLayoutEffect(() => {
25
+ window?.present();
26
+ }, [window]);
27
+
28
+ const mergedRef = useMergeRefs(ref, handleMount);
29
+
30
+ return (
31
+ <ParentWindowContext.Provider value={window}>
32
+ <Component ref={mergedRef} {...rest} />
33
+ </ParentWindowContext.Provider>
34
+ );
35
+ };
36
+ };
@@ -0,0 +1,17 @@
1
+ import type * as Gtk from "@gtkx/gi/gtk";
2
+ import { type Context, createContext, use } from "react";
3
+
4
+ export const ApplicationContext: Context<Gtk.Application | null> = createContext<Gtk.Application | null>(null);
5
+
6
+ /**
7
+ * Returns the `Gtk.Application` provided by the nearest `Application` ancestor, throwing if used outside one.
8
+ */
9
+ export const useApplication = (): Gtk.Application => {
10
+ const context = use(ApplicationContext);
11
+
12
+ if (!context) {
13
+ throw new Error("Expected ApplicationContext: useApplication must be called within Application");
14
+ }
15
+
16
+ return context;
17
+ };
@@ -0,0 +1,35 @@
1
+ import * as Gio from "@gtkx/gi/gio";
2
+ import type * as GObject from "@gtkx/gi/gobject";
3
+ import { toKebabCase } from "@gtkx/utils";
4
+ import type { ObjectProp } from "../utils/object-prop.js";
5
+ import { useObjectAttachment } from "./use-object-attachment.js";
6
+ import { type SchemaRef, useSettingsInstance } from "./use-setting.js";
7
+
8
+ export function useBindSetting<K extends object, P extends keyof K & string>(
9
+ schema: SchemaRef<K>,
10
+ key: P,
11
+ object: ObjectProp<GObject.Object>,
12
+ property: string,
13
+ flags?: Gio.SettingsBindFlags,
14
+ ): void;
15
+ export function useBindSetting(
16
+ schema: SchemaRef,
17
+ key: string,
18
+ object: ObjectProp<GObject.Object>,
19
+ property: string,
20
+ flags: Gio.SettingsBindFlags = Gio.SettingsBindFlags.DEFAULT,
21
+ ): void {
22
+ const settings = useSettingsInstance(schema);
23
+ const propertyName = toKebabCase(property);
24
+
25
+ useObjectAttachment<GObject.Object, GObject.Object>(object, {
26
+ attach: (obj) => {
27
+ settings.bind(key, obj, propertyName, flags);
28
+ return obj;
29
+ },
30
+ detach: (obj) => {
31
+ Gio.Settings.unbind(obj, propertyName);
32
+ },
33
+ isSame: (attachment, current) => attachment === current,
34
+ });
35
+ }
@@ -0,0 +1,53 @@
1
+ import { type Ref, type RefCallback, useCallback, useLayoutEffect, useRef } from "react";
2
+
3
+ type MergedRefEntry<T> = {
4
+ ref: Ref<T | null> | undefined;
5
+ cleanup: (() => void) | undefined;
6
+ };
7
+
8
+ const attachRef = <T>(ref: Ref<T | null> | undefined, value: T): (() => void) | undefined => {
9
+ if (typeof ref === "function") {
10
+ const cleanup = ref(value);
11
+ return typeof cleanup === "function" ? cleanup : () => ref(null);
12
+ }
13
+ if (ref) {
14
+ ref.current = value;
15
+ return () => {
16
+ ref.current = null;
17
+ };
18
+ }
19
+ return undefined;
20
+ };
21
+
22
+ export const useMergeRefs = <T>(...refs: Array<Ref<T | null> | undefined>): RefCallback<T> => {
23
+ const latestRefs = useRef(refs);
24
+ latestRefs.current = refs;
25
+ const attachedRef = useRef<{ value: T; entries: MergedRefEntry<T>[] } | null>(null);
26
+
27
+ useLayoutEffect(() => {
28
+ const attached = attachedRef.current;
29
+ if (attached === null) return;
30
+ const next = latestRefs.current;
31
+ for (let index = next.length; index < attached.entries.length; index += 1) {
32
+ attached.entries[index]?.cleanup?.();
33
+ }
34
+ attached.entries = next.map((ref, index) => {
35
+ const entry = attached.entries[index];
36
+ if (entry !== undefined && entry.ref === ref) return entry;
37
+ entry?.cleanup?.();
38
+ return { ref, cleanup: attachRef(ref, attached.value) };
39
+ });
40
+ });
41
+
42
+ return useCallback((value: T) => {
43
+ const entries = latestRefs.current.map((ref) => ({ ref, cleanup: attachRef(ref, value) }));
44
+ attachedRef.current = { value, entries };
45
+ return () => {
46
+ const attached = attachedRef.current;
47
+ attachedRef.current = null;
48
+ if (attached) {
49
+ for (const entry of attached.entries) entry.cleanup?.();
50
+ }
51
+ };
52
+ }, []);
53
+ };
@@ -0,0 +1,35 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import { useLayoutEffect, useRef } from "react";
3
+ import { type ObjectProp, resolveObjectProp } from "../utils/object-prop.js";
4
+
5
+ type ObjectAttachmentOps<T extends GObject.Object, A> = {
6
+ attach(object: T): A;
7
+ detach(attachment: A): void;
8
+ isSame(attachment: A, object: T): boolean;
9
+ };
10
+
11
+ export const useObjectAttachment = <T extends GObject.Object, A>(
12
+ object: ObjectProp<T>,
13
+ ops: ObjectAttachmentOps<T, A>,
14
+ ): void => {
15
+ const attachmentRef = useRef<A | null>(null);
16
+
17
+ const drop = (): void => {
18
+ const attachment = attachmentRef.current;
19
+ if (attachment !== null) {
20
+ ops.detach(attachment);
21
+ attachmentRef.current = null;
22
+ }
23
+ };
24
+
25
+ useLayoutEffect(() => {
26
+ const resolved = resolveObjectProp(object);
27
+ const attachment = attachmentRef.current;
28
+ if (attachment !== null && resolved !== null && ops.isSame(attachment, resolved)) return;
29
+ drop();
30
+ if (resolved === null) return;
31
+ attachmentRef.current = ops.attach(resolved);
32
+ });
33
+
34
+ useLayoutEffect(() => () => drop(), []);
35
+ };
@@ -0,0 +1,50 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import type { SignalHandler } from "@gtkx/runtime";
3
+ import { useCallback, useRef, useSyncExternalStore } from "react";
4
+ import { type ObjectProp, resolveObjectProp } from "../utils/object-prop.js";
5
+
6
+ type ObjectValueCache<T extends GObject.Object, V> = {
7
+ object: T | null;
8
+ signal: string;
9
+ value: V;
10
+ };
11
+
12
+ export function useObjectValue<T extends GObject.Object, V>(
13
+ object: ObjectProp<T>,
14
+ signal: string,
15
+ read: (object: T | null) => V,
16
+ ): V {
17
+ const resolved = resolveObjectProp(object);
18
+ const readRef = useRef(read);
19
+ readRef.current = read;
20
+ const cacheRef = useRef<ObjectValueCache<T, V> | null>(null);
21
+
22
+ const readNow = useCallback((): ObjectValueCache<T, V> => {
23
+ const cache = { object: resolved, signal, value: readRef.current(resolved) };
24
+ cacheRef.current = cache;
25
+ return cache;
26
+ }, [resolved, signal]);
27
+
28
+ const getSnapshot = useCallback((): V => {
29
+ const cache = cacheRef.current;
30
+ if (cache !== null && cache.object === resolved && cache.signal === signal) {
31
+ return cache.value;
32
+ }
33
+ return readNow().value;
34
+ }, [resolved, signal, readNow]);
35
+
36
+ const subscribe = useCallback(
37
+ (onStoreChange: () => void): (() => void) => {
38
+ if (resolved === null) return () => {};
39
+ const handler: SignalHandler = () => {
40
+ readNow();
41
+ onStoreChange();
42
+ };
43
+ resolved.on(signal, handler);
44
+ return () => resolved.off(signal, handler);
45
+ },
46
+ [resolved, signal, readNow],
47
+ );
48
+
49
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
50
+ }
@@ -0,0 +1,9 @@
1
+ import type * as Gtk from "@gtkx/gi/gtk";
2
+ import { type Context, createContext, use } from "react";
3
+
4
+ export const ParentWindowContext: Context<Gtk.Window | null> = createContext<Gtk.Window | null>(null);
5
+
6
+ /**
7
+ * Returns the `Gtk.Window` provided by the nearest window ancestor, or `null` when there is none.
8
+ */
9
+ export const useParentWindow = (): Gtk.Window | null => use(ParentWindowContext);
@@ -0,0 +1,22 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import { propToNotifySignal } from "../utils/notify-name.js";
3
+ import type { ObjectProp } from "../utils/object-prop.js";
4
+ import { useObjectValue } from "./use-object-value.js";
5
+
6
+ type PropertiesOf<T extends GObject.Object> = NonNullable<T["__properties__"]>;
7
+
8
+ export type PropertyNameOf<T extends GObject.Object> = keyof PropertiesOf<T> & keyof T & string;
9
+
10
+ /**
11
+ * Subscribes to a GObject property and returns its current value, re-rendering when the property changes.
12
+ *
13
+ * @param object The GObject (or ref to one) whose property to observe.
14
+ * @param propertyName The camelCase name of a readable property on the object.
15
+ * @returns The current property value, or `undefined` when the object is not resolved.
16
+ */
17
+ export function useProperty<T extends GObject.Object, K extends PropertyNameOf<T>>(
18
+ object: ObjectProp<T>,
19
+ propertyName: K,
20
+ ): T[K] | undefined {
21
+ return useObjectValue(object, propToNotifySignal(propertyName), (obj) => (obj ? obj[propertyName] : undefined));
22
+ }
@@ -0,0 +1,47 @@
1
+ import * as Gio from "@gtkx/gi/gio";
2
+ import { useCallback, useMemo } from "react";
3
+ import { resolveAccessor } from "../utils/settings-accessor.js";
4
+ import { useObjectValue } from "./use-object-value.js";
5
+
6
+ /**
7
+ * A typed reference to a GSettings schema: its id, path, and the mapping of typed keys to their setting names.
8
+ */
9
+ export type SchemaRef<K extends object = Record<string, unknown>> = {
10
+ id: string;
11
+ /** The schema's object path, or `null` to use the schema's default path. */
12
+ path: string | null;
13
+ /** Maps each typed key of `K` to its corresponding GSettings key name. */
14
+ keys: { [P in keyof K]: string };
15
+ /** Phantom field carrying the value type `K`; never populated at runtime. */
16
+ __keys__?: K;
17
+ };
18
+
19
+ export const useSettingsInstance = ({ id, path }: Pick<SchemaRef, "id" | "path">): Gio.Settings =>
20
+ useMemo(() => (path === null ? Gio.Settings.new(id) : new Gio.Settings({ schemaId: id, path })), [id, path]);
21
+
22
+ /**
23
+ * Reads and writes a single key of a GSettings schema, re-rendering when the stored value changes.
24
+ *
25
+ * @param schema The schema reference identifying the settings backend.
26
+ * @param key The key within the schema to read and write.
27
+ * @returns A tuple of the current value and a setter that persists a new value.
28
+ */
29
+ export function useSetting<K extends object, P extends keyof K & string>(
30
+ schema: SchemaRef<K>,
31
+ key: P,
32
+ ): [K[P], (value: K[P]) => void];
33
+ export function useSetting(schema: SchemaRef, key: string): [unknown, (value: unknown) => void] {
34
+ const accessor = resolveAccessor(schema.keys[key], key, schema.id);
35
+ const settings = useSettingsInstance(schema);
36
+
37
+ const value = useObjectValue(settings, `changed::${key}`, () => accessor.read(settings, key));
38
+
39
+ const set = useCallback(
40
+ (newValue: unknown) => {
41
+ accessor.write(settings, key, newValue);
42
+ },
43
+ [accessor, settings, key],
44
+ );
45
+
46
+ return [value, set];
47
+ }
@@ -0,0 +1,71 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import type { SignalHandler } from "@gtkx/runtime";
3
+ import { useRef } from "react";
4
+ import type { ObjectProp } from "../utils/object-prop.js";
5
+ import { useObjectAttachment } from "./use-object-attachment.js";
6
+
7
+ type AnySignalHandler = (...args: unknown[]) => unknown;
8
+
9
+ type SignalsOf<T extends GObject.Object> = NonNullable<T["__signals__"]>;
10
+
11
+ export type SignalNameOf<T extends GObject.Object> =
12
+ | (keyof SignalsOf<T> & string)
13
+ | `${keyof SignalsOf<T> & string}::${string}`;
14
+
15
+ export type SignalHandlerFor<T extends GObject.Object, S extends string> = S extends keyof SignalsOf<T>
16
+ ? SignalsOf<T>[S]
17
+ : S extends `${infer TBase}::${string}`
18
+ ? TBase extends keyof SignalsOf<T>
19
+ ? SignalsOf<T>[TBase]
20
+ : AnySignalHandler
21
+ : AnySignalHandler;
22
+
23
+ type UseSignalOptions = {
24
+ after?: boolean;
25
+ immediate?: boolean;
26
+ };
27
+
28
+ type SignalSubscription = {
29
+ obj: GObject.Object;
30
+ signal: string;
31
+ after: boolean;
32
+ listener: SignalHandler;
33
+ };
34
+
35
+ /**
36
+ * Connects a handler to a GObject signal for the lifetime of the component, reconnecting when the object changes.
37
+ *
38
+ * @param object The GObject (or ref to one) to connect to.
39
+ * @param signal The signal name, optionally with a detail suffix.
40
+ * @param handler The callback invoked when the signal is emitted.
41
+ * @param options Connection options such as running after the default handler or invoking immediately.
42
+ */
43
+ export function useSignal<T extends GObject.Object, S extends SignalNameOf<T>>(
44
+ object: ObjectProp<T>,
45
+ signal: S,
46
+ handler: SignalHandlerFor<T, S>,
47
+ options?: UseSignalOptions,
48
+ ): void;
49
+ export function useSignal(
50
+ object: ObjectProp<GObject.Object>,
51
+ signal: string,
52
+ handler: AnySignalHandler,
53
+ options?: UseSignalOptions,
54
+ ): void {
55
+ const handlerRef = useRef(handler);
56
+ handlerRef.current = handler;
57
+ const after = options?.after ?? false;
58
+ const immediate = options?.immediate ?? false;
59
+
60
+ useObjectAttachment<GObject.Object, SignalSubscription>(object, {
61
+ attach: (obj) => {
62
+ const listener: SignalHandler = (...args) => handlerRef.current(...args);
63
+ obj.on(signal, listener, after);
64
+ if (immediate) handlerRef.current();
65
+ return { obj, signal, after, listener };
66
+ },
67
+ detach: (subscription) => subscription.obj.off(subscription.signal, subscription.listener),
68
+ isSame: (subscription, obj) =>
69
+ subscription.obj === obj && subscription.signal === signal && subscription.after === after,
70
+ });
71
+ }
package/src/index.ts CHANGED
@@ -1,14 +1,15 @@
1
- export { GtkxError } from "./errors.js";
2
- export * from "./jsx.js";
3
- export { createPortal } from "./portal.js";
4
- export { reconciler } from "./reconciler.js";
5
- export {
6
- ApplicationContext,
7
- quit,
8
- render,
9
- setHotReloading,
10
- update,
11
- useApplication,
12
- } from "./render.js";
13
- export { useProperty } from "./use-property.js";
14
- export { useSetting } from "./use-setting.js";
1
+ import "./utils/wrapper-node-jsx.js";
2
+
3
+ export type { ElementProp } from "@gtkx/config";
4
+ export { useApplication } from "./hooks/use-application.js";
5
+ export { useBindSetting } from "./hooks/use-bind-setting.js";
6
+ export { useParentWindow } from "./hooks/use-parent-window.js";
7
+ export { useProperty } from "./hooks/use-property.js";
8
+ export { type SchemaRef, useSetting } from "./hooks/use-setting.js";
9
+ export { useSignal } from "./hooks/use-signal.js";
10
+ export type { AccessibleProps } from "./reconciler/accessible.js";
11
+ export { createPortal } from "./reconciler/portal.js";
12
+ export { createRoot, quit, type Root } from "./reconciler/render.js";
13
+ export { type RootElement, rootElement } from "./reconciler/root-element.js";
14
+ export type { ObjectProp } from "./utils/object-prop.js";
15
+ export type { TextAnchorProps, TextPaintableProps } from "./utils/wrapper-node-jsx.js";
@@ -0,0 +1,24 @@
1
+ export { createApplicationComponent } from "./components/application.js";
2
+ export { createWindowComponent } from "./components/window.js";
3
+ export { ApplicationContext } from "./hooks/use-application.js";
4
+ export { useMergeRefs } from "./hooks/use-merge-refs.js";
5
+ export { useObjectAttachment } from "./hooks/use-object-attachment.js";
6
+ export { useObjectValue } from "./hooks/use-object-value.js";
7
+ export { setReconcilerErrorHandler } from "./reconciler/reconciler-error-handler.js";
8
+ export { createReconcilerRoot, type ReconcilerRoot } from "./reconciler/reconciler-root.js";
9
+ export { isRootElement } from "./reconciler/root-element.js";
10
+ export {
11
+ BUFFER_TEXT_KIND,
12
+ CONTAINER_PROP_KIND,
13
+ isWrapperKind,
14
+ LABEL_TEXT_KIND,
15
+ LAZY_ELEMENT_KIND,
16
+ OBJECT_PROP_KIND,
17
+ TEXT_ANCHOR_KIND,
18
+ TEXT_PAINTABLE_KIND,
19
+ WRAPPER_NODE_ELEMENT,
20
+ type WrapperKind,
21
+ } from "./reconciler/wrapper-protocol.js";
22
+ export { getAccessibleMetadata } from "./utils/accessible-metadata.js";
23
+ export { createElementComponent, createLazyElementComponent } from "./utils/create-element-component.js";
24
+ export { type ObjectProp, resolveObjectProp } from "./utils/object-prop.js";
@@ -0,0 +1,34 @@
1
+ import type * as Adw from "@gtkx/gi/adw";
2
+ import { type ElementType, type ReactNode, type Ref, useCallback, useLayoutEffect, useState } from "react";
3
+ import { useMergeRefs } from "../../hooks/use-merge-refs.js";
4
+ import { useParentWindow } from "../../hooks/use-parent-window.js";
5
+ import { createPortal } from "../../reconciler/portal.js";
6
+ import { rootElement } from "../../reconciler/root-element.js";
7
+
8
+ type DialogComponentProps = {
9
+ ref?: Ref<Adw.Dialog | null> | undefined;
10
+ };
11
+
12
+ export const createDialogComponent = (Component: ElementType): ((props: DialogComponentProps) => ReactNode) => {
13
+ return ({ ref, ...rest }: DialogComponentProps): ReactNode => {
14
+ const parent = useParentWindow();
15
+ const [dialog, setDialog] = useState<Adw.Dialog | null>(null);
16
+
17
+ const handleMount = useCallback((instance: Adw.Dialog) => {
18
+ setDialog(instance);
19
+
20
+ return () => {
21
+ instance.forceClose();
22
+ setDialog(null);
23
+ };
24
+ }, []);
25
+
26
+ useLayoutEffect(() => {
27
+ dialog?.present(parent);
28
+ }, [dialog, parent]);
29
+
30
+ const mergedRef = useMergeRefs<Adw.Dialog>(ref, handleMount);
31
+
32
+ return createPortal(<Component ref={mergedRef} {...rest} />, rootElement);
33
+ };
34
+ };
@@ -0,0 +1 @@
1
+ export { createDialogComponent } from "./dialog.js";