@gjsify/react-native 0.48.0 → 0.50.0

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/PROPS.md CHANGED
@@ -28,13 +28,13 @@ widget `GtkBox` · takes no text child.
28
28
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
29
29
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
30
30
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
31
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
32
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
31
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
32
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
33
33
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
34
34
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
35
35
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
36
36
  | `onLayout` | refused | — | GTK reports its allocation through `Gtk.Widget.vfunc_size_allocate`, a SUBCLASS override rather than a signal, so there is no handler to bind. `useWindowDimensions` (tier P2) is the window-level answer |
37
- | `pointerEvents` | property | `can-target` | — |
37
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
38
38
  | `testID` | property | `name` | — |
39
39
 
40
40
  `accessibilityRole` is answered for every other value, and these are refused by name:
@@ -55,13 +55,13 @@ widget `GtkLabel` · a text child writes `label`.
55
55
  |---|---|---|---|
56
56
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
57
57
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
58
- | `accessibilityLiveRegion` | announcement | `notify::label`, `Gtk.Accessible.announce()` | — |
59
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
60
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
58
+ | `accessibilityLiveRegion` | announcement | `notify::label`, `Gtk.Accessible.announce()` | takes `assertive`, `none`, `polite` |
59
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
60
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
61
61
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
62
62
  | `adjustsFontSizeToFit` | refused | — | GTK has no shrink-to-fit text; a label ellipsizes or wraps. Use `numberOfLines` with `ellipsizeMode` |
63
63
  | `allowFontScaling` | ignored | — | text scaling is a desktop-wide GNOME setting, not a per-label opt-in |
64
- | `ellipsizeMode` | property | `ellipsize` | — |
64
+ | `ellipsizeMode` | property | `ellipsize` | takes `head`, `middle`, `tail` |
65
65
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
66
66
  | `maxFontSizeMultiplier` | ignored | — | see `allowFontScaling` |
67
67
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
@@ -90,8 +90,8 @@ widget `GtkButton` · a text child writes `label`.
90
90
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
91
91
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
92
92
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
93
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
94
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
93
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
94
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
95
95
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
96
96
  | `android_ripple` | ignored | — | an Android-only ripple; Adwaita has its own press feedback |
97
97
  | `delayLongPress` | refused | — | see `onLongPress` |
@@ -104,7 +104,7 @@ widget `GtkButton` · a text child writes `label`.
104
104
  | `onPress` | event | `clicked` | — |
105
105
  | `onPressIn` | refused | — | press state is the GTK CSS `:active` pseudo-class, not React state (ADR 0032 § 7) — write `active:opacity-70` and GTK animates it with no re-render at all |
106
106
  | `onPressOut` | refused | — | see `onPressIn` — `active:` is the mechanism |
107
- | `pointerEvents` | property | `can-target` | — |
107
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
108
108
  | `testID` | property | `name` | — |
109
109
 
110
110
  `accessibilityRole` is answered for every other value, and these are refused by name:
@@ -126,12 +126,12 @@ widget `GtkScrolledWindow` · children go into `GtkBox` · takes no text child.
126
126
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
127
127
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
128
128
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
129
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
130
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
129
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
130
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
131
131
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
132
132
  | `contentContainerClassName` | ignored | — | read directly as the content node’s class list |
133
133
  | `contentContainerStyle` | ignored | — | read directly as the content node’s style set |
134
- | `horizontal` | property | `orientation`, `hscrollbar-policy`, `vscrollbar-policy` | — |
134
+ | `horizontal` | property | `orientation`, `hscrollbar-policy`, `vscrollbar-policy` | takes `false`, `true` |
135
135
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
136
136
  | `keyboardDismissMode` | ignored | — | see `keyboardShouldPersistTaps` |
137
137
  | `keyboardShouldPersistTaps` | ignored | — | there is no on-screen keyboard to dismiss |
@@ -141,8 +141,8 @@ widget `GtkScrolledWindow` · children go into `GtkBox` · takes no text child.
141
141
  | `refreshControl` | refused | — | GTK has no pull-to-refresh idiom and `RefreshControl` is `refused` in the support table for that reason. Give the desktop build a refresh action |
142
142
  | `scrollEnabled` | refused | — | a `Gtk.ScrolledWindow` has no switch that stops scrolling — setting both policies to `never` hides the bars AND clamps the child, which is a different thing. Render the content without the ScrollView when it must not scroll |
143
143
  | `scrollEventThrottle` | refused | — | see `onScroll` |
144
- | `showsHorizontalScrollIndicator` | property | `hscrollbar-policy` | — |
145
- | `showsVerticalScrollIndicator` | property | `vscrollbar-policy` | — |
144
+ | `showsHorizontalScrollIndicator` | property | `hscrollbar-policy` | takes `false`, `true` |
145
+ | `showsVerticalScrollIndicator` | property | `vscrollbar-policy` | takes `false`, `true` |
146
146
  | `testID` | property | `name` | — |
147
147
 
148
148
  `accessibilityRole` is answered for every other value, and these are refused by name:
@@ -164,8 +164,8 @@ widget `AdwSpinner` · takes no text child.
164
164
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
165
165
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
166
166
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
167
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
168
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
167
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
168
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
169
169
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
170
170
  | `animating` | property | `visible` | — |
171
171
  | `color` | style | `style: color` | — |
@@ -173,7 +173,7 @@ widget `AdwSpinner` · takes no text child.
173
173
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
174
174
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
175
175
  | `onLayout` | refused | — | GTK reports its allocation through `Gtk.Widget.vfunc_size_allocate`, a SUBCLASS override rather than a signal, so there is no handler to bind. `useWindowDimensions` (tier P2) is the window-level answer |
176
- | `size` | property | `width-request`, `height-request` | — |
176
+ | `size` | property | `width-request`, `height-request` | takes `large`, `small`, or a number of pixels |
177
177
  | `testID` | property | `name` | — |
178
178
 
179
179
  `accessibilityRole` is answered for every other value, and these are refused by name:
@@ -195,8 +195,8 @@ widget `GtkEntry` · a text child writes `text` · a `ref` receives the `text-in
195
195
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
196
196
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
197
197
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
198
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
199
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
198
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
199
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
200
200
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
201
201
  | `autoCapitalize` | ignored | — | an on-screen keyboard behaviour; a hardware keyboard has no shift state to preset |
202
202
  | `autoComplete` | ignored | — | is Android’s autofill hint, and there is no autofill service on a GTK desktop to hint to — a password manager fills a field through the accessibility bus or a paste, neither of which the widget declares anything for. `keyboardType` is the one hint that does land: it writes `Gtk.Entry:input-purpose`, which an input method reads |
@@ -206,7 +206,7 @@ widget `GtkEntry` · a text child writes `text` · a `ref` receives the `text-in
206
206
  | `editable` | property | `editable` | — |
207
207
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
208
208
  | `keyboardAppearance` | ignored | — | there is no on-screen keyboard to theme |
209
- | `keyboardType` | property | `input-purpose` | — |
209
+ | `keyboardType` | property | `input-purpose` | takes `decimal-pad`, `default`, `email-address`, `number-pad`, `numeric`, `phone-pad`, `url` |
210
210
  | `maxLength` | property | `max-length` | — |
211
211
  | `multiline` | ignored | — | it chose the widget; it is not also a property |
212
212
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
@@ -244,8 +244,8 @@ One React Native prop, two GTK widgets: `multiline` selects this row instead of
244
244
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
245
245
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
246
246
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
247
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
248
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
247
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
248
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
249
249
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
250
250
  | `autoCapitalize` | ignored | — | an on-screen keyboard behaviour; a hardware keyboard has no shift state to preset |
