@gtkx/react 0.21.0 → 1.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/README.md +137 -34
  2. package/dist/adw/config.d.ts +2 -0
  3. package/dist/adw/config.d.ts.map +1 -0
  4. package/dist/adw/config.js +2 -0
  5. package/dist/adw/config.js.map +1 -0
  6. package/dist/adw/dialog.d.ts +8 -0
  7. package/dist/adw/dialog.d.ts.map +1 -0
  8. package/dist/adw/dialog.js +25 -0
  9. package/dist/adw/dialog.js.map +1 -0
  10. package/dist/adw/element-behaviors.d.ts +2 -0
  11. package/dist/adw/element-behaviors.d.ts.map +1 -0
  12. package/dist/adw/element-behaviors.js +299 -0
  13. package/dist/adw/element-behaviors.js.map +1 -0
  14. package/dist/adw/element-config.d.ts +9 -0
  15. package/dist/adw/element-config.d.ts.map +1 -0
  16. package/dist/adw/element-config.js +137 -0
  17. package/dist/adw/element-config.js.map +1 -0
  18. package/dist/adw/index.d.ts +4 -0
  19. package/dist/adw/index.d.ts.map +1 -0
  20. package/dist/adw/index.js +3 -0
  21. package/dist/adw/index.js.map +1 -0
  22. package/dist/adw/prop-types.d.ts +29 -0
  23. package/dist/adw/prop-types.d.ts.map +1 -0
  24. package/dist/adw/prop-types.js +2 -0
  25. package/dist/adw/prop-types.js.map +1 -0
  26. package/dist/bootstrap.d.ts +2 -0
  27. package/dist/bootstrap.d.ts.map +1 -0
  28. package/dist/bootstrap.js +5 -0
  29. package/dist/bootstrap.js.map +1 -0
  30. package/dist/components/application.d.ts +10 -0
  31. package/dist/components/application.d.ts.map +1 -0
  32. package/dist/components/application.js +39 -0
  33. package/dist/components/application.js.map +1 -0
  34. package/dist/components/element.d.ts +6 -0
  35. package/dist/components/element.d.ts.map +1 -0
  36. package/dist/components/element.js +29 -0
  37. package/dist/components/element.js.map +1 -0
  38. package/dist/components/window.d.ts +8 -0
  39. package/dist/components/window.d.ts.map +1 -0
  40. package/dist/components/window.js +22 -0
  41. package/dist/components/window.js.map +1 -0
  42. package/dist/config.d.ts +4 -0
  43. package/dist/config.d.ts.map +1 -0
  44. package/dist/config.js +3 -0
  45. package/dist/config.js.map +1 -0
  46. package/dist/element-behaviors.d.ts +2 -0
  47. package/dist/element-behaviors.d.ts.map +1 -0
  48. package/dist/element-behaviors.js +348 -0
  49. package/dist/element-behaviors.js.map +1 -0
  50. package/dist/element-config.d.ts +10 -0
  51. package/dist/element-config.d.ts.map +1 -0
  52. package/dist/element-config.js +146 -0
  53. package/dist/element-config.js.map +1 -0
  54. package/dist/hooks/use-application.d.ts +9 -0
  55. package/dist/hooks/use-application.d.ts.map +1 -0
  56. package/dist/hooks/use-application.js +14 -0
  57. package/dist/hooks/use-application.js.map +1 -0
  58. package/dist/hooks/use-bind-setting.d.ts +23 -0
  59. package/dist/hooks/use-bind-setting.d.ts.map +1 -0
  60. package/dist/hooks/use-bind-setting.js +30 -0
  61. package/dist/hooks/use-bind-setting.js.map +1 -0
  62. package/dist/hooks/use-merged-refs.d.ts +8 -0
  63. package/dist/hooks/use-merged-refs.d.ts.map +1 -0
  64. package/dist/hooks/use-merged-refs.js +48 -0
  65. package/dist/hooks/use-merged-refs.js.map +1 -0
  66. package/dist/hooks/use-object-value.d.ts +5 -0
  67. package/dist/hooks/use-object-value.d.ts.map +1 -0
  68. package/dist/hooks/use-object-value.js +29 -0
  69. package/dist/hooks/use-object-value.js.map +1 -0
  70. package/dist/hooks/use-parent-window.d.ts +9 -0
  71. package/dist/hooks/use-parent-window.d.ts.map +1 -0
  72. package/dist/hooks/use-parent-window.js +8 -0
  73. package/dist/hooks/use-parent-window.js.map +1 -0
  74. package/dist/hooks/use-property.d.ts +14 -0
  75. package/dist/hooks/use-property.d.ts.map +1 -0
  76. package/dist/hooks/use-property.js +14 -0
  77. package/dist/hooks/use-property.js.map +1 -0
  78. package/dist/hooks/use-setting.d.ts +14 -0
  79. package/dist/hooks/use-setting.d.ts.map +1 -0
  80. package/dist/hooks/use-setting.js +20 -0
  81. package/dist/hooks/use-setting.js.map +1 -0
  82. package/dist/hooks/use-signal.d.ts +24 -0
  83. package/dist/hooks/use-signal.d.ts.map +1 -0
  84. package/dist/hooks/use-signal.js +31 -0
  85. package/dist/hooks/use-signal.js.map +1 -0
  86. package/dist/index.d.ts +13 -7
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +9 -7
  89. package/dist/index.js.map +1 -1
  90. package/dist/internal.d.ts +13 -0
  91. package/dist/internal.d.ts.map +1 -0
  92. package/dist/internal.js +12 -0
  93. package/dist/internal.js.map +1 -0
  94. package/dist/prop-types.d.ts +110 -0
  95. package/dist/prop-types.d.ts.map +1 -0
  96. package/dist/prop-types.js +2 -0
  97. package/dist/prop-types.js.map +1 -0
  98. package/dist/reconciler/apply-props.d.ts +11 -0
  99. package/dist/reconciler/apply-props.d.ts.map +1 -0
  100. package/dist/reconciler/apply-props.js +190 -0
  101. package/dist/reconciler/apply-props.js.map +1 -0
  102. package/dist/reconciler/behaviors.d.ts +59 -0
  103. package/dist/reconciler/behaviors.d.ts.map +1 -0
  104. package/dist/reconciler/behaviors.js +172 -0
  105. package/dist/reconciler/behaviors.js.map +1 -0
  106. package/dist/reconciler/child-routing.d.ts +5 -0
  107. package/dist/reconciler/child-routing.d.ts.map +1 -0
  108. package/dist/reconciler/child-routing.js +156 -0
  109. package/dist/reconciler/child-routing.js.map +1 -0
  110. package/dist/reconciler/host-config.d.ts +9 -0
  111. package/dist/reconciler/host-config.d.ts.map +1 -0
  112. package/dist/reconciler/host-config.js +214 -0
  113. package/dist/reconciler/host-config.js.map +1 -0
  114. package/dist/reconciler/instance.d.ts +5 -0
  115. package/dist/reconciler/instance.d.ts.map +1 -0
  116. package/dist/reconciler/instance.js +49 -0
  117. package/dist/reconciler/instance.js.map +1 -0
  118. package/dist/reconciler/metadata.d.ts +17 -0
  119. package/dist/reconciler/metadata.d.ts.map +1 -0
  120. package/dist/reconciler/metadata.js +82 -0
  121. package/dist/reconciler/metadata.js.map +1 -0
  122. package/dist/reconciler/node.d.ts +76 -0
  123. package/dist/reconciler/node.d.ts.map +1 -0
  124. package/dist/reconciler/node.js +53 -0
  125. package/dist/reconciler/node.js.map +1 -0
  126. package/dist/reconciler/placement.d.ts +5 -0
  127. package/dist/reconciler/placement.d.ts.map +1 -0
  128. package/dist/reconciler/placement.js +175 -0
  129. package/dist/reconciler/placement.js.map +1 -0
  130. package/dist/reconciler/registry.d.ts +92 -0
  131. package/dist/reconciler/registry.d.ts.map +1 -0
  132. package/dist/reconciler/registry.js +64 -0
  133. package/dist/reconciler/registry.js.map +1 -0
  134. package/dist/reconciler/root-element.d.ts +11 -0
  135. package/dist/reconciler/root-element.d.ts.map +1 -0
  136. package/dist/reconciler/root-element.js +7 -0
  137. package/dist/reconciler/root-element.js.map +1 -0
  138. package/dist/reconciler/root.d.ts +56 -0
  139. package/dist/reconciler/root.d.ts.map +1 -0
  140. package/dist/reconciler/root.js +109 -0
  141. package/dist/reconciler/root.js.map +1 -0
  142. package/dist/reconciler/signals.d.ts +10 -0
  143. package/dist/reconciler/signals.d.ts.map +1 -0
  144. package/dist/reconciler/signals.js +70 -0
  145. package/dist/reconciler/signals.js.map +1 -0
  146. package/dist/reconciler/text.d.ts +19 -0
  147. package/dist/reconciler/text.d.ts.map +1 -0
  148. package/dist/reconciler/text.js +276 -0
  149. package/dist/reconciler/text.js.map +1 -0
  150. package/dist/utils/accessible-metadata.d.ts +12 -0
  151. package/dist/utils/accessible-metadata.d.ts.map +1 -0
  152. package/dist/utils/accessible-metadata.js +25 -0
  153. package/dist/utils/accessible-metadata.js.map +1 -0
  154. package/dist/utils/accessible-props.d.ts +60 -0
  155. package/dist/utils/accessible-props.d.ts.map +1 -0
  156. package/dist/utils/accessible-props.js +181 -0
  157. package/dist/utils/accessible-props.js.map +1 -0
  158. package/dist/utils/ref-prop.d.ts +15 -0
  159. package/dist/utils/ref-prop.d.ts.map +1 -0
  160. package/dist/utils/ref-prop.js +18 -0
  161. package/dist/utils/ref-prop.js.map +1 -0
  162. package/dist/utils/settings.d.ts +17 -0
  163. package/dist/utils/settings.d.ts.map +1 -0
  164. package/dist/utils/settings.js +37 -0
  165. package/dist/utils/settings.js.map +1 -0
  166. package/dist/utils/variant.d.ts +57 -0
  167. package/dist/utils/variant.d.ts.map +1 -0
  168. package/dist/utils/variant.js +197 -0
  169. package/dist/utils/variant.js.map +1 -0
  170. package/env.d.ts +9 -0
  171. package/package.json +49 -10
  172. package/src/adw/config.ts +1 -0
  173. package/src/adw/dialog.tsx +35 -0
  174. package/src/adw/element-behaviors.ts +379 -0
  175. package/src/adw/element-config.ts +140 -0
  176. package/src/adw/index.ts +4 -0
  177. package/src/adw/prop-types.ts +42 -0
  178. package/src/bootstrap.ts +5 -0
  179. package/src/components/application.tsx +62 -0
  180. package/src/components/element.tsx +47 -0
  181. package/src/components/window.tsx +35 -0
  182. package/src/config.ts +3 -0
  183. package/src/element-behaviors.ts +424 -0
  184. package/src/element-config.ts +148 -0
  185. package/src/env.d.ts +1 -0
  186. package/src/hooks/use-application.ts +19 -0
  187. package/src/hooks/use-bind-setting.ts +51 -0
  188. package/src/hooks/use-merged-refs.ts +64 -0
  189. package/src/hooks/use-object-value.ts +54 -0
  190. package/src/hooks/use-parent-window.ts +11 -0
  191. package/src/hooks/use-property.ts +23 -0
  192. package/src/hooks/use-setting.ts +34 -0
  193. package/src/hooks/use-signal.ts +60 -0
  194. package/src/index.ts +14 -14
  195. package/src/internal.ts +13 -0
  196. package/src/prop-types.ts +142 -0
  197. package/src/reconciler/apply-props.ts +265 -0
  198. package/src/reconciler/behaviors.ts +324 -0
  199. package/src/reconciler/child-routing.ts +202 -0
  200. package/src/reconciler/host-config.ts +278 -0
  201. package/src/reconciler/instance.ts +82 -0
  202. package/src/reconciler/metadata.ts +119 -0
  203. package/src/reconciler/node.ts +161 -0
  204. package/src/reconciler/placement.ts +255 -0
  205. package/src/reconciler/registry.ts +161 -0
  206. package/src/reconciler/root-element.ts +12 -0
  207. package/src/reconciler/root.ts +175 -0
  208. package/src/reconciler/signals.ts +113 -0
  209. package/src/reconciler/text.ts +407 -0
  210. package/src/utils/accessible-metadata.ts +31 -0
  211. package/src/utils/accessible-props.ts +279 -0
  212. package/src/utils/ref-prop.ts +30 -0
  213. package/src/utils/settings.ts +69 -0
  214. package/src/utils/variant.ts +368 -0
  215. package/dist/components/compound.d.ts +0 -40
  216. package/dist/components/compound.d.ts.map +0 -1
  217. package/dist/components/compound.js +0 -46
  218. package/dist/components/compound.js.map +0 -1
  219. package/dist/components/list.d.ts +0 -75
  220. package/dist/components/list.d.ts.map +0 -1
  221. package/dist/components/list.js +0 -81
  222. package/dist/components/list.js.map +0 -1
  223. package/dist/components/slot-widget.d.ts +0 -15
  224. package/dist/components/slot-widget.d.ts.map +0 -1
  225. package/dist/components/slot-widget.js +0 -37
  226. package/dist/components/slot-widget.js.map +0 -1
  227. package/dist/errors.d.ts +0 -15
  228. package/dist/errors.d.ts.map +0 -1
  229. package/dist/errors.js +0 -44
  230. package/dist/errors.js.map +0 -1
  231. package/dist/factory.d.ts +0 -5
  232. package/dist/factory.d.ts.map +0 -1
  233. package/dist/factory.js +0 -37
  234. package/dist/factory.js.map +0 -1
  235. package/dist/generated/compounds.d.ts +0 -2672
  236. package/dist/generated/compounds.d.ts.map +0 -1
  237. package/dist/generated/compounds.js +0 -2624
  238. package/dist/generated/compounds.js.map +0 -1
  239. package/dist/generated/internal.d.ts +0 -16
  240. package/dist/generated/internal.d.ts.map +0 -1
  241. package/dist/generated/internal.js +0 -3638
  242. package/dist/generated/internal.js.map +0 -1
  243. package/dist/generated/jsx.d.ts +0 -17074
  244. package/dist/generated/jsx.d.ts.map +0 -1
  245. package/dist/generated/jsx.js +0 -6715
  246. package/dist/generated/jsx.js.map +0 -1
  247. package/dist/generated/registry.d.ts +0 -5
  248. package/dist/generated/registry.d.ts.map +0 -1
  249. package/dist/generated/registry.js +0 -13
  250. package/dist/generated/registry.js.map +0 -1
  251. package/dist/host-config.d.ts +0 -24
  252. package/dist/host-config.d.ts.map +0 -1
  253. package/dist/host-config.js +0 -172
  254. package/dist/host-config.js.map +0 -1
  255. package/dist/jsx.d.ts +0 -974
  256. package/dist/jsx.d.ts.map +0 -1
  257. package/dist/jsx.js +0 -8
  258. package/dist/jsx.js.map +0 -1
  259. package/dist/metadata.d.ts +0 -5
  260. package/dist/metadata.d.ts.map +0 -1
  261. package/dist/metadata.js +0 -33
  262. package/dist/metadata.js.map +0 -1
  263. package/dist/node.d.ts +0 -25
  264. package/dist/node.d.ts.map +0 -1
  265. package/dist/node.js +0 -85
  266. package/dist/node.js.map +0 -1
  267. package/dist/nodes/adjustable.d.ts +0 -11
  268. package/dist/nodes/adjustable.d.ts.map +0 -1
  269. package/dist/nodes/adjustable.js +0 -46
  270. package/dist/nodes/adjustable.js.map +0 -1
  271. package/dist/nodes/alert-dialog-response.d.ts +0 -15
  272. package/dist/nodes/alert-dialog-response.d.ts.map +0 -1
  273. package/dist/nodes/alert-dialog-response.js +0 -61
  274. package/dist/nodes/alert-dialog-response.js.map +0 -1
  275. package/dist/nodes/alert-dialog.d.ts +0 -14
  276. package/dist/nodes/alert-dialog.d.ts.map +0 -1
  277. package/dist/nodes/alert-dialog.js +0 -41
  278. package/dist/nodes/alert-dialog.js.map +0 -1
  279. package/dist/nodes/animation.d.ts +0 -39
  280. package/dist/nodes/animation.d.ts.map +0 -1
  281. package/dist/nodes/animation.js +0 -326
  282. package/dist/nodes/animation.js.map +0 -1
  283. package/dist/nodes/application.d.ts +0 -12
  284. package/dist/nodes/application.d.ts.map +0 -1
  285. package/dist/nodes/application.js +0 -51
  286. package/dist/nodes/application.js.map +0 -1
  287. package/dist/nodes/calendar.d.ts +0 -18
  288. package/dist/nodes/calendar.d.ts.map +0 -1
  289. package/dist/nodes/calendar.js +0 -28
  290. package/dist/nodes/calendar.js.map +0 -1
  291. package/dist/nodes/color-dialog-button.d.ts +0 -15
  292. package/dist/nodes/color-dialog-button.d.ts.map +0 -1
  293. package/dist/nodes/color-dialog-button.js +0 -43
  294. package/dist/nodes/color-dialog-button.js.map +0 -1
  295. package/dist/nodes/column-view-column.d.ts +0 -36
  296. package/dist/nodes/column-view-column.d.ts.map +0 -1
  297. package/dist/nodes/column-view-column.js +0 -168
  298. package/dist/nodes/column-view-column.js.map +0 -1
  299. package/dist/nodes/container-slot.d.ts +0 -18
  300. package/dist/nodes/container-slot.d.ts.map +0 -1
  301. package/dist/nodes/container-slot.js +0 -81
  302. package/dist/nodes/container-slot.js.map +0 -1
  303. package/dist/nodes/dialog.d.ts +0 -10
  304. package/dist/nodes/dialog.d.ts.map +0 -1
  305. package/dist/nodes/dialog.js +0 -20
  306. package/dist/nodes/dialog.js.map +0 -1
  307. package/dist/nodes/drawing-area.d.ts +0 -19
  308. package/dist/nodes/drawing-area.d.ts.map +0 -1
  309. package/dist/nodes/drawing-area.js +0 -40
  310. package/dist/nodes/drawing-area.js.map +0 -1
  311. package/dist/nodes/event-controller.d.ts +0 -15
  312. package/dist/nodes/event-controller.d.ts.map +0 -1
  313. package/dist/nodes/event-controller.js +0 -73
  314. package/dist/nodes/event-controller.js.map +0 -1
  315. package/dist/nodes/fixed-child.d.ts +0 -19
  316. package/dist/nodes/fixed-child.d.ts.map +0 -1
  317. package/dist/nodes/fixed-child.js +0 -99
  318. package/dist/nodes/fixed-child.js.map +0 -1
  319. package/dist/nodes/font-dialog-button.d.ts +0 -15
  320. package/dist/nodes/font-dialog-button.d.ts.map +0 -1
  321. package/dist/nodes/font-dialog-button.js +0 -76
  322. package/dist/nodes/font-dialog-button.js.map +0 -1
  323. package/dist/nodes/grid-child.d.ts +0 -19
  324. package/dist/nodes/grid-child.d.ts.map +0 -1
  325. package/dist/nodes/grid-child.js +0 -94
  326. package/dist/nodes/grid-child.js.map +0 -1
  327. package/dist/nodes/internal/accessible.d.ts +0 -5
  328. package/dist/nodes/internal/accessible.d.ts.map +0 -1
  329. package/dist/nodes/internal/accessible.js +0 -119
  330. package/dist/nodes/internal/accessible.js.map +0 -1
  331. package/dist/nodes/internal/bound-item.d.ts +0 -4
  332. package/dist/nodes/internal/bound-item.d.ts.map +0 -1
  333. package/dist/nodes/internal/bound-item.js +0 -2
  334. package/dist/nodes/internal/bound-item.js.map +0 -1
  335. package/dist/nodes/internal/construct.d.ts +0 -3
  336. package/dist/nodes/internal/construct.d.ts.map +0 -1
  337. package/dist/nodes/internal/construct.js +0 -44
  338. package/dist/nodes/internal/construct.js.map +0 -1
  339. package/dist/nodes/internal/predicates.d.ts +0 -51
  340. package/dist/nodes/internal/predicates.d.ts.map +0 -1
  341. package/dist/nodes/internal/predicates.js +0 -36
  342. package/dist/nodes/internal/predicates.js.map +0 -1
  343. package/dist/nodes/internal/props.d.ts +0 -6
  344. package/dist/nodes/internal/props.d.ts.map +0 -1
  345. package/dist/nodes/internal/props.js +0 -43
  346. package/dist/nodes/internal/props.js.map +0 -1
  347. package/dist/nodes/internal/signal-store.d.ts +0 -22
  348. package/dist/nodes/internal/signal-store.d.ts.map +0 -1
  349. package/dist/nodes/internal/signal-store.js +0 -98
  350. package/dist/nodes/internal/signal-store.js.map +0 -1
  351. package/dist/nodes/internal/text-buffer-controller.d.ts +0 -40
  352. package/dist/nodes/internal/text-buffer-controller.d.ts.map +0 -1
  353. package/dist/nodes/internal/text-buffer-controller.js +0 -327
  354. package/dist/nodes/internal/text-buffer-controller.js.map +0 -1
  355. package/dist/nodes/internal/widget.d.ts +0 -8
  356. package/dist/nodes/internal/widget.d.ts.map +0 -1
  357. package/dist/nodes/internal/widget.js +0 -68
  358. package/dist/nodes/internal/widget.js.map +0 -1
  359. package/dist/nodes/level-bar.d.ts +0 -12
  360. package/dist/nodes/level-bar.d.ts.map +0 -1
  361. package/dist/nodes/level-bar.js +0 -24
  362. package/dist/nodes/level-bar.js.map +0 -1
  363. package/dist/nodes/list-item-node.d.ts +0 -12
  364. package/dist/nodes/list-item-node.d.ts.map +0 -1
  365. package/dist/nodes/list-item-node.js +0 -45
  366. package/dist/nodes/list-item-node.js.map +0 -1
  367. package/dist/nodes/list.d.ts +0 -100
  368. package/dist/nodes/list.d.ts.map +0 -1
  369. package/dist/nodes/list.js +0 -950
  370. package/dist/nodes/list.js.map +0 -1
  371. package/dist/nodes/menu.d.ts +0 -7
  372. package/dist/nodes/menu.d.ts.map +0 -1
  373. package/dist/nodes/menu.js +0 -20
  374. package/dist/nodes/menu.js.map +0 -1
  375. package/dist/nodes/models/menu.d.ts +0 -47
  376. package/dist/nodes/models/menu.d.ts.map +0 -1
  377. package/dist/nodes/models/menu.js +0 -240
  378. package/dist/nodes/models/menu.js.map +0 -1
  379. package/dist/nodes/navigation-page.d.ts +0 -19
  380. package/dist/nodes/navigation-page.d.ts.map +0 -1
  381. package/dist/nodes/navigation-page.js +0 -129
  382. package/dist/nodes/navigation-page.js.map +0 -1
  383. package/dist/nodes/navigation-view.d.ts +0 -19
  384. package/dist/nodes/navigation-view.d.ts.map +0 -1
  385. package/dist/nodes/navigation-view.js +0 -51
  386. package/dist/nodes/navigation-view.js.map +0 -1
  387. package/dist/nodes/notebook-page-tab.d.ts +0 -15
  388. package/dist/nodes/notebook-page-tab.d.ts.map +0 -1
  389. package/dist/nodes/notebook-page-tab.js +0 -40
  390. package/dist/nodes/notebook-page-tab.js.map +0 -1
  391. package/dist/nodes/notebook-page.d.ts +0 -29
  392. package/dist/nodes/notebook-page.d.ts.map +0 -1
  393. package/dist/nodes/notebook-page.js +0 -151
  394. package/dist/nodes/notebook-page.js.map +0 -1
  395. package/dist/nodes/notebook.d.ts +0 -16
  396. package/dist/nodes/notebook.d.ts.map +0 -1
  397. package/dist/nodes/notebook.js +0 -31
  398. package/dist/nodes/notebook.js.map +0 -1
  399. package/dist/nodes/overlay-child.d.ts +0 -20
  400. package/dist/nodes/overlay-child.d.ts.map +0 -1
  401. package/dist/nodes/overlay-child.js +0 -109
  402. package/dist/nodes/overlay-child.js.map +0 -1
  403. package/dist/nodes/popover-menu.d.ts +0 -19
  404. package/dist/nodes/popover-menu.d.ts.map +0 -1
  405. package/dist/nodes/popover-menu.js +0 -54
  406. package/dist/nodes/popover-menu.js.map +0 -1
  407. package/dist/nodes/scale.d.ts +0 -10
  408. package/dist/nodes/scale.d.ts.map +0 -1
  409. package/dist/nodes/scale.js +0 -19
  410. package/dist/nodes/scale.js.map +0 -1
  411. package/dist/nodes/scrolled-window.d.ts +0 -11
  412. package/dist/nodes/scrolled-window.d.ts.map +0 -1
  413. package/dist/nodes/scrolled-window.js +0 -18
  414. package/dist/nodes/scrolled-window.js.map +0 -1
  415. package/dist/nodes/search-bar.d.ts +0 -11
  416. package/dist/nodes/search-bar.d.ts.map +0 -1
  417. package/dist/nodes/search-bar.js +0 -16
  418. package/dist/nodes/search-bar.js.map +0 -1
  419. package/dist/nodes/shortcut.d.ts +0 -19
  420. package/dist/nodes/shortcut.d.ts.map +0 -1
  421. package/dist/nodes/shortcut.js +0 -72
  422. package/dist/nodes/shortcut.js.map +0 -1
  423. package/dist/nodes/slot.d.ts +0 -21
  424. package/dist/nodes/slot.d.ts.map +0 -1
  425. package/dist/nodes/slot.js +0 -102
  426. package/dist/nodes/slot.js.map +0 -1
  427. package/dist/nodes/source-view.d.ts +0 -18
  428. package/dist/nodes/source-view.d.ts.map +0 -1
  429. package/dist/nodes/source-view.js +0 -94
  430. package/dist/nodes/source-view.js.map +0 -1
  431. package/dist/nodes/spin-row.d.ts +0 -14
  432. package/dist/nodes/spin-row.d.ts.map +0 -1
  433. package/dist/nodes/spin-row.js +0 -46
  434. package/dist/nodes/spin-row.js.map +0 -1
  435. package/dist/nodes/stack-page.d.ts +0 -22
  436. package/dist/nodes/stack-page.d.ts.map +0 -1
  437. package/dist/nodes/stack-page.js +0 -140
  438. package/dist/nodes/stack-page.js.map +0 -1
  439. package/dist/nodes/stack.d.ts +0 -13
  440. package/dist/nodes/stack.d.ts.map +0 -1
  441. package/dist/nodes/stack.js +0 -21
  442. package/dist/nodes/stack.js.map +0 -1
  443. package/dist/nodes/switch-row.d.ts +0 -11
  444. package/dist/nodes/switch-row.d.ts.map +0 -1
  445. package/dist/nodes/switch-row.js +0 -15
  446. package/dist/nodes/switch-row.js.map +0 -1
  447. package/dist/nodes/text-anchor.d.ts +0 -23
  448. package/dist/nodes/text-anchor.d.ts.map +0 -1
  449. package/dist/nodes/text-anchor.js +0 -74
  450. package/dist/nodes/text-anchor.js.map +0 -1
  451. package/dist/nodes/text-content.d.ts +0 -12
  452. package/dist/nodes/text-content.d.ts.map +0 -1
  453. package/dist/nodes/text-content.js +0 -2
  454. package/dist/nodes/text-content.js.map +0 -1
  455. package/dist/nodes/text-paintable.d.ts +0 -19
  456. package/dist/nodes/text-paintable.d.ts.map +0 -1
  457. package/dist/nodes/text-paintable.js +0 -42
  458. package/dist/nodes/text-paintable.js.map +0 -1
  459. package/dist/nodes/text-segment.d.ts +0 -18
  460. package/dist/nodes/text-segment.d.ts.map +0 -1
  461. package/dist/nodes/text-segment.js +0 -38
  462. package/dist/nodes/text-segment.js.map +0 -1
  463. package/dist/nodes/text-tag.d.ts +0 -38
  464. package/dist/nodes/text-tag.d.ts.map +0 -1
  465. package/dist/nodes/text-tag.js +0 -247
  466. package/dist/nodes/text-tag.js.map +0 -1
  467. package/dist/nodes/text-view.d.ts +0 -29
  468. package/dist/nodes/text-view.d.ts.map +0 -1
  469. package/dist/nodes/text-view.js +0 -80
  470. package/dist/nodes/text-view.js.map +0 -1
  471. package/dist/nodes/toggle-group.d.ts +0 -17
  472. package/dist/nodes/toggle-group.d.ts.map +0 -1
  473. package/dist/nodes/toggle-group.js +0 -65
  474. package/dist/nodes/toggle-group.js.map +0 -1
  475. package/dist/nodes/toggle.d.ts +0 -16
  476. package/dist/nodes/toggle.d.ts.map +0 -1
  477. package/dist/nodes/toggle.js +0 -61
  478. package/dist/nodes/toggle.js.map +0 -1
  479. package/dist/nodes/virtual.d.ts +0 -7
  480. package/dist/nodes/virtual.d.ts.map +0 -1
  481. package/dist/nodes/virtual.js +0 -9
  482. package/dist/nodes/virtual.js.map +0 -1
  483. package/dist/nodes/web-view.d.ts +0 -11
  484. package/dist/nodes/web-view.d.ts.map +0 -1
  485. package/dist/nodes/web-view.js +0 -16
  486. package/dist/nodes/web-view.js.map +0 -1
  487. package/dist/nodes/widget.d.ts +0 -26
  488. package/dist/nodes/widget.d.ts.map +0 -1
  489. package/dist/nodes/widget.js +0 -308
  490. package/dist/nodes/widget.js.map +0 -1
  491. package/dist/nodes/window.d.ts +0 -31
  492. package/dist/nodes/window.d.ts.map +0 -1
  493. package/dist/nodes/window.js +0 -122
  494. package/dist/nodes/window.js.map +0 -1
  495. package/dist/portal.d.ts +0 -29
  496. package/dist/portal.d.ts.map +0 -1
  497. package/dist/portal.js +0 -35
  498. package/dist/portal.js.map +0 -1
  499. package/dist/reconciler.d.ts +0 -34
  500. package/dist/reconciler.d.ts.map +0 -1
  501. package/dist/reconciler.js +0 -48
  502. package/dist/reconciler.js.map +0 -1
  503. package/dist/registry.d.ts +0 -18
  504. package/dist/registry.d.ts.map +0 -1
  505. package/dist/registry.js +0 -98
  506. package/dist/registry.js.map +0 -1
  507. package/dist/render.d.ts +0 -117
  508. package/dist/render.d.ts.map +0 -1
  509. package/dist/render.js +0 -159
  510. package/dist/render.js.map +0 -1
  511. package/dist/types.d.ts +0 -6
  512. package/dist/types.d.ts.map +0 -1
  513. package/dist/types.js +0 -2
  514. package/dist/types.js.map +0 -1
  515. package/dist/use-property.d.ts +0 -29
  516. package/dist/use-property.d.ts.map +0 -1
  517. package/dist/use-property.js +0 -44
  518. package/dist/use-property.js.map +0 -1
  519. package/dist/use-setting.d.ts +0 -36
  520. package/dist/use-setting.d.ts.map +0 -1
  521. package/dist/use-setting.js +0 -68
  522. package/dist/use-setting.js.map +0 -1
  523. package/src/components/compound.tsx +0 -57
  524. package/src/components/list.tsx +0 -140
  525. package/src/components/slot-widget.tsx +0 -46
  526. package/src/errors.ts +0 -53
  527. package/src/factory.ts +0 -62
  528. package/src/generated/compounds.ts +0 -2741
  529. package/src/generated/internal.ts +0 -3642
  530. package/src/generated/jsx.ts +0 -17383
  531. package/src/generated/registry.ts +0 -17
  532. package/src/host-config.ts +0 -219
  533. package/src/jsx.ts +0 -1033
  534. package/src/metadata.ts +0 -43
  535. package/src/node.ts +0 -107
  536. package/src/nodes/adjustable.ts +0 -68
  537. package/src/nodes/alert-dialog-response.ts +0 -78
  538. package/src/nodes/alert-dialog.ts +0 -55
  539. package/src/nodes/animation.ts +0 -409
  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 -100
  545. package/src/nodes/dialog.ts +0 -25
  546. package/src/nodes/drawing-area.ts +0 -53
  547. package/src/nodes/event-controller.ts +0 -96
  548. package/src/nodes/fixed-child.ts +0 -122
  549. package/src/nodes/font-dialog-button.ts +0 -107
  550. package/src/nodes/grid-child.ts +0 -116
  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 -74
  559. package/src/nodes/level-bar.ts +0 -36
  560. package/src/nodes/list-item-node.ts +0 -53
  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 -130
  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/spin-row.ts +0 -72
  578. package/src/nodes/stack-page.ts +0 -170
  579. package/src/nodes/stack.ts +0 -35
  580. package/src/nodes/switch-row.ts +0 -26
  581. package/src/nodes/text-anchor.ts +0 -88
  582. package/src/nodes/text-content.ts +0 -14
  583. package/src/nodes/text-paintable.ts +0 -51
  584. package/src/nodes/text-segment.ts +0 -55
  585. package/src/nodes/text-tag.ts +0 -298
  586. package/src/nodes/text-view.ts +0 -100
  587. package/src/nodes/toggle-group.ts +0 -81
  588. package/src/nodes/toggle.ts +0 -72
  589. package/src/nodes/virtual.ts +0 -16
  590. package/src/nodes/web-view.ts +0 -22
  591. package/src/nodes/widget.ts +0 -369
  592. package/src/nodes/window.ts +0 -172
  593. package/src/portal.ts +0 -37
  594. package/src/reconciler.ts +0 -52
  595. package/src/registry.ts +0 -119
  596. package/src/render.tsx +0 -192
  597. package/src/types.ts +0 -13
  598. package/src/use-property.ts +0 -58
  599. package/src/use-setting.ts +0 -96
