@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,161 @@
|
|
|
1
|
+
import type * as GObject from "@gtkx/gi/gobject";
|
|
2
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
import type { SignalHandler } from "@gtkx/runtime";
|
|
4
|
+
import { getOrInsert } from "@gtkx/utils";
|
|
5
|
+
import type { ElementBehavior, Props } from "./registry.js";
|
|
6
|
+
|
|
7
|
+
type ContentKind = "label" | "buffer" | "tag" | "anchor";
|
|
8
|
+
type HandlerRecord = { signal: string; handler: SignalHandler; wrapped: SignalHandler; blockable: boolean };
|
|
9
|
+
type Dispatch = (fn: () => unknown) => unknown;
|
|
10
|
+
|
|
11
|
+
type SignalTarget = {
|
|
12
|
+
object: GObject.Object;
|
|
13
|
+
handlers: Map<string, HandlerRecord>;
|
|
14
|
+
typeName: string;
|
|
15
|
+
dispatch: Dispatch;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
type PlacedChild = {
|
|
19
|
+
node: PlaceableNode;
|
|
20
|
+
object: GObject.Object;
|
|
21
|
+
adopted: GObject.Object | null;
|
|
22
|
+
slot: string;
|
|
23
|
+
behavior: ElementBehavior | null;
|
|
24
|
+
attached: boolean;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
type ElementNode = SignalTarget & {
|
|
28
|
+
kind: typeof ELEMENT_KIND;
|
|
29
|
+
props: Props;
|
|
30
|
+
placements: Map<string, PlacedChild[]>;
|
|
31
|
+
contexts: Map<ElementBehavior, unknown>;
|
|
32
|
+
parent: ParentNode | null;
|
|
33
|
+
content: ContentChild[];
|
|
34
|
+
contentKind: ContentKind | null;
|
|
35
|
+
bufferView: Gtk.TextView | null;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
type PropNode = {
|
|
39
|
+
kind: typeof PROP_KIND;
|
|
40
|
+
slot: string;
|
|
41
|
+
children: PlaceableNode[];
|
|
42
|
+
parent: ElementNode | null;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
type LazyNode = {
|
|
46
|
+
kind: typeof LAZY_KIND;
|
|
47
|
+
typeName: string;
|
|
48
|
+
props: Props;
|
|
49
|
+
children: PlaceableNode[];
|
|
50
|
+
parent: ElementNode | null;
|
|
51
|
+
adopted: GObject.Object | null;
|
|
52
|
+
handlers: Map<string, HandlerRecord>;
|
|
53
|
+
dispatch: Dispatch;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
type TextNode = {
|
|
57
|
+
kind: typeof TEXT_KIND;
|
|
58
|
+
text: string;
|
|
59
|
+
parent: ParentNode | null;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
type PlaceableNode = ElementNode | LazyNode;
|
|
63
|
+
type ParentNode = ElementNode | PropNode | LazyNode;
|
|
64
|
+
type ContentChild = TextNode | ElementNode;
|
|
65
|
+
type Instance = ElementNode | PropNode | LazyNode;
|
|
66
|
+
type AnyNode = Instance | TextNode;
|
|
67
|
+
|
|
68
|
+
const ELEMENT_KIND = "element";
|
|
69
|
+
const PROP_KIND = "prop";
|
|
70
|
+
const TEXT_KIND = "text";
|
|
71
|
+
const LAZY_KIND = "lazy";
|
|
72
|
+
const DEFAULT_SLOT = "children";
|
|
73
|
+
|
|
74
|
+
const createPropNode = (slot: string): PropNode => ({
|
|
75
|
+
kind: PROP_KIND,
|
|
76
|
+
slot,
|
|
77
|
+
children: [],
|
|
78
|
+
parent: null,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const createLazyNode = (typeName: string, props: Props, dispatch: Dispatch): LazyNode => ({
|
|
82
|
+
kind: LAZY_KIND,
|
|
83
|
+
typeName,
|
|
84
|
+
props,
|
|
85
|
+
children: [],
|
|
86
|
+
parent: null,
|
|
87
|
+
adopted: null,
|
|
88
|
+
handlers: new Map(),
|
|
89
|
+
dispatch,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const createElementNode = (
|
|
93
|
+
typeName: string,
|
|
94
|
+
object: GObject.Object,
|
|
95
|
+
dispatch: Dispatch,
|
|
96
|
+
contentKind: ContentKind | null,
|
|
97
|
+
): ElementNode => ({
|
|
98
|
+
kind: ELEMENT_KIND,
|
|
99
|
+
typeName,
|
|
100
|
+
object,
|
|
101
|
+
props: {},
|
|
102
|
+
handlers: new Map(),
|
|
103
|
+
placements: new Map(),
|
|
104
|
+
contexts: new Map(),
|
|
105
|
+
parent: null,
|
|
106
|
+
content: [],
|
|
107
|
+
contentKind,
|
|
108
|
+
bufferView: null,
|
|
109
|
+
dispatch,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const createTextNode = (text: string): TextNode => ({ kind: TEXT_KIND, text, parent: null });
|
|
113
|
+
|
|
114
|
+
const nodeObject = (node: PlaceableNode): GObject.Object | null => {
|
|
115
|
+
if (node.kind === LAZY_KIND) {
|
|
116
|
+
const [child] = node.children;
|
|
117
|
+
|
|
118
|
+
return child === undefined ? null : nodeObject(child);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return node.object;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const lazyTarget = (node: LazyNode, adopted: GObject.Object): SignalTarget => ({
|
|
125
|
+
object: adopted,
|
|
126
|
+
handlers: node.handlers,
|
|
127
|
+
typeName: node.typeName,
|
|
128
|
+
dispatch: node.dispatch,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const getOrCreateContext = (node: ElementNode, behavior: ElementBehavior): unknown =>
|
|
132
|
+
getOrInsert(node.contexts, behavior, () => behavior.createContext?.(node.object));
|
|
133
|
+
|
|
134
|
+
export {
|
|
135
|
+
ELEMENT_KIND,
|
|
136
|
+
PROP_KIND,
|
|
137
|
+
TEXT_KIND,
|
|
138
|
+
LAZY_KIND,
|
|
139
|
+
DEFAULT_SLOT,
|
|
140
|
+
createPropNode,
|
|
141
|
+
createLazyNode,
|
|
142
|
+
createElementNode,
|
|
143
|
+
createTextNode,
|
|
144
|
+
nodeObject,
|
|
145
|
+
lazyTarget,
|
|
146
|
+
getOrCreateContext,
|
|
147
|
+
type ContentKind,
|
|
148
|
+
type HandlerRecord,
|
|
149
|
+
type Dispatch,
|
|
150
|
+
type SignalTarget,
|
|
151
|
+
type PlacedChild,
|
|
152
|
+
type ElementNode,
|
|
153
|
+
type PropNode,
|
|
154
|
+
type LazyNode,
|
|
155
|
+
type TextNode,
|
|
156
|
+
type PlaceableNode,
|
|
157
|
+
type ParentNode,
|
|
158
|
+
type ContentChild,
|
|
159
|
+
type Instance,
|
|
160
|
+
type AnyNode,
|
|
161
|
+
};
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import * as GObject from "@gtkx/gi/gobject";
|
|
2
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
import { getOrInsert, indexBeforeOrEnd, remove } from "@gtkx/utils";
|
|
4
|
+
import type { DetachInfo, ElementBehavior, PlaceInfo } from "./registry.js";
|
|
5
|
+
import { applyAdoptedProps, markFlush } from "./apply-props.js";
|
|
6
|
+
import { typeInfoFor } from "./metadata.js";
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_SLOT,
|
|
9
|
+
ELEMENT_KIND,
|
|
10
|
+
type ElementNode,
|
|
11
|
+
getOrCreateContext,
|
|
12
|
+
LAZY_KIND,
|
|
13
|
+
lazyTarget,
|
|
14
|
+
nodeObject,
|
|
15
|
+
type PlaceableNode,
|
|
16
|
+
type PlacedChild,
|
|
17
|
+
} from "./node.js";
|
|
18
|
+
import { markTextDirty } from "./text.js";
|
|
19
|
+
|
|
20
|
+
type AttachContext = { parent: ElementNode; entry: PlacedChild; index: number; sibling: GObject.Object | null };
|
|
21
|
+
|
|
22
|
+
const createEntry = (slot: string, node: PlaceableNode): PlacedChild | null => {
|
|
23
|
+
const object = nodeObject(node);
|
|
24
|
+
|
|
25
|
+
if (object === null) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return { node, object, adopted: null, slot, behavior: null, attached: false };
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const siblingAt = (entries: PlacedChild[], index: number): GObject.Object | null =>
|
|
33
|
+
index > 0 ? (entries[index - 1]?.object ?? null) : null;
|
|
34
|
+
|
|
35
|
+
const placeInfo = (entry: PlacedChild, index: number, sibling: GObject.Object | null, context: unknown): PlaceInfo => ({
|
|
36
|
+
slot: entry.slot,
|
|
37
|
+
index,
|
|
38
|
+
sibling,
|
|
39
|
+
adopted: entry.adopted,
|
|
40
|
+
props: entry.node.props,
|
|
41
|
+
context,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const adoptedFrom = (parent: ElementNode, entry: PlacedChild, behavior: ElementBehavior, claim: unknown): void => {
|
|
45
|
+
if (behavior.resolve !== undefined) {
|
|
46
|
+
entry.adopted = behavior.resolve(parent.object, entry.object);
|
|
47
|
+
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
entry.adopted = claim instanceof GObject.Object ? claim : null;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const applyLazyProps = (entry: PlacedChild): void => {
|
|
55
|
+
if (entry.node.kind !== LAZY_KIND || entry.adopted === null) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
applyAdoptedProps(lazyTarget(entry.node, entry.adopted), {}, entry.node.props);
|
|
60
|
+
entry.node.adopted = entry.adopted;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const wireBufferView = (node: PlaceableNode, parent: ElementNode): void => {
|
|
64
|
+
if (!(node.kind === ELEMENT_KIND && node.contentKind === "buffer" && parent.object instanceof Gtk.TextView)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
node.bufferView = parent.object;
|
|
69
|
+
markTextDirty(node);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const setObjectSlot = (parent: ElementNode, entry: PlacedChild): void => {
|
|
73
|
+
Reflect.set(parent.object, entry.slot, entry.object);
|
|
74
|
+
wireBufferView(entry.node, parent);
|
|
75
|
+
entry.behavior = null;
|
|
76
|
+
entry.attached = true;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const didAttach = (ctx: AttachContext, behavior: ElementBehavior): boolean => {
|
|
80
|
+
const attach = behavior.attach;
|
|
81
|
+
|
|
82
|
+
if (attach === undefined) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const context = getOrCreateContext(ctx.parent, behavior);
|
|
87
|
+
const claim = attach(ctx.parent.object, ctx.entry.object, placeInfo(ctx.entry, ctx.index, ctx.sibling, context));
|
|
88
|
+
|
|
89
|
+
if (claim === undefined) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
ctx.entry.behavior = behavior;
|
|
94
|
+
adoptedFrom(ctx.parent, ctx.entry, behavior, claim);
|
|
95
|
+
ctx.entry.attached = true;
|
|
96
|
+
applyLazyProps(ctx.entry);
|
|
97
|
+
|
|
98
|
+
return true;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const attachEntry = (parent: ElementNode, entry: PlacedChild, index: number, sibling: GObject.Object | null): void => {
|
|
102
|
+
const ctx: AttachContext = { parent, entry, index, sibling };
|
|
103
|
+
|
|
104
|
+
for (const behavior of typeInfoFor(parent.typeName).behaviors) {
|
|
105
|
+
if (didAttach(ctx, behavior)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (entry.slot !== DEFAULT_SLOT) {
|
|
111
|
+
setObjectSlot(parent, entry);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const detachInfo = (entry: PlacedChild, context: unknown): DetachInfo => ({
|
|
116
|
+
slot: entry.slot,
|
|
117
|
+
adopted: entry.adopted,
|
|
118
|
+
props: entry.node.props,
|
|
119
|
+
context,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const detachEntry = (parent: ElementNode, entry: PlacedChild): void => {
|
|
123
|
+
if (!entry.attached) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
entry.attached = false;
|
|
128
|
+
const behavior = entry.behavior;
|
|
129
|
+
|
|
130
|
+
if (behavior === null) {
|
|
131
|
+
if (entry.slot !== DEFAULT_SLOT) {
|
|
132
|
+
Reflect.set(parent.object, entry.slot, null);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
behavior.detach?.(parent.object, entry.object, detachInfo(entry, getOrCreateContext(parent, behavior)));
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const rebuild = (parent: ElementNode, entries: PlacedChild[]): void => {
|
|
142
|
+
for (const entry of entries) {
|
|
143
|
+
detachEntry(parent, entry);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for (const [index, entry] of entries.entries()) {
|
|
147
|
+
entry.behavior = null;
|
|
148
|
+
attachEntry(parent, entry, index, siblingAt(entries, index));
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const getPosition = (entries: PlacedChild[], before: PlaceableNode | null): number =>
|
|
153
|
+
indexBeforeOrEnd(entries, before, (entry, target) => entry.node === target);
|
|
154
|
+
|
|
155
|
+
const placeNew = (parent: ElementNode, entry: PlacedChild, entries: PlacedChild[], index: number): void => {
|
|
156
|
+
attachEntry(parent, entry, index, siblingAt(entries, index));
|
|
157
|
+
|
|
158
|
+
if (!entry.attached) {
|
|
159
|
+
remove(entries, entry);
|
|
160
|
+
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const isInsertedBeforeEnd = index < entries.length - 1;
|
|
165
|
+
const isCannotReorderInPlace = entry.behavior !== null && entry.behavior.reorder === undefined;
|
|
166
|
+
|
|
167
|
+
if (isInsertedBeforeEnd && isCannotReorderInPlace) {
|
|
168
|
+
rebuild(parent, entries);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const moveEntry = (parent: ElementNode, entry: PlacedChild, entries: PlacedChild[], index: number): void => {
|
|
173
|
+
const behavior = entry.behavior;
|
|
174
|
+
const reorder = behavior?.reorder;
|
|
175
|
+
|
|
176
|
+
if (behavior === null || reorder === undefined) {
|
|
177
|
+
rebuild(parent, entries);
|
|
178
|
+
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const context = getOrCreateContext(parent, behavior);
|
|
183
|
+
const claim = reorder(parent.object, entry.object, placeInfo(entry, index, siblingAt(entries, index), context));
|
|
184
|
+
adoptedFrom(parent, entry, behavior, claim);
|
|
185
|
+
applyLazyProps(entry);
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const resolveEntry = (
|
|
189
|
+
entries: PlacedChild[],
|
|
190
|
+
existing: number,
|
|
191
|
+
slot: string,
|
|
192
|
+
node: PlaceableNode,
|
|
193
|
+
): PlacedChild | null => {
|
|
194
|
+
if (existing >= 0) {
|
|
195
|
+
return entries[existing] ?? null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return createEntry(slot, node);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const placeChild = (
|
|
202
|
+
parent: ElementNode,
|
|
203
|
+
slot: string,
|
|
204
|
+
node: PlaceableNode,
|
|
205
|
+
before: PlaceableNode | null,
|
|
206
|
+
): void => {
|
|
207
|
+
const entries = getOrInsert(parent.placements, slot, () => []);
|
|
208
|
+
const existing = entries.findIndex((entry) => entry.node === node);
|
|
209
|
+
const entry = resolveEntry(entries, existing, slot, node);
|
|
210
|
+
|
|
211
|
+
if (entry === null) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const isMove = existing !== -1;
|
|
216
|
+
|
|
217
|
+
if (isMove) {
|
|
218
|
+
entries.splice(existing, 1);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const index = getPosition(entries, before);
|
|
222
|
+
entries.splice(index, 0, entry);
|
|
223
|
+
|
|
224
|
+
if (isMove) {
|
|
225
|
+
moveEntry(parent, entry, entries, index);
|
|
226
|
+
} else {
|
|
227
|
+
placeNew(parent, entry, entries, index);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
markFlush(parent);
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const unplaceChild = (parent: ElementNode, slot: string, node: PlaceableNode): void => {
|
|
234
|
+
const entries = parent.placements.get(slot);
|
|
235
|
+
|
|
236
|
+
if (entries === undefined) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const index = entries.findIndex((entry) => entry.node === node);
|
|
241
|
+
|
|
242
|
+
if (index === -1) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const [entry] = entries.splice(index, 1);
|
|
247
|
+
|
|
248
|
+
if (entry !== undefined) {
|
|
249
|
+
detachEntry(parent, entry);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
markFlush(parent);
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
export { placeChild, unplaceChild };
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import type * as GObject from "@gtkx/gi/gobject";
|
|
2
|
+
|
|
3
|
+
/** The props of a host element or node, as React passes them through the reconciler. */
|
|
4
|
+
type Props = Record<string, unknown>;
|
|
5
|
+
|
|
6
|
+
/** Per-child values a slot hook receives while placing or moving one child. */
|
|
7
|
+
type PlaceInfo = {
|
|
8
|
+
slot: string;
|
|
9
|
+
index: number;
|
|
10
|
+
sibling: GObject.Object | null;
|
|
11
|
+
adopted: GObject.Object | null;
|
|
12
|
+
props: Props;
|
|
13
|
+
context: unknown;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/** Per-child values a slot hook receives while removing one child. */
|
|
17
|
+
type DetachInfo = {
|
|
18
|
+
slot: string;
|
|
19
|
+
adopted: GObject.Object | null;
|
|
20
|
+
props: Props;
|
|
21
|
+
context: unknown;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Customizes how one element type places children and applies props. Every hook receives the
|
|
26
|
+
* GObject instance and a private per-node `context` built once by `createContext`. A slot hook
|
|
27
|
+
* claims a child by returning a non-`undefined` value; that value, or `resolve`, is the object
|
|
28
|
+
* the container adopts for the child. `update` returns the prop names it consumed so those props
|
|
29
|
+
* are not also set as plain GObject properties. `create` builds the GObject for types whose
|
|
30
|
+
* constructor does more than set properties, and is consulted for its own type only, never
|
|
31
|
+
* inherited by subtypes.
|
|
32
|
+
*/
|
|
33
|
+
type ElementBehavior<T extends GObject.Object = GObject.Object> = {
|
|
34
|
+
create?: (props: Props) => GObject.Object;
|
|
35
|
+
createContext?: (object: T) => unknown;
|
|
36
|
+
attach?: (object: T, child: GObject.Object, info: PlaceInfo) => unknown;
|
|
37
|
+
reorder?: (object: T, child: GObject.Object, info: PlaceInfo) => unknown;
|
|
38
|
+
detach?: (object: T, child: GObject.Object, info: DetachInfo) => void;
|
|
39
|
+
resolve?: (object: T, child: GObject.Object) => GObject.Object | null;
|
|
40
|
+
update?: (object: T, prev: Props, next: Props, context: unknown) => Iterable<string> | undefined;
|
|
41
|
+
flush?: (object: T, context: unknown) => void;
|
|
42
|
+
mount?: (object: T, context: unknown) => void;
|
|
43
|
+
unmount?: (object: T, context: unknown) => void;
|
|
44
|
+
deferred?: string[];
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** A named export in a module, referenced as plain data (the module is never imported at runtime). */
|
|
48
|
+
type ModuleExport = { module: string; export: string };
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Per-element configuration keyed by GLib type name: whether the element is lazy (its GObject is
|
|
52
|
+
* created by its parent container, as pages and layout children are), the custom behaviors bound to
|
|
53
|
+
* its type, an optional component that wraps the generated element, and the base props interface its
|
|
54
|
+
* generated props extend. `component` and `props` are inert at runtime; they are read only by codegen.
|
|
55
|
+
*/
|
|
56
|
+
type ElementConfig<T extends GObject.Object = GObject.Object> = {
|
|
57
|
+
lazy?: boolean;
|
|
58
|
+
behaviors?: ElementBehavior<T>[];
|
|
59
|
+
component?: ModuleExport;
|
|
60
|
+
props?: ModuleExport;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Every registered element config, keyed by GLib type name. Adwaita entries appear once `@gtkx/react/adw`
|
|
65
|
+
* is loaded.
|
|
66
|
+
*/
|
|
67
|
+
const ELEMENTS: Record<string, ElementConfig> = {};
|
|
68
|
+
|
|
69
|
+
/** Props a behavior applies after construction; the constructor is never given them. */
|
|
70
|
+
const deferredProps = (behavior: ElementBehavior): string[] => behavior.deferred ?? [];
|
|
71
|
+
|
|
72
|
+
const mergeBehaviors = (base: ElementConfig, added: ElementBehavior[], isPrepended: boolean): ElementBehavior[] => {
|
|
73
|
+
const baseBehaviors = base.behaviors ?? [];
|
|
74
|
+
|
|
75
|
+
return isPrepended ? [...added, ...baseBehaviors] : [...baseBehaviors, ...added];
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const mergeConfigEntry = (base: ElementConfig, added: ElementConfig<never>, isPrepended = false): ElementConfig => {
|
|
79
|
+
const entry: ElementConfig = { ...base };
|
|
80
|
+
|
|
81
|
+
if (added.behaviors !== undefined) {
|
|
82
|
+
entry.behaviors = mergeBehaviors(entry, added.behaviors as ElementBehavior[], isPrepended);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (added.lazy === true) {
|
|
86
|
+
entry.lazy = true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (added.component !== undefined) {
|
|
90
|
+
entry.component = added.component;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (added.props !== undefined) {
|
|
94
|
+
entry.props = added.props;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return entry;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Merges maps of {@link ElementConfig} keyed by GLib type name into one, concatenating each type's
|
|
102
|
+
* behaviors in the order the maps are given (an earlier map's behaviors come first) and taking the last
|
|
103
|
+
* lazy flag, component, and props seen. Use it to combine an app's element config with its behaviors.
|
|
104
|
+
*/
|
|
105
|
+
const mergeElementConfigs = (...maps: Record<string, ElementConfig<never>>[]): Record<string, ElementConfig> => {
|
|
106
|
+
const merged: Record<string, ElementConfig> = {};
|
|
107
|
+
|
|
108
|
+
for (const map of maps) {
|
|
109
|
+
for (const [type, config] of Object.entries(map)) {
|
|
110
|
+
merged[type] = mergeConfigEntry(merged[type] ?? {}, config);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return merged;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Registers a map of {@link ElementConfig} keyed by GLib type name, merging each entry into the
|
|
119
|
+
* registry. Behaviors are appended by default (the framework's built-ins register this way); pass
|
|
120
|
+
* `{ prepend: true }` for an app's own configuration so its behaviors are consulted before the
|
|
121
|
+
* built-ins for the same slot, letting it override them regardless of registration order.
|
|
122
|
+
*/
|
|
123
|
+
const registerElements = (
|
|
124
|
+
map: Record<string, ElementConfig<never>>,
|
|
125
|
+
options: { prepend?: boolean } = {},
|
|
126
|
+
): void => {
|
|
127
|
+
for (const [type, config] of Object.entries(map)) {
|
|
128
|
+
ELEMENTS[type] = mergeConfigEntry(ELEMENTS[type] ?? {}, config, options.prepend === true);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Identity helper that types the module named by the `elements` entry of `gtkx.config.ts`, enabling
|
|
134
|
+
* editor autocompletion and type checking. Key each entry by GLib type name and annotate each hook's
|
|
135
|
+
* object parameter with the concrete GObject class the behavior applies to.
|
|
136
|
+
*/
|
|
137
|
+
const defineElements = (elements: Record<string, ElementConfig<never>>): Record<string, ElementConfig<never>> =>
|
|
138
|
+
elements;
|
|
139
|
+
|
|
140
|
+
/** Spreads one config across many GLib type names. */
|
|
141
|
+
const forTypes = (types: string[], config: ElementConfig<never>): Record<string, ElementConfig<never>> =>
|
|
142
|
+
Object.fromEntries(types.map((type) => [type, config]));
|
|
143
|
+
|
|
144
|
+
/** References a base props interface exported from `@gtkx/react/internal`. */
|
|
145
|
+
const internal = (name: string): ModuleExport => ({ module: "@gtkx/react/internal", export: name });
|
|
146
|
+
|
|
147
|
+
export {
|
|
148
|
+
ELEMENTS,
|
|
149
|
+
deferredProps,
|
|
150
|
+
mergeElementConfigs,
|
|
151
|
+
registerElements,
|
|
152
|
+
defineElements,
|
|
153
|
+
forTypes,
|
|
154
|
+
internal,
|
|
155
|
+
type Props,
|
|
156
|
+
type PlaceInfo,
|
|
157
|
+
type DetachInfo,
|
|
158
|
+
type ElementBehavior,
|
|
159
|
+
type ModuleExport,
|
|
160
|
+
type ElementConfig,
|
|
161
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** The type of the shared {@link rootElement} marker used as a default top-level container. */
|
|
2
|
+
type RootElement = { [ROOT_ELEMENT_BRAND]: true };
|
|
3
|
+
|
|
4
|
+
const ROOT_ELEMENT_BRAND: unique symbol = Symbol.for("gtkx:root-element");
|
|
5
|
+
/** A shared marker value used as the default top-level container for rendering and portals. */
|
|
6
|
+
const rootElement: RootElement = { [ROOT_ELEMENT_BRAND]: true };
|
|
7
|
+
|
|
8
|
+
/** Reports whether an arbitrary value is a {@link rootElement} marker. */
|
|
9
|
+
const isRootElement = (value: unknown): value is RootElement =>
|
|
10
|
+
typeof value === "object" && value !== null && Object.hasOwn(value, ROOT_ELEMENT_BRAND);
|
|
11
|
+
|
|
12
|
+
export { rootElement, isRootElement, type RootElement };
|