251
251
  | `autoComplete` | ignored | — | is Android’s autofill hint, and there is no autofill service on a GTK desktop to hint to — a password manager fills a field through the accessibility bus or a paste, neither of which the widget declares anything for. `keyboardType` is the one hint that does land: it writes `Gtk.Entry:input-purpose`, which an input method reads |
@@ -255,7 +255,7 @@ One React Native prop, two GTK widgets: `multiline` selects this row instead of
255
255
  | `editable` | property | `editable` | — |
256
256
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
257
257
  | `keyboardAppearance` | ignored | — | there is no on-screen keyboard to theme |
258
- | `keyboardType` | property | `input-purpose` | — |
258
+ | `keyboardType` | property | `input-purpose` | takes `decimal-pad`, `default`, `email-address`, `number-pad`, `numeric`, `phone-pad`, `url` |
259
259
  | `maxLength` | refused | — | `Gtk.TextView` installs no `max-length` (measured) — the limit belongs to the buffer |
260
260
  | `multiline` | ignored | — | it chose the widget; it is not also a property |
261
261
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
@@ -291,8 +291,8 @@ widget `GtkSwitch` · takes no text child.
291
291
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
292
292
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
293
293
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
294
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
295
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
294
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
295
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
296
296
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
297
297
  | `disabled` | property | `sensitive` | — |
298
298
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
@@ -324,8 +324,8 @@ widget `GtkPicture` · takes no text child.
324
324
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
325
325
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
326
326
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
327
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
328
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
327
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
328
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
329
329
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
330
330
  | `alt` | property | `alternative-text` | — |
331
331
  | `blurRadius` | refused | — | is a per-pixel effect. GTK composites a `Gdk.Paintable` and has no filter property on the widget that draws it — the counterpart is a `Gsk` render node or a `Gtk.Snapshot` subclass, which is a widget of its own rather than a prop on this one |
@@ -343,7 +343,7 @@ widget `GtkPicture` · takes no text child.
343
343
  | `onProgress` | refused | — | is a load event, and `Gtk.Picture` emits NO signals at all (measured: its GType lists none) — it is handed a file or a paintable and draws it, reporting neither progress nor failure. A missing file leaves `paintable` null with no diagnostic, so a callback that never fires would hide exactly the case it exists to report. Load the bytes yourself and set `paintable` through a ref |
344
344
  | `progressiveRenderingEnabled` | ignored | — | GTK decodes an image in one pass |
345
345
  | `resizeMethod` | ignored | — | an Android decoder hint |
346
- | `resizeMode` | property | `content-fit` | — |
346
+ | `resizeMode` | property | `content-fit` | takes `center`, `contain`, `cover`, `stretch` |
347
347
  | `resizeMultiplier` | ignored | — | an Android decoder hint |
348
348
  | `source` | file | `file` | — |
349
349
  | `testID` | property | `name` | — |
@@ -368,8 +368,8 @@ widget `GtkOverlay` · children go into `GtkBox` · backdrop `GtkPicture` · tak
368
368
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
369
369
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
370
370
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
371
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
372
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
371
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
372
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
373
373
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
374
374
  | `alt` | property | `alternative-text` | — |
375
375
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
@@ -377,8 +377,8 @@ widget `GtkOverlay` · children go into `GtkBox` · backdrop `GtkPicture` · tak
377
377
  | `imageStyle` | ignored | — | read directly as the picture node’s style set |
378
378
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
379
379
  | `onLayout` | refused | — | GTK reports its allocation through `Gtk.Widget.vfunc_size_allocate`, a SUBCLASS override rather than a signal, so there is no handler to bind. `useWindowDimensions` (tier P2) is the window-level answer |
380
- | `pointerEvents` | property | `can-target` | — |
381
- | `resizeMode` | property | `content-fit` | — |
380
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
381
+ | `resizeMode` | property | `content-fit` | takes `center`, `contain`, `cover`, `stretch` |
382
382
  | `source` | file | `file` | — |
383
383
  | `testID` | property | `name` | — |
384
384
 
@@ -401,8 +401,8 @@ widget `GtkButton` · a text child writes `label`.
401
401
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
402
402
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
403
403
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
404
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
405
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
404
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
405
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
406
406
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
407
407
  | `activeOpacity` | refused | — | sets the pressed appearance, which on GTK is the CSS `:active` pseudo-class rather than a prop (ADR 0032 § 7). Write `active:opacity-70` — it resolves through the same variant mechanism as every other utility, reads the project's own token scale, and GTK animates it with no re-render at all |
408
408
  | `delayLongPress` | refused | — | see `onLongPress` |
@@ -417,7 +417,7 @@ widget `GtkButton` · a text child writes `label`.
417
417
  | `onPress` | event | `clicked` | — |
418
418
  | `onPressIn` | refused | — | press state is the GTK CSS `:active` pseudo-class, not React state (ADR 0032 § 7) — write `active:opacity-70` and GTK animates it with no re-render at all |
419
419
  | `onPressOut` | refused | — | see `onPressIn` — `active:` is the mechanism |
420
- | `pointerEvents` | property | `can-target` | — |
420
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
421
421
  | `pressRetentionOffset` | refused | — | see `hitSlop` — GTK hit-tests the allocation and nothing around it |
422
422
  | `testID` | property | `name` | — |
423
423
  | `touchSoundDisabled` | ignored | — | an Android touch sound; a desktop button makes none |
@@ -441,8 +441,8 @@ widget `GtkButton` · a text child writes `label`.
441
441
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
442
442
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
443
443
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
444
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
445
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
444
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
445
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
446
446
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
447
447
  | `activeOpacity` | refused | — | sets the pressed appearance, which on GTK is the CSS `:active` pseudo-class rather than a prop (ADR 0032 § 7). Write `active:opacity-70` — it resolves through the same variant mechanism as every other utility, reads the project's own token scale, and GTK animates it with no re-render at all |
448
448
  | `delayLongPress` | refused | — | see `onLongPress` |
@@ -459,7 +459,7 @@ widget `GtkButton` · a text child writes `label`.
459
459
  | `onPressIn` | refused | — | press state is the GTK CSS `:active` pseudo-class, not React state (ADR 0032 § 7) — write `active:opacity-70` and GTK animates it with no re-render at all |
460
460
  | `onPressOut` | refused | — | see `onPressIn` — `active:` is the mechanism |
461
461
  | `onShowUnderlay` | refused | — | see `underlayColor` — there is no underlay to show |
462
- | `pointerEvents` | property | `can-target` | — |
462
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
463
463
  | `pressRetentionOffset` | refused | — | see `hitSlop` — GTK hit-tests the allocation and nothing around it |
464
464
  | `testID` | property | `name` | — |
465
465
  | `touchSoundDisabled` | ignored | — | an Android touch sound; a desktop button makes none |
@@ -484,8 +484,8 @@ widget `GtkBox` · takes no text child.
484
484
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
485
485
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
486
486
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
487
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
488
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
487
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
488
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
489
489
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
490
490
  | `delayLongPress` | refused | — | see `onLongPress` |
491
491
  | `delayPressIn` | refused | — | see `onPressIn` — there is no press-in event to delay |
@@ -499,7 +499,7 @@ widget `GtkBox` · takes no text child.
499
499
  | `onPress` | gesture | `Gtk.GestureClick::released` | — |
500
500
  | `onPressIn` | refused | — | press state is the GTK CSS `:active` pseudo-class, not React state (ADR 0032 § 7) — write `active:opacity-70` and GTK animates it with no re-render at all |
501
501
  | `onPressOut` | refused | — | see `onPressIn` — `active:` is the mechanism |
