@gtkx/react 0.20.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 (596) hide show
  1. package/README.md +122 -55
  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 -5
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +10 -5
  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 -12
  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/list.d.ts +0 -35
  253. package/dist/components/list.d.ts.map +0 -1
  254. package/dist/components/list.js +0 -40
  255. package/dist/components/list.js.map +0 -1
  256. package/dist/errors.d.ts +0 -9
  257. package/dist/errors.d.ts.map +0 -1
  258. package/dist/errors.js +0 -42
  259. package/dist/errors.js.map +0 -1
  260. package/dist/factory.d.ts +0 -5
  261. package/dist/factory.d.ts.map +0 -1
  262. package/dist/factory.js +0 -37
  263. package/dist/factory.js.map +0 -1
  264. package/dist/generated/internal.d.ts +0 -16
  265. package/dist/generated/internal.d.ts.map +0 -1
  266. package/dist/generated/internal.js +0 -5635
  267. package/dist/generated/internal.js.map +0 -1
  268. package/dist/generated/jsx.d.ts +0 -19624
  269. package/dist/generated/jsx.d.ts.map +0 -1
  270. package/dist/generated/jsx.js +0 -9274
  271. package/dist/generated/jsx.js.map +0 -1
  272. package/dist/generated/registry.d.ts +0 -4
  273. package/dist/generated/registry.d.ts.map +0 -1
  274. package/dist/generated/registry.js +0 -14
  275. package/dist/generated/registry.js.map +0 -1
  276. package/dist/host-config.d.ts +0 -24
  277. package/dist/host-config.d.ts.map +0 -1
  278. package/dist/host-config.js +0 -172
  279. package/dist/host-config.js.map +0 -1
  280. package/dist/jsx.d.ts +0 -1272
  281. package/dist/jsx.d.ts.map +0 -1
  282. package/dist/jsx.js +0 -331
  283. package/dist/jsx.js.map +0 -1
  284. package/dist/metadata.d.ts +0 -5
  285. package/dist/metadata.d.ts.map +0 -1
  286. package/dist/metadata.js +0 -33
  287. package/dist/metadata.js.map +0 -1
  288. package/dist/node.d.ts +0 -25
  289. package/dist/node.d.ts.map +0 -1
  290. package/dist/node.js +0 -85
  291. package/dist/node.js.map +0 -1
  292. package/dist/nodes/adjustable.d.ts +0 -11
  293. package/dist/nodes/adjustable.d.ts.map +0 -1
  294. package/dist/nodes/adjustable.js +0 -46
  295. package/dist/nodes/adjustable.js.map +0 -1
  296. package/dist/nodes/alert-dialog-response.d.ts +0 -15
  297. package/dist/nodes/alert-dialog-response.d.ts.map +0 -1
  298. package/dist/nodes/alert-dialog-response.js +0 -61
  299. package/dist/nodes/alert-dialog-response.js.map +0 -1
  300. package/dist/nodes/animation.d.ts +0 -38
  301. package/dist/nodes/animation.d.ts.map +0 -1
  302. package/dist/nodes/animation.js +0 -310
  303. package/dist/nodes/animation.js.map +0 -1
  304. package/dist/nodes/application.d.ts +0 -12
  305. package/dist/nodes/application.d.ts.map +0 -1
  306. package/dist/nodes/application.js +0 -51
  307. package/dist/nodes/application.js.map +0 -1
  308. package/dist/nodes/calendar.d.ts +0 -18
  309. package/dist/nodes/calendar.d.ts.map +0 -1
  310. package/dist/nodes/calendar.js +0 -28
  311. package/dist/nodes/calendar.js.map +0 -1
  312. package/dist/nodes/color-dialog-button.d.ts +0 -15
  313. package/dist/nodes/color-dialog-button.d.ts.map +0 -1
  314. package/dist/nodes/color-dialog-button.js +0 -43
  315. package/dist/nodes/color-dialog-button.js.map +0 -1
  316. package/dist/nodes/column-view-column.d.ts +0 -36
  317. package/dist/nodes/column-view-column.d.ts.map +0 -1
  318. package/dist/nodes/column-view-column.js +0 -168
  319. package/dist/nodes/column-view-column.js.map +0 -1
  320. package/dist/nodes/container-slot.d.ts +0 -16
  321. package/dist/nodes/container-slot.d.ts.map +0 -1
  322. package/dist/nodes/container-slot.js +0 -69
  323. package/dist/nodes/container-slot.js.map +0 -1
  324. package/dist/nodes/dialog.d.ts +0 -10
  325. package/dist/nodes/dialog.d.ts.map +0 -1
  326. package/dist/nodes/dialog.js +0 -20
  327. package/dist/nodes/dialog.js.map +0 -1
  328. package/dist/nodes/drawing-area.d.ts +0 -17
  329. package/dist/nodes/drawing-area.d.ts.map +0 -1
  330. package/dist/nodes/drawing-area.js +0 -42
  331. package/dist/nodes/drawing-area.js.map +0 -1
  332. package/dist/nodes/event-controller.d.ts +0 -15
  333. package/dist/nodes/event-controller.d.ts.map +0 -1
  334. package/dist/nodes/event-controller.js +0 -77
  335. package/dist/nodes/event-controller.js.map +0 -1
  336. package/dist/nodes/fixed-child.d.ts +0 -18
  337. package/dist/nodes/fixed-child.d.ts.map +0 -1
  338. package/dist/nodes/fixed-child.js +0 -86
  339. package/dist/nodes/fixed-child.js.map +0 -1
  340. package/dist/nodes/font-dialog-button.d.ts +0 -15
  341. package/dist/nodes/font-dialog-button.d.ts.map +0 -1
  342. package/dist/nodes/font-dialog-button.js +0 -76
  343. package/dist/nodes/font-dialog-button.js.map +0 -1
  344. package/dist/nodes/grid-child.d.ts +0 -18
  345. package/dist/nodes/grid-child.d.ts.map +0 -1
  346. package/dist/nodes/grid-child.js +0 -81
  347. package/dist/nodes/grid-child.js.map +0 -1
  348. package/dist/nodes/internal/accessible.d.ts +0 -5
  349. package/dist/nodes/internal/accessible.d.ts.map +0 -1
  350. package/dist/nodes/internal/accessible.js +0 -119
  351. package/dist/nodes/internal/accessible.js.map +0 -1
  352. package/dist/nodes/internal/bound-item.d.ts +0 -4
  353. package/dist/nodes/internal/bound-item.d.ts.map +0 -1
  354. package/dist/nodes/internal/bound-item.js +0 -2
  355. package/dist/nodes/internal/bound-item.js.map +0 -1
  356. package/dist/nodes/internal/construct.d.ts +0 -3
  357. package/dist/nodes/internal/construct.d.ts.map +0 -1
  358. package/dist/nodes/internal/construct.js +0 -44
  359. package/dist/nodes/internal/construct.js.map +0 -1
  360. package/dist/nodes/internal/predicates.d.ts +0 -51
  361. package/dist/nodes/internal/predicates.d.ts.map +0 -1
  362. package/dist/nodes/internal/predicates.js +0 -36
  363. package/dist/nodes/internal/predicates.js.map +0 -1
  364. package/dist/nodes/internal/props.d.ts +0 -6
  365. package/dist/nodes/internal/props.d.ts.map +0 -1
  366. package/dist/nodes/internal/props.js +0 -43
  367. package/dist/nodes/internal/props.js.map +0 -1
  368. package/dist/nodes/internal/signal-store.d.ts +0 -22
  369. package/dist/nodes/internal/signal-store.d.ts.map +0 -1
  370. package/dist/nodes/internal/signal-store.js +0 -98
  371. package/dist/nodes/internal/signal-store.js.map +0 -1
  372. package/dist/nodes/internal/text-buffer-controller.d.ts +0 -40
  373. package/dist/nodes/internal/text-buffer-controller.d.ts.map +0 -1
  374. package/dist/nodes/internal/text-buffer-controller.js +0 -327
  375. package/dist/nodes/internal/text-buffer-controller.js.map +0 -1
  376. package/dist/nodes/internal/widget.d.ts +0 -8
  377. package/dist/nodes/internal/widget.d.ts.map +0 -1
  378. package/dist/nodes/internal/widget.js +0 -72
  379. package/dist/nodes/internal/widget.js.map +0 -1
  380. package/dist/nodes/level-bar.d.ts +0 -12
  381. package/dist/nodes/level-bar.d.ts.map +0 -1
  382. package/dist/nodes/level-bar.js +0 -24
  383. package/dist/nodes/level-bar.js.map +0 -1
  384. package/dist/nodes/list-item-node.d.ts +0 -12
  385. package/dist/nodes/list-item-node.d.ts.map +0 -1
  386. package/dist/nodes/list-item-node.js +0 -23
  387. package/dist/nodes/list-item-node.js.map +0 -1
  388. package/dist/nodes/list.d.ts +0 -100
  389. package/dist/nodes/list.d.ts.map +0 -1
  390. package/dist/nodes/list.js +0 -950
  391. package/dist/nodes/list.js.map +0 -1
  392. package/dist/nodes/menu.d.ts +0 -7
  393. package/dist/nodes/menu.d.ts.map +0 -1
  394. package/dist/nodes/menu.js +0 -20
  395. package/dist/nodes/menu.js.map +0 -1
  396. package/dist/nodes/models/menu.d.ts +0 -47
  397. package/dist/nodes/models/menu.d.ts.map +0 -1
  398. package/dist/nodes/models/menu.js +0 -240
  399. package/dist/nodes/models/menu.js.map +0 -1
  400. package/dist/nodes/navigation-page.d.ts +0 -19
  401. package/dist/nodes/navigation-page.d.ts.map +0 -1
  402. package/dist/nodes/navigation-page.js +0 -129
  403. package/dist/nodes/navigation-page.js.map +0 -1
  404. package/dist/nodes/navigation-view.d.ts +0 -19
  405. package/dist/nodes/navigation-view.d.ts.map +0 -1
  406. package/dist/nodes/navigation-view.js +0 -51
  407. package/dist/nodes/navigation-view.js.map +0 -1
  408. package/dist/nodes/notebook-page-tab.d.ts +0 -15
  409. package/dist/nodes/notebook-page-tab.d.ts.map +0 -1
  410. package/dist/nodes/notebook-page-tab.js +0 -40
  411. package/dist/nodes/notebook-page-tab.js.map +0 -1
  412. package/dist/nodes/notebook-page.d.ts +0 -29
  413. package/dist/nodes/notebook-page.d.ts.map +0 -1
  414. package/dist/nodes/notebook-page.js +0 -151
  415. package/dist/nodes/notebook-page.js.map +0 -1
  416. package/dist/nodes/notebook.d.ts +0 -16
  417. package/dist/nodes/notebook.d.ts.map +0 -1
  418. package/dist/nodes/notebook.js +0 -31
  419. package/dist/nodes/notebook.js.map +0 -1
  420. package/dist/nodes/overlay-child.d.ts +0 -18
  421. package/dist/nodes/overlay-child.d.ts.map +0 -1
  422. package/dist/nodes/overlay-child.js +0 -88
  423. package/dist/nodes/overlay-child.js.map +0 -1
  424. package/dist/nodes/popover-menu.d.ts +0 -19
  425. package/dist/nodes/popover-menu.d.ts.map +0 -1
  426. package/dist/nodes/popover-menu.js +0 -54
  427. package/dist/nodes/popover-menu.js.map +0 -1
  428. package/dist/nodes/scale.d.ts +0 -10
  429. package/dist/nodes/scale.d.ts.map +0 -1
  430. package/dist/nodes/scale.js +0 -19
  431. package/dist/nodes/scale.js.map +0 -1
  432. package/dist/nodes/scrolled-window.d.ts +0 -11
  433. package/dist/nodes/scrolled-window.d.ts.map +0 -1
  434. package/dist/nodes/scrolled-window.js +0 -18
  435. package/dist/nodes/scrolled-window.js.map +0 -1
  436. package/dist/nodes/search-bar.d.ts +0 -11
  437. package/dist/nodes/search-bar.d.ts.map +0 -1
  438. package/dist/nodes/search-bar.js +0 -16
  439. package/dist/nodes/search-bar.js.map +0 -1
  440. package/dist/nodes/shortcut.d.ts +0 -19
  441. package/dist/nodes/shortcut.d.ts.map +0 -1
  442. package/dist/nodes/shortcut.js +0 -72
  443. package/dist/nodes/shortcut.js.map +0 -1
  444. package/dist/nodes/slot.d.ts +0 -21
  445. package/dist/nodes/slot.d.ts.map +0 -1
  446. package/dist/nodes/slot.js +0 -102
  447. package/dist/nodes/slot.js.map +0 -1
  448. package/dist/nodes/source-view.d.ts +0 -18
  449. package/dist/nodes/source-view.d.ts.map +0 -1
  450. package/dist/nodes/source-view.js +0 -94
  451. package/dist/nodes/source-view.js.map +0 -1
  452. package/dist/nodes/stack-page.d.ts +0 -22
  453. package/dist/nodes/stack-page.d.ts.map +0 -1
  454. package/dist/nodes/stack-page.js +0 -140
  455. package/dist/nodes/stack-page.js.map +0 -1
  456. package/dist/nodes/stack.d.ts +0 -13
  457. package/dist/nodes/stack.d.ts.map +0 -1
  458. package/dist/nodes/stack.js +0 -21
  459. package/dist/nodes/stack.js.map +0 -1
  460. package/dist/nodes/text-anchor.d.ts +0 -23
  461. package/dist/nodes/text-anchor.d.ts.map +0 -1
  462. package/dist/nodes/text-anchor.js +0 -64
  463. package/dist/nodes/text-anchor.js.map +0 -1
  464. package/dist/nodes/text-content.d.ts +0 -12
  465. package/dist/nodes/text-content.d.ts.map +0 -1
  466. package/dist/nodes/text-content.js +0 -2
  467. package/dist/nodes/text-content.js.map +0 -1
  468. package/dist/nodes/text-paintable.d.ts +0 -19
  469. package/dist/nodes/text-paintable.d.ts.map +0 -1
  470. package/dist/nodes/text-paintable.js +0 -42
  471. package/dist/nodes/text-paintable.js.map +0 -1
  472. package/dist/nodes/text-segment.d.ts +0 -18
  473. package/dist/nodes/text-segment.d.ts.map +0 -1
  474. package/dist/nodes/text-segment.js +0 -38
  475. package/dist/nodes/text-segment.js.map +0 -1
  476. package/dist/nodes/text-tag.d.ts +0 -38
  477. package/dist/nodes/text-tag.d.ts.map +0 -1
  478. package/dist/nodes/text-tag.js +0 -241
  479. package/dist/nodes/text-tag.js.map +0 -1
  480. package/dist/nodes/text-view.d.ts +0 -29
  481. package/dist/nodes/text-view.d.ts.map +0 -1
  482. package/dist/nodes/text-view.js +0 -80
  483. package/dist/nodes/text-view.js.map +0 -1
  484. package/dist/nodes/toggle-group.d.ts +0 -11
  485. package/dist/nodes/toggle-group.d.ts.map +0 -1
  486. package/dist/nodes/toggle-group.js +0 -16
  487. package/dist/nodes/toggle-group.js.map +0 -1
  488. package/dist/nodes/toggle.d.ts +0 -16
  489. package/dist/nodes/toggle.d.ts.map +0 -1
  490. package/dist/nodes/toggle.js +0 -61
  491. package/dist/nodes/toggle.js.map +0 -1
  492. package/dist/nodes/virtual.d.ts +0 -7
  493. package/dist/nodes/virtual.d.ts.map +0 -1
  494. package/dist/nodes/virtual.js +0 -9
  495. package/dist/nodes/virtual.js.map +0 -1
  496. package/dist/nodes/web-view.d.ts +0 -11
  497. package/dist/nodes/web-view.d.ts.map +0 -1
  498. package/dist/nodes/web-view.js +0 -16
  499. package/dist/nodes/web-view.js.map +0 -1
  500. package/dist/nodes/widget.d.ts +0 -26
  501. package/dist/nodes/widget.d.ts.map +0 -1
  502. package/dist/nodes/widget.js +0 -315
  503. package/dist/nodes/widget.js.map +0 -1
  504. package/dist/nodes/window.d.ts +0 -31
  505. package/dist/nodes/window.d.ts.map +0 -1
  506. package/dist/nodes/window.js +0 -122
  507. package/dist/nodes/window.js.map +0 -1
  508. package/dist/portal.d.ts +0 -29
  509. package/dist/portal.d.ts.map +0 -1
  510. package/dist/portal.js +0 -35
  511. package/dist/portal.js.map +0 -1
  512. package/dist/reconciler.d.ts +0 -34
  513. package/dist/reconciler.d.ts.map +0 -1
  514. package/dist/reconciler.js +0 -48
  515. package/dist/reconciler.js.map +0 -1
  516. package/dist/registry.d.ts +0 -18
  517. package/dist/registry.d.ts.map +0 -1
  518. package/dist/registry.js +0 -96
  519. package/dist/registry.js.map +0 -1
  520. package/dist/render.d.ts +0 -117
  521. package/dist/render.d.ts.map +0 -1
  522. package/dist/render.js +0 -159
  523. package/dist/render.js.map +0 -1
  524. package/dist/types.d.ts +0 -5
  525. package/dist/types.d.ts.map +0 -1
  526. package/dist/types.js.map +0 -1
  527. package/src/components/list.tsx +0 -83
  528. package/src/errors.ts +0 -52
  529. package/src/factory.ts +0 -62
  530. package/src/generated/internal.ts +0 -5644
  531. package/src/generated/jsx.ts +0 -19900
  532. package/src/generated/registry.ts +0 -16
  533. package/src/host-config.ts +0 -219
  534. package/src/jsx.ts +0 -1355
  535. package/src/metadata.ts +0 -43
  536. package/src/node.ts +0 -107
  537. package/src/nodes/adjustable.ts +0 -68
  538. package/src/nodes/alert-dialog-response.ts +0 -78
  539. package/src/nodes/animation.ts +0 -402
  540. package/src/nodes/application.ts +0 -61
  541. package/src/nodes/calendar.ts +0 -42
  542. package/src/nodes/color-dialog-button.ts +0 -69
  543. package/src/nodes/column-view-column.ts +0 -189
  544. package/src/nodes/container-slot.ts +0 -87
  545. package/src/nodes/dialog.ts +0 -25
  546. package/src/nodes/drawing-area.ts +0 -62
  547. package/src/nodes/event-controller.ts +0 -100
  548. package/src/nodes/fixed-child.ts +0 -109
  549. package/src/nodes/font-dialog-button.ts +0 -107
  550. package/src/nodes/grid-child.ts +0 -103
  551. package/src/nodes/internal/accessible.ts +0 -155
  552. package/src/nodes/internal/bound-item.ts +0 -4
  553. package/src/nodes/internal/construct.ts +0 -60
  554. package/src/nodes/internal/predicates.ts +0 -80
  555. package/src/nodes/internal/props.ts +0 -51
  556. package/src/nodes/internal/signal-store.ts +0 -141
  557. package/src/nodes/internal/text-buffer-controller.ts +0 -417
  558. package/src/nodes/internal/widget.ts +0 -80
  559. package/src/nodes/level-bar.ts +0 -36
  560. package/src/nodes/list-item-node.ts +0 -29
  561. package/src/nodes/list.ts +0 -1082
  562. package/src/nodes/menu.ts +0 -27
  563. package/src/nodes/models/menu.ts +0 -314
  564. package/src/nodes/navigation-page.ts +0 -154
  565. package/src/nodes/navigation-view.ts +0 -66
  566. package/src/nodes/notebook-page-tab.ts +0 -55
  567. package/src/nodes/notebook-page.ts +0 -189
  568. package/src/nodes/notebook.ts +0 -42
  569. package/src/nodes/overlay-child.ts +0 -109
  570. package/src/nodes/popover-menu.ts +0 -67
  571. package/src/nodes/scale.ts +0 -28
  572. package/src/nodes/scrolled-window.ts +0 -23
  573. package/src/nodes/search-bar.ts +0 -27
  574. package/src/nodes/shortcut.ts +0 -86
  575. package/src/nodes/slot.ts +0 -138
  576. package/src/nodes/source-view.ts +0 -130
  577. package/src/nodes/stack-page.ts +0 -170
  578. package/src/nodes/stack.ts +0 -35
  579. package/src/nodes/text-anchor.ts +0 -79
  580. package/src/nodes/text-content.ts +0 -14
  581. package/src/nodes/text-paintable.ts +0 -51
  582. package/src/nodes/text-segment.ts +0 -55
  583. package/src/nodes/text-tag.ts +0 -293
  584. package/src/nodes/text-view.ts +0 -100
  585. package/src/nodes/toggle-group.ts +0 -27
  586. package/src/nodes/toggle.ts +0 -72
  587. package/src/nodes/virtual.ts +0 -16
  588. package/src/nodes/web-view.ts +0 -22
  589. package/src/nodes/widget.ts +0 -376
  590. package/src/nodes/window.ts +0 -172
  591. package/src/portal.ts +0 -37
  592. package/src/reconciler.ts +0 -52
  593. package/src/registry.ts +0 -117
  594. package/src/render.tsx +0 -192
  595. package/src/types.ts +0 -12
  596. /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.20.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/gir": "0.20.0",
43
- "@gtkx/ffi": "0.20.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,12 +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";
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";