@@ -0,0 +1,175 @@
1
+ import type { ErrorInfo, ReactNode } from "react";
2
+ import * as Gdk from "@gtkx/gi/gdk";
3
+ import { createLogger, type Logger } from "@gtkx/utils";
4
+ import { ConcurrentRoot } from "react-reconciler/constants.js";
5
+ import { type Container, reconciler } from "./host-config.js";
6
+ import { rootElement } from "./root-element.js";
7
+ import { endSuppressionNow } from "./signals.js";
8
+
9
+ type OpaqueRoot = { [opaqueRoot]: true };
10
+
11
+ type RootErrorCallbacks = {
12
+ onUncaughtError?: (error: unknown, info: ErrorInfo) => void;
13
+ onCaughtError?: (error: unknown, info: ErrorInfo) => void;
14
+ onRecoverableError?: (error: unknown, info: ErrorInfo) => void;
15
+ };
16
+
17
+ type ReconcilerRootOptions = RootErrorCallbacks & { containerInfo: Container };
18
+
19
+ /** A root that mounts an element tree into an explicit container and reports render errors. */
20
+ type ReconcilerRoot = {
21
+ update: (element: ReactNode) => void;
22
+ unmount: (teardown: (root: ReconcilerRoot) => Promise<void>) => Promise<void>;
23
+ };
24
+
25
+ /** The object {@link createRoot} returns: it renders an element tree into a container and can tear it down. */
26
+ type Root = {
27
+ render: (element: ReactNode) => void;
28
+ unmount: () => void;
29
+ };
30
+
31
+ type ErrorHandler = (error: unknown) => void;
32
+ type ErrorHandlerSlot = { get: () => ErrorHandler | null; set: (handler: ErrorHandler) => ErrorHandler | null };
33
+
34
+ declare const opaqueRoot: unique symbol;
35
+ const log: Logger = createLogger("react");
36
+ const activeRoots: Set<OpaqueRoot> = new Set();
37
+ const errorHandlerSlot = createErrorHandlerSlot();
38
+
39
+ function createErrorHandlerSlot(): ErrorHandlerSlot {
40
+ let current: ErrorHandler | null = null;
41
+
42
+ return {
43
+ get: () => current,
44
+ set: (handler) => {
45
+ const previous = current;
46
+ current = handler;
47
+
48
+ return previous;
49
+ },
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Installs a process-wide handler for errors thrown while rendering or applying an update.
55
+ *
56
+ * @param handler The handler to install.
57
+ * @returns The previously installed handler, or null.
58
+ */
59
+ const setReconcilerErrorHandler = (handler: ErrorHandler): ErrorHandler | null => errorHandlerSlot.set(handler);
60
+
61
+ const rethrowUncaughtRenderError = (error: unknown): never => {
62
+ endSuppressionNow();
63
+ throw error;
64
+ };
65
+
66
+ const logCaughtRenderError = (error: unknown): void => {
67
+ endSuppressionNow();
68
+ log.error("caught render error", error);
69
+ };
70
+
71
+ const openContainer = (containerInfo: Container, callbacks: RootErrorCallbacks): OpaqueRoot => {
72
+ const container = reconciler.createContainer(
73
+ containerInfo,
74
+ ConcurrentRoot,
75
+ null,
76
+ false,
77
+ null,
78
+ "",
79
+ (error, info) => {
80
+ errorHandlerSlot.get()?.(error);
81
+ callbacks.onUncaughtError?.(error, info);
82
+ },
83
+ (error, info) => {
84
+ errorHandlerSlot.get()?.(error);
85
+ callbacks.onCaughtError?.(error, info);
86
+ },
87
+ (error, info) => {
88
+ callbacks.onRecoverableError?.(error, info);
89
+ },
90
+ (): void => undefined,
91
+ ) as OpaqueRoot;
92
+
93
+ activeRoots.add(container);
94
+
95
+ return container;
96
+ };
97
+
98
+ const unmountContainer = (container: OpaqueRoot): void => {
99
+ reconciler.updateContainer(null, container, null, null);
100
+ activeRoots.delete(container);
101
+ };
102
+
103
+ /**
104
+ * Creates a root that mounts an element tree into a container, routing render errors to the supplied callbacks.
105
+ *
106
+ * @param options The container to render into and the error callbacks to route failures to.
107
+ * @returns A {@link ReconcilerRoot}.
108
+ */
109
+ const createReconcilerRoot = (options: ReconcilerRootOptions): ReconcilerRoot => {
110
+ const container = openContainer(options.containerInfo, options);
111
+
112
+ const root: ReconcilerRoot = {
113
+ update: (element) => {
114
+ reconciler.updateContainer(element, container, null, null);
115
+ },
116
+ unmount: async (teardown) => {
117
+ await teardown(root);
118
+ activeRoots.delete(container);
119
+ },
120
+ };
121
+
122
+ return root;
123
+ };
124
+
125
+ /**
126
+ * Creates a render root for a GTKX application.
127
+ *
128
+ * @param container The top-level container to render into; defaults to the shared {@link rootElement}.
129
+ * @returns A {@link Root} exposing render and unmount.
130
+ */
131
+ const createRoot = (container: Container = rootElement): Root => {
132
+ const opaque = openContainer(container, {
133
+ onUncaughtError: rethrowUncaughtRenderError,
134
+ onCaughtError: logCaughtRenderError,
135
+ });
136
+
137
+ return {
138
+ render: (element) => {
139
+ reconciler.updateContainer(element, opaque, null, null);
140
+ },
141
+ unmount: () => {
142
+ unmountContainer(opaque);
143
+ },
144
+ };
145
+ };
146
+
147
+ /** Unmounts every active render root and stops the originating signal from propagating further. */
148
+ const quit = (): typeof Gdk.EVENT_STOP => {
149
+ for (const container of activeRoots) {
150
+ unmountContainer(container);
151
+ }
152
+
153
+ return Gdk.EVENT_STOP;
154
+ };
155
+
156
+ /**
157
+ * Renders children into a container other than the surrounding tree.
158
+ *
159
+ * @param children The element tree to render.
160
+ * @param container The GObject, application, or {@link rootElement} to render into.
161
+ * @param key An optional stable key.
162
+ * @returns A React portal.
163
+ */
164
+ const createPortal = (children: ReactNode, container: Container, key?: string): ReactNode =>
165
+ Object.assign(reconciler.createPortal(children, container, null, key ?? null), { type: "gtkx-portal", props: {} });
166
+
167
+ export {
168
+ setReconcilerErrorHandler,
169
+ createReconcilerRoot,
170
+ createRoot,
171
+ quit,
172
+ createPortal,
173
+ type ReconcilerRoot,
174
+ type Root,
175
+ };
@@ -0,0 +1,113 @@
1
+ import { getSignalBaseName, type SignalHandler } from "@gtkx/runtime";
2
+ import { camelCase } from "@gtkx/utils";
3
+ import type { HandlerRecord, SignalTarget } from "./node.js";
4
+ import { type TypeInfo, typeInfoFor } from "./metadata.js";
5
+
6
+ type SuppressionCounter = {
7
+ beginSuppression: () => void;
8
+ endSuppression: () => void;
9
+ endSuppressionNow: () => void;
10
+ isSuppressed: () => boolean;
11
+ };
12
+
13
+ const NOTIFY_DETAIL_PREFIX = "notify::";
14
+ const suppressionCounter: SuppressionCounter = createSuppressionCounter();
15
+ const beginSuppression: () => void = suppressionCounter.beginSuppression;
16
+ const endSuppression: () => void = suppressionCounter.endSuppression;
17
+ const endSuppressionNow: () => void = suppressionCounter.endSuppressionNow;
18
+ const isSuppressed: () => boolean = suppressionCounter.isSuppressed;
19
+
20
+ function createSuppressionCounter(): SuppressionCounter {
21
+ let depth = 0;
22
+
23
+ const release = (): void => {
24
+ if (depth > 0) {
25
+ depth -= 1;
26
+ }
27
+ };
28
+
29
+ return {
30
+ beginSuppression: () => {
31
+ depth += 1;
32
+ },
33
+ endSuppression: () => {
34
+ queueMicrotask(release);
35
+ },
36
+ endSuppressionNow: release,
37
+ isSuppressed: () => depth > 0,
38
+ };
39
+ }
40
+
41
+ const getNotifyProperty = (signal: string): string | null =>
42
+ signal.startsWith(NOTIFY_DETAIL_PREFIX) ? camelCase(signal.slice(NOTIFY_DETAIL_PREFIX.length)) : null;
43
+
44
+ const isBlockableSignal = (info: TypeInfo, signal: string): boolean =>
45
+ info.userEventSignals.has(getSignalBaseName(signal));
46
+
47
+ const invokeHandler = (
48
+ target: SignalTarget,
49
+ record: HandlerRecord,
50
+ notifyProperty: string | null,
51
+ args: unknown[],
52
+ ): unknown =>
53
+ notifyProperty === null
54
+ ? record.handler(...args, target.object)
55
+ : record.handler(Reflect.get(target.object, notifyProperty), target.object);
56
+
57
+ const wrapHandler = (target: SignalTarget, record: HandlerRecord, notifyProperty: string | null): SignalHandler =>
58
+ (...args: unknown[]): unknown => {
59
+ if (record.blockable && isSuppressed()) {
60
+ return undefined;
61
+ }
62
+
63
+ return target.dispatch(() => invokeHandler(target, record, notifyProperty, args));
64
+ };
65
+
66
+ const connectHandler = (target: SignalTarget, prop: string, signal: string, handler: SignalHandler): void => {
67
+ const existing = target.handlers.get(prop);
68
+
69
+ if (existing?.signal === signal) {
70
+ existing.handler = handler;
71
+
72
+ return;
73
+ }
74
+
75
+ if (existing !== undefined) {
76
+ target.object.off(existing.signal, existing.wrapped);
77
+ }
78
+
79
+ const isBlockable = isBlockableSignal(typeInfoFor(target.typeName), signal);
80
+ const notifyProperty = getNotifyProperty(signal);
81
+ const record: HandlerRecord = { signal, handler, wrapped: (): undefined => undefined, blockable: isBlockable };
82
+ record.wrapped = wrapHandler(target, record, notifyProperty);
83
+ target.object.on(signal, record.wrapped);
84
+ target.handlers.set(prop, record);
85
+ };
86
+
87
+ const disconnectHandler = (target: SignalTarget, prop: string): void => {
88
+ const record = target.handlers.get(prop);
89
+
90
+ if (record === undefined) {
91
+ return;
92
+ }
93
+
94
+ target.object.off(record.signal, record.wrapped);
95
+ target.handlers.delete(prop);
96
+ };
97
+
98
+ const disconnectAllHandlers = (target: SignalTarget): void => {
99
+ for (const record of target.handlers.values()) {
100
+ target.object.off(record.signal, record.wrapped);
101
+ }
102
+
103
+ target.handlers.clear();
104
+ };
105
+
106
+ export {
107
+ beginSuppression,
108
+ endSuppression,
109
+ endSuppressionNow,
110
+ connectHandler,
111
+ disconnectHandler,
112
+ disconnectAllHandlers,
113
+ };
@@ -0,0 +1,407 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import * as Gdk from "@gtkx/gi/gdk";
3
+ import * as Gtk from "@gtkx/gi/gtk";
4
+ import { drain, indexBeforeOrEnd } from "@gtkx/utils";
5
+ import type { ContentChild, ContentKind, ElementNode, ParentNode, TextNode } from "./node.js";
6
+ import type { Props } from "./registry.js";
7
+ import { ELEMENT_KIND, TEXT_KIND } from "./node.js";
8
+
9
+ type OffsetResult = { found: boolean; offset: number };
10
+
11
+ type BufferBuild = {
12
+ buffer: Gtk.TextBuffer;
13
+ view: Gtk.TextView | null;
14
+ marks: { node: ElementNode; offset: number }[];
15
+ };
16
+
17
+ const dirtyHosts: Set<ElementNode> = new Set();
18
+ const tagTables: WeakMap<object, Gtk.TextTagTable> = new WeakMap();
19
+ const TEXT_CONTENT_KINDS: Set<string> = new Set(["label", "buffer", "tag"]);
20
+ const PAINTABLE_PROP = "paintable";
21
+ const TEXT_PROP = "text";
22
+
23
+ const CONTENT_MIX_RULES: { kind: ContentKind; prop: string; message: string }[] = [
24
+ {
25
+ kind: "label",
26
+ prop: "label",
27
+ message: "<GtkLabel> cannot mix a `label` prop with text children; use one or the other",
28
+ },
29
+ {
30
+ kind: "buffer",
31
+ prop: "text",
32
+ message: "<GtkTextBuffer> cannot mix a `text` prop with content children; use one or the other",
33
+ },
34
+ {
35
+ kind: "anchor",
36
+ prop: PAINTABLE_PROP,
37
+ message: "<GtkTextChildAnchor> cannot mix a `paintable` prop with a child widget; use one or the other",
38
+ },
39
+ ];
40
+
41
+ const charLength = (text: string): number => text[Symbol.iterator]().toArray().length;
42
+
43
+ const bufferText = (buffer: Gtk.TextBuffer): string =>
44
+ buffer.getText(buffer.getStartIter(), buffer.getEndIter(), false);
45
+
46
+ const currentText = (object: GObject.Object): string | null => {
47
+ if (object instanceof Gtk.TextBuffer) {
48
+ return bufferText(object);
49
+ }
50
+
51
+ if (object instanceof Gtk.Editable || object instanceof Gtk.EntryBuffer) {
52
+ return object.getText();
53
+ }
54
+
55
+ return null;
56
+ };
57
+
58
+ const hasSameText = (object: GObject.Object, prop: string, value: unknown): boolean =>
59
+ prop === TEXT_PROP && typeof value === "string" && currentText(object) === value;
60
+
61
+ const contentTextLength = (node: ContentChild): number => {
62
+ if (node.kind === TEXT_KIND) {
63
+ return charLength(node.text);
64
+ }
65
+
66
+ if (node.contentKind === "tag") {
67
+ return node.content.reduce((sum, child) => sum + contentTextLength(child), 0);
68
+ }
69
+
70
+ return node.contentKind === "anchor" ? 1 : 0;
71
+ };
72
+
73
+ const isTagElement = (node: ContentChild): node is ElementNode =>
74
+ node.kind === ELEMENT_KIND && node.contentKind === "tag";
75
+
76
+ const stepOffset = (node: ContentChild, target: TextNode, offset: number): OffsetResult => {
77
+ if (node === target) {
78
+ return { found: true, offset };
79
+ }
80
+
81
+ if (isTagElement(node)) {
82
+ return getOffset(node.content, target, offset);
83
+ }
84
+
85
+ return { found: false, offset: offset + contentTextLength(node) };
86
+ };
87
+
88
+ const getOffset = (nodes: ContentChild[], target: TextNode, start: number): OffsetResult => {
89
+ let offset = start;
90
+
91
+ for (const node of nodes) {
92
+ const step = stepOffset(node, target, offset);
93
+
94
+ if (step.found) {
95
+ return step;
96
+ }
97
+
98
+ offset = step.offset;
99
+ }
100
+
101
+ return { found: false, offset };
102
+ };
103
+
104
+ const enclosingTagNodes = (node: TextNode): ElementNode[] => {
105
+ const nodes: ElementNode[] = [];
106
+ let current: ParentNode | null = node.parent;
107
+
108
+ while (current !== null && current.kind === ELEMENT_KIND) {
109
+ if (current.contentKind === "tag") {
110
+ nodes.push(current);
111
+ }
112
+
113
+ current = current.parent;
114
+ }
115
+
116
+ return nodes;
117
+ };
118
+
119
+ const textRestrictionError = (text: string): Error =>
120
+ new Error(
121
+ "Text strings must be rendered within a <GtkLabel> or <GtkTextBuffer> element; " +
122
+ `received ${JSON.stringify(text)}`,
123
+ );
124
+
125
+ const canAcceptText = (host: ElementNode): boolean =>
126
+ host.contentKind !== null && TEXT_CONTENT_KINDS.has(host.contentKind);
127
+
128
+ const isRootHost = (node: ElementNode): boolean => node.contentKind === "label" || node.contentKind === "buffer";
129
+
130
+ const mapElementParent = <T>(parent: ParentNode | null, map: (element: ElementNode) => T): T | null =>
131
+ parent !== null && parent.kind === ELEMENT_KIND ? map(parent) : null;
132
+
133
+ const parentElement = (node: ElementNode): ElementNode | null => mapElementParent(node.parent, (parent) => parent);
134
+
135
+ const getRootHost = (node: ElementNode): ElementNode | null => {
136
+ let current: ElementNode | null = node;
137
+
138
+ while (current !== null) {
139
+ if (isRootHost(current)) {
140
+ return current;
141
+ }
142
+
143
+ current = parentElement(current);
144
+ }
145
+
146
+ return null;
147
+ };
148
+
149
+ const markTextDirty = (host: ElementNode): void => {
150
+ const root = getRootHost(host);
151
+
152
+ if (root !== null) {
153
+ dirtyHosts.add(root);
154
+ }
155
+ };
156
+
157
+ const enclosingHost = (node: TextNode): ElementNode | null => mapElementParent(node.parent, getRootHost);
158
+
159
+ const addContent = (host: ElementNode, child: ContentChild, before: ContentChild | null): void => {
160
+ const content = host.content;
161
+ const existing = content.indexOf(child);
162
+
163
+ if (existing !== -1) {
164
+ content.splice(existing, 1);
165
+ }
166
+
167
+ content.splice(
168
+ indexBeforeOrEnd(content, before, (item, target) => item === target),
169
+ 0,
170
+ child,
171
+ );
172
+
173
+ child.parent = host;
174
+ markTextDirty(host);
175
+ };
176
+
177
+ const removeContent = (host: ElementNode, child: ContentChild): void => {
178
+ const index = host.content.indexOf(child);
179
+
180
+ if (index !== -1) {
181
+ host.content.splice(index, 1);
182
+ }
183
+
184
+ markTextDirty(host);
185
+ };
186
+
187
+ const validateContentMix = (node: ElementNode, props: Props): void => {
188
+ if (node.content.length === 0) {
189
+ return;
190
+ }
191
+
192
+ const violated = CONTENT_MIX_RULES.find(
193
+ (rule) => rule.kind === node.contentKind && props[rule.prop] !== undefined,
194
+ );
195
+
196
+ if (violated !== undefined) {
197
+ throw new Error(violated.message);
198
+ }
199
+ };
200
+
201
+ const detachTag = (tag: Gtk.TextTag, table: Gtk.TextTagTable, name: string | null): void => {
202
+ const previous = tagTables.get(tag);
203
+
204
+ if (previous !== undefined && previous !== table) {
205
+ previous.remove(tag);
206
+ }
207
+
208
+ if (name === null) {
209
+ return;
210
+ }
211
+
212
+ const existing = table.lookup(name);
213
+
214
+ if (existing !== null && existing !== tag) {
215
+ table.remove(existing);
216
+ }
217
+ };
218
+
219
+ const ensureTag = (table: Gtk.TextTagTable, node: ElementNode): void => {
220
+ const tag = node.object;
221
+
222
+ if (!(tag instanceof Gtk.TextTag) || tagTables.get(tag) === table) {
223
+ return;
224
+ }
225
+
226
+ const name = typeof node.props.name === "string" ? node.props.name : null;
227
+ detachTag(tag, table, name);
228
+
229
+ if (name === null || table.lookup(name) !== tag) {
230
+ table.add(tag);
231
+ }
232
+
233
+ tagTables.set(tag, table);
234
+ };
235
+
236
+ const insertTag = (build: BufferBuild, node: ElementNode): void => {
237
+ const start = build.buffer.getCharCount();
238
+ insertContent(build, node.content);
239
+ const tag = node.object;
240
+
241
+ if (tag instanceof Gtk.TextTag) {
242
+ ensureTag(build.buffer.getTagTable(), node);
243
+ build.buffer.applyTag(tag, build.buffer.getIterAtOffset(start), build.buffer.getEndIter());
244
+ }
245
+ };
246
+
247
+ const contentPaintable = (node: ElementNode): Gdk.Paintable | null => {
248
+ const value = node.props[PAINTABLE_PROP];
249
+
250
+ return value instanceof Gdk.Paintable ? value : null;
251
+ };
252
+
253
+ const isContentPaintableProp = (node: ElementNode, name: string): boolean =>
254
+ name === PAINTABLE_PROP && node.contentKind === "anchor";
255
+
256
+ const insertAnchor = (build: BufferBuild, node: ElementNode): void => {
257
+ const paintable = contentPaintable(node);
258
+
259
+ if (paintable !== null) {
260
+ build.buffer.insertPaintable(build.buffer.getEndIter(), paintable);
261
+
262
+ return;
263
+ }
264
+
265
+ const anchor = node.object;
266
+
267
+ if (!(anchor instanceof Gtk.TextChildAnchor)) {
268
+ return;
269
+ }
270
+
271
+ build.buffer.insertChildAnchor(build.buffer.getEndIter(), anchor);
272
+ const child = node.content[0];
273
+
274
+ if (build.view !== null && child?.kind === ELEMENT_KIND && child.object instanceof Gtk.Widget) {
275
+ build.view.addChildAtAnchor(child.object, anchor);
276
+ }
277
+ };
278
+
279
+ const insertElement = (build: BufferBuild, node: ElementNode): void => {
280
+ if (node.contentKind === "tag") {
281
+ insertTag(build, node);
282
+ } else if (node.contentKind === "anchor") {
283
+ insertAnchor(build, node);
284
+ } else {
285
+ build.marks.push({ node, offset: build.buffer.getCharCount() });
286
+ }
287
+ };
288
+
289
+ const insertContent = (build: BufferBuild, nodes: ContentChild[]): void => {
290
+ for (const child of nodes) {
291
+ if (child.kind === TEXT_KIND) {
292
+ build.buffer.insert(build.buffer.getEndIter(), child.text, -1);
293
+ } else {
294
+ insertElement(build, child);
295
+ }
296
+ }
297
+ };
298
+
299
+ const placeMark = (buffer: Gtk.TextBuffer, node: ElementNode, offset: number): void => {
300
+ const mark = node.object;
301
+
302
+ if (!(mark instanceof Gtk.TextMark)) {
303
+ return;
304
+ }
305
+
306
+ const iter = buffer.getIterAtOffset(offset);
307
+
308
+ if (mark.getBuffer() === null) {
309
+ buffer.addMark(mark, iter);
310
+ } else {
311
+ buffer.moveMark(mark, iter);
312
+ }
313
+ };
314
+
315
+ const rebuildBuffer = (node: ElementNode): void => {
316
+ const buffer = node.object;
317
+
318
+ if (node.props.text !== undefined || !(buffer instanceof Gtk.TextBuffer)) {
319
+ return;
320
+ }
321
+
322
+ buffer.setText("", -1);
323
+ const build: BufferBuild = { buffer, view: node.bufferView, marks: [] };
324
+ insertContent(build, node.content);
325
+
326
+ for (const mark of build.marks) {
327
+ placeMark(buffer, mark.node, mark.offset);
328
+ }
329
+ };
330
+
331
+ const rebuildLabel = (node: ElementNode): void => {
332
+ if (node.props.label !== undefined) {
333
+ return;
334
+ }
335
+
336
+ const label = node.object;
337
+
338
+ if (!(label instanceof Gtk.Label)) {
339
+ return;
340
+ }
341
+
342
+ label.setLabel(node.content.map((child) => (child.kind === TEXT_KIND ? child.text : "")).join(""));
343
+ };
344
+
345
+ const flushTextHosts = (): void => {
346
+ drain(dirtyHosts, (host) => {
347
+ if (host.contentKind === "label") {
348
+ rebuildLabel(host);
349
+ } else if (host.contentKind === "buffer") {
350
+ rebuildBuffer(host);
351
+ }
352
+ });
353
+ };
354
+
355
+ const applyEnclosingTags = (
356
+ buffer: Gtk.TextBuffer,
357
+ node: TextNode,
358
+ startIter: Gtk.TextIter,
359
+ endIter: Gtk.TextIter,
360
+ ): void => {
361
+ for (const tagNode of enclosingTagNodes(node)) {
362
+ ensureTag(buffer.getTagTable(), tagNode);
363
+
364
+ if (tagNode.object instanceof Gtk.TextTag) {
365
+ buffer.applyTag(tagNode.object, startIter, endIter);
366
+ }
367
+ }
368
+ };
369
+
370
+ const didUpdateTextSurgically = (host: ElementNode, node: TextNode, oldText: string, newText: string): boolean => {
371
+ const buffer = host.object;
372
+
373
+ if (host.contentKind !== "buffer" || !(buffer instanceof Gtk.TextBuffer)) {
374
+ return false;
375
+ }
376
+
377
+ const located = getOffset(host.content, node, 0);
378
+
379
+ if (!located.found) {
380
+ return false;
381
+ }
382
+
383
+ const start = located.offset;
384
+ buffer.delete(buffer.getIterAtOffset(start), buffer.getIterAtOffset(start + charLength(oldText)));
385
+ buffer.insert(buffer.getIterAtOffset(start), newText, -1);
386
+ const startIter = buffer.getIterAtOffset(start);
387
+ const endIter = buffer.getIterAtOffset(start + charLength(newText));
388
+ applyEnclosingTags(buffer, node, startIter, endIter);
389
+
390
+ return true;
391
+ };
392
+
393
+ export {
394
+ TEXT_PROP,
395
+ textRestrictionError,
396
+ bufferText,
397
+ hasSameText,
398
+ canAcceptText,
399
+ isContentPaintableProp,
400
+ markTextDirty,
401
+ enclosingHost,
402
+ addContent,
403
+ removeContent,
404
+ validateContentMix,
405
+ flushTextHosts,
406
+ didUpdateTextSurgically,
407
+ };