502
- | `pointerEvents` | property | `can-target` | — |
502
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
503
503
  | `pressRetentionOffset` | refused | — | see `hitSlop` — GTK hit-tests the allocation and nothing around it |
504
504
  | `testID` | property | `name` | — |
505
505
  | `touchSoundDisabled` | ignored | — | an Android touch sound; a desktop button makes none |
@@ -523,8 +523,8 @@ widget `GtkButton` · takes no text child.
523
523
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
524
524
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
525
525
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
526
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
527
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
526
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
527
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
528
528
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
529
529
  | `color` | refused | — | is the button’s background on Android and its text colour on iOS — one prop, two meanings, and GTK has a third answer: `suggested-action` and `destructive-action` are Adwaita’s own classes for the two cases a colour is usually asking for. Set them from the application stylesheet, or use `<Pressable>` |
530
530
  | `disabled` | property | `sensitive` | — |
@@ -561,13 +561,13 @@ widget `GtkBox` · takes no text child.
561
561
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
562
562
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
563
563
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
564
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
565
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
564
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
565
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
566
566
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
567
567
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
568
568
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
569
569
  | `onLayout` | refused | — | GTK reports its allocation through `Gtk.Widget.vfunc_size_allocate`, a SUBCLASS override rather than a signal, so there is no handler to bind. `useWindowDimensions` (tier P2) is the window-level answer |
570
- | `pointerEvents` | property | `can-target` | — |
570
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
571
571
  | `testID` | property | `name` | — |
572
572
 
573
573
  `accessibilityRole` is answered for every other value, and these are refused by name:
@@ -589,8 +589,8 @@ widget `AdwDialog` · children go into `GtkBox` · takes no text child.
589
589
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
590
590
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
591
591
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
592
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
593
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
592
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
593
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
594
594
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
595
595
  | `allowSwipeDismissal` | refused | — | swipe-to-dismiss is a touch gesture; the desktop dismissal is Escape or a click on the backdrop, and `onRequestClose` already reports both |
596
596
  | `animationType` | refused | — | libadwaita animates the presentation itself and picks the animation from `Adw.Dialog:presentation-mode` — a floating sheet fades and scales, a bottom sheet slides up — so there is no property that selects one. Reach the dialog through a `ref` and set `presentation-mode` if the sheet should arrive from the bottom |
@@ -631,8 +631,8 @@ widget `GtkImage` · takes no text child.
631
631
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
632
632
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
633
633
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
634
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
635
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
634
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
635
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
636
636
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
637
637
  | `color` | style | `style: color` | — |
638
638
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
@@ -661,8 +661,8 @@ widget `GtkBox` · takes no text child.
661
661
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
662
662
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
663
663
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
664
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
665
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
664
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
665
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
666
666
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
667
667
  | `behavior` | ignored | — | describes how to move out of an on-screen keyboard’s way, and none appears |
668
668
  | `contentContainerStyle` | refused | — | styles the inner view React Native adds to do the avoiding, and there is no avoiding here — so there is no second node to style. Put it on `style`, which lands on the one box this element is |
@@ -671,7 +671,7 @@ widget `GtkBox` · takes no text child.
671
671
  | `keyboardVerticalOffset` | ignored | — | see `behavior` |
672
672
  | `nativeID` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
673
673
  | `onLayout` | refused | — | GTK reports its allocation through `Gtk.Widget.vfunc_size_allocate`, a SUBCLASS override rather than a signal, so there is no handler to bind. `useWindowDimensions` (tier P2) is the window-level answer |
674
- | `pointerEvents` | property | `can-target` | — |
674
+ | `pointerEvents` | property | `can-target` | takes `auto`, `none` |
675
675
  | `testID` | property | `name` | — |
676
676
 
677
677
  `accessibilityRole` is answered for every other value, and these are refused by name:
@@ -697,8 +697,8 @@ widget `GtkBox` · children go into `GtkScrolledWindow` · takes no text child.
697
697
  | `accessibilityHint` | accessible | `Gtk.Accessible.update_property(): help-text` | — |
698
698
  | `accessibilityLabel` | accessible | `Gtk.Accessible.update_property(): label` | — |
699
699
  | `accessibilityLiveRegion` | refused | — | declares that a screen reader should speak this element when its CONTENT changes. GTK has the announcement — `Gtk.Accessible.announce(message, priority)` since 4.14 — but not the watch: it is an imperative call, and this element’s content is a SUBTREE, which GTK emits no signal for. `<Text>` answers this prop, because its content is one property (`Gtk.Label:label`) and so is both the moment and the message. Elsewhere, call `announce()` on the widget through a ref when you change the content |
700
- | `accessibilityRole` | property | `accessible-role` | refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
701
- | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | — |
700
+ | `accessibilityRole` | property | `accessible-role` | takes `adjustable`, `alert`, `button`, `checkbox`, `combobox`, `dropdownlist`, `grid`, `header`, `iconmenu`, `image`, `imagebutton`, `link`, `list`, `menu`, `menubar`, `menuitem`, `none`, `progressbar`, `radio`, `radiogroup`, `scrollbar`, `search`, `spinbutton`, `switch`, `tab`, `tabbar`, `tablist`, `text`, `timer`, `togglebutton`, `toolbar`, `viewgroup`, `webview`; refuses `drawerlayout`, `horizontalscrollview`, `keyboardkey`, `pager`, `scrollview`, `slidingdrawer`, `summary` — see below |
701
+ | `accessibilityState` | accessible | `busy → Gtk.Accessible.update_state(): busy`, `checked → Gtk.Accessible.update_state(): checked`, `disabled → Gtk.Accessible.update_state(): disabled`, `expanded → Gtk.Accessible.update_state(): expanded`, `selected → Gtk.Accessible.update_state(): selected` | takes `busy`, `checked`, `disabled`, `expanded`, `selected` |
702
702
  | `accessible` | ignored | — | asks for two things, and GTK already answers one: every GTK widget is in the accessibility tree, so “this element is an accessibility element” is the desktop default rather than an opt-in. The other thing it asks — merge my whole subtree into ONE accessible node, which is what `accessible={true}` does on iOS — GTK has no mechanism for, and a desktop screen reader navigates the widget tree it is given. To take an element OUT of that tree, set `accessibilityRole="none"`: it is the one prop that writes `Gtk.Accessible:accessible-role`, and two props writing one property is the silent-drop shape this table refuses by name |
703
703
  | `columnWrapperStyle` | refused | — | see `numColumns` |
704
704
  | `contentContainerStyle` | refused | — | styles the box React Native puts the rows in, and there is no such box: `Gtk.ListView` builds each row from the factory and owns the space between them. Style the row inside `renderItem`, or the list itself through `style` |
@@ -707,7 +707,7 @@ widget `GtkBox` · children go into `GtkScrolledWindow` · takes no text child.
707
707
  | `getItem` | ignored | — | read by the component — VirtualizedList’s accessor form of `data` |
708
708
  | `getItemCount` | ignored | — | see `getItem` |
709
709
  | `getItemLayout` | refused | — | tunes React Native’s own virtualisation, and `Gtk.ListView` does that job itself — it creates and recycles rows through the factory as the viewport moves (measured: 205 of 500 rows set up in a 400×300 window) and installs no property that changes the batching. There is nothing for this to set |
710
- | `horizontal` | property | `orientation`, `hscrollbar-policy`, `vscrollbar-policy` | — |
710
+ | `horizontal` | property | `orientation`, `hscrollbar-policy`, `vscrollbar-policy` | takes `false`, `true` |
711
711
  | `id` | refused | — | would write `Gtk.Widget:name`, and so does `testID`. Two props for one property is the silent-drop shape the host refuses by name (`signalTaken`), so this layer picks one: use `testID` |
