@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.
- package/README.md +137 -34
- package/dist/adw/config.d.ts +2 -0
- package/dist/adw/config.d.ts.map +1 -0
- package/dist/adw/config.js +2 -0
- package/dist/adw/config.js.map +1 -0
- package/dist/adw/dialog.d.ts +8 -0
- package/dist/adw/dialog.d.ts.map +1 -0
- package/dist/adw/dialog.js +25 -0
- package/dist/adw/dialog.js.map +1 -0
- package/dist/adw/element-behaviors.d.ts +2 -0
- package/dist/adw/element-behaviors.d.ts.map +1 -0
- package/dist/adw/element-behaviors.js +299 -0
- package/dist/adw/element-behaviors.js.map +1 -0
- package/dist/adw/element-config.d.ts +9 -0
- package/dist/adw/element-config.d.ts.map +1 -0
- package/dist/adw/element-config.js +137 -0
- package/dist/adw/element-config.js.map +1 -0
- package/dist/adw/index.d.ts +4 -0
- package/dist/adw/index.d.ts.map +1 -0
- package/dist/adw/index.js +3 -0
- package/dist/adw/index.js.map +1 -0
- package/dist/adw/prop-types.d.ts +29 -0
- package/dist/adw/prop-types.d.ts.map +1 -0
- package/dist/adw/prop-types.js +2 -0
- package/dist/adw/prop-types.js.map +1 -0
- package/dist/bootstrap.d.ts +2 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +5 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/components/application.d.ts +10 -0
- package/dist/components/application.d.ts.map +1 -0
- package/dist/components/application.js +39 -0
- package/dist/components/application.js.map +1 -0
- package/dist/components/element.d.ts +6 -0
- package/dist/components/element.d.ts.map +1 -0
- package/dist/components/element.js +29 -0
- package/dist/components/element.js.map +1 -0
- package/dist/components/window.d.ts +8 -0
- package/dist/components/window.d.ts.map +1 -0
- package/dist/components/window.js +22 -0
- package/dist/components/window.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -0
- package/dist/element-behaviors.d.ts +2 -0
- package/dist/element-behaviors.d.ts.map +1 -0
- package/dist/element-behaviors.js +348 -0
- package/dist/element-behaviors.js.map +1 -0
- package/dist/element-config.d.ts +10 -0
- package/dist/element-config.d.ts.map +1 -0
- package/dist/element-config.js +146 -0
- package/dist/element-config.js.map +1 -0
- package/dist/hooks/use-application.d.ts +9 -0
- package/dist/hooks/use-application.d.ts.map +1 -0
- package/dist/hooks/use-application.js +14 -0
- package/dist/hooks/use-application.js.map +1 -0
- package/dist/hooks/use-bind-setting.d.ts +23 -0
- package/dist/hooks/use-bind-setting.d.ts.map +1 -0
- package/dist/hooks/use-bind-setting.js +30 -0
- package/dist/hooks/use-bind-setting.js.map +1 -0
- package/dist/hooks/use-merged-refs.d.ts +8 -0
- package/dist/hooks/use-merged-refs.d.ts.map +1 -0
- package/dist/hooks/use-merged-refs.js +48 -0
- package/dist/hooks/use-merged-refs.js.map +1 -0
- package/dist/hooks/use-object-value.d.ts +5 -0
- package/dist/hooks/use-object-value.d.ts.map +1 -0
- package/dist/hooks/use-object-value.js +29 -0
- package/dist/hooks/use-object-value.js.map +1 -0
- package/dist/hooks/use-parent-window.d.ts +9 -0
- package/dist/hooks/use-parent-window.d.ts.map +1 -0
- package/dist/hooks/use-parent-window.js +8 -0
- package/dist/hooks/use-parent-window.js.map +1 -0
- package/dist/hooks/use-property.d.ts +14 -0
- package/dist/hooks/use-property.d.ts.map +1 -0
- package/dist/hooks/use-property.js +14 -0
- package/dist/hooks/use-property.js.map +1 -0
- package/dist/hooks/use-setting.d.ts +14 -0
- package/dist/hooks/use-setting.d.ts.map +1 -0
- package/dist/hooks/use-setting.js +20 -0
- package/dist/hooks/use-setting.js.map +1 -0
- package/dist/hooks/use-signal.d.ts +24 -0
- package/dist/hooks/use-signal.d.ts.map +1 -0
- package/dist/hooks/use-signal.js +31 -0
- package/dist/hooks/use-signal.js.map +1 -0
- package/dist/index.d.ts +13 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +13 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +12 -0
- package/dist/internal.js.map +1 -0
- package/dist/prop-types.d.ts +110 -0
- package/dist/prop-types.d.ts.map +1 -0
- package/dist/prop-types.js +2 -0
- package/dist/prop-types.js.map +1 -0
- package/dist/reconciler/apply-props.d.ts +11 -0
- package/dist/reconciler/apply-props.d.ts.map +1 -0
- package/dist/reconciler/apply-props.js +190 -0
- package/dist/reconciler/apply-props.js.map +1 -0
- package/dist/reconciler/behaviors.d.ts +59 -0
- package/dist/reconciler/behaviors.d.ts.map +1 -0
- package/dist/reconciler/behaviors.js +172 -0
- package/dist/reconciler/behaviors.js.map +1 -0
- package/dist/reconciler/child-routing.d.ts +5 -0
- package/dist/reconciler/child-routing.d.ts.map +1 -0
- package/dist/reconciler/child-routing.js +156 -0
- package/dist/reconciler/child-routing.js.map +1 -0
- package/dist/reconciler/host-config.d.ts +9 -0
- package/dist/reconciler/host-config.d.ts.map +1 -0
- package/dist/reconciler/host-config.js +214 -0
- package/dist/reconciler/host-config.js.map +1 -0
- package/dist/reconciler/instance.d.ts +5 -0
- package/dist/reconciler/instance.d.ts.map +1 -0
- package/dist/reconciler/instance.js +49 -0
- package/dist/reconciler/instance.js.map +1 -0
- package/dist/reconciler/metadata.d.ts +17 -0
- package/dist/reconciler/metadata.d.ts.map +1 -0
- package/dist/reconciler/metadata.js +82 -0
- package/dist/reconciler/metadata.js.map +1 -0
- package/dist/reconciler/node.d.ts +76 -0
- package/dist/reconciler/node.d.ts.map +1 -0
- package/dist/reconciler/node.js +53 -0
- package/dist/reconciler/node.js.map +1 -0
- package/dist/reconciler/placement.d.ts +5 -0
- package/dist/reconciler/placement.d.ts.map +1 -0
- package/dist/reconciler/placement.js +175 -0
- package/dist/reconciler/placement.js.map +1 -0
- package/dist/reconciler/registry.d.ts +92 -0
- package/dist/reconciler/registry.d.ts.map +1 -0
- package/dist/reconciler/registry.js +64 -0
- package/dist/reconciler/registry.js.map +1 -0
- package/dist/reconciler/root-element.d.ts +11 -0
- package/dist/reconciler/root-element.d.ts.map +1 -0
- package/dist/reconciler/root-element.js +7 -0
- package/dist/reconciler/root-element.js.map +1 -0
- package/dist/reconciler/root.d.ts +56 -0
- package/dist/reconciler/root.d.ts.map +1 -0
- package/dist/reconciler/root.js +109 -0
- package/dist/reconciler/root.js.map +1 -0
- package/dist/reconciler/signals.d.ts +10 -0
- package/dist/reconciler/signals.d.ts.map +1 -0
- package/dist/reconciler/signals.js +70 -0
- package/dist/reconciler/signals.js.map +1 -0
- package/dist/reconciler/text.d.ts +19 -0
- package/dist/reconciler/text.d.ts.map +1 -0
- package/dist/reconciler/text.js +276 -0
- package/dist/reconciler/text.js.map +1 -0
- package/dist/utils/accessible-metadata.d.ts +12 -0
- package/dist/utils/accessible-metadata.d.ts.map +1 -0
- package/dist/utils/accessible-metadata.js +25 -0
- package/dist/utils/accessible-metadata.js.map +1 -0
- package/dist/utils/accessible-props.d.ts +60 -0
- package/dist/utils/accessible-props.d.ts.map +1 -0
- package/dist/utils/accessible-props.js +181 -0
- package/dist/utils/accessible-props.js.map +1 -0
- package/dist/utils/ref-prop.d.ts +15 -0
- package/dist/utils/ref-prop.d.ts.map +1 -0
- package/dist/utils/ref-prop.js +18 -0
- package/dist/utils/ref-prop.js.map +1 -0
- package/dist/utils/settings.d.ts +17 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +37 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/variant.d.ts +57 -0
- package/dist/utils/variant.d.ts.map +1 -0
- package/dist/utils/variant.js +197 -0
- package/dist/utils/variant.js.map +1 -0
- package/env.d.ts +9 -0
- package/package.json +49 -10
- package/src/adw/config.ts +1 -0
- package/src/adw/dialog.tsx +35 -0
- package/src/adw/element-behaviors.ts +379 -0
- package/src/adw/element-config.ts +140 -0
- package/src/adw/index.ts +4 -0
- package/src/adw/prop-types.ts +42 -0
- package/src/bootstrap.ts +5 -0
- package/src/components/application.tsx +62 -0
- package/src/components/element.tsx +47 -0
- package/src/components/window.tsx +35 -0
- package/src/config.ts +3 -0
- package/src/element-behaviors.ts +424 -0
- package/src/element-config.ts +148 -0
- package/src/env.d.ts +1 -0
- package/src/hooks/use-application.ts +19 -0
- package/src/hooks/use-bind-setting.ts +51 -0
- package/src/hooks/use-merged-refs.ts +64 -0
- package/src/hooks/use-object-value.ts +54 -0
- package/src/hooks/use-parent-window.ts +11 -0
- package/src/hooks/use-property.ts +23 -0
- package/src/hooks/use-setting.ts +34 -0
- package/src/hooks/use-signal.ts +60 -0
- package/src/index.ts +14 -14
- package/src/internal.ts +13 -0
- package/src/prop-types.ts +142 -0
- package/src/reconciler/apply-props.ts +265 -0
- package/src/reconciler/behaviors.ts +324 -0
- package/src/reconciler/child-routing.ts +202 -0
- package/src/reconciler/host-config.ts +278 -0
- package/src/reconciler/instance.ts +82 -0
- package/src/reconciler/metadata.ts +119 -0
- package/src/reconciler/node.ts +161 -0
- package/src/reconciler/placement.ts +255 -0
- package/src/reconciler/registry.ts +161 -0
- package/src/reconciler/root-element.ts +12 -0
- package/src/reconciler/root.ts +175 -0
- package/src/reconciler/signals.ts +113 -0
- package/src/reconciler/text.ts +407 -0
- package/src/utils/accessible-metadata.ts +31 -0
- package/src/utils/accessible-props.ts +279 -0
- package/src/utils/ref-prop.ts +30 -0
- package/src/utils/settings.ts +69 -0
- package/src/utils/variant.ts +368 -0
- package/dist/components/compound.d.ts +0 -40
- package/dist/components/compound.d.ts.map +0 -1
- package/dist/components/compound.js +0 -46
- package/dist/components/compound.js.map +0 -1
- package/dist/components/list.d.ts +0 -75
- package/dist/components/list.d.ts.map +0 -1
- package/dist/components/list.js +0 -81
- package/dist/components/list.js.map +0 -1
- package/dist/components/slot-widget.d.ts +0 -15
- package/dist/components/slot-widget.d.ts.map +0 -1
- package/dist/components/slot-widget.js +0 -37
- package/dist/components/slot-widget.js.map +0 -1
- package/dist/errors.d.ts +0 -15
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -44
- package/dist/errors.js.map +0 -1
- package/dist/factory.d.ts +0 -5
- package/dist/factory.d.ts.map +0 -1
- package/dist/factory.js +0 -37
- package/dist/factory.js.map +0 -1
- package/dist/generated/compounds.d.ts +0 -2672
- package/dist/generated/compounds.d.ts.map +0 -1
- package/dist/generated/compounds.js +0 -2624
- package/dist/generated/compounds.js.map +0 -1
- package/dist/generated/internal.d.ts +0 -16
- package/dist/generated/internal.d.ts.map +0 -1
- package/dist/generated/internal.js +0 -3638
- package/dist/generated/internal.js.map +0 -1
- package/dist/generated/jsx.d.ts +0 -17074
- package/dist/generated/jsx.d.ts.map +0 -1
- package/dist/generated/jsx.js +0 -6715
- package/dist/generated/jsx.js.map +0 -1
- package/dist/generated/registry.d.ts +0 -5
- package/dist/generated/registry.d.ts.map +0 -1
- package/dist/generated/registry.js +0 -13
- package/dist/generated/registry.js.map +0 -1
- package/dist/host-config.d.ts +0 -24
- package/dist/host-config.d.ts.map +0 -1
- package/dist/host-config.js +0 -172
- package/dist/host-config.js.map +0 -1
- package/dist/jsx.d.ts +0 -974
- package/dist/jsx.d.ts.map +0 -1
- package/dist/jsx.js +0 -8
- package/dist/jsx.js.map +0 -1
- package/dist/metadata.d.ts +0 -5
- package/dist/metadata.d.ts.map +0 -1
- package/dist/metadata.js +0 -33
- package/dist/metadata.js.map +0 -1
- package/dist/node.d.ts +0 -25
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -85
- package/dist/node.js.map +0 -1
- package/dist/nodes/adjustable.d.ts +0 -11
- package/dist/nodes/adjustable.d.ts.map +0 -1
- package/dist/nodes/adjustable.js +0 -46
- package/dist/nodes/adjustable.js.map +0 -1
- package/dist/nodes/alert-dialog-response.d.ts +0 -15
- package/dist/nodes/alert-dialog-response.d.ts.map +0 -1
- package/dist/nodes/alert-dialog-response.js +0 -61
- package/dist/nodes/alert-dialog-response.js.map +0 -1
- package/dist/nodes/alert-dialog.d.ts +0 -14
- package/dist/nodes/alert-dialog.d.ts.map +0 -1
- package/dist/nodes/alert-dialog.js +0 -41
- package/dist/nodes/alert-dialog.js.map +0 -1
- package/dist/nodes/animation.d.ts +0 -39
- package/dist/nodes/animation.d.ts.map +0 -1
- package/dist/nodes/animation.js +0 -326
- package/dist/nodes/animation.js.map +0 -1
- package/dist/nodes/application.d.ts +0 -12
- package/dist/nodes/application.d.ts.map +0 -1
- package/dist/nodes/application.js +0 -51
- package/dist/nodes/application.js.map +0 -1
- package/dist/nodes/calendar.d.ts +0 -18
- package/dist/nodes/calendar.d.ts.map +0 -1
- package/dist/nodes/calendar.js +0 -28
- package/dist/nodes/calendar.js.map +0 -1
- package/dist/nodes/color-dialog-button.d.ts +0 -15
- package/dist/nodes/color-dialog-button.d.ts.map +0 -1
- package/dist/nodes/color-dialog-button.js +0 -43
- package/dist/nodes/color-dialog-button.js.map +0 -1
- package/dist/nodes/column-view-column.d.ts +0 -36
- package/dist/nodes/column-view-column.d.ts.map +0 -1
- package/dist/nodes/column-view-column.js +0 -168
- package/dist/nodes/column-view-column.js.map +0 -1
- package/dist/nodes/container-slot.d.ts +0 -18
- package/dist/nodes/container-slot.d.ts.map +0 -1
- package/dist/nodes/container-slot.js +0 -81
- package/dist/nodes/container-slot.js.map +0 -1
- package/dist/nodes/dialog.d.ts +0 -10
- package/dist/nodes/dialog.d.ts.map +0 -1
- package/dist/nodes/dialog.js +0 -20
- package/dist/nodes/dialog.js.map +0 -1
- package/dist/nodes/drawing-area.d.ts +0 -19
- package/dist/nodes/drawing-area.d.ts.map +0 -1
- package/dist/nodes/drawing-area.js +0 -40
- package/dist/nodes/drawing-area.js.map +0 -1
- package/dist/nodes/event-controller.d.ts +0 -15
- package/dist/nodes/event-controller.d.ts.map +0 -1
- package/dist/nodes/event-controller.js +0 -73
- package/dist/nodes/event-controller.js.map +0 -1
- package/dist/nodes/fixed-child.d.ts +0 -19
- package/dist/nodes/fixed-child.d.ts.map +0 -1
- package/dist/nodes/fixed-child.js +0 -99
- package/dist/nodes/fixed-child.js.map +0 -1
- package/dist/nodes/font-dialog-button.d.ts +0 -15
- package/dist/nodes/font-dialog-button.d.ts.map +0 -1
- package/dist/nodes/font-dialog-button.js +0 -76
- package/dist/nodes/font-dialog-button.js.map +0 -1
- package/dist/nodes/grid-child.d.ts +0 -19
- package/dist/nodes/grid-child.d.ts.map +0 -1
- package/dist/nodes/grid-child.js +0 -94
- package/dist/nodes/grid-child.js.map +0 -1
- package/dist/nodes/internal/accessible.d.ts +0 -5
- package/dist/nodes/internal/accessible.d.ts.map +0 -1
- package/dist/nodes/internal/accessible.js +0 -119
- package/dist/nodes/internal/accessible.js.map +0 -1
- package/dist/nodes/internal/bound-item.d.ts +0 -4
- package/dist/nodes/internal/bound-item.d.ts.map +0 -1
- package/dist/nodes/internal/bound-item.js +0 -2
- package/dist/nodes/internal/bound-item.js.map +0 -1
- package/dist/nodes/internal/construct.d.ts +0 -3
- package/dist/nodes/internal/construct.d.ts.map +0 -1
- package/dist/nodes/internal/construct.js +0 -44
- package/dist/nodes/internal/construct.js.map +0 -1
- package/dist/nodes/internal/predicates.d.ts +0 -51
- package/dist/nodes/internal/predicates.d.ts.map +0 -1
- package/dist/nodes/internal/predicates.js +0 -36
- package/dist/nodes/internal/predicates.js.map +0 -1
- package/dist/nodes/internal/props.d.ts +0 -6
- package/dist/nodes/internal/props.d.ts.map +0 -1
- package/dist/nodes/internal/props.js +0 -43
- package/dist/nodes/internal/props.js.map +0 -1
- package/dist/nodes/internal/signal-store.d.ts +0 -22
- package/dist/nodes/internal/signal-store.d.ts.map +0 -1
- package/dist/nodes/internal/signal-store.js +0 -98
- package/dist/nodes/internal/signal-store.js.map +0 -1
- package/dist/nodes/internal/text-buffer-controller.d.ts +0 -40
- package/dist/nodes/internal/text-buffer-controller.d.ts.map +0 -1
- package/dist/nodes/internal/text-buffer-controller.js +0 -327
- package/dist/nodes/internal/text-buffer-controller.js.map +0 -1
- package/dist/nodes/internal/widget.d.ts +0 -8
- package/dist/nodes/internal/widget.d.ts.map +0 -1
- package/dist/nodes/internal/widget.js +0 -68
- package/dist/nodes/internal/widget.js.map +0 -1
- package/dist/nodes/level-bar.d.ts +0 -12
- package/dist/nodes/level-bar.d.ts.map +0 -1
- package/dist/nodes/level-bar.js +0 -24
- package/dist/nodes/level-bar.js.map +0 -1
- package/dist/nodes/list-item-node.d.ts +0 -12
- package/dist/nodes/list-item-node.d.ts.map +0 -1
- package/dist/nodes/list-item-node.js +0 -45
- package/dist/nodes/list-item-node.js.map +0 -1
- package/dist/nodes/list.d.ts +0 -100
- package/dist/nodes/list.d.ts.map +0 -1
- package/dist/nodes/list.js +0 -950
- package/dist/nodes/list.js.map +0 -1
- package/dist/nodes/menu.d.ts +0 -7
- package/dist/nodes/menu.d.ts.map +0 -1
- package/dist/nodes/menu.js +0 -20
- package/dist/nodes/menu.js.map +0 -1
- package/dist/nodes/models/menu.d.ts +0 -47
- package/dist/nodes/models/menu.d.ts.map +0 -1
- package/dist/nodes/models/menu.js +0 -240
- package/dist/nodes/models/menu.js.map +0 -1
- package/dist/nodes/navigation-page.d.ts +0 -19
- package/dist/nodes/navigation-page.d.ts.map +0 -1
- package/dist/nodes/navigation-page.js +0 -129
- package/dist/nodes/navigation-page.js.map +0 -1
- package/dist/nodes/navigation-view.d.ts +0 -19
- package/dist/nodes/navigation-view.d.ts.map +0 -1
- package/dist/nodes/navigation-view.js +0 -51
- package/dist/nodes/navigation-view.js.map +0 -1
- package/dist/nodes/notebook-page-tab.d.ts +0 -15
- package/dist/nodes/notebook-page-tab.d.ts.map +0 -1
- package/dist/nodes/notebook-page-tab.js +0 -40
- package/dist/nodes/notebook-page-tab.js.map +0 -1
- package/dist/nodes/notebook-page.d.ts +0 -29
- package/dist/nodes/notebook-page.d.ts.map +0 -1
- package/dist/nodes/notebook-page.js +0 -151
- package/dist/nodes/notebook-page.js.map +0 -1
- package/dist/nodes/notebook.d.ts +0 -16
- package/dist/nodes/notebook.d.ts.map +0 -1
- package/dist/nodes/notebook.js +0 -31
- package/dist/nodes/notebook.js.map +0 -1
- package/dist/nodes/overlay-child.d.ts +0 -20
- package/dist/nodes/overlay-child.d.ts.map +0 -1
- package/dist/nodes/overlay-child.js +0 -109
- package/dist/nodes/overlay-child.js.map +0 -1
- package/dist/nodes/popover-menu.d.ts +0 -19
- package/dist/nodes/popover-menu.d.ts.map +0 -1
- package/dist/nodes/popover-menu.js +0 -54
- package/dist/nodes/popover-menu.js.map +0 -1
- package/dist/nodes/scale.d.ts +0 -10
- package/dist/nodes/scale.d.ts.map +0 -1
- package/dist/nodes/scale.js +0 -19
- package/dist/nodes/scale.js.map +0 -1
- package/dist/nodes/scrolled-window.d.ts +0 -11
- package/dist/nodes/scrolled-window.d.ts.map +0 -1
- package/dist/nodes/scrolled-window.js +0 -18
- package/dist/nodes/scrolled-window.js.map +0 -1
- package/dist/nodes/search-bar.d.ts +0 -11
- package/dist/nodes/search-bar.d.ts.map +0 -1
- package/dist/nodes/search-bar.js +0 -16
- package/dist/nodes/search-bar.js.map +0 -1
- package/dist/nodes/shortcut.d.ts +0 -19
- package/dist/nodes/shortcut.d.ts.map +0 -1
- package/dist/nodes/shortcut.js +0 -72
- package/dist/nodes/shortcut.js.map +0 -1
- package/dist/nodes/slot.d.ts +0 -21
- package/dist/nodes/slot.d.ts.map +0 -1
- package/dist/nodes/slot.js +0 -102
- package/dist/nodes/slot.js.map +0 -1
- package/dist/nodes/source-view.d.ts +0 -18
- package/dist/nodes/source-view.d.ts.map +0 -1
- package/dist/nodes/source-view.js +0 -94
- package/dist/nodes/source-view.js.map +0 -1
- package/dist/nodes/spin-row.d.ts +0 -14
- package/dist/nodes/spin-row.d.ts.map +0 -1
- package/dist/nodes/spin-row.js +0 -46
- package/dist/nodes/spin-row.js.map +0 -1
- package/dist/nodes/stack-page.d.ts +0 -22
- package/dist/nodes/stack-page.d.ts.map +0 -1
- package/dist/nodes/stack-page.js +0 -140
- package/dist/nodes/stack-page.js.map +0 -1
- package/dist/nodes/stack.d.ts +0 -13
- package/dist/nodes/stack.d.ts.map +0 -1
- package/dist/nodes/stack.js +0 -21
- package/dist/nodes/stack.js.map +0 -1
- package/dist/nodes/switch-row.d.ts +0 -11
- package/dist/nodes/switch-row.d.ts.map +0 -1
- package/dist/nodes/switch-row.js +0 -15
- package/dist/nodes/switch-row.js.map +0 -1
- package/dist/nodes/text-anchor.d.ts +0 -23
- package/dist/nodes/text-anchor.d.ts.map +0 -1
- package/dist/nodes/text-anchor.js +0 -74
- package/dist/nodes/text-anchor.js.map +0 -1
- package/dist/nodes/text-content.d.ts +0 -12
- package/dist/nodes/text-content.d.ts.map +0 -1
- package/dist/nodes/text-content.js +0 -2
- package/dist/nodes/text-content.js.map +0 -1
- package/dist/nodes/text-paintable.d.ts +0 -19
- package/dist/nodes/text-paintable.d.ts.map +0 -1
- package/dist/nodes/text-paintable.js +0 -42
- package/dist/nodes/text-paintable.js.map +0 -1
- package/dist/nodes/text-segment.d.ts +0 -18
- package/dist/nodes/text-segment.d.ts.map +0 -1
- package/dist/nodes/text-segment.js +0 -38
- package/dist/nodes/text-segment.js.map +0 -1
- package/dist/nodes/text-tag.d.ts +0 -38
- package/dist/nodes/text-tag.d.ts.map +0 -1
- package/dist/nodes/text-tag.js +0 -247
- package/dist/nodes/text-tag.js.map +0 -1
- package/dist/nodes/text-view.d.ts +0 -29
- package/dist/nodes/text-view.d.ts.map +0 -1
- package/dist/nodes/text-view.js +0 -80
- package/dist/nodes/text-view.js.map +0 -1
- package/dist/nodes/toggle-group.d.ts +0 -17
- package/dist/nodes/toggle-group.d.ts.map +0 -1
- package/dist/nodes/toggle-group.js +0 -65
- package/dist/nodes/toggle-group.js.map +0 -1
- package/dist/nodes/toggle.d.ts +0 -16
- package/dist/nodes/toggle.d.ts.map +0 -1
- package/dist/nodes/toggle.js +0 -61
- package/dist/nodes/toggle.js.map +0 -1
- package/dist/nodes/virtual.d.ts +0 -7
- package/dist/nodes/virtual.d.ts.map +0 -1
- package/dist/nodes/virtual.js +0 -9
- package/dist/nodes/virtual.js.map +0 -1
- package/dist/nodes/web-view.d.ts +0 -11
- package/dist/nodes/web-view.d.ts.map +0 -1
- package/dist/nodes/web-view.js +0 -16
- package/dist/nodes/web-view.js.map +0 -1
- package/dist/nodes/widget.d.ts +0 -26
- package/dist/nodes/widget.d.ts.map +0 -1
- package/dist/nodes/widget.js +0 -308
- package/dist/nodes/widget.js.map +0 -1
- package/dist/nodes/window.d.ts +0 -31
- package/dist/nodes/window.d.ts.map +0 -1
- package/dist/nodes/window.js +0 -122
- package/dist/nodes/window.js.map +0 -1
- package/dist/portal.d.ts +0 -29
- package/dist/portal.d.ts.map +0 -1
- package/dist/portal.js +0 -35
- package/dist/portal.js.map +0 -1
- package/dist/reconciler.d.ts +0 -34
- package/dist/reconciler.d.ts.map +0 -1
- package/dist/reconciler.js +0 -48
- package/dist/reconciler.js.map +0 -1
- package/dist/registry.d.ts +0 -18
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -98
- package/dist/registry.js.map +0 -1
- package/dist/render.d.ts +0 -117
- package/dist/render.d.ts.map +0 -1
- package/dist/render.js +0 -159
- package/dist/render.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/use-property.d.ts +0 -29
- package/dist/use-property.d.ts.map +0 -1
- package/dist/use-property.js +0 -44
- package/dist/use-property.js.map +0 -1
- package/dist/use-setting.d.ts +0 -36
- package/dist/use-setting.d.ts.map +0 -1
- package/dist/use-setting.js +0 -68
- package/dist/use-setting.js.map +0 -1
- package/src/components/compound.tsx +0 -57
- package/src/components/list.tsx +0 -140
- package/src/components/slot-widget.tsx +0 -46
- package/src/errors.ts +0 -53
- package/src/factory.ts +0 -62
- package/src/generated/compounds.ts +0 -2741
- package/src/generated/internal.ts +0 -3642
- package/src/generated/jsx.ts +0 -17383
- package/src/generated/registry.ts +0 -17
- package/src/host-config.ts +0 -219
- package/src/jsx.ts +0 -1033
- package/src/metadata.ts +0 -43
- package/src/node.ts +0 -107
- package/src/nodes/adjustable.ts +0 -68
- package/src/nodes/alert-dialog-response.ts +0 -78
- package/src/nodes/alert-dialog.ts +0 -55
- package/src/nodes/animation.ts +0 -409
- package/src/nodes/application.ts +0 -61
- package/src/nodes/calendar.ts +0 -42
- package/src/nodes/color-dialog-button.ts +0 -69
- package/src/nodes/column-view-column.ts +0 -189
- package/src/nodes/container-slot.ts +0 -100
- package/src/nodes/dialog.ts +0 -25
- package/src/nodes/drawing-area.ts +0 -53
- package/src/nodes/event-controller.ts +0 -96
- package/src/nodes/fixed-child.ts +0 -122
- package/src/nodes/font-dialog-button.ts +0 -107
- package/src/nodes/grid-child.ts +0 -116
- package/src/nodes/internal/accessible.ts +0 -155
- package/src/nodes/internal/bound-item.ts +0 -4
- package/src/nodes/internal/construct.ts +0 -60
- package/src/nodes/internal/predicates.ts +0 -80
- package/src/nodes/internal/props.ts +0 -51
- package/src/nodes/internal/signal-store.ts +0 -141
- package/src/nodes/internal/text-buffer-controller.ts +0 -417
- package/src/nodes/internal/widget.ts +0 -74
- package/src/nodes/level-bar.ts +0 -36
- package/src/nodes/list-item-node.ts +0 -53
- package/src/nodes/list.ts +0 -1082
- package/src/nodes/menu.ts +0 -27
- package/src/nodes/models/menu.ts +0 -314
- package/src/nodes/navigation-page.ts +0 -154
- package/src/nodes/navigation-view.ts +0 -66
- package/src/nodes/notebook-page-tab.ts +0 -55
- package/src/nodes/notebook-page.ts +0 -189
- package/src/nodes/notebook.ts +0 -42
- package/src/nodes/overlay-child.ts +0 -130
- package/src/nodes/popover-menu.ts +0 -67
- package/src/nodes/scale.ts +0 -28
- package/src/nodes/scrolled-window.ts +0 -23
- package/src/nodes/search-bar.ts +0 -27
- package/src/nodes/shortcut.ts +0 -86
- package/src/nodes/slot.ts +0 -138
- package/src/nodes/source-view.ts +0 -130
- package/src/nodes/spin-row.ts +0 -72
- package/src/nodes/stack-page.ts +0 -170
- package/src/nodes/stack.ts +0 -35
- package/src/nodes/switch-row.ts +0 -26
- package/src/nodes/text-anchor.ts +0 -88
- package/src/nodes/text-content.ts +0 -14
- package/src/nodes/text-paintable.ts +0 -51
- package/src/nodes/text-segment.ts +0 -55
- package/src/nodes/text-tag.ts +0 -298
- package/src/nodes/text-view.ts +0 -100
- package/src/nodes/toggle-group.ts +0 -81
- package/src/nodes/toggle.ts +0 -72
- package/src/nodes/virtual.ts +0 -16
- package/src/nodes/web-view.ts +0 -22
- package/src/nodes/widget.ts +0 -369
- package/src/nodes/window.ts +0 -172
- package/src/portal.ts +0 -37
- package/src/reconciler.ts +0 -52
- package/src/registry.ts +0 -119
- package/src/render.tsx +0 -192
- package/src/types.ts +0 -13
- package/src/use-property.ts +0 -58
- package/src/use-setting.ts +0 -96
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ErrorInfo, ReactNode } from "react";
|
|
2
|
+
import * as Gdk from "@gtkx/gi/gdk";
|
|
3
|
+
import { type Container } from "./host-config.js";
|
|
4
|
+
type RootErrorCallbacks = {
|
|
5
|
+
onUncaughtError?: (error: unknown, info: ErrorInfo) => void;
|
|
6
|
+
onCaughtError?: (error: unknown, info: ErrorInfo) => void;
|
|
7
|
+
onRecoverableError?: (error: unknown, info: ErrorInfo) => void;
|
|
8
|
+
};
|
|
9
|
+
type ReconcilerRootOptions = RootErrorCallbacks & {
|
|
10
|
+
containerInfo: Container;
|
|
11
|
+
};
|
|
12
|
+
/** A root that mounts an element tree into an explicit container and reports render errors. */
|
|
13
|
+
type ReconcilerRoot = {
|
|
14
|
+
update: (element: ReactNode) => void;
|
|
15
|
+
unmount: (teardown: (root: ReconcilerRoot) => Promise<void>) => Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
/** The object {@link createRoot} returns: it renders an element tree into a container and can tear it down. */
|
|
18
|
+
type Root = {
|
|
19
|
+
render: (element: ReactNode) => void;
|
|
20
|
+
unmount: () => void;
|
|
21
|
+
};
|
|
22
|
+
type ErrorHandler = (error: unknown) => void;
|
|
23
|
+
/**
|
|
24
|
+
* Installs a process-wide handler for errors thrown while rendering or applying an update.
|
|
25
|
+
*
|
|
26
|
+
* @param handler The handler to install.
|
|
27
|
+
* @returns The previously installed handler, or null.
|
|
28
|
+
*/
|
|
29
|
+
declare const setReconcilerErrorHandler: (handler: ErrorHandler) => ErrorHandler | null;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a root that mounts an element tree into a container, routing render errors to the supplied callbacks.
|
|
32
|
+
*
|
|
33
|
+
* @param options The container to render into and the error callbacks to route failures to.
|
|
34
|
+
* @returns A {@link ReconcilerRoot}.
|
|
35
|
+
*/
|
|
36
|
+
declare const createReconcilerRoot: (options: ReconcilerRootOptions) => ReconcilerRoot;
|
|
37
|
+
/**
|
|
38
|
+
* Creates a render root for a GTKX application.
|
|
39
|
+
*
|
|
40
|
+
* @param container The top-level container to render into; defaults to the shared {@link rootElement}.
|
|
41
|
+
* @returns A {@link Root} exposing render and unmount.
|
|
42
|
+
*/
|
|
43
|
+
declare const createRoot: (container?: Container) => Root;
|
|
44
|
+
/** Unmounts every active render root and stops the originating signal from propagating further. */
|
|
45
|
+
declare const quit: () => typeof Gdk.EVENT_STOP;
|
|
46
|
+
/**
|
|
47
|
+
* Renders children into a container other than the surrounding tree.
|
|
48
|
+
*
|
|
49
|
+
* @param children The element tree to render.
|
|
50
|
+
* @param container The GObject, application, or {@link rootElement} to render into.
|
|
51
|
+
* @param key An optional stable key.
|
|
52
|
+
* @returns A React portal.
|
|
53
|
+
*/
|
|
54
|
+
declare const createPortal: (children: ReactNode, container: Container, key?: string) => ReactNode;
|
|
55
|
+
export { setReconcilerErrorHandler, createReconcilerRoot, createRoot, quit, createPortal, type ReconcilerRoot, type Root, };
|
|
56
|
+
//# sourceMappingURL=root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/reconciler/root.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAGpC,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,kBAAkB,CAAC;AAM9D,KAAK,kBAAkB,GAAG;IACtB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IAC5D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1D,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CAClE,CAAC;AAEF,KAAK,qBAAqB,GAAG,kBAAkB,GAAG;IAAE,aAAa,EAAE,SAAS,CAAA;CAAE,CAAC;AAE/E,+FAA+F;AAC/F,KAAK,cAAc,GAAG;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF,CAAC;AAEF,+GAA+G;AAC/G,KAAK,IAAI,GAAG;IACR,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAsB7C;;;;;GAKG;AACH,QAAA,MAAM,yBAAyB,GAAI,SAAS,YAAY,KAAG,YAAY,GAAG,IAAqC,CAAC;AA4ChH;;;;;GAKG;AACH,QAAA,MAAM,oBAAoB,GAAI,SAAS,qBAAqB,KAAG,cAc9D,CAAC;AAEF;;;;;GAKG;AACH,QAAA,MAAM,UAAU,GAAI,YAAW,SAAuB,KAAG,IAcxD,CAAC;AAEF,mGAAmG;AACnG,QAAA,MAAM,IAAI,QAAO,OAAO,GAAG,CAAC,UAM3B,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,YAAY,GAAI,UAAU,SAAS,EAAE,WAAW,SAAS,EAAE,MAAM,MAAM,KAAG,SACsC,CAAC;AAEvH,OAAO,EACH,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,EACV,IAAI,EACJ,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,IAAI,GACZ,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as Gdk from "@gtkx/gi/gdk";
|
|
2
|
+
import { createLogger } from "@gtkx/utils";
|
|
3
|
+
import { ConcurrentRoot } from "react-reconciler/constants.js";
|
|
4
|
+
import { reconciler } from "./host-config.js";
|
|
5
|
+
import { rootElement } from "./root-element.js";
|
|
6
|
+
import { endSuppressionNow } from "./signals.js";
|
|
7
|
+
const log = createLogger("react");
|
|
8
|
+
const activeRoots = new Set();
|
|
9
|
+
const errorHandlerSlot = createErrorHandlerSlot();
|
|
10
|
+
function createErrorHandlerSlot() {
|
|
11
|
+
let current = null;
|
|
12
|
+
return {
|
|
13
|
+
get: () => current,
|
|
14
|
+
set: (handler) => {
|
|
15
|
+
const previous = current;
|
|
16
|
+
current = handler;
|
|
17
|
+
return previous;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Installs a process-wide handler for errors thrown while rendering or applying an update.
|
|
23
|
+
*
|
|
24
|
+
* @param handler The handler to install.
|
|
25
|
+
* @returns The previously installed handler, or null.
|
|
26
|
+
*/
|
|
27
|
+
const setReconcilerErrorHandler = (handler) => errorHandlerSlot.set(handler);
|
|
28
|
+
const rethrowUncaughtRenderError = (error) => {
|
|
29
|
+
endSuppressionNow();
|
|
30
|
+
throw error;
|
|
31
|
+
};
|
|
32
|
+
const logCaughtRenderError = (error) => {
|
|
33
|
+
endSuppressionNow();
|
|
34
|
+
log.error("caught render error", error);
|
|
35
|
+
};
|
|
36
|
+
const openContainer = (containerInfo, callbacks) => {
|
|
37
|
+
const container = reconciler.createContainer(containerInfo, ConcurrentRoot, null, false, null, "", (error, info) => {
|
|
38
|
+
errorHandlerSlot.get()?.(error);
|
|
39
|
+
callbacks.onUncaughtError?.(error, info);
|
|
40
|
+
}, (error, info) => {
|
|
41
|
+
errorHandlerSlot.get()?.(error);
|
|
42
|
+
callbacks.onCaughtError?.(error, info);
|
|
43
|
+
}, (error, info) => {
|
|
44
|
+
callbacks.onRecoverableError?.(error, info);
|
|
45
|
+
}, () => undefined);
|
|
46
|
+
activeRoots.add(container);
|
|
47
|
+
return container;
|
|
48
|
+
};
|
|
49
|
+
const unmountContainer = (container) => {
|
|
50
|
+
reconciler.updateContainer(null, container, null, null);
|
|
51
|
+
activeRoots.delete(container);
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Creates a root that mounts an element tree into a container, routing render errors to the supplied callbacks.
|
|
55
|
+
*
|
|
56
|
+
* @param options The container to render into and the error callbacks to route failures to.
|
|
57
|
+
* @returns A {@link ReconcilerRoot}.
|
|
58
|
+
*/
|
|
59
|
+
const createReconcilerRoot = (options) => {
|
|
60
|
+
const container = openContainer(options.containerInfo, options);
|
|
61
|
+
const root = {
|
|
62
|
+
update: (element) => {
|
|
63
|
+
reconciler.updateContainer(element, container, null, null);
|
|
64
|
+
},
|
|
65
|
+
unmount: async (teardown) => {
|
|
66
|
+
await teardown(root);
|
|
67
|
+
activeRoots.delete(container);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
return root;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Creates a render root for a GTKX application.
|
|
74
|
+
*
|
|
75
|
+
* @param container The top-level container to render into; defaults to the shared {@link rootElement}.
|
|
76
|
+
* @returns A {@link Root} exposing render and unmount.
|
|
77
|
+
*/
|
|
78
|
+
const createRoot = (container = rootElement) => {
|
|
79
|
+
const opaque = openContainer(container, {
|
|
80
|
+
onUncaughtError: rethrowUncaughtRenderError,
|
|
81
|
+
onCaughtError: logCaughtRenderError,
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
render: (element) => {
|
|
85
|
+
reconciler.updateContainer(element, opaque, null, null);
|
|
86
|
+
},
|
|
87
|
+
unmount: () => {
|
|
88
|
+
unmountContainer(opaque);
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/** Unmounts every active render root and stops the originating signal from propagating further. */
|
|
93
|
+
const quit = () => {
|
|
94
|
+
for (const container of activeRoots) {
|
|
95
|
+
unmountContainer(container);
|
|
96
|
+
}
|
|
97
|
+
return Gdk.EVENT_STOP;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Renders children into a container other than the surrounding tree.
|
|
101
|
+
*
|
|
102
|
+
* @param children The element tree to render.
|
|
103
|
+
* @param container The GObject, application, or {@link rootElement} to render into.
|
|
104
|
+
* @param key An optional stable key.
|
|
105
|
+
* @returns A React portal.
|
|
106
|
+
*/
|
|
107
|
+
const createPortal = (children, container, key) => Object.assign(reconciler.createPortal(children, container, null, key ?? null), { type: "gtkx-portal", props: {} });
|
|
108
|
+
export { setReconcilerErrorHandler, createReconcilerRoot, createRoot, quit, createPortal, };
|
|
109
|
+
//# sourceMappingURL=root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/reconciler/root.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ErrorInfo, ReactNode } from \"react\";\nimport * as Gdk from \"@gtkx/gi/gdk\";\nimport { createLogger, type Logger } from \"@gtkx/utils\";\nimport { ConcurrentRoot } from \"react-reconciler/constants.js\";\nimport { type Container, reconciler } from \"./host-config.js\";\nimport { rootElement } from \"./root-element.js\";\nimport { endSuppressionNow } from \"./signals.js\";\n\ntype OpaqueRoot = { [opaqueRoot]: true };\n\ntype RootErrorCallbacks = {\n onUncaughtError?: (error: unknown, info: ErrorInfo) => void;\n onCaughtError?: (error: unknown, info: ErrorInfo) => void;\n onRecoverableError?: (error: unknown, info: ErrorInfo) => void;\n};\n\ntype ReconcilerRootOptions = RootErrorCallbacks & { containerInfo: Container };\n\n/** A root that mounts an element tree into an explicit container and reports render errors. */\ntype ReconcilerRoot = {\n update: (element: ReactNode) => void;\n unmount: (teardown: (root: ReconcilerRoot) => Promise<void>) => Promise<void>;\n};\n\n/** The object {@link createRoot} returns: it renders an element tree into a container and can tear it down. */\ntype Root = {\n render: (element: ReactNode) => void;\n unmount: () => void;\n};\n\ntype ErrorHandler = (error: unknown) => void;\ntype ErrorHandlerSlot = { get: () => ErrorHandler | null; set: (handler: ErrorHandler) => ErrorHandler | null };\n\ndeclare const opaqueRoot: unique symbol;\nconst log: Logger = createLogger(\"react\");\nconst activeRoots: Set<OpaqueRoot> = new Set();\nconst errorHandlerSlot = createErrorHandlerSlot();\n\nfunction createErrorHandlerSlot(): ErrorHandlerSlot {\n let current: ErrorHandler | null = null;\n\n return {\n get: () => current,\n set: (handler) => {\n const previous = current;\n current = handler;\n\n return previous;\n },\n };\n}\n\n/**\n * Installs a process-wide handler for errors thrown while rendering or applying an update.\n *\n * @param handler The handler to install.\n * @returns The previously installed handler, or null.\n */\nconst setReconcilerErrorHandler = (handler: ErrorHandler): ErrorHandler | null => errorHandlerSlot.set(handler);\n\nconst rethrowUncaughtRenderError = (error: unknown): never => {\n endSuppressionNow();\n throw error;\n};\n\nconst logCaughtRenderError = (error: unknown): void => {\n endSuppressionNow();\n log.error(\"caught render error\", error);\n};\n\nconst openContainer = (containerInfo: Container, callbacks: RootErrorCallbacks): OpaqueRoot => {\n const container = reconciler.createContainer(\n containerInfo,\n ConcurrentRoot,\n null,\n false,\n null,\n \"\",\n (error, info) => {\n errorHandlerSlot.get()?.(error);\n callbacks.onUncaughtError?.(error, info);\n },\n (error, info) => {\n errorHandlerSlot.get()?.(error);\n callbacks.onCaughtError?.(error, info);\n },\n (error, info) => {\n callbacks.onRecoverableError?.(error, info);\n },\n (): void => undefined,\n ) as OpaqueRoot;\n\n activeRoots.add(container);\n\n return container;\n};\n\nconst unmountContainer = (container: OpaqueRoot): void => {\n reconciler.updateContainer(null, container, null, null);\n activeRoots.delete(container);\n};\n\n/**\n * Creates a root that mounts an element tree into a container, routing render errors to the supplied callbacks.\n *\n * @param options The container to render into and the error callbacks to route failures to.\n * @returns A {@link ReconcilerRoot}.\n */\nconst createReconcilerRoot = (options: ReconcilerRootOptions): ReconcilerRoot => {\n const container = openContainer(options.containerInfo, options);\n\n const root: ReconcilerRoot = {\n update: (element) => {\n reconciler.updateContainer(element, container, null, null);\n },\n unmount: async (teardown) => {\n await teardown(root);\n activeRoots.delete(container);\n },\n };\n\n return root;\n};\n\n/**\n * Creates a render root for a GTKX application.\n *\n * @param container The top-level container to render into; defaults to the shared {@link rootElement}.\n * @returns A {@link Root} exposing render and unmount.\n */\nconst createRoot = (container: Container = rootElement): Root => {\n const opaque = openContainer(container, {\n onUncaughtError: rethrowUncaughtRenderError,\n onCaughtError: logCaughtRenderError,\n });\n\n return {\n render: (element) => {\n reconciler.updateContainer(element, opaque, null, null);\n },\n unmount: () => {\n unmountContainer(opaque);\n },\n };\n};\n\n/** Unmounts every active render root and stops the originating signal from propagating further. */\nconst quit = (): typeof Gdk.EVENT_STOP => {\n for (const container of activeRoots) {\n unmountContainer(container);\n }\n\n return Gdk.EVENT_STOP;\n};\n\n/**\n * Renders children into a container other than the surrounding tree.\n *\n * @param children The element tree to render.\n * @param container The GObject, application, or {@link rootElement} to render into.\n * @param key An optional stable key.\n * @returns A React portal.\n */\nconst createPortal = (children: ReactNode, container: Container, key?: string): ReactNode =>\n Object.assign(reconciler.createPortal(children, container, null, key ?? null), { type: \"gtkx-portal\", props: {} });\n\nexport {\n setReconcilerErrorHandler,\n createReconcilerRoot,\n createRoot,\n quit,\n createPortal,\n type ReconcilerRoot,\n type Root,\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type SignalHandler } from "@gtkx/runtime";
|
|
2
|
+
import type { SignalTarget } from "./node.js";
|
|
3
|
+
declare const beginSuppression: () => void;
|
|
4
|
+
declare const endSuppression: () => void;
|
|
5
|
+
declare const endSuppressionNow: () => void;
|
|
6
|
+
declare const connectHandler: (target: SignalTarget, prop: string, signal: string, handler: SignalHandler) => void;
|
|
7
|
+
declare const disconnectHandler: (target: SignalTarget, prop: string) => void;
|
|
8
|
+
declare const disconnectAllHandlers: (target: SignalTarget) => void;
|
|
9
|
+
export { beginSuppression, endSuppression, endSuppressionNow, connectHandler, disconnectHandler, disconnectAllHandlers, };
|
|
10
|
+
//# sourceMappingURL=signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/reconciler/signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,WAAW,CAAC;AAY7D,QAAA,MAAM,gBAAgB,EAAE,MAAM,IAA0C,CAAC;AACzE,QAAA,MAAM,cAAc,EAAE,MAAM,IAAwC,CAAC;AACrE,QAAA,MAAM,iBAAiB,EAAE,MAAM,IAA2C,CAAC;AAiD3E,QAAA,MAAM,cAAc,GAAI,QAAQ,YAAY,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE,SAAS,aAAa,KAAG,IAmBpG,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,QAAQ,YAAY,EAAE,MAAM,MAAM,KAAG,IAS/D,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,YAAY,KAAG,IAMrD,CAAC;AAEF,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GACxB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getSignalBaseName } from "@gtkx/runtime";
|
|
2
|
+
import { camelCase } from "@gtkx/utils";
|
|
3
|
+
import { typeInfoFor } from "./metadata.js";
|
|
4
|
+
const NOTIFY_DETAIL_PREFIX = "notify::";
|
|
5
|
+
const suppressionCounter = createSuppressionCounter();
|
|
6
|
+
const beginSuppression = suppressionCounter.beginSuppression;
|
|
7
|
+
const endSuppression = suppressionCounter.endSuppression;
|
|
8
|
+
const endSuppressionNow = suppressionCounter.endSuppressionNow;
|
|
9
|
+
const isSuppressed = suppressionCounter.isSuppressed;
|
|
10
|
+
function createSuppressionCounter() {
|
|
11
|
+
let depth = 0;
|
|
12
|
+
const release = () => {
|
|
13
|
+
if (depth > 0) {
|
|
14
|
+
depth -= 1;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
beginSuppression: () => {
|
|
19
|
+
depth += 1;
|
|
20
|
+
},
|
|
21
|
+
endSuppression: () => {
|
|
22
|
+
queueMicrotask(release);
|
|
23
|
+
},
|
|
24
|
+
endSuppressionNow: release,
|
|
25
|
+
isSuppressed: () => depth > 0,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const getNotifyProperty = (signal) => signal.startsWith(NOTIFY_DETAIL_PREFIX) ? camelCase(signal.slice(NOTIFY_DETAIL_PREFIX.length)) : null;
|
|
29
|
+
const isBlockableSignal = (info, signal) => info.userEventSignals.has(getSignalBaseName(signal));
|
|
30
|
+
const invokeHandler = (target, record, notifyProperty, args) => notifyProperty === null
|
|
31
|
+
? record.handler(...args, target.object)
|
|
32
|
+
: record.handler(Reflect.get(target.object, notifyProperty), target.object);
|
|
33
|
+
const wrapHandler = (target, record, notifyProperty) => (...args) => {
|
|
34
|
+
if (record.blockable && isSuppressed()) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return target.dispatch(() => invokeHandler(target, record, notifyProperty, args));
|
|
38
|
+
};
|
|
39
|
+
const connectHandler = (target, prop, signal, handler) => {
|
|
40
|
+
const existing = target.handlers.get(prop);
|
|
41
|
+
if (existing?.signal === signal) {
|
|
42
|
+
existing.handler = handler;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (existing !== undefined) {
|
|
46
|
+
target.object.off(existing.signal, existing.wrapped);
|
|
47
|
+
}
|
|
48
|
+
const isBlockable = isBlockableSignal(typeInfoFor(target.typeName), signal);
|
|
49
|
+
const notifyProperty = getNotifyProperty(signal);
|
|
50
|
+
const record = { signal, handler, wrapped: () => undefined, blockable: isBlockable };
|
|
51
|
+
record.wrapped = wrapHandler(target, record, notifyProperty);
|
|
52
|
+
target.object.on(signal, record.wrapped);
|
|
53
|
+
target.handlers.set(prop, record);
|
|
54
|
+
};
|
|
55
|
+
const disconnectHandler = (target, prop) => {
|
|
56
|
+
const record = target.handlers.get(prop);
|
|
57
|
+
if (record === undefined) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
target.object.off(record.signal, record.wrapped);
|
|
61
|
+
target.handlers.delete(prop);
|
|
62
|
+
};
|
|
63
|
+
const disconnectAllHandlers = (target) => {
|
|
64
|
+
for (const record of target.handlers.values()) {
|
|
65
|
+
target.object.off(record.signal, record.wrapped);
|
|
66
|
+
}
|
|
67
|
+
target.handlers.clear();
|
|
68
|
+
};
|
|
69
|
+
export { beginSuppression, endSuppression, endSuppressionNow, connectHandler, disconnectHandler, disconnectAllHandlers, };
|
|
70
|
+
//# sourceMappingURL=signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/reconciler/signals.ts"],"names":[],"mappings":"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","sourcesContent":["import { getSignalBaseName, type SignalHandler } from \"@gtkx/runtime\";\nimport { camelCase } from \"@gtkx/utils\";\nimport type { HandlerRecord, SignalTarget } from \"./node.js\";\nimport { type TypeInfo, typeInfoFor } from \"./metadata.js\";\n\ntype SuppressionCounter = {\n beginSuppression: () => void;\n endSuppression: () => void;\n endSuppressionNow: () => void;\n isSuppressed: () => boolean;\n};\n\nconst NOTIFY_DETAIL_PREFIX = \"notify::\";\nconst suppressionCounter: SuppressionCounter = createSuppressionCounter();\nconst beginSuppression: () => void = suppressionCounter.beginSuppression;\nconst endSuppression: () => void = suppressionCounter.endSuppression;\nconst endSuppressionNow: () => void = suppressionCounter.endSuppressionNow;\nconst isSuppressed: () => boolean = suppressionCounter.isSuppressed;\n\nfunction createSuppressionCounter(): SuppressionCounter {\n let depth = 0;\n\n const release = (): void => {\n if (depth > 0) {\n depth -= 1;\n }\n };\n\n return {\n beginSuppression: () => {\n depth += 1;\n },\n endSuppression: () => {\n queueMicrotask(release);\n },\n endSuppressionNow: release,\n isSuppressed: () => depth > 0,\n };\n}\n\nconst getNotifyProperty = (signal: string): string | null =>\n signal.startsWith(NOTIFY_DETAIL_PREFIX) ? camelCase(signal.slice(NOTIFY_DETAIL_PREFIX.length)) : null;\n\nconst isBlockableSignal = (info: TypeInfo, signal: string): boolean =>\n info.userEventSignals.has(getSignalBaseName(signal));\n\nconst invokeHandler = (\n target: SignalTarget,\n record: HandlerRecord,\n notifyProperty: string | null,\n args: unknown[],\n): unknown =>\n notifyProperty === null\n ? record.handler(...args, target.object)\n : record.handler(Reflect.get(target.object, notifyProperty), target.object);\n\nconst wrapHandler = (target: SignalTarget, record: HandlerRecord, notifyProperty: string | null): SignalHandler =>\n (...args: unknown[]): unknown => {\n if (record.blockable && isSuppressed()) {\n return undefined;\n }\n\n return target.dispatch(() => invokeHandler(target, record, notifyProperty, args));\n };\n\nconst connectHandler = (target: SignalTarget, prop: string, signal: string, handler: SignalHandler): void => {\n const existing = target.handlers.get(prop);\n\n if (existing?.signal === signal) {\n existing.handler = handler;\n\n return;\n }\n\n if (existing !== undefined) {\n target.object.off(existing.signal, existing.wrapped);\n }\n\n const isBlockable = isBlockableSignal(typeInfoFor(target.typeName), signal);\n const notifyProperty = getNotifyProperty(signal);\n const record: HandlerRecord = { signal, handler, wrapped: (): undefined => undefined, blockable: isBlockable };\n record.wrapped = wrapHandler(target, record, notifyProperty);\n target.object.on(signal, record.wrapped);\n target.handlers.set(prop, record);\n};\n\nconst disconnectHandler = (target: SignalTarget, prop: string): void => {\n const record = target.handlers.get(prop);\n\n if (record === undefined) {\n return;\n }\n\n target.object.off(record.signal, record.wrapped);\n target.handlers.delete(prop);\n};\n\nconst disconnectAllHandlers = (target: SignalTarget): void => {\n for (const record of target.handlers.values()) {\n target.object.off(record.signal, record.wrapped);\n }\n\n target.handlers.clear();\n};\n\nexport {\n beginSuppression,\n endSuppression,\n endSuppressionNow,\n connectHandler,\n disconnectHandler,\n disconnectAllHandlers,\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type * as GObject from "@gtkx/gi/gobject";
|
|
2
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
import type { ContentChild, ElementNode, TextNode } from "./node.js";
|
|
4
|
+
import type { Props } from "./registry.js";
|
|
5
|
+
declare const TEXT_PROP = "text";
|
|
6
|
+
declare const bufferText: (buffer: Gtk.TextBuffer) => string;
|
|
7
|
+
declare const hasSameText: (object: GObject.Object, prop: string, value: unknown) => boolean;
|
|
8
|
+
declare const textRestrictionError: (text: string) => Error;
|
|
9
|
+
declare const canAcceptText: (host: ElementNode) => boolean;
|
|
10
|
+
declare const markTextDirty: (host: ElementNode) => void;
|
|
11
|
+
declare const enclosingHost: (node: TextNode) => ElementNode | null;
|
|
12
|
+
declare const addContent: (host: ElementNode, child: ContentChild, before: ContentChild | null) => void;
|
|
13
|
+
declare const removeContent: (host: ElementNode, child: ContentChild) => void;
|
|
14
|
+
declare const validateContentMix: (node: ElementNode, props: Props) => void;
|
|
15
|
+
declare const isContentPaintableProp: (node: ElementNode, name: string) => boolean;
|
|
16
|
+
declare const flushTextHosts: () => void;
|
|
17
|
+
declare const didUpdateTextSurgically: (host: ElementNode, node: TextNode, oldText: string, newText: string) => boolean;
|
|
18
|
+
export { TEXT_PROP, textRestrictionError, bufferText, hasSameText, canAcceptText, isContentPaintableProp, markTextDirty, enclosingHost, addContent, removeContent, validateContentMix, flushTextHosts, didUpdateTextSurgically, };
|
|
19
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/reconciler/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAe,WAAW,EAAc,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAe3C,QAAA,MAAM,SAAS,SAAS,CAAC;AAsBzB,QAAA,MAAM,UAAU,GAAI,QAAQ,GAAG,CAAC,UAAU,KAAG,MACwB,CAAC;AActE,QAAA,MAAM,WAAW,GAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,OAAO,KAAG,OACQ,CAAC;AA4DrF,QAAA,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,KAIxC,CAAC;AAEN,QAAA,MAAM,aAAa,GAAI,MAAM,WAAW,KAAG,OAC8B,CAAC;AAuB1E,QAAA,MAAM,aAAa,GAAI,MAAM,WAAW,KAAG,IAM1C,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,MAAM,QAAQ,KAAG,WAAW,GAAG,IAAkD,CAAC;AAEzG,QAAA,MAAM,UAAU,GAAI,MAAM,WAAW,EAAE,OAAO,YAAY,EAAE,QAAQ,YAAY,GAAG,IAAI,KAAG,IAgBzF,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,MAAM,WAAW,EAAE,OAAO,YAAY,KAAG,IAQ/D,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,MAAM,WAAW,EAAE,OAAO,KAAK,KAAG,IAY7D,CAAC;AAsDF,QAAA,MAAM,sBAAsB,GAAI,MAAM,WAAW,EAAE,MAAM,MAAM,KAAG,OACN,CAAC;AA2F7D,QAAA,MAAM,cAAc,QAAO,IAQ1B,CAAC;AAiBF,QAAA,MAAM,uBAAuB,GAAI,MAAM,WAAW,EAAE,MAAM,QAAQ,EAAE,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,OAqBtG,CAAC;AAEF,OAAO,EACH,SAAS,EACT,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,uBAAuB,GAC1B,CAAC"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import * as Gdk from "@gtkx/gi/gdk";
|
|
2
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
import { drain, indexBeforeOrEnd } from "@gtkx/utils";
|
|
4
|
+
import { ELEMENT_KIND, TEXT_KIND } from "./node.js";
|
|
5
|
+
const dirtyHosts = new Set();
|
|
6
|
+
const tagTables = new WeakMap();
|
|
7
|
+
const TEXT_CONTENT_KINDS = new Set(["label", "buffer", "tag"]);
|
|
8
|
+
const PAINTABLE_PROP = "paintable";
|
|
9
|
+
const TEXT_PROP = "text";
|
|
10
|
+
const CONTENT_MIX_RULES = [
|
|
11
|
+
{
|
|
12
|
+
kind: "label",
|
|
13
|
+
prop: "label",
|
|
14
|
+
message: "<GtkLabel> cannot mix a `label` prop with text children; use one or the other",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
kind: "buffer",
|
|
18
|
+
prop: "text",
|
|
19
|
+
message: "<GtkTextBuffer> cannot mix a `text` prop with content children; use one or the other",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
kind: "anchor",
|
|
23
|
+
prop: PAINTABLE_PROP,
|
|
24
|
+
message: "<GtkTextChildAnchor> cannot mix a `paintable` prop with a child widget; use one or the other",
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
const charLength = (text) => text[Symbol.iterator]().toArray().length;
|
|
28
|
+
const bufferText = (buffer) => buffer.getText(buffer.getStartIter(), buffer.getEndIter(), false);
|
|
29
|
+
const currentText = (object) => {
|
|
30
|
+
if (object instanceof Gtk.TextBuffer) {
|
|
31
|
+
return bufferText(object);
|
|
32
|
+
}
|
|
33
|
+
if (object instanceof Gtk.Editable || object instanceof Gtk.EntryBuffer) {
|
|
34
|
+
return object.getText();
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
};
|
|
38
|
+
const hasSameText = (object, prop, value) => prop === TEXT_PROP && typeof value === "string" && currentText(object) === value;
|
|
39
|
+
const contentTextLength = (node) => {
|
|
40
|
+
if (node.kind === TEXT_KIND) {
|
|
41
|
+
return charLength(node.text);
|
|
42
|
+
}
|
|
43
|
+
if (node.contentKind === "tag") {
|
|
44
|
+
return node.content.reduce((sum, child) => sum + contentTextLength(child), 0);
|
|
45
|
+
}
|
|
46
|
+
return node.contentKind === "anchor" ? 1 : 0;
|
|
47
|
+
};
|
|
48
|
+
const isTagElement = (node) => node.kind === ELEMENT_KIND && node.contentKind === "tag";
|
|
49
|
+
const stepOffset = (node, target, offset) => {
|
|
50
|
+
if (node === target) {
|
|
51
|
+
return { found: true, offset };
|
|
52
|
+
}
|
|
53
|
+
if (isTagElement(node)) {
|
|
54
|
+
return getOffset(node.content, target, offset);
|
|
55
|
+
}
|
|
56
|
+
return { found: false, offset: offset + contentTextLength(node) };
|
|
57
|
+
};
|
|
58
|
+
const getOffset = (nodes, target, start) => {
|
|
59
|
+
let offset = start;
|
|
60
|
+
for (const node of nodes) {
|
|
61
|
+
const step = stepOffset(node, target, offset);
|
|
62
|
+
if (step.found) {
|
|
63
|
+
return step;
|
|
64
|
+
}
|
|
65
|
+
offset = step.offset;
|
|
66
|
+
}
|
|
67
|
+
return { found: false, offset };
|
|
68
|
+
};
|
|
69
|
+
const enclosingTagNodes = (node) => {
|
|
70
|
+
const nodes = [];
|
|
71
|
+
let current = node.parent;
|
|
72
|
+
while (current !== null && current.kind === ELEMENT_KIND) {
|
|
73
|
+
if (current.contentKind === "tag") {
|
|
74
|
+
nodes.push(current);
|
|
75
|
+
}
|
|
76
|
+
current = current.parent;
|
|
77
|
+
}
|
|
78
|
+
return nodes;
|
|
79
|
+
};
|
|
80
|
+
const textRestrictionError = (text) => new Error("Text strings must be rendered within a <GtkLabel> or <GtkTextBuffer> element; " +
|
|
81
|
+
`received ${JSON.stringify(text)}`);
|
|
82
|
+
const canAcceptText = (host) => host.contentKind !== null && TEXT_CONTENT_KINDS.has(host.contentKind);
|
|
83
|
+
const isRootHost = (node) => node.contentKind === "label" || node.contentKind === "buffer";
|
|
84
|
+
const mapElementParent = (parent, map) => parent !== null && parent.kind === ELEMENT_KIND ? map(parent) : null;
|
|
85
|
+
const parentElement = (node) => mapElementParent(node.parent, (parent) => parent);
|
|
86
|
+
const getRootHost = (node) => {
|
|
87
|
+
let current = node;
|
|
88
|
+
while (current !== null) {
|
|
89
|
+
if (isRootHost(current)) {
|
|
90
|
+
return current;
|
|
91
|
+
}
|
|
92
|
+
current = parentElement(current);
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
};
|
|
96
|
+
const markTextDirty = (host) => {
|
|
97
|
+
const root = getRootHost(host);
|
|
98
|
+
if (root !== null) {
|
|
99
|
+
dirtyHosts.add(root);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const enclosingHost = (node) => mapElementParent(node.parent, getRootHost);
|
|
103
|
+
const addContent = (host, child, before) => {
|
|
104
|
+
const content = host.content;
|
|
105
|
+
const existing = content.indexOf(child);
|
|
106
|
+
if (existing !== -1) {
|
|
107
|
+
content.splice(existing, 1);
|
|
108
|
+
}
|
|
109
|
+
content.splice(indexBeforeOrEnd(content, before, (item, target) => item === target), 0, child);
|
|
110
|
+
child.parent = host;
|
|
111
|
+
markTextDirty(host);
|
|
112
|
+
};
|
|
113
|
+
const removeContent = (host, child) => {
|
|
114
|
+
const index = host.content.indexOf(child);
|
|
115
|
+
if (index !== -1) {
|
|
116
|
+
host.content.splice(index, 1);
|
|
117
|
+
}
|
|
118
|
+
markTextDirty(host);
|
|
119
|
+
};
|
|
120
|
+
const validateContentMix = (node, props) => {
|
|
121
|
+
if (node.content.length === 0) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const violated = CONTENT_MIX_RULES.find((rule) => rule.kind === node.contentKind && props[rule.prop] !== undefined);
|
|
125
|
+
if (violated !== undefined) {
|
|
126
|
+
throw new Error(violated.message);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const detachTag = (tag, table, name) => {
|
|
130
|
+
const previous = tagTables.get(tag);
|
|
131
|
+
if (previous !== undefined && previous !== table) {
|
|
132
|
+
previous.remove(tag);
|
|
133
|
+
}
|
|
134
|
+
if (name === null) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const existing = table.lookup(name);
|
|
138
|
+
if (existing !== null && existing !== tag) {
|
|
139
|
+
table.remove(existing);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const ensureTag = (table, node) => {
|
|
143
|
+
const tag = node.object;
|
|
144
|
+
if (!(tag instanceof Gtk.TextTag) || tagTables.get(tag) === table) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const name = typeof node.props.name === "string" ? node.props.name : null;
|
|
148
|
+
detachTag(tag, table, name);
|
|
149
|
+
if (name === null || table.lookup(name) !== tag) {
|
|
150
|
+
table.add(tag);
|
|
151
|
+
}
|
|
152
|
+
tagTables.set(tag, table);
|
|
153
|
+
};
|
|
154
|
+
const insertTag = (build, node) => {
|
|
155
|
+
const start = build.buffer.getCharCount();
|
|
156
|
+
insertContent(build, node.content);
|
|
157
|
+
const tag = node.object;
|
|
158
|
+
if (tag instanceof Gtk.TextTag) {
|
|
159
|
+
ensureTag(build.buffer.getTagTable(), node);
|
|
160
|
+
build.buffer.applyTag(tag, build.buffer.getIterAtOffset(start), build.buffer.getEndIter());
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
const contentPaintable = (node) => {
|
|
164
|
+
const value = node.props[PAINTABLE_PROP];
|
|
165
|
+
return value instanceof Gdk.Paintable ? value : null;
|
|
166
|
+
};
|
|
167
|
+
const isContentPaintableProp = (node, name) => name === PAINTABLE_PROP && node.contentKind === "anchor";
|
|
168
|
+
const insertAnchor = (build, node) => {
|
|
169
|
+
const paintable = contentPaintable(node);
|
|
170
|
+
if (paintable !== null) {
|
|
171
|
+
build.buffer.insertPaintable(build.buffer.getEndIter(), paintable);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const anchor = node.object;
|
|
175
|
+
if (!(anchor instanceof Gtk.TextChildAnchor)) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
build.buffer.insertChildAnchor(build.buffer.getEndIter(), anchor);
|
|
179
|
+
const child = node.content[0];
|
|
180
|
+
if (build.view !== null && child?.kind === ELEMENT_KIND && child.object instanceof Gtk.Widget) {
|
|
181
|
+
build.view.addChildAtAnchor(child.object, anchor);
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
const insertElement = (build, node) => {
|
|
185
|
+
if (node.contentKind === "tag") {
|
|
186
|
+
insertTag(build, node);
|
|
187
|
+
}
|
|
188
|
+
else if (node.contentKind === "anchor") {
|
|
189
|
+
insertAnchor(build, node);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
build.marks.push({ node, offset: build.buffer.getCharCount() });
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
const insertContent = (build, nodes) => {
|
|
196
|
+
for (const child of nodes) {
|
|
197
|
+
if (child.kind === TEXT_KIND) {
|
|
198
|
+
build.buffer.insert(build.buffer.getEndIter(), child.text, -1);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
insertElement(build, child);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
const placeMark = (buffer, node, offset) => {
|
|
206
|
+
const mark = node.object;
|
|
207
|
+
if (!(mark instanceof Gtk.TextMark)) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const iter = buffer.getIterAtOffset(offset);
|
|
211
|
+
if (mark.getBuffer() === null) {
|
|
212
|
+
buffer.addMark(mark, iter);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
buffer.moveMark(mark, iter);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const rebuildBuffer = (node) => {
|
|
219
|
+
const buffer = node.object;
|
|
220
|
+
if (node.props.text !== undefined || !(buffer instanceof Gtk.TextBuffer)) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
buffer.setText("", -1);
|
|
224
|
+
const build = { buffer, view: node.bufferView, marks: [] };
|
|
225
|
+
insertContent(build, node.content);
|
|
226
|
+
for (const mark of build.marks) {
|
|
227
|
+
placeMark(buffer, mark.node, mark.offset);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
const rebuildLabel = (node) => {
|
|
231
|
+
if (node.props.label !== undefined) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const label = node.object;
|
|
235
|
+
if (!(label instanceof Gtk.Label)) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
label.setLabel(node.content.map((child) => (child.kind === TEXT_KIND ? child.text : "")).join(""));
|
|
239
|
+
};
|
|
240
|
+
const flushTextHosts = () => {
|
|
241
|
+
drain(dirtyHosts, (host) => {
|
|
242
|
+
if (host.contentKind === "label") {
|
|
243
|
+
rebuildLabel(host);
|
|
244
|
+
}
|
|
245
|
+
else if (host.contentKind === "buffer") {
|
|
246
|
+
rebuildBuffer(host);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
const applyEnclosingTags = (buffer, node, startIter, endIter) => {
|
|
251
|
+
for (const tagNode of enclosingTagNodes(node)) {
|
|
252
|
+
ensureTag(buffer.getTagTable(), tagNode);
|
|
253
|
+
if (tagNode.object instanceof Gtk.TextTag) {
|
|
254
|
+
buffer.applyTag(tagNode.object, startIter, endIter);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
const didUpdateTextSurgically = (host, node, oldText, newText) => {
|
|
259
|
+
const buffer = host.object;
|
|
260
|
+
if (host.contentKind !== "buffer" || !(buffer instanceof Gtk.TextBuffer)) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
const located = getOffset(host.content, node, 0);
|
|
264
|
+
if (!located.found) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
const start = located.offset;
|
|
268
|
+
buffer.delete(buffer.getIterAtOffset(start), buffer.getIterAtOffset(start + charLength(oldText)));
|
|
269
|
+
buffer.insert(buffer.getIterAtOffset(start), newText, -1);
|
|
270
|
+
const startIter = buffer.getIterAtOffset(start);
|
|
271
|
+
const endIter = buffer.getIterAtOffset(start + charLength(newText));
|
|
272
|
+
applyEnclosingTags(buffer, node, startIter, endIter);
|
|
273
|
+
return true;
|
|
274
|
+
};
|
|
275
|
+
export { TEXT_PROP, textRestrictionError, bufferText, hasSameText, canAcceptText, isContentPaintableProp, markTextDirty, enclosingHost, addContent, removeContent, validateContentMix, flushTextHosts, didUpdateTextSurgically, };
|
|
276
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/reconciler/text.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gdk from \"@gtkx/gi/gdk\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { drain, indexBeforeOrEnd } from \"@gtkx/utils\";\nimport type { ContentChild, ContentKind, ElementNode, ParentNode, TextNode } from \"./node.js\";\nimport type { Props } from \"./registry.js\";\nimport { ELEMENT_KIND, TEXT_KIND } from \"./node.js\";\n\ntype OffsetResult = { found: boolean; offset: number };\n\ntype BufferBuild = {\n buffer: Gtk.TextBuffer;\n view: Gtk.TextView | null;\n marks: { node: ElementNode; offset: number }[];\n};\n\nconst dirtyHosts: Set<ElementNode> = new Set();\nconst tagTables: WeakMap<object, Gtk.TextTagTable> = new WeakMap();\nconst TEXT_CONTENT_KINDS: Set<string> = new Set([\"label\", \"buffer\", \"tag\"]);\nconst PAINTABLE_PROP = \"paintable\";\nconst TEXT_PROP = \"text\";\n\nconst CONTENT_MIX_RULES: { kind: ContentKind; prop: string; message: string }[] = [\n {\n kind: \"label\",\n prop: \"label\",\n message: \"<GtkLabel> cannot mix a `label` prop with text children; use one or the other\",\n },\n {\n kind: \"buffer\",\n prop: \"text\",\n message: \"<GtkTextBuffer> cannot mix a `text` prop with content children; use one or the other\",\n },\n {\n kind: \"anchor\",\n prop: PAINTABLE_PROP,\n message: \"<GtkTextChildAnchor> cannot mix a `paintable` prop with a child widget; use one or the other\",\n },\n];\n\nconst charLength = (text: string): number => text[Symbol.iterator]().toArray().length;\n\nconst bufferText = (buffer: Gtk.TextBuffer): string =>\n buffer.getText(buffer.getStartIter(), buffer.getEndIter(), false);\n\nconst currentText = (object: GObject.Object): string | null => {\n if (object instanceof Gtk.TextBuffer) {\n return bufferText(object);\n }\n\n if (object instanceof Gtk.Editable || object instanceof Gtk.EntryBuffer) {\n return object.getText();\n }\n\n return null;\n};\n\nconst hasSameText = (object: GObject.Object, prop: string, value: unknown): boolean =>\n prop === TEXT_PROP && typeof value === \"string\" && currentText(object) === value;\n\nconst contentTextLength = (node: ContentChild): number => {\n if (node.kind === TEXT_KIND) {\n return charLength(node.text);\n }\n\n if (node.contentKind === \"tag\") {\n return node.content.reduce((sum, child) => sum + contentTextLength(child), 0);\n }\n\n return node.contentKind === \"anchor\" ? 1 : 0;\n};\n\nconst isTagElement = (node: ContentChild): node is ElementNode =>\n node.kind === ELEMENT_KIND && node.contentKind === \"tag\";\n\nconst stepOffset = (node: ContentChild, target: TextNode, offset: number): OffsetResult => {\n if (node === target) {\n return { found: true, offset };\n }\n\n if (isTagElement(node)) {\n return getOffset(node.content, target, offset);\n }\n\n return { found: false, offset: offset + contentTextLength(node) };\n};\n\nconst getOffset = (nodes: ContentChild[], target: TextNode, start: number): OffsetResult => {\n let offset = start;\n\n for (const node of nodes) {\n const step = stepOffset(node, target, offset);\n\n if (step.found) {\n return step;\n }\n\n offset = step.offset;\n }\n\n return { found: false, offset };\n};\n\nconst enclosingTagNodes = (node: TextNode): ElementNode[] => {\n const nodes: ElementNode[] = [];\n let current: ParentNode | null = node.parent;\n\n while (current !== null && current.kind === ELEMENT_KIND) {\n if (current.contentKind === \"tag\") {\n nodes.push(current);\n }\n\n current = current.parent;\n }\n\n return nodes;\n};\n\nconst textRestrictionError = (text: string): Error =>\n new Error(\n \"Text strings must be rendered within a <GtkLabel> or <GtkTextBuffer> element; \" +\n `received ${JSON.stringify(text)}`,\n );\n\nconst canAcceptText = (host: ElementNode): boolean =>\n host.contentKind !== null && TEXT_CONTENT_KINDS.has(host.contentKind);\n\nconst isRootHost = (node: ElementNode): boolean => node.contentKind === \"label\" || node.contentKind === \"buffer\";\n\nconst mapElementParent = <T>(parent: ParentNode | null, map: (element: ElementNode) => T): T | null =>\n parent !== null && parent.kind === ELEMENT_KIND ? map(parent) : null;\n\nconst parentElement = (node: ElementNode): ElementNode | null => mapElementParent(node.parent, (parent) => parent);\n\nconst getRootHost = (node: ElementNode): ElementNode | null => {\n let current: ElementNode | null = node;\n\n while (current !== null) {\n if (isRootHost(current)) {\n return current;\n }\n\n current = parentElement(current);\n }\n\n return null;\n};\n\nconst markTextDirty = (host: ElementNode): void => {\n const root = getRootHost(host);\n\n if (root !== null) {\n dirtyHosts.add(root);\n }\n};\n\nconst enclosingHost = (node: TextNode): ElementNode | null => mapElementParent(node.parent, getRootHost);\n\nconst addContent = (host: ElementNode, child: ContentChild, before: ContentChild | null): void => {\n const content = host.content;\n const existing = content.indexOf(child);\n\n if (existing !== -1) {\n content.splice(existing, 1);\n }\n\n content.splice(\n indexBeforeOrEnd(content, before, (item, target) => item === target),\n 0,\n child,\n );\n\n child.parent = host;\n markTextDirty(host);\n};\n\nconst removeContent = (host: ElementNode, child: ContentChild): void => {\n const index = host.content.indexOf(child);\n\n if (index !== -1) {\n host.content.splice(index, 1);\n }\n\n markTextDirty(host);\n};\n\nconst validateContentMix = (node: ElementNode, props: Props): void => {\n if (node.content.length === 0) {\n return;\n }\n\n const violated = CONTENT_MIX_RULES.find(\n (rule) => rule.kind === node.contentKind && props[rule.prop] !== undefined,\n );\n\n if (violated !== undefined) {\n throw new Error(violated.message);\n }\n};\n\nconst detachTag = (tag: Gtk.TextTag, table: Gtk.TextTagTable, name: string | null): void => {\n const previous = tagTables.get(tag);\n\n if (previous !== undefined && previous !== table) {\n previous.remove(tag);\n }\n\n if (name === null) {\n return;\n }\n\n const existing = table.lookup(name);\n\n if (existing !== null && existing !== tag) {\n table.remove(existing);\n }\n};\n\nconst ensureTag = (table: Gtk.TextTagTable, node: ElementNode): void => {\n const tag = node.object;\n\n if (!(tag instanceof Gtk.TextTag) || tagTables.get(tag) === table) {\n return;\n }\n\n const name = typeof node.props.name === \"string\" ? node.props.name : null;\n detachTag(tag, table, name);\n\n if (name === null || table.lookup(name) !== tag) {\n table.add(tag);\n }\n\n tagTables.set(tag, table);\n};\n\nconst insertTag = (build: BufferBuild, node: ElementNode): void => {\n const start = build.buffer.getCharCount();\n insertContent(build, node.content);\n const tag = node.object;\n\n if (tag instanceof Gtk.TextTag) {\n ensureTag(build.buffer.getTagTable(), node);\n build.buffer.applyTag(tag, build.buffer.getIterAtOffset(start), build.buffer.getEndIter());\n }\n};\n\nconst contentPaintable = (node: ElementNode): Gdk.Paintable | null => {\n const value = node.props[PAINTABLE_PROP];\n\n return value instanceof Gdk.Paintable ? value : null;\n};\n\nconst isContentPaintableProp = (node: ElementNode, name: string): boolean =>\n name === PAINTABLE_PROP && node.contentKind === \"anchor\";\n\nconst insertAnchor = (build: BufferBuild, node: ElementNode): void => {\n const paintable = contentPaintable(node);\n\n if (paintable !== null) {\n build.buffer.insertPaintable(build.buffer.getEndIter(), paintable);\n\n return;\n }\n\n const anchor = node.object;\n\n if (!(anchor instanceof Gtk.TextChildAnchor)) {\n return;\n }\n\n build.buffer.insertChildAnchor(build.buffer.getEndIter(), anchor);\n const child = node.content[0];\n\n if (build.view !== null && child?.kind === ELEMENT_KIND && child.object instanceof Gtk.Widget) {\n build.view.addChildAtAnchor(child.object, anchor);\n }\n};\n\nconst insertElement = (build: BufferBuild, node: ElementNode): void => {\n if (node.contentKind === \"tag\") {\n insertTag(build, node);\n } else if (node.contentKind === \"anchor\") {\n insertAnchor(build, node);\n } else {\n build.marks.push({ node, offset: build.buffer.getCharCount() });\n }\n};\n\nconst insertContent = (build: BufferBuild, nodes: ContentChild[]): void => {\n for (const child of nodes) {\n if (child.kind === TEXT_KIND) {\n build.buffer.insert(build.buffer.getEndIter(), child.text, -1);\n } else {\n insertElement(build, child);\n }\n }\n};\n\nconst placeMark = (buffer: Gtk.TextBuffer, node: ElementNode, offset: number): void => {\n const mark = node.object;\n\n if (!(mark instanceof Gtk.TextMark)) {\n return;\n }\n\n const iter = buffer.getIterAtOffset(offset);\n\n if (mark.getBuffer() === null) {\n buffer.addMark(mark, iter);\n } else {\n buffer.moveMark(mark, iter);\n }\n};\n\nconst rebuildBuffer = (node: ElementNode): void => {\n const buffer = node.object;\n\n if (node.props.text !== undefined || !(buffer instanceof Gtk.TextBuffer)) {\n return;\n }\n\n buffer.setText(\"\", -1);\n const build: BufferBuild = { buffer, view: node.bufferView, marks: [] };\n insertContent(build, node.content);\n\n for (const mark of build.marks) {\n placeMark(buffer, mark.node, mark.offset);\n }\n};\n\nconst rebuildLabel = (node: ElementNode): void => {\n if (node.props.label !== undefined) {\n return;\n }\n\n const label = node.object;\n\n if (!(label instanceof Gtk.Label)) {\n return;\n }\n\n label.setLabel(node.content.map((child) => (child.kind === TEXT_KIND ? child.text : \"\")).join(\"\"));\n};\n\nconst flushTextHosts = (): void => {\n drain(dirtyHosts, (host) => {\n if (host.contentKind === \"label\") {\n rebuildLabel(host);\n } else if (host.contentKind === \"buffer\") {\n rebuildBuffer(host);\n }\n });\n};\n\nconst applyEnclosingTags = (\n buffer: Gtk.TextBuffer,\n node: TextNode,\n startIter: Gtk.TextIter,\n endIter: Gtk.TextIter,\n): void => {\n for (const tagNode of enclosingTagNodes(node)) {\n ensureTag(buffer.getTagTable(), tagNode);\n\n if (tagNode.object instanceof Gtk.TextTag) {\n buffer.applyTag(tagNode.object, startIter, endIter);\n }\n }\n};\n\nconst didUpdateTextSurgically = (host: ElementNode, node: TextNode, oldText: string, newText: string): boolean => {\n const buffer = host.object;\n\n if (host.contentKind !== \"buffer\" || !(buffer instanceof Gtk.TextBuffer)) {\n return false;\n }\n\n const located = getOffset(host.content, node, 0);\n\n if (!located.found) {\n return false;\n }\n\n const start = located.offset;\n buffer.delete(buffer.getIterAtOffset(start), buffer.getIterAtOffset(start + charLength(oldText)));\n buffer.insert(buffer.getIterAtOffset(start), newText, -1);\n const startIter = buffer.getIterAtOffset(start);\n const endIter = buffer.getIterAtOffset(start + charLength(newText));\n applyEnclosingTags(buffer, node, startIter, endIter);\n\n return true;\n};\n\nexport {\n TEXT_PROP,\n textRestrictionError,\n bufferText,\n hasSameText,\n canAcceptText,\n isContentPaintableProp,\n markTextDirty,\n enclosingHost,\n addContent,\n removeContent,\n validateContentMix,\n flushTextHosts,\n didUpdateTextSurgically,\n};\n"]}
|