712
712
  | `initialNumToRender` | refused | — | tunes React Native’s own virtualisation, and `Gtk.ListView` does that job itself — it creates and recycles rows through the factory as the viewport moves (measured: 205 of 500 rows set up in a 400×300 window) and installs no property that changes the batching. There is nothing for this to set |
713
713
  | `initialScrollIndex` | refused | — | scrolls to a row before the first paint. `Gtk.ListView.scroll_to(position, flags, scroll_info)` is the counterpart and it is an imperative call on a realised view, not a property — reach the view through a ref and call it |
@@ -732,8 +732,8 @@ widget `GtkBox` · children go into `GtkScrolledWindow` · takes no text child.
732
732
  | `renderSectionHeader` | ignored | — | read by the item factory |
733
733
  | `scrollEventThrottle` | refused | — | see `onScroll` |
734
734
  | `sections` | ignored | — | read by the component — SectionList’s form of `data` |
735
- | `showsHorizontalScrollIndicator` | property | `hscrollbar-policy` | — |
736
- | `showsVerticalScrollIndicator` | property | `vscrollbar-policy` | — |
735
+ | `showsHorizontalScrollIndicator` | property | `hscrollbar-policy` | takes `false`, `true` |
736
+ | `showsVerticalScrollIndicator` | property | `vscrollbar-policy` | takes `false`, `true` |
737
737
  | `stickySectionHeadersEnabled` | refused | — | GTK’s own sticky headers are a `Gtk.ListView:header-factory` over a model that implements `Gtk.SectionModel` (MEASURED: `Gio.ListStore` does not, every selection model and `Gtk.FlattenListModel` do). This layer flattens the sections into one model with header ROWS instead, so a header scrolls with its section — which is what `stickySectionHeadersEnabled={false}` asks for and the only thing it can deliver |
738
738
  | `testID` | property | `name` | — |
739
739
  | `updateCellsBatchingPeriod` | refused | — | tunes React Native’s own virtualisation, and `Gtk.ListView` does that job itself — it creates and recycles rows through the factory as the viewport moves (measured: 205 of 500 rows set up in a 400×300 window) and installs no property that changes the batching. There is nothing for this to set |
package/README.md CHANGED
@@ -32,6 +32,24 @@ a real `react-native` install when one is resolvable — and it prints which of
32
32
  it did, because a gate that silently degrades to the weaker half is worse than one
33
33
  that has only the weaker half.
34
34
 
35
+ ### The names this layer ADDS are DERIVED, not table rows
36
+
37
+ The support table answers for *React Native's* names. The ones this layer adds on top —
38
+ `configureStyle`, `primitives`, the table's own readers — may not be table keys at all, and
39
+ the gate refused the package's own API until they had a home. They do: `src/generated/own-exports.ts`,
40
+ derived from `src/index.ts` rather than hand-listed.
41
+
42
+ An unimplemented name is a generated **refusing export**, never an absent one. The difference is
43
+ the diagnostic: `MISSING_EXPORT` says the name is unknown, whereas the table says it is P2 over
44
+ `Gtk.ListView`. Read the TABLE for any question about coverage — a list written into prose drifted
45
+ once already, omitting the whole list family, the bindings and routing.
46
+
47
+ Two constraints fall out of the generator and are easy to trip:
48
+
49
+ - **`src/primitives/table.ts` and `src/primitives/answers.ts` may hold NO relative value import.**
50
+ The generator imports them under Node's type stripping, and Node does not rewrite `./x.js` to `./x.ts`.
51
+ - **A new `ref` handle is a table row**, never something a binding assembles.
52
+
35
53
  ## The PROP surface is a contract too, and it is published
36
54
 
37
55
  The support table answers "may this application import this name". One grain finer
@@ -60,6 +78,23 @@ expect(explainProp('Text', 'onPress')).toContain('Wrap it in a `<Pressable>`');
60
78
  runtime one. [PROPS.md](PROPS.md) is the generated document, one section per
61
79
  primitive, held byte for byte by `check-rn-surface.mjs`.
62
80
 
81
+ **A prop can be answered and still refuse a VALUE, and the table says so at both
82
+ grains** — `propRefusedValues` lists the spellings with a reason of their own,
83
+ `propAllowedValues` lists the ones a mapped prop takes at all, and
84
+ `acceptsPropValue`/`explainPropValue` answer for one value:
85
+
86
+ ```ts
87
+ acceptsPropValue('View', 'pointerEvents', 'box-none'); // false — GTK's `can-target`
88
+ propAllowedValues('View', 'pointerEvents'); // ['auto', 'none']
89
+ ```
90
+
91
+ Both halves are needed because they are different facts: a value can be refused by
92
+ NAME, with its own sentence, or by being absent from the list its route maps. Reading
93
+ only the first answered ACCEPTED for `box-none` until #1648 (ADR 0039 § Amendment).
94
+ What is still not answered is the TYPE grain — `acceptsPropValue('Text',
95
+ 'selectable', 'yes')` is `true` while a render refuses the string — because that is a
96
+ predicate rather than a list; `status/open-todos.md` carries what it would take.
97
+
63
98
  ## `<TextInput>`'s ref is a handle, not the widget
64
99
 
65
100
  React Native's `TextInput` is a class, so `useRef<TextInput>(null)` and
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import{UnsupportedError as e}from"./unsupported.js";import{buildWindowShell as t,provideWindowChrome as n}from"./window-chrome.js";import r from"gi://Adw?version=1";import{createElement as i}from"react";import a from"gi://GLib?version=2.0";import{runAdwaitaApp as o}from"@gjsify/adwaita-app";import{registerBuiltinWidgets as s}from"@gjsify/gtk-host";import{windowChromeProblems as c}from"@gjsify/gtk-host/conformance";import{createRoot as l}from"@gjsify/gtk-host/react";const u=new Map;let d=null,f=null,p=[],m=0;const lastWindowChromeProblems=()=>p,windowChromeChecks=()=>m;function checkWindowChrome(e){let t=e.connect(`map`,()=>{e.disconnect(t),a.idle_add(a.PRIORITY_DEFAULT_IDLE,()=>{if(!e.get_mapped())return a.SOURCE_REMOVE;p=c(e),m++;for(let e of p)console.warn(`@gjsify/react-native: ${e}`);return a.SOURCE_REMOVE})})}function toShellOptions(e,t){return{...e,createWindow:t}}function buildWindow(e,n,i){let a=new r.ApplicationWindow({application:e,title:i.title??n,defaultWidth:i.defaultWidth??900,defaultHeight:i.defaultHeight??700}),o=t();return a.set_content(o.root),{window:a,content:o.content,chrome:o.chrome}}function mountApplicationRoot(e,t,r,a){let{window:o,content:s,chrome:c}=buildWindow(e,t,r),u=a(),f=l(s);return d={app:e,window:o,content:s,root:f},f.render(n(c,i(u,r.initialProps??{}))),checkWindowChrome(o),o}async function ownTheApplication(e,t){if(f!==null)throw Error(`@gjsify/react-native: AppRegistry.runApplication("${e}") was called while "${f}" is still running. One process is one GApplication here — this layer CREATES the application, which is the declared divergence from React Native — so a second call has no window of its own to build and would take the first one’s handle away from it. Await the first call, or render both trees under one root component.`);f=e;try{return await t()}finally{let e=d;d=null,f=null,e?.root.unmount()}}const h={registerComponent(e,t){return u.set(e,{provider:t}),e},getAppKeys(){return[...u.keys()]},getRunnable(e){return u.get(e)},getApplication(){return d?.app??null},getWindow(){return d?.window??null},async runApplication(e,t){let n=u.get(e);if(n===void 0){let t=[...u.keys()];throw Error(`@gjsify/react-native: no component is registered as "${e}". `+(t.length>0?`Registered: ${t.join(`, `)}.`:`Nothing is registered — call AppRegistry.registerComponent(key, () => Component) first.`))}return s(),ownTheApplication(e,()=>o(toShellOptions(t,r=>mountApplicationRoot(r,e,t,n.provider))))},unmountApplicationComponentAtRootTag(){throw new e(`AppRegistry`)}};function registerRootComponent(e,t){return h.registerComponent(`main`,()=>e),h.runApplication(`main`,t)}export{h as AppRegistry,lastWindowChromeProblems,mountApplicationRoot,ownTheApplication,registerRootComponent,toShellOptions,windowChromeChecks};
1
+ import"./_virtual/_rolldown/runtime.js";import{UnsupportedError as e}from"./unsupported.js";import{buildWindowShell as t,provideWindowChrome as n}from"./window-chrome.js";import r from"gi://Adw?version=1";import i from"gi://GLib?version=2.0";import{createElement as a}from"react";import{runAdwaitaApp as o}from"@gjsify/adwaita-app";import{registerBuiltinWidgets as s}from"@gjsify/gtk-host";import{windowChromeProblems as c}from"@gjsify/gtk-host/conformance";import{createRoot as l}from"@gjsify/gtk-host/react";const u=new Map;let d=null,f=null,p=[],m=0;const lastWindowChromeProblems=()=>p,windowChromeChecks=()=>m;function checkWindowChrome(e){let t=e.connect(`map`,()=>{e.disconnect(t),i.idle_add(i.PRIORITY_DEFAULT_IDLE,()=>{if(!e.get_mapped())return i.SOURCE_REMOVE;p=c(e),m++;for(let e of p)console.warn(`@gjsify/react-native: ${e}`);return i.SOURCE_REMOVE})})}function toShellOptions(e,t){return{...e,createWindow:t}}function buildWindow(e,n,i){let a=new r.ApplicationWindow({application:e,title:i.title??n,defaultWidth:i.defaultWidth??900,defaultHeight:i.defaultHeight??700}),o=t();return a.set_content(o.root),{window:a,content:o.content,chrome:o.chrome}}function mountApplicationRoot(e,t,r,i){let{window:o,content:s,chrome:c}=buildWindow(e,t,r),u=i(),f=l(s);return d={app:e,window:o,content:s,root:f},f.render(n(c,a(u,r.initialProps??{}))),checkWindowChrome(o),o}async function ownTheApplication(e,t){if(f!==null)throw Error(`@gjsify/react-native: AppRegistry.runApplication("${e}") was called while "${f}" is still running. One process is one GApplication here — this layer CREATES the application, which is the declared divergence from React Native — so a second call has no window of its own to build and would take the first one’s handle away from it. Await the first call, or render both trees under one root component.`);f=e;try{return await t()}finally{let e=d;d=null,f=null,e?.root.unmount()}}const h={registerComponent(e,t){return u.set(e,{provider:t}),e},getAppKeys(){return[...u.keys()]},getRunnable(e){return u.get(e)},getApplication(){return d?.app??null},getWindow(){return d?.window??null},async runApplication(e,t){let n=u.get(e);if(n===void 0){let t=[...u.keys()];throw Error(`@gjsify/react-native: no component is registered as "${e}". `+(t.length>0?`Registered: ${t.join(`, `)}.`:`Nothing is registered — call AppRegistry.registerComponent(key, () => Component) first.`))}return s(),ownTheApplication(e,()=>o(toShellOptions(t,r=>mountApplicationRoot(r,e,t,n.provider))))},unmountApplicationComponentAtRootTag(){throw new e(`AppRegistry`)}};function registerRootComponent(e,t){return h.registerComponent(`main`,()=>e),h.runApplication(`main`,t)}export{h as AppRegistry,lastWindowChromeProblems,mountApplicationRoot,ownTheApplication,registerRootComponent,toShellOptions,windowChromeChecks};
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import{applyAccessibility as e}from"./accessibility.js";import{accessor as t}from"./accessor.js";import{PrimitiveError as n}from"./primitives/errors.js";import{onLiveRegion as r}from"./announce.js";import{splitAnimatedStyle as i}from"./primitives/style.js";import{resolvePrimitive as a}from"./primitives/resolve.js";import{childFacts as o,childNodes as s,isAbsoluteChild as c,isTextNode as l}from"./child-facts.js";import{ParentContext as u,ParentProvider as d}from"./parent-context.js";import{onGesture as f,onPressStateChange as p}from"./press.js";import{createHandle as m}from"./primitives/handles.js";import{animatedProperty as h,assertNoStaticClash as g}from"./animated/properties.js";import{styleConfig as _}from"./style-config.js";import v from"gi://Gio?version=2.0";import{createElement as y,useContext as b,useEffect as x,useMemo as S,useRef as C,useState as w}from"react";function useSignals(e,n){let r=C(null),i=C(n);return i.current=n,{props:S(()=>{let n={};for(let a of e)n[`on:${a.signal}`]=()=>{let e=i.current[a.prop];if(typeof e!=`function`)return;if(a.read===null){e();return}let n=r.current;e(n===null?void 0:n[t(a.read)])};return n},[e.map(e=>`${e.prop}>${e.signal}>${e.read??``}`).join(`|`)]),widgetRef:r}}function nodeProps(e,t,n){let r={...t,...e.props,...n};return e.cssClasses.length>0&&(r[`css-classes`]=[...e.cssClasses]),r}function usePlan(e,t){let r=t,i=b(u),c=_(),l=s(r.children),d=a(e,r,{tokens:c.tokens,sheet:c.sheet,...i===null?{}:{parent:i},children:o(l,c.tokens)}),f=Object.keys(d.intent);if(f.length>0)throw new n(e,f.join(`, `),"carries layout that cannot be resolved at this position. These need a parent to resolve against — `flex-1` and `self-*` need the parent orientation, `absolute` needs the parent to be an overlay — and this element is the root of its tree, or its parent is not a box. Wrap it in a <View>, or move the utility to a child.");let p=useSignals(d.events,r),h=r.ref,g=d.handle,v=d.node.tag,y=S(()=>e=>{p.widgetRef.current=e;let t=e==null?e:m(g,e,v);typeof h==`function`?h(t):h!=null&&(h.current=t)},[h,p.widgetRef,g,v]);useGestures(d.gestures,r,p.widgetRef),useLiveRegions(d.announcements,p.widgetRef),useAccessibility(d.accessibility,p.widgetRef);let x=useFiles(d.files),C={...p.props,ref:y,...x.outer};d.slot!==null&&(C.slot=d.slot);let w={...x.content};d.contentSlot!==null&&(w.slot=d.contentSlot);let T={...x.backdrop};d.backdropSlot!==null&&(T.slot=d.backdropSlot);let E=S(()=>d.childContext,[JSON.stringify(d.childContext),d.childContext]);return{plan:d,children:l,inherited:i?.props??{},extra:C,contentExtra:w,backdropExtra:T,published:E,tokens:c.tokens,widgetRef:p.widgetRef}}function useFiles(e){return S(()=>{let t={outer:{},content:{},backdrop:{}};for(let n of e)t[n.on][n.property]=n.kind===`path`?v.File.new_for_path(n.value):v.File.new_for_uri(n.value);return t},[e.map(e=>`${e.on}>${e.property}>${e.kind}>${e.value}`).join(`|`)])}function useGestures(e,t,n){let r=C(t);r.current=t;let i=e.map(e=>`${e.prop}>${e.signal}`).join(`|`);x(()=>{let e=n.current;if(i===``||e==null)return;let t=i.split(`|`).map(t=>{let[n,i]=t.split(`>`);return f(e,i,()=>{let e=r.current[n];typeof e==`function`&&e()})});return()=>{for(let e of t)e()}},[i,n])}function useLiveRegions(e,t){let n=e.map(e=>`${e.signal}>${e.read}>${e.priority}`).join(`|`);x(()=>{let e=t.current;if(n===``||e==null)return;let i=n.split(`|`).map(t=>{let[n,i,a]=t.split(`>`);return r(e,{prop:`accessibilityLiveRegion`,signal:n,read:i,priority:a})});return()=>{for(let e of i)e()}},[n,t])}function useAccessibility(t,n){let r=t.length===0?``:JSON.stringify(t);x(()=>{let t=n.current;if(!(r===``||t==null))return e(t,JSON.parse(r))},[r,n])}function render(e){let{plan:t,children:n,inherited:r,extra:i,contentExtra:a,backdropExtra:o,published:s,tokens:u}=e,wrap=e=>y(d,{value:s},...e);if(t.content===null){let e=n.some(l)?n:[wrap(n)];return y(t.node.tag,nodeProps(t.node,r,i),...e)}let f=t.absoluteSlot===null?[]:n.filter(e=>c(e,u)),p=t.absoluteSlot===null?n:n.filter(e=>!c(e,u)),m=y(t.content.tag,nodeProps(t.content,{},a),wrap(p)),h=t.backdrop===null?[]:[y(t.backdrop.tag,nodeProps(t.backdrop,{},o))];return y(t.node.tag,nodeProps(t.node,r,i),...h,m,...f.length===0?[]:[wrap(f)])}function View(e){return render(usePlan(`View`,e))}function Text(e){return render(usePlan(`Text`,e))}function Pressable(e){let t=typeof e.children==`function`?e.children:null,[n,r]=w(!1),i=usePlan(`Pressable`,t===null?e:{...e,children:t({pressed:n})}),a=i.widgetRef;return x(()=>{if(t===null)return;let e=a.current;if(e!=null)return p(e,r)},[t===null,a]),render(i)}function ScrollView(e){return render(usePlan(`ScrollView`,e))}function ActivityIndicator(e){return render(usePlan(`ActivityIndicator`,e))}function TextInput(e){return render(usePlan(`TextInput`,e))}function Switch(e){return render(usePlan(`Switch`,e))}function Image(e){return render(usePlan(`Image`,e))}function ImageBackground(e){return render(usePlan(`ImageBackground`,e))}function TouchableOpacity(e){return render(usePlan(`TouchableOpacity`,e))}function TouchableHighlight(e){return render(usePlan(`TouchableHighlight`,e))}function TouchableWithoutFeedback(e){return render(usePlan(`TouchableWithoutFeedback`,e))}function Button(e){return render(usePlan(`Button`,e))}function SafeAreaView(e){return render(usePlan(`SafeAreaView`,e))}function Modal(e){let t=usePlan(`Modal`,e);return e.visible===!1?null:render(t)}function KeyboardAvoidingView(e){return render(usePlan(`KeyboardAvoidingView`,e))}function StatusBar(e){return null}const T="configures the status bar above a phone screen, and a desktop window has none — the space above it belongs to the compositor and the header bar inside it is `Adw.HeaderBar`, an ordinary widget you render. This refuses rather than accepting the call, because a setter that appears to work is indistinguishable from one that does";Object.defineProperties(StatusBar,Object.getOwnPropertyDescriptors({setBarStyle:()=>{throw new n(`StatusBar`,`setBarStyle`,T)},setHidden:()=>{throw new n(`StatusBar`,`setHidden`,T)},setBackgroundColor:()=>{throw new n(`StatusBar`,`setBackgroundColor`,T)},setTranslucent:()=>{throw new n(`StatusBar`,`setTranslucent`,T)},setNetworkActivityIndicatorVisible:()=>{throw new n(`StatusBar`,`setNetworkActivityIndicatorVisible`,T)},pushStackEntry:()=>{throw new n(`StatusBar`,`pushStackEntry`,T)},popStackEntry:()=>{throw new n(`StatusBar`,`popStackEntry`,T)},replaceStackEntry:()=>{throw new n(`StatusBar`,`replaceStackEntry`,T)},get currentHeight(){throw new n(`StatusBar`,`currentHeight`,"is the height of a phone’s status bar, and code reads it straight into a layout (`paddingTop: StatusBar.currentHeight`). A desktop window has no such bar, so any number here would inset every ported screen by a bar that is not there. Use 0 explicitly if that is what you mean")}}));function animatedBindings(e,t){let{plain:n,animated:r}=i(t),a=[];for(let[t,n]of Object.entries(r))h(e,t),a.push({key:t,value:n});return{plain:n,bindings:a}}function AnimatedView(e){let n=_(),{plain:r,bindings:i}=animatedBindings(`Animated.View`,e.style),a={...e,style:r};g(`Animated.View`,a,i.map(e=>e.key),n.tokens);let o=usePlan(`View`,a),s=o.widgetRef,c=i.map(e=>`${e.key}#${e.value.id}`).join(`|`),l=C(i);l.current=i,x(()=>{let e=s.current;if(c===``||e==null)return;let n=e,r=l.current.map(r=>{let i=t(h(`Animated.View`,r.key).property);return r.value.__attach({widget:e,write:e=>{n[i]=e}})});return()=>{for(let e of r)e()}},[c,s]);let u={};for(let e of i)u[t(h(`Animated.View`,e.key).property)]=e.value.__getValue();return render({...o,extra:{...o.extra,...u}})}function Icon(e){return render(usePlan(`Icon`,e))}export{ActivityIndicator,AnimatedView,Button,Icon,Image,ImageBackground,KeyboardAvoidingView,Modal,Pressable,SafeAreaView,ScrollView,StatusBar,Switch,Text,TextInput,TouchableHighlight,TouchableOpacity,TouchableWithoutFeedback,View,nodeProps,usePlan};
1
+ import"./_virtual/_rolldown/runtime.js";import{applyAccessibility as e}from"./accessibility.js";import{accessor as t}from"./accessor.js";import{PrimitiveError as n,describeElement as r}from"./primitives/errors.js";import{onLiveRegion as i}from"./announce.js";import{splitAnimatedStyle as a}from"./primitives/style.js";import{resolvePrimitive as o}from"./primitives/resolve.js";import{childFacts as s,childNodes as c,isAbsoluteChild as l,isTextNode as u}from"./child-facts.js";import{ParentContext as d,ParentProvider as f}from"./parent-context.js";import{onGesture as p,onPressStateChange as m}from"./press.js";import{createHandle as h}from"./primitives/handles.js";import{animatedProperty as g,assertNoStaticClash as _}from"./animated/properties.js";import{styleConfig as v}from"./style-config.js";import y from"gi://GObject?version=2.0";import b from"gi://Gtk?version=4.0";import x from"gi://Gio?version=2.0";import S from"gi://GLib?version=2.0";import{createElement as C,useCallback as w,useContext as T,useEffect as E,useMemo as D,useRef as O,useState as k}from"react";function useSignals(e,n){let r=O(null),i=O(n);return i.current=n,{props:D(()=>{let n={};for(let a of e)n[`on:${a.signal}`]=()=>{let e=i.current[a.prop];if(typeof e!=`function`)return;if(a.read===null){e();return}let n=r.current;e(n===null?void 0:n[t(a.read)])};return n},[e.map(e=>`${e.prop}>${e.signal}>${e.read??``}`).join(`|`)]),widgetRef:r}}function nodeProps(e,t,n){let r={...t,...e.props,...n};return e.cssClasses.length>0&&(r[`css-classes`]=[...e.cssClasses]),r}function usePlan(e,t){let i=t,a=T(d),l=v(),u=c(i.children),f=o(e,i,{tokens:l.tokens,sheet:l.sheet,...a===null?{}:{parent:a},children:s(u,l.tokens)}),p=Object.keys(f.intent);if(p.length>0)throw new n(e,p.join(`, `),"carries layout that only a parent can resolve — `flex-1` and `self-*` need the parent orientation, `absolute` needs the parent to be an overlay — and no parent context was published above this element: either it is the root of its React tree, or it was built outside its parent’s provider. Wrap it in a <View>, or move the utility to a child.",r(i));let m=useSignals(f.events,i),g=i.ref,_=f.handle,y=f.node.tag,b=D(()=>e=>{m.widgetRef.current=e;let t=e==null?e:h(_,e,y);typeof g==`function`?g(t):g!=null&&(g.current=t)},[g,m.widgetRef,_,y]);useGestures(f.gestures,i,m.widgetRef),useLiveRegions(f.announcements,m.widgetRef),useAccessibility(f.accessibility,m.widgetRef);let x=useFiles(f.files),S={...m.props,ref:b,...x.outer};f.slot!==null&&(S.slot=f.slot);let C={...x.content};f.contentSlot!==null&&(C.slot=f.contentSlot);let w={...x.backdrop};f.backdropSlot!==null&&(w.slot=f.backdropSlot);let E=D(()=>f.childContext,[JSON.stringify(f.childContext),f.childContext]);return{plan:f,children:u,inherited:a?.props??{},extra:S,contentExtra:C,backdropExtra:w,published:E,tokens:l.tokens,widgetRef:m.widgetRef}}function useFiles(e){return D(()=>{let t={outer:{},content:{},backdrop:{}};for(let n of e)t[n.on][n.property]=n.kind===`path`?x.File.new_for_path(n.value):x.File.new_for_uri(n.value);return t},[e.map(e=>`${e.on}>${e.property}>${e.kind}>${e.value}`).join(`|`)])}function useGestures(e,t,n){let r=O(t);r.current=t;let i=e.map(e=>`${e.prop}>${e.signal}`).join(`|`);E(()=>{let e=n.current;if(i===``||e==null)return;let t=i.split(`|`).map(t=>{let[n,i]=t.split(`>`);return p(e,i,()=>{let e=r.current[n];typeof e==`function`&&e()})});return()=>{for(let e of t)e()}},[i,n])}function useLiveRegions(e,t){let n=e.map(e=>`${e.signal}>${e.read}>${e.priority}`).join(`|`);E(()=>{let e=t.current;if(n===``||e==null)return;let r=n.split(`|`).map(t=>{let[n,r,a]=t.split(`>`);return i(e,{prop:`accessibilityLiveRegion`,signal:n,read:r,priority:a})});return()=>{for(let e of r)e()}},[n,t])}function useAccessibility(t,n){let r=t.length===0?``:JSON.stringify(t);E(()=>{let t=n.current;if(!(r===``||t==null))return e(t,JSON.parse(r))},[r,n])}function render(e){let{plan:t,children:n,inherited:r,extra:i,contentExtra:a,backdropExtra:o,published:s,tokens:c}=e,wrap=e=>C(f,{value:s},...e);if(t.content===null){let e=t.textSink!==null&&n.every(u)?n:[wrap(n)];return C(t.node.tag,nodeProps(t.node,r,i),...e)}let d=t.absoluteSlot===null?[]:n.filter(e=>l(e,c)),p=t.absoluteSlot===null?n:n.filter(e=>!l(e,c)),m=C(t.content.tag,nodeProps(t.content,{},a),wrap(p)),h=t.backdrop===null?[]:[C(t.backdrop.tag,nodeProps(t.backdrop,{},o))];return C(t.node.tag,nodeProps(t.node,r,i),...h,m,...d.length===0?[]:[wrap(d)])}function View(e){return render(usePlan(`View`,e))}function Text(e){return render(usePlan(`Text`,e))}function Pressable(e){let t=typeof e.children==`function`?e.children:null,[n,r]=k(!1),i=usePlan(`Pressable`,t===null?e:{...e,children:t({pressed:n})}),a=i.widgetRef;return E(()=>{if(t===null)return;let e=a.current;if(e!=null)return m(e,r)},[t===null,a]),render(i)}const A=y.registerClass({GTypeName:`GjsifyReactNativeRailLayout`},class RailLayout extends b.BoxLayout{vfunc_measure(e,t,n){let plain=n=>super.vfunc_measure(e,t,n);if(t!==b.Orientation.VERTICAL||n>=0||this.get_orientation()!==b.Orientation.HORIZONTAL)return plain(n);let r=super.vfunc_measure(e,b.Orientation.HORIZONTAL,-1)[0],i=e.get_ancestor(b.ScrolledWindow.$gtype),a=i===null?0:Math.round(i.get_hadjustment().get_page_size()),o=Math.max(a,r);if(o<=0)return plain(n);let[,s,,c]=super.vfunc_measure(e,b.Orientation.VERTICAL,o);return[s,s,c,c]}});let j=0;const railWatchCount=()=>j;function useIntrinsicContentHeight(e){let t=O(null),n=O(null);return w(r=>{let i=t.current;i!==null&&(i.adjustment.disconnect(i.id),t.current=null,--j),n.current!==null&&(S.source_remove(n.current),n.current=null);let a=r??null;if(a===null||!e)return;let o=a.get_layout_manager();if(!(o instanceof A)){let e=new A({orientation:b.Orientation.HORIZONTAL});o instanceof b.BoxLayout&&e.set_spacing(o.get_spacing()),a.set_layout_manager(e)}let s=a.get_ancestor(b.ScrolledWindow.$gtype);if(s===null)return;let c=s.get_hadjustment(),l=c.connect(`notify::page-size`,()=>{n.current===null&&(n.current=S.idle_add(S.PRIORITY_DEFAULT_IDLE,()=>(n.current=null,a.queue_resize(),S.SOURCE_REMOVE)))});t.current={adjustment:c,id:l},j+=1},[e])}function ScrollView(e){let t=usePlan(`ScrollView`,e),n=useIntrinsicContentHeight(e.horizontal===!0);return render({...t,contentExtra:{...t.contentExtra,ref:n}})}function ActivityIndicator(e){return render(usePlan(`ActivityIndicator`,e))}function TextInput(e){return render(usePlan(`TextInput`,e))}function Switch(e){return render(usePlan(`Switch`,e))}function Image(e){return render(usePlan(`Image`,e))}function ImageBackground(e){return render(usePlan(`ImageBackground`,e))}function TouchableOpacity(e){return render(usePlan(`TouchableOpacity`,e))}function TouchableHighlight(e){return render(usePlan(`TouchableHighlight`,e))}function TouchableWithoutFeedback(e){return render(usePlan(`TouchableWithoutFeedback`,e))}function Button(e){return render(usePlan(`Button`,e))}function SafeAreaView(e){return render(usePlan(`SafeAreaView`,e))}function Modal(e){let t=usePlan(`Modal`,e);return e.visible===!1?null:render(t)}function KeyboardAvoidingView(e){return render(usePlan(`KeyboardAvoidingView`,e))}function StatusBar(e){return null}const M="configures the status bar above a phone screen, and a desktop window has none — the space above it belongs to the compositor and the header bar inside it is `Adw.HeaderBar`, an ordinary widget you render. This refuses rather than accepting the call, because a setter that appears to work is indistinguishable from one that does";Object.defineProperties(StatusBar,Object.getOwnPropertyDescriptors({setBarStyle:()=>{throw new n(`StatusBar`,`setBarStyle`,M)},setHidden:()=>{throw new n(`StatusBar`,`setHidden`,M)},setBackgroundColor:()=>{throw new n(`StatusBar`,`setBackgroundColor`,M)},setTranslucent:()=>{throw new n(`StatusBar`,`setTranslucent`,M)},setNetworkActivityIndicatorVisible:()=>{throw new n(`StatusBar`,`setNetworkActivityIndicatorVisible`,M)},pushStackEntry:()=>{throw new n(`StatusBar`,`pushStackEntry`,M)},popStackEntry:()=>{throw new n(`StatusBar`,`popStackEntry`,M)},replaceStackEntry:()=>{throw new n(`StatusBar`,`replaceStackEntry`,M)},get currentHeight(){throw new n(`StatusBar`,`currentHeight`,"is the height of a phone’s status bar, and code reads it straight into a layout (`paddingTop: StatusBar.currentHeight`). A desktop window has no such bar, so any number here would inset every ported screen by a bar that is not there. Use 0 explicitly if that is what you mean")}}));function animatedBindings(e,t){let{plain:n,animated:r}=a(t),i=[];for(let[t,n]of Object.entries(r))g(e,t),i.push({key:t,value:n});return{plain:n,bindings:i}}function AnimatedView(e){let n=v(),{plain:r,bindings:i}=animatedBindings(`Animated.View`,e.style),a={...e,style:r};_(`Animated.View`,a,i.map(e=>e.key),n.tokens);let o=usePlan(`View`,a),s=o.widgetRef,c=i.map(e=>`${e.key}#${e.value.id}`).join(`|`),l=O(i);l.current=i,E(()=>{let e=s.current;if(c===``||e==null)return;let n=e,r=l.current.map(r=>{let i=t(g(`Animated.View`,r.key).property);return r.value.__attach({widget:e,write:e=>{n[i]=e}})});return()=>{for(let e of r)e()}},[c,s]);let u={};for(let e of i)u[t(g(`Animated.View`,e.key).property)]=e.value.__getValue();return render({...o,extra:{...o.extra,...u}})}function Icon(e){return render(usePlan(`Icon`,e))}export{ActivityIndicator,AnimatedView,Button,Icon,Image,ImageBackground,KeyboardAvoidingView,Modal,Pressable,SafeAreaView,ScrollView,StatusBar,Switch,Text,TextInput,TouchableHighlight,TouchableOpacity,TouchableWithoutFeedback,View,nodeProps,railWatchCount,usePlan};
package/lib/esm/press.js CHANGED
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import e from"gi://Gtk?version=4.0";let t=0;const pressWatchCount=()=>t,isPressed=t=>(t.get_state_flags()&e.StateFlags.ACTIVE)!==0;function onPressStateChange(e,n){let r=isPressed(e),i=e.connect(`state-flags-changed`,()=>{let t=isPressed(e);t!==r&&(r=t,n(t))});return t+=1,n(r),()=>{e.disconnect(i),--t}}function onGesture(t,n,r){let i=new e.GestureClick,a=i.connect(n,()=>r());return t.add_controller(i),()=>{t.remove_controller(i),i.disconnect(a)}}export{onGesture,onPressStateChange,pressWatchCount};
1
+ import"./_virtual/_rolldown/runtime.js";import e from"gi://GObject?version=2.0";import t from"gi://Gtk?version=4.0";let n=0;const pressWatchCount=()=>n,isPressed=e=>(e.get_state_flags()&t.StateFlags.ACTIVE)!==0;function onPressStateChange(e,t){let r=isPressed(e),i=e.connect(`state-flags-changed`,()=>{let n=isPressed(e);n!==r&&(r=n,t(n))});return n+=1,t(r),()=>{e.disconnect(i),--n}}function onGesture(n,r,i){let a=new t.GestureClick,o=e.signal_connect(a,r,()=>i());return n.add_controller(a),()=>{n.remove_controller(a),a.disconnect(o)}}export{onGesture,onPressStateChange,pressWatchCount};
@@ -1 +1 @@
1
- import"../_virtual/_rolldown/runtime.js";const e={false:0,true:1,mixed:2};function coerceAttribute(t,n){switch(t.as){case`string`:return typeof n==`string`?n:null;case`boolean`:return typeof n==`boolean`?n:null;case`tristate`:return typeof n==`boolean`?n?e.true:e.false:n===`mixed`?e.mixed:null}}const t={string:`a string`,boolean:`true or false`,tristate:`true, false or "mixed" — GTK reads it as a Gtk.AccessibleTristate`};function resolveAccessible(e,n,r){if(e.from===`value`){let i=coerceAttribute(e.attribute,r);return i===null?{entries:[],problem:`writes the GTK accessible ${e.attribute.set} "${e.attribute.name}" and needs ${t[e.attribute.as]}`}:{entries:[{prop:n,set:e.attribute.set,name:e.attribute.name,value:i}],problem:null}}if(typeof r!=`object`||!r||Array.isArray(r))return{entries:[],problem:`is a record of accessibility states and needs an object — its keys are ${Object.keys(e.members).sort().join(`, `)}`};let i=[];for(let[a,o]of Object.entries(r)){if(o===void 0)continue;let r=e.refuses[a];if(r!==void 0)return{entries:[],problem:`carries "${a}", which ${r}`};let s=e.members[a];if(s===void 0)return{entries:[],problem:`carries "${a}", which is not a state this layer answers for. It takes: ${Object.keys(e.members).sort().join(`, `)}`};let c=coerceAttribute(s,o);if(c===null)return{entries:[],problem:`carries "${a}", which needs ${t[s.as]}`};i.push({prop:n,set:s.set,name:s.name,value:c})}return{entries:i,problem:null}}export{resolveAccessible};
1
+ import"../_virtual/_rolldown/runtime.js";import{describeValue as e,unknownAccessibleKeyDetail as t}from"./errors.js";const n={false:0,true:1,mixed:2};function coerceAttribute(e,t){switch(e.as){case`string`:return typeof t==`string`?t:null;case`boolean`:return typeof t==`boolean`?t:null;case`tristate`:return typeof t==`boolean`?t?n.true:n.false:t===`mixed`?n.mixed:null}}const r={string:`a string`,boolean:`true or false`,tristate:`true, false or "mixed" — GTK reads it as a Gtk.AccessibleTristate`};function resolveAccessible(n,i,a){if(n.from===`value`){let t=coerceAttribute(n.attribute,a);return t===null?{entries:[],problem:`writes the GTK accessible ${n.attribute.set} "${n.attribute.name}" and needs ${r[n.attribute.as]}; got ${e(a)}`}:{entries:[{prop:i,set:n.attribute.set,name:n.attribute.name,value:t}],problem:null}}if(typeof a!=`object`||!a||Array.isArray(a))return{entries:[],problem:`is a record of accessibility states and needs an object — its keys are ${Object.keys(n.members).sort().join(`, `)}; got ${e(a)}`};let o=[];for(let[s,c]of Object.entries(a)){if(c===void 0)continue;let a=n.refuses[s];if(a!==void 0)return{entries:[],problem:`carries "${s}", which ${a}`};let l=n.members[s];if(l===void 0)return{entries:[],problem:t(s,Object.keys(n.members))};let u=coerceAttribute(l,c);if(u===null)return{entries:[],problem:`carries "${s}", which needs ${r[l.as]}; got ${e(c)}`};o.push({prop:i,set:l.set,name:l.name,value:u})}return{entries:o,problem:null}}export{resolveAccessible};