@gjsify/react-native 0.45.0 → 0.46.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 +525 -0
- package/README.md +45 -163
- package/SUPPORT.md +472 -0
- package/lib/esm/accessor.js +1 -0
- package/lib/esm/animated/brand.js +1 -0
- package/lib/esm/animated/easing.js +1 -0
- package/lib/esm/animated/index.js +1 -0
- package/lib/esm/animated/properties.js +1 -0
- package/lib/esm/animated/timing.js +1 -0
- package/lib/esm/animated/value.js +1 -0
- package/lib/esm/announce.js +1 -0
- package/lib/esm/app-registry.js +1 -1
- package/lib/esm/components.js +1 -1
- package/lib/esm/generated/own-exports.js +1 -1
- package/lib/esm/generated/unsupported-async-storage.js +0 -0
- package/lib/esm/generated/unsupported-expo-audio.js +1 -0
- package/lib/esm/generated/unsupported-expo-constants.js +1 -0
- package/lib/esm/generated/unsupported-expo-font.js +1 -0
- package/lib/esm/generated/unsupported-expo-image.js +1 -0
- package/lib/esm/generated/unsupported-expo-linking.js +1 -0
- package/lib/esm/generated/unsupported-expo-splash-screen.js +1 -0
- package/lib/esm/generated/unsupported-expo-status-bar.js +1 -0
- package/lib/esm/generated/unsupported-expo-system-ui.js +1 -0
- package/lib/esm/generated/unsupported-expo-video.js +1 -0
- package/lib/esm/generated/unsupported-expo-web-browser.js +1 -0
- package/lib/esm/generated/unsupported-nativewind.js +1 -0
- package/lib/esm/generated/unsupported-react-native-gesture-handler.js +1 -0
- package/lib/esm/generated/unsupported-react-native-safe-area-context.js +1 -0
- package/lib/esm/generated/unsupported-react-native-webview.js +1 -0
- package/lib/esm/generated/unsupported-react-native.js +1 -0
- package/lib/esm/generated/unsupported-router.js +1 -0
- package/lib/esm/generated/unsupported-vector-icons.js +1 -0
- package/lib/esm/index.js +1 -1
- package/lib/esm/lists/controller.js +1 -1
- package/lib/esm/primitives/answers.js +1 -0
- package/lib/esm/primitives/defaults.js +1 -0
- package/lib/esm/primitives/errors.js +1 -1
- package/lib/esm/primitives/handles.js +1 -0
- package/lib/esm/primitives/index.js +1 -1
- package/lib/esm/primitives/intents.js +1 -1
- package/lib/esm/primitives/resolve.js +1 -1
- package/lib/esm/primitives/style.js +1 -1
- package/lib/esm/primitives/table.js +1 -1
- package/lib/esm/prop-table.js +1 -0
- package/lib/esm/router/href.js +1 -0
- package/lib/esm/router/index.js +1 -1
- package/lib/esm/router/navigation.js +1 -1
- package/lib/esm/router/tabs.js +1 -1
- package/lib/esm/solid/index.js +1 -1
- package/lib/esm/stylesheet.js +1 -1
- package/lib/esm/support-table.js +1 -1
- package/lib/esm/surfaces/async-storage.js +1 -0
- package/lib/esm/surfaces/expo-audio.js +1 -0
- package/lib/esm/surfaces/expo-constants.js +1 -0
- package/lib/esm/surfaces/expo-font.js +1 -0
- package/lib/esm/surfaces/expo-image.js +1 -0
- package/lib/esm/surfaces/expo-linking.js +1 -0
- package/lib/esm/surfaces/expo-splash-screen.js +1 -0
- package/lib/esm/surfaces/expo-status-bar.js +1 -0
- package/lib/esm/surfaces/expo-system-ui.js +1 -0
- package/lib/esm/surfaces/expo-video.js +1 -0
- package/lib/esm/surfaces/expo-web-browser.js +1 -0
- package/lib/esm/surfaces/icon-map.js +1 -0
- package/lib/esm/surfaces/nativewind.js +1 -0
- package/lib/esm/surfaces/react-native-gesture-handler.js +1 -0
- package/lib/esm/surfaces/react-native-safe-area-context.js +1 -0
- package/lib/esm/surfaces/react-native-webview.js +1 -0
- package/lib/esm/surfaces/vector-icons.js +1 -0
- package/lib/esm/unsupported.js +1 -1
- package/lib/types/accessor.d.ts +10 -0
- package/lib/types/animated/animated.spec.d.ts +2 -0
- package/lib/types/animated/brand.d.ts +8 -0
- package/lib/types/animated/easing.d.ts +70 -0
- package/lib/types/animated/easing.spec.d.ts +2 -0
- package/lib/types/animated/index.d.ts +55 -0
- package/lib/types/animated/properties.d.ts +33 -0
- package/lib/types/animated/timing.d.ts +37 -0
- package/lib/types/animated/value.d.ts +103 -0
- package/lib/types/announce.d.ts +18 -0
- package/lib/types/components.d.ts +82 -3
- package/lib/types/generated/unsupported-async-storage.d.ts +1 -0
- package/lib/types/generated/unsupported-expo-audio.d.ts +4 -0
- package/lib/types/generated/unsupported-expo-constants.d.ts +2 -0
- package/lib/types/generated/unsupported-expo-font.d.ts +4 -0
- package/lib/types/generated/unsupported-expo-image.d.ts +3 -0
- package/lib/types/generated/unsupported-expo-linking.d.ts +4 -0
- package/lib/types/generated/unsupported-expo-splash-screen.d.ts +5 -0
- package/lib/types/generated/unsupported-expo-status-bar.d.ts +5 -0
- package/lib/types/generated/unsupported-expo-system-ui.d.ts +2 -0
- package/lib/types/generated/unsupported-expo-video.d.ts +3 -0
- package/lib/types/generated/unsupported-expo-web-browser.d.ts +6 -0
- package/lib/types/generated/unsupported-nativewind.d.ts +5 -0
- package/lib/types/generated/unsupported-react-native-gesture-handler.d.ts +10 -0
- package/lib/types/generated/unsupported-react-native-safe-area-context.d.ts +4 -0
- package/lib/types/generated/unsupported-react-native-webview.d.ts +1 -0
- package/lib/types/generated/{unsupported-exports.d.ts → unsupported-react-native.d.ts} +0 -2
- package/lib/types/generated/unsupported-vector-icons.d.ts +11 -0
- package/lib/types/index.d.ts +5 -1
- package/lib/types/primitives/answers.d.ts +69 -0
- package/lib/types/primitives/defaults.d.ts +52 -0
- package/lib/types/primitives/defaults.spec.d.ts +2 -0
- package/lib/types/primitives/errors.d.ts +9 -0
- package/lib/types/primitives/handles.d.ts +56 -0
- package/lib/types/primitives/index.d.ts +8 -2
- package/lib/types/primitives/intents.d.ts +36 -0
- package/lib/types/primitives/resolve.d.ts +25 -1
- package/lib/types/primitives/table.d.ts +63 -1
- package/lib/types/prop-table.d.ts +56 -0
- package/lib/types/prop-table.spec.d.ts +2 -0
- package/lib/types/router/href.d.ts +58 -0
- package/lib/types/router/href.spec.d.ts +2 -0
- package/lib/types/router/index.d.ts +3 -1
- package/lib/types/router/navigation.d.ts +47 -5
- package/lib/types/router/tabs.d.ts +35 -0
- package/lib/types/solid/index.d.ts +15 -1
- package/lib/types/support-table.d.ts +79 -10
- package/lib/types/surfaces/async-storage.d.ts +57 -0
- package/lib/types/surfaces/expo-audio.d.ts +1 -0
- package/lib/types/surfaces/expo-constants.d.ts +11 -0
- package/lib/types/surfaces/expo-font.d.ts +34 -0
- package/lib/types/surfaces/expo-image.d.ts +1 -0
- package/lib/types/surfaces/expo-linking.d.ts +36 -0
- package/lib/types/surfaces/expo-splash-screen.d.ts +1 -0
- package/lib/types/surfaces/expo-status-bar.d.ts +16 -0
- package/lib/types/surfaces/expo-system-ui.d.ts +1 -0
- package/lib/types/surfaces/expo-video.d.ts +1 -0
- package/lib/types/surfaces/expo-web-browser.d.ts +21 -0
- package/lib/types/surfaces/icon-map.d.ts +14 -0
- package/lib/types/surfaces/nativewind.d.ts +1 -0
- package/lib/types/surfaces/react-native-gesture-handler.d.ts +10 -0
- package/lib/types/surfaces/react-native-safe-area-context.d.ts +60 -0
- package/lib/types/surfaces/react-native-webview.d.ts +4 -0
- package/lib/types/surfaces/surfaces.spec.d.ts +2 -0
- package/lib/types/surfaces/vector-icons.d.ts +15 -0
- package/lib/types/unsupported.d.ts +12 -3
- package/package.json +85 -14
- package/lib/esm/generated/unsupported-exports.js +0 -1
- package/lib/esm/generated/unsupported-router-exports.js +0 -1
- /package/lib/types/generated/{unsupported-router-exports.d.ts → unsupported-router.d.ts} +0 -0
package/SUPPORT.md
ADDED
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/generate-exports.mjs — do not edit. -->
|
|
2
|
+
|
|
3
|
+
# What `@gjsify/react-native` answers for
|
|
4
|
+
|
|
5
|
+
One section per npm package this layer declares a surface for (ADR 0032 § 8, ADR 0036).
|
|
6
|
+
Every row comes from `src/support-table.ts`, which is also what the bundler gate reads and
|
|
7
|
+
what the runtime refusals print — so this document cannot disagree with either.
|
|
8
|
+
|
|
9
|
+
A package that is NOT listed here has no entry on purpose: it reaches no platform, so it is
|
|
10
|
+
the consumer's own dependency and works unmodified. ADR 0036 § 5 states that rule.
|
|
11
|
+
|
|
12
|
+
## `react-native`
|
|
13
|
+
|
|
14
|
+
Imported from `react-native`; answered by `@gjsify/react-native`.
|
|
15
|
+
|
|
16
|
+
### Supported (4)
|
|
17
|
+
|
|
18
|
+
| export | tier | GTK | why |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| `useColorScheme` | P1 | Adw.StyleManager.dark | Follows the Adwaita colour scheme — the dark property, which is what the user is looking at, not color-scheme, which is what the application asked for. |
|
|
21
|
+
| `Appearance` | P2 | Adw.StyleManager | The imperative sibling of useColorScheme, over the SAME reader — getColorScheme reads Adw.StyleManager:dark (what the user is looking at) and setColorScheme writes :color-scheme (what the application asked for), which is exactly the split React Native’s getter and setter have. |
|
|
22
|
+
| `EventEmitter` | — | — | Pure JavaScript; nothing in it touches a platform. |
|
|
23
|
+
| `unstable_batchedUpdates` | — | — | React 19 batches automatically; this is the identity call it already is upstream. |
|
|
24
|
+
|
|
25
|
+
### Supported, with named limits (31)
|
|
26
|
+
|
|
27
|
+
| export | tier | GTK | why |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| `View` | P1 | Gtk.Box, or Gtk.Overlay when a child is absolutely positioned | The container primitive. Which widget it becomes depends on its children, not on the element. |
|
|
30
|
+
| `Text` | P1 | Gtk.Label | THREE Gtk.Label defaults disagree with React Native’s and are set explicitly — wrap, xalign and yalign. The whole set of default divergences, including the ones that agree, is enumerated in primitives/defaults.ts. |
|
|
31
|
+
| `Pressable` | P1 | Gtk.Button (flat) | Press state is a GTK CSS :active pseudo-class; children-as-a-function is implemented over the state flag, and costs nothing when it is unused. |
|
|
32
|
+
| `ScrollView` | P1 | Gtk.ScrolledWindow + an implicit content box | contentContainerStyle styles the inner box, which is a second styleable node. |
|
|
33
|
+
| `ActivityIndicator` | P1 | Adw.Spinner | Direct counterpart. |
|
|
34
|
+
| `TextInput` | P1 | Gtk.Entry / Gtk.TextView | Single- versus multi-line is one prop in React Native and two different widgets in GTK. |
|
|
35
|
+
| `Linking` | P1 | Gtk.UriLauncher | openURL and canOpenURL only. |
|
|
36
|
+
| `Switch` | P1 | Gtk.Switch | Direct counterpart. |
|
|
37
|
+
| `Platform` | P1 | — | OS is "linux" \| "macos" \| "windows"; select() picks the default branch. |
|
|
38
|
+
| `Share` | P1 | Gdk.Clipboard | No desktop share sheet worth pretending about; copying the link is the honest mapping. |
|
|
39
|
+
| `AppRegistry` | P1 | Adw.Application + Adw.ApplicationWindow | The entry point. Nothing renders without a window, so this is P1 despite being a shim. |
|
|
40
|
+
| `StyleSheet` | P1 | Gdk.Monitor.scale for hairlineWidth | create/flatten/compose/hairlineWidth/absoluteFill. Style objects go through the same partition as classes (ADR 0032 § 4), which is why create can be identity. |
|
|
41
|
+
| `FlatList` | P2 | Gtk.ListView + Gio.ListStore, owned by the component | GTK virtualises for real. The list is NOT an ordinary element: a Gtk.ListView takes no children (measured — no append, add, insert, prepend, remove or set_child), so the component owns the view and drives the model from data, with React only inside the item factory. |
|
|
42
|
+
| `SectionList` | P2 | Gtk.ListView + one flattened Gio.ListStore | The same component as FlatList, handed sections instead of data. |
|
|
43
|
+
| `VirtualizedList` | P2 | Gtk.ListView | Its public surface is wide and mostly not worth honouring literally; the useful subset backs FlatList, and this name is that subset plus getItem/getItemCount. |
|
|
44
|
+
| `VirtualizedSectionList` | P2 | Gtk.ListView | The section-shaped sibling of VirtualizedList, which is SectionList here. |
|
|
45
|
+
| `Image` | P2 | Gtk.Picture | resizeMode becomes content-fit, and the default is inverted: React Native defaults to cover, a Gtk.Picture to contain (measured). |
|
|
46
|
+
| `ImageBackground` | P2 | Gtk.Picture in a Gtk.Overlay | A picture with the children stacked over it. The picture is the overlay’s MAIN child, because a Gtk.Overlay paints every overlay child ABOVE it. |
|
|
47
|
+
| `TouchableOpacity` | P2 | Gtk.Button (flat) | The same machinery as Pressable, written over it: one shared record of routes in the primitive table, one line of component. |
|
|
48
|
+
| `TouchableHighlight` | P2 | Gtk.Button (flat) | As TouchableOpacity. The pressed style is Adwaita’s own unless a variant says otherwise. |
|
|
49
|
+
| `TouchableWithoutFeedback` | P2 | Gtk.Box + Gtk.GestureClick | No chrome, so no button: a vertical Gtk.Box like a View, with a Gtk.GestureClick added to it. Measured: Gtk.Button emits activate and clicked, a Gtk.Box emits neither, and Gtk.GestureClick emits pressed/released/stopped/unpaired-release. |
|
|
50
|
+
| `Button` | P2 | Gtk.Button | The one component whose React Native styling story is "you cannot", which GTK agrees with. title, onPress and disabled. |
|
|
51
|
+
| `Dimensions` | P2 | Gtk.Window allocation, Gdk.Monitor geometry | get("window") is the window, not the screen — a desktop app is not full-screen, so the screen’s number would be wrong in the ordinary case. get("screen") is the monitor, because that is what it asks for. |
|
|
52
|
+
| `useWindowDimensions` | P2 | Gdk.Surface notify::width/height, Gtk.Window allocation | The hook form of Dimensions, through useSyncExternalStore so a resize between render and commit cannot tear. |
|
|
53
|
+
| `Alert` | P2 | Adw.AlertDialog | Direct counterpart, and buildable where Modal is not: Alert is a FUNCTION CALL, so no element is ever inserted into a widget. Measured on libadwaita 1.9.3 — present(null) from a plain function, with no parent and no window, returned with no diagnostic. |
|
|
54
|
+
| `SafeAreaView` | P2 | Gtk.Box | The INSET has no desktop meaning; the layout does. It is a View in every other respect, and it has to be a real export to be imported. |
|
|
55
|
+
| `StatusBar` | P2 | — | A desktop window has no status bar to configure, and <StatusBar/> is in the first ten lines of most React Native screens — so it renders NOTHING and says so, rather than failing to import. |
|
|
56
|
+
| `KeyboardAvoidingView` | P2 | Gtk.Box | No on-screen keyboard eats a desktop window layout, so the AVOIDING is the no-op. React Native’s KeyboardAvoidingView is a View that changes its own height; what is left here is the View. |
|
|
57
|
+
| `Keyboard` | P2 | — | Its events are on-screen-keyboard events, which do not occur — so the questions with a correct answer get it and the ones whose answer would have to be invented refuse. |
|
|
58
|
+
| `Animated` | P3 | Adw.TimedAnimation, over Adw.CallbackAnimationTarget | Value, timing and View — the three names a measured application uses, in one file of 28 routes. The rest of the subsystem is a graph evaluated per frame, and every other member refuses BY NAME. |
|
|
59
|
+
| `Easing` | P3 | AdwEasing, through Adw.TimedAnimation:easing | Not arithmetic, which the planning entry called it: React Native’s easings are FUNCTIONS and AdwEasing is an ENUM with no callback form, so this is a name-to-enum mapping and every pair in it is measured. |
|
|
60
|
+
|
|
61
|
+
### Planned (26)
|
|
62
|
+
|
|
63
|
+
| export | tier | GTK | why |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| `Modal` | P1 | Adw.Dialog | An Adw.Dialog cannot be an ordinary element. MEASURED on libadwaita 1.9.3: box.append(dialog) calls g_error() — SIGABRT and a core dump, not a catchable exception — but ONLY when the box is rooted in a window. A detached box accepts the append in silence, so a re-test on a bare box appears to disprove this and puts the primitive back. A dialog is PRESENTED against a parent, never parented by it, so this is a PORTAL and needs a host seam that does not exist yet. |
|
|
66
|
+
| `AppState` | P3 | Gtk.Application / Gdk.Surface state | active/background from window focus and visibility. |
|
|
67
|
+
| `PixelRatio` | P3 | Gdk.Surface.scale-factor | The scale factor of the surface the widget is on. |
|
|
68
|
+
| `PlatformColor` | P3 | Adwaita named colours | Maps unusually well — GTK’s palette is exactly this idea. |
|
|
69
|
+
| `AccessibilityInfo` | P3 | Gtk.Accessible / AT-SPI | The highest-value P3 entry: GTK’s accessibility model is strong and the props map onto it well. |
|
|
70
|
+
| `LayoutAnimation` | P3 | — | Needs an animated layout pass, which is the same subsystem as Animated. |
|
|
71
|
+
| `InteractionManager` | P3 | — | Deferring work until interactions settle; a main-loop idle source is the counterpart. |
|
|
72
|
+
| `useAnimatedValue` | P3 | — | Part of the Animated subsystem. |
|
|
73
|
+
| `useAnimatedValueXY` | P3 | — | Part of the Animated subsystem. |
|
|
74
|
+
| `useAnimatedColor` | P3 | — | Part of the Animated subsystem. |
|
|
75
|
+
| `PanResponder` | P3 | Gtk.Gesture* controllers | The controllers exist; the arbitration model is not React Native’s, so this is its own project. |
|
|
76
|
+
| `usePressability` | P3 | — | The hook behind the Touchable family; it lands with the gesture work. |
|
|
77
|
+
| `DrawerLayoutAndroid` | P3 | Adw.OverlaySplitView | The pattern survives on a desktop even though the component is Android-only. |
|
|
78
|
+
| `I18nManager` | P3 | Gtk.Widget.direction | RTL is a widget-direction question on GTK. |
|
|
79
|
+
| `ToastAndroid` | P3 | Adw.Toast | Android-only by name, and Adwaita has the exact widget. |
|
|
80
|
+
| `TouchableNativeFeedback` | P3 | Gtk.Button | Android-only ripple; shimmed to its portable sibling. |
|
|
81
|
+
| `ActionSheetIOS` | P3 | Adw.AlertDialog with responses | iOS-only by name; the pattern is a dialog with choices. |
|
|
82
|
+
| `Clipboard` | P3 | Gdk.Clipboard | Deprecated upstream in favour of a community package, but trivial here. |
|
|
83
|
+
| `BackHandler` | P3 | — | An Android hardware back button. Routing has landed and this did NOT arrive with it, which the earlier reason assumed it would: BackHandler INTERCEPTS a back press and consumes it, and MEASURED on libadwaita 1.9.3, Adw.NavigationView emits `popped` AFTER the fact and has no vetoable "about to pop" signal at all — its only prevention is Adw.NavigationPage:can-pop, a property rather than an event. The honest counterpart is usePreventRemove, which the routing layer does honour through its popped bridge; this name needs a key controller of its own on the window. |
|
|
84
|
+
| `DynamicColorIOS` | P3 | — | A light/dark colour pair; the Adwaita scheme already provides the switch. |
|
|
85
|
+
| `processColor` | P3 | — | Colour string to a platform value; a Gdk.RGBA on this side. |
|
|
86
|
+
| `UTFSequence` | P3 | — | A table of unicode constants. Pure data, no platform in it. |
|
|
87
|
+
| `ReactNativeVersion` | P3 | — | The version this layer targets, reported honestly rather than spoofed. |
|
|
88
|
+
| `ProgressBarAndroid` | P3 | Gtk.ProgressBar | Android-only by name; GTK has the widget. |
|
|
89
|
+
| `NativeEventEmitter` | P3 | — | It would construct and subscribe, but nothing native would ever emit into it — shipping that needs a decision, not a class. |
|
|
90
|
+
| `DeviceEventEmitter` | P3 | — | The global emitter. Lands with NativeEventEmitter, and for the same reason. |
|
|
91
|
+
|
|
92
|
+
### No meaning on a desktop window (6)
|
|
93
|
+
|
|
94
|
+
| export | tier | GTK | why |
|
|
95
|
+
|---|---|---|---|
|
|
96
|
+
| `LogBox` | P3 | — | A development overlay for a phone; the console is the desktop equivalent. |
|
|
97
|
+
| `Systrace` | — | — | Android systrace has no desktop counterpart. |
|
|
98
|
+
| `Vibration` | — | — | A desktop machine does not vibrate. |
|
|
99
|
+
| `InputAccessoryView` | — | — | An iOS keyboard accessory bar; there is no keyboard to accessorise. |
|
|
100
|
+
| `DevMenu` | — | — | The shake-to-open developer menu. |
|
|
101
|
+
| `DevSettings` | — | — | Development-client settings for a phone runtime. |
|
|
102
|
+
|
|
103
|
+
### Refused (25)
|
|
104
|
+
|
|
105
|
+
| export | tier | GTK | why |
|
|
106
|
+
|---|---|---|---|
|
|
107
|
+
| `RefreshControl` | — | — | GTK has no pull-to-refresh idiom and should not grow one. Give the desktop build a refresh action instead. |
|
|
108
|
+
| `PushNotificationIOS` | — | — | Platform notification plumbing. A desktop app uses Gio.Notification directly. |
|
|
109
|
+
| `PermissionsAndroid` | — | — | Android runtime permissions have no desktop counterpart; portals are asked for at use time. |
|
|
110
|
+
| `Settings` | — | — | An iOS user-defaults bridge. GSettings is the desktop answer and is not this API. |
|
|
111
|
+
| `experimental_LayoutConformance` | — | — | An experimental switch between two React Native layout implementations. Neither is used here. |
|
|
112
|
+
| `unstable_VirtualView` | — | — | Unstable React Native internal. |
|
|
113
|
+
| `VirtualViewMode` | — | — | Unstable React Native internal. |
|
|
114
|
+
| `unstable_NativeText` | — | — | Unstable React Native internal. |
|
|
115
|
+
| `unstable_NativeView` | — | — | Unstable React Native internal. |
|
|
116
|
+
| `unstable_TextAncestorContext` | — | — | Unstable React Native internal. |
|
|
117
|
+
| `DeviceInfo` | — | — | A native module surface describing a phone. |
|
|
118
|
+
| `NativeModules` | — | — | The native-module bridge. There is no bridge here; this layer renders in-process onto GTK. |
|
|
119
|
+
| `TurboModuleRegistry` | — | — | The TurboModule lookup. Same reason as NativeModules. |
|
|
120
|
+
| `NativeComponentRegistry` | — | — | Fabric component registration. The host owns widget creation. |
|
|
121
|
+
| `requireNativeComponent` | — | — | Looks up a native view manager. Write a GTK widget descriptor instead. |
|
|
122
|
+
| `codegenNativeComponent` | — | — | React Native codegen for Fabric components. |
|
|
123
|
+
| `codegenNativeCommands` | — | — | React Native codegen for Fabric commands. |
|
|
124
|
+
| `UIManager` | — | — | The legacy view-manager surface. The GTK host is the view manager here. |
|
|
125
|
+
| `findNodeHandle` | — | — | Returns a native view tag. A ref here is the Gtk.Widget itself, which is more useful. |
|
|
126
|
+
| `registerCallableModule` | — | — | Registers a module callable from the native side. There is no native side. |
|
|
127
|
+
| `Networking` | — | — | React Native’s XHR internals. Use fetch, which gjsify provides. |
|
|
128
|
+
| `NativeDialogManagerAndroid` | — | — | An Android dialog native module. Alert is the portable spelling. |
|
|
129
|
+
| `Touchable` | — | — | The legacy mixin behind the Touchable family, not a public component. |
|
|
130
|
+
| `NativeAppEventEmitter` | — | — | The legacy iOS app-event emitter. |
|
|
131
|
+
| `RootTagContext` | — | — | A React Native surface identifier. This layer has one root per Adw window. |
|
|
132
|
+
|
|
133
|
+
## `expo-router`
|
|
134
|
+
|
|
135
|
+
Imported from `expo-router`; answered by `@gjsify/react-native/router`.
|
|
136
|
+
|
|
137
|
+
### Supported, with named limits (5)
|
|
138
|
+
|
|
139
|
+
| export | tier | GTK | why |
|
|
140
|
+
|---|---|---|---|
|
|
141
|
+
| `router` | P1 | Adw.NavigationView (push/pop) via React Navigation’s StackActions | push, back, replace, navigate and canGoBack. Every href-taking method accepts BOTH argument shapes — a path string and expo-router’s { pathname, params } object. |
|
|
142
|
+
| `useLocalSearchParams` | P1 | — | The current route’s params — the [param] values and the query string — read through React Navigation’s own useRoute(). |
|
|
143
|
+
| `usePathname` | P1 | — | The current URL without its query string, from React Navigation’s getPathFromState over the published root state. |
|
|
144
|
+
| `Stack` | P1 | Adw.NavigationView + Adw.NavigationPage | The stack navigator: React declares which pages exist, the widget owns their order, and the route key is the tag that joins the two. |
|
|
145
|
+
| `Tabs` | P1 | Adw.ViewStack + Adw.ViewSwitcher | The tab navigator. The switcher is driven by the stack’s own page model, so a route file adds a button with no tab-bar bookkeeping. |
|
|
146
|
+
|
|
147
|
+
### Planned (13)
|
|
148
|
+
|
|
149
|
+
| export | tier | GTK | why |
|
|
150
|
+
|---|---|---|---|
|
|
151
|
+
| `Link` | P2 | Gtk.Button (flat) or Gtk.LinkButton | An href as an element rather than a call. Cheap once `router` exists, and the honest widget question — button or link — is worth measuring first. |
|
|
152
|
+
| `Redirect` | P2 | — | A declarative navigate-on-render. It needs a rule for what happens when it redirects during the first commit, which is the commit that must not be empty. |
|
|
153
|
+
| `Slot` | P2 | Adw.Bin | A layout that renders its child route with no navigator around it. It is the one layout shape that has no widget of its own. |
|
|
154
|
+
| `useRouter` | P2 | — | The hook form of `router`. Identical behaviour, and it exists so a test can substitute the object — which is worth having once there is something to substitute. |
|
|
155
|
+
| `useSegments` | P2 | — | The current route split into segments. Derivable from the published root state, and unused in the measured application. |
|
|
156
|
+
| `useGlobalSearchParams` | P2 | — | The params of the focused route anywhere in the tree, rather than of the calling screen. It re-renders on every navigation by design, which is why expo-router documents preferring the local form. |
|
|
157
|
+
| `useNavigation` | P2 | — | React Navigation’s own hook, re-exported by expo-router. It works already through @react-navigation/core; exporting it from here is a decision about what this surface promises, not a build. |
|
|
158
|
+
| `useFocusEffect` | P2 | — | As useNavigation: it is core’s, and it works. The open question is the same one. |
|
|
159
|
+
| `useRootNavigationState` | P3 | — | The root state as a hook. The store `usePathname` reads is already there; this is a second selector over it. |
|
|
160
|
+
| `Drawer` | P3 | Adw.OverlaySplitView | A sidebar navigator. The pattern survives on a desktop better than it does on a phone, and Adwaita has the exact widget — it is a third navigator, not a variation on these two. |
|
|
161
|
+
| `withLayoutContext` | P3 | — | The escape hatch that lets a third-party navigator take its screens from the file tree. It is exactly `useRouteNode` plus screen synthesis, made public — worth doing once a third navigator exists to prove the shape. |
|
|
162
|
+
| `Navigator` | P3 | — | expo-router’s low-level navigator primitive. It belongs with withLayoutContext and for the same reason. |
|
|
163
|
+
| `ErrorBoundary` | P3 | Adw.StatusPage | A per-route error screen. React 19 routes an uncaught error to the root’s handler and @gjsify/gtk-host/react rethrows it from render() — deliberately, so a refusal is not swallowed — and a boundary here has to be reconciled with that rather than bolted beside it. |
|
|
164
|
+
|
|
165
|
+
### Refused (4)
|
|
166
|
+
|
|
167
|
+
| export | tier | GTK | why |
|
|
168
|
+
|---|---|---|---|
|
|
169
|
+
| `ExpoRoot` | — | — | It takes a Metro `require.context`, which does not exist in this build chain. `RouterRoot` takes the manifest a bundler plugin emits instead — the same job, with the one input that is available. |
|
|
170
|
+
| `useUnstableGlobalHref` | — | — | Unstable by its own name, and it answers the question usePathname already answers for the only surface this layer has. |
|
|
171
|
+
| `useNavigationContainerRef` | — | — | The container ref is this layer’s own (one process routes one tree), and handing it out would let a consumer dispatch around the refusals `router` exists to give. |
|
|
172
|
+
| `SplashScreen` | — | — | A native splash screen belongs to a phone launcher. A GTK application maps its window when it is ready, which is the desktop equivalent and is Gio.Application’s job, not the router’s. |
|
|
173
|
+
|
|
174
|
+
## `expo-status-bar`
|
|
175
|
+
|
|
176
|
+
Imported from `expo-status-bar`; answered by `@gjsify/react-native/expo-status-bar`.
|
|
177
|
+
|
|
178
|
+
### Supported, with named limits (1)
|
|
179
|
+
|
|
180
|
+
| export | tier | GTK | why |
|
|
181
|
+
|---|---|---|---|
|
|
182
|
+
| `StatusBar` | P1 | — | `react-native`’s own StatusBar, re-exported. A desktop window has no bar above it, so the component renders null and every imperative setter refuses by name. |
|
|
183
|
+
|
|
184
|
+
### Refused (5)
|
|
185
|
+
|
|
186
|
+
| export | tier | GTK | why |
|
|
187
|
+
|---|---|---|---|
|
|
188
|
+
| `setStatusBarStyle` | — | — | Sets the bar’s contrast NOW. There is no bar, and a setter that appears to work is indistinguishable from one that does. |
|
|
189
|
+
| `setStatusBarHidden` | — | — | As setStatusBarStyle: there is no bar to hide. |
|
|
190
|
+
| `setStatusBarBackgroundColor` | — | — | Android-only even on a phone, and there is no bar here to paint. |
|
|
191
|
+
| `setStatusBarTranslucent` | — | — | As setStatusBarBackgroundColor. |
|
|
192
|
+
| `setStatusBarNetworkActivityIndicatorVisible` | — | — | An iOS spinner in the carrier bar. A desktop application shows progress in its own window. |
|
|
193
|
+
|
|
194
|
+
## `expo-font`
|
|
195
|
+
|
|
196
|
+
Imported from `expo-font`; answered by `@gjsify/react-native/expo-font`.
|
|
197
|
+
|
|
198
|
+
### Supported (1)
|
|
199
|
+
|
|
200
|
+
| export | tier | GTK | why |
|
|
201
|
+
|---|---|---|---|
|
|
202
|
+
| `isLoading` | P2 | — | Always false. Nothing loads asynchronously, so nothing is ever loading — which is the same answer React Native gives once a font has arrived. |
|
|
203
|
+
|
|
204
|
+
### Supported, with named limits (2)
|
|
205
|
+
|
|
206
|
+
| export | tier | GTK | why |
|
|
207
|
+
|---|---|---|---|
|
|
208
|
+
| `useFonts` | P1 | Pango’s font map | A desktop application does not load a font file per screen: fonts are INSTALLED and the platform’s font map discovers them, so the hook has nothing to wait for and reports ready on its first render. |
|
|
209
|
+
| `isLoaded` | P2 | PangoCairo.FontMap.list_families | A real answer rather than a stub: whether Pango knows a family of that name on this machine. |
|
|
210
|
+
|
|
211
|
+
### Refused (4)
|
|
212
|
+
|
|
213
|
+
| export | tier | GTK | why |
|
|
214
|
+
|---|---|---|---|
|
|
215
|
+
| `loadAsync` | — | — | Registers a font file with the runtime, and what it is HANDED is not a file: the argument is a `require("./Inter.ttf")` id into React Native’s asset registry, which ADR 0032 § 12 leaves to the consumer’s build chain — the same reason `useFonts` ignores its map’s values. So there is no path to register, and a promise that resolved would be claiming a font was installed when it was not. NOT because the call is missing: `pango_font_map_add_font_file()` is in the typelib since Pango 1.56 and `@gjsify/dom-elements` uses it for Canvas FontFace, but it answers G_IO_ERROR_NOT_SUPPORTED on the CoreText map, so it would work on Linux and Windows and lie on macOS. Install the face, or ship it with the application (`gjsify.ship.fonts`, ADR 0038). |
|
|
216
|
+
| `unloadAsync` | — | — | The inverse of loadAsync, and it has the same answer. |
|
|
217
|
+
| `unloadAllAsync` | — | — | As unloadAsync. |
|
|
218
|
+
| `FontDisplay` | — | — | A web `font-display` strategy for a font that is still downloading. Nothing downloads here. |
|
|
219
|
+
|
|
220
|
+
## `expo-linking`
|
|
221
|
+
|
|
222
|
+
Imported from `expo-linking`; answered by `@gjsify/react-native/expo-linking`.
|
|
223
|
+
|
|
224
|
+
### Supported, with named limits (5)
|
|
225
|
+
|
|
226
|
+
| export | tier | GTK | why |
|
|
227
|
+
|---|---|---|---|
|
|
228
|
+
| `openURL` | P1 | Gtk.UriLauncher | `react-native`’s own Linking.openURL, re-exported — the same measured implementation, including the `can_launch` gate that stops a promise never settling. |
|
|
229
|
+
| `canOpenURL` | P1 | Gtk.UriLauncher.can_launch | As openURL: react-native’s own. |
|
|
230
|
+
| `getInitialURL` | P1 | — | Always resolves null, which is also what React Native returns for a normal launch. |
|
|
231
|
+
| `useURL` | P2 | — | The hook form of getInitialURL, and it answers null for the same reason. |
|
|
232
|
+
| `parse` | P2 | — | Pure URL parsing, so it is answerable with no platform at all: `WHATWG URL`, which gjsify provides, reshaped into expo-linking’s { scheme, hostname, path, queryParams }. |
|
|
233
|
+
|
|
234
|
+
### Refused (4)
|
|
235
|
+
|
|
236
|
+
| export | tier | GTK | why |
|
|
237
|
+
|---|---|---|---|
|
|
238
|
+
| `createURL` | — | — | Builds a URL from the application’s own scheme, which expo reads from `app.json`. There is no Expo config here; a desktop application’s identity is its Gio.Application id and its scheme is a desktop-entry declaration. Write the URL. |
|
|
239
|
+
| `addEventListener` | — | — | URL delivery is Gio.Application::open with HANDLES_OPEN in the application flags — the application object’s own wiring, above this layer. Same refusal as react-native’s Linking. |
|
|
240
|
+
| `openSettings` | — | — | A phone OS per-app settings page. GNOME Settings has no per-application section a program can deep-link into. |
|
|
241
|
+
| `sendIntent` | — | — | An Android Intent. Same refusal as react-native’s Linking. |
|
|
242
|
+
|
|
243
|
+
## `expo-web-browser`
|
|
244
|
+
|
|
245
|
+
Imported from `expo-web-browser`; answered by `@gjsify/react-native/expo-web-browser`.
|
|
246
|
+
|
|
247
|
+
### Supported (1)
|
|
248
|
+
|
|
249
|
+
| export | tier | GTK | why |
|
|
250
|
+
|---|---|---|---|
|
|
251
|
+
| `WebBrowserResultType` | P1 | — | The result constants, so a comparison against them resolves instead of failing to import. |
|
|
252
|
+
|
|
253
|
+
### Supported, with named limits (1)
|
|
254
|
+
|
|
255
|
+
| export | tier | GTK | why |
|
|
256
|
+
|---|---|---|---|
|
|
257
|
+
| `openBrowserAsync` | P1 | Gtk.UriLauncher | On a phone this opens an IN-APP browser; on a desktop the counterpart is the user’s own browser, which is what Linking.openURL already does. |
|
|
258
|
+
|
|
259
|
+
### Refused (6)
|
|
260
|
+
|
|
261
|
+
| export | tier | GTK | why |
|
|
262
|
+
|---|---|---|---|
|
|
263
|
+
| `dismissBrowser` | — | — | Closes the in-app browser. There is none: the page is in another application and closing someone else’s window is not this application’s to do. |
|
|
264
|
+
| `openAuthSessionAsync` | — | — | Opens an in-app browser AND intercepts the redirect back to the app. The interception is the whole feature and it needs the in-app browser; with the system browser the redirect arrives as Gio.Application::open, which is the application’s own wiring. |
|
|
265
|
+
| `dismissAuthSession` | — | — | As dismissBrowser. |
|
|
266
|
+
| `maybeCompleteAuthSession` | — | — | Completes a web-popup auth flow, which is expo-web-browser’s browser-target behaviour. There is no popup here. |
|
|
267
|
+
| `warmUpAsync` | — | — | Pre-warms Android’s Custom Tabs service. A refusal rather than a no-op, because a no-op here would be an optimisation hint that silently does nothing on every platform — and there is no service to warm. |
|
|
268
|
+
| `coolDownAsync` | — | — | The inverse of warmUpAsync. |
|
|
269
|
+
|
|
270
|
+
## `react-native-safe-area-context`
|
|
271
|
+
|
|
272
|
+
Imported from `react-native-safe-area-context`; answered by `@gjsify/react-native/react-native-safe-area-context`.
|
|
273
|
+
|
|
274
|
+
### Supported, with named limits (5)
|
|
275
|
+
|
|
276
|
+
| export | tier | GTK | why |
|
|
277
|
+
|---|---|---|---|
|
|
278
|
+
| `SafeAreaView` | P1 | Gtk.Box | `react-native`’s own SafeAreaView, re-exported: the INSET has no desktop meaning, the layout does. |
|
|
279
|
+
| `SafeAreaProvider` | P1 | Gtk.Box | It is a View that publishes the insets. The insets are zero and constant here, so what is left is the View — and it must render, because a provider that rendered nothing would delete the whole application below it. |
|
|
280
|
+
| `useSafeAreaInsets` | P1 | — | Always { top: 0, right: 0, bottom: 0, left: 0 }. |
|
|
281
|
+
| `useSafeAreaFrame` | P2 | Gtk.Window allocation | The frame is the window, so this is `useWindowDimensions` with an x/y of zero. |
|
|
282
|
+
| `initialWindowMetrics` | P2 | — | Zero insets and a zero frame. React Native populates this from the native side BEFORE the first render so a screen can lay out without a flash; there is nothing to read before a GTK window exists. |
|
|
283
|
+
|
|
284
|
+
### Planned (2)
|
|
285
|
+
|
|
286
|
+
| export | tier | GTK | why |
|
|
287
|
+
|---|---|---|---|
|
|
288
|
+
| `SafeAreaInsetsContext` | P3 | — | The context object behind the hook, used by class components. It is a `createContext` call with a constant in it, and it lands when something needs the class-component form. |
|
|
289
|
+
| `SafeAreaFrameContext` | P3 | — | As SafeAreaInsetsContext. |
|
|
290
|
+
|
|
291
|
+
### Refused (2)
|
|
292
|
+
|
|
293
|
+
| export | tier | GTK | why |
|
|
294
|
+
|---|---|---|---|
|
|
295
|
+
| `withSafeAreaInsets` | — | — | A higher-order component that injects the insets into a class component. The insets are constant zero; write them. |
|
|
296
|
+
| `SafeAreaConsumer` | — | — | The deprecated render-prop form, superseded upstream by the hook. |
|
|
297
|
+
|
|
298
|
+
## `react-native-gesture-handler`
|
|
299
|
+
|
|
300
|
+
Imported from `react-native-gesture-handler`; answered by `@gjsify/react-native/react-native-gesture-handler`.
|
|
301
|
+
|
|
302
|
+
### Supported, with named limits (1)
|
|
303
|
+
|
|
304
|
+
| export | tier | GTK | why |
|
|
305
|
+
|---|---|---|---|
|
|
306
|
+
| `GestureHandlerRootView` | P1 | Gtk.Box | The root every gesture-handler application wraps itself in. It exists to host the library’s native touch arbitration, and there is none here — so what is left is the View, and it has to render or the application below it disappears. |
|
|
307
|
+
|
|
308
|
+
### Planned (4)
|
|
309
|
+
|
|
310
|
+
| export | tier | GTK | why |
|
|
311
|
+
|---|---|---|---|
|
|
312
|
+
| `PanGestureHandler` | P3 | Gtk.GestureDrag | The legacy handler components do not need worklets, and GTK has the controllers — `Gtk.GestureDrag`, `Gtk.GestureClick`, `Gtk.GestureZoom`. What they need is an arbitration model, which is `PanResponder`’s own project in the react-native table. |
|
|
313
|
+
| `TapGestureHandler` | P3 | Gtk.GestureClick | As PanGestureHandler. |
|
|
314
|
+
| `LongPressGestureHandler` | P3 | Gtk.GestureLongPress | As PanGestureHandler. |
|
|
315
|
+
| `PinchGestureHandler` | P3 | Gtk.GestureZoom | As PanGestureHandler. |
|
|
316
|
+
|
|
317
|
+
### Refused (4)
|
|
318
|
+
|
|
319
|
+
| export | tier | GTK | why |
|
|
320
|
+
|---|---|---|---|
|
|
321
|
+
| `Swipeable` | — | — | A row that reveals actions when dragged. Adwaita’s answer to the same idea is a different interaction entirely, and reproducing a phone one on a desktop is the approximation this layer refuses. |
|
|
322
|
+
| `ScrollView` | — | — | gesture-handler’s re-wrapped ScrollView exists to cooperate with its own touch arbitration. Import ScrollView from react-native. |
|
|
323
|
+
| `Directions` | — | — | Direction constants for the worklet gesture API. |
|
|
324
|
+
| `State` | — | — | The gesture state machine’s constants, for the same API. |
|
|
325
|
+
|
|
326
|
+
### Not reachable in this build chain (2)
|
|
327
|
+
|
|
328
|
+
| export | tier | GTK | why |
|
|
329
|
+
|---|---|---|---|
|
|
330
|
+
| `Gesture` | — | — | The gesture builder’s handlers are WORKLETS, compiled by a Babel plugin that is not in this build chain (ADR 0032’s own Consequences). This is not a scheduling statement. |
|
|
331
|
+
| `GestureDetector` | — | — | It runs `Gesture`’s worklets. Same answer. |
|
|
332
|
+
|
|
333
|
+
## `@react-native-async-storage/async-storage`
|
|
334
|
+
|
|
335
|
+
Imported from `@react-native-async-storage/async-storage`; answered by `@gjsify/react-native/async-storage`.
|
|
336
|
+
|
|
337
|
+
### Supported, with named limits (2)
|
|
338
|
+
|
|
339
|
+
| export | tier | GTK | why |
|
|
340
|
+
|---|---|---|---|
|
|
341
|
+
| `default` | P1 | Gio.File in GLib.get_user_data_dir() | A REAL store, not a stub: one JSON document in the application’s own data directory, read once and rewritten atomically on every mutation. |
|
|
342
|
+
| `useAsyncStorage` | P2 | — | The per-key handle: getItem/setItem/mergeItem/removeItem bound to one key. Pure composition over the default export. |
|
|
343
|
+
|
|
344
|
+
## `@expo/vector-icons`
|
|
345
|
+
|
|
346
|
+
Imported from `@expo/vector-icons`; answered by `@gjsify/react-native/vector-icons`.
|
|
347
|
+
|
|
348
|
+
### Supported, with named limits (1)
|
|
349
|
+
|
|
350
|
+
| export | tier | GTK | why |
|
|
351
|
+
|---|---|---|---|
|
|
352
|
+
| `Ionicons` | P1 | Gtk.Image with a symbolic icon-name | A declared mapping from Ionicons’ names onto the icon theme’s symbolic names, with every TARGET held against the installed theme by the spec. |
|
|
353
|
+
|
|
354
|
+
### Planned (8)
|
|
355
|
+
|
|
356
|
+
| export | tier | GTK | why |
|
|
357
|
+
|---|---|---|---|
|
|
358
|
+
| `MaterialIcons` | P3 | — | A second glyph vocabulary over the same mechanism — a table and its measurement, not new code. It lands when an application measured here uses one. |
|
|
359
|
+
| `MaterialCommunityIcons` | P3 | — | As MaterialIcons. |
|
|
360
|
+
| `FontAwesome` | P3 | — | As MaterialIcons. |
|
|
361
|
+
| `Feather` | P3 | — | As MaterialIcons. |
|
|
362
|
+
| `AntDesign` | P3 | — | As MaterialIcons. |
|
|
363
|
+
| `Entypo` | P3 | — | As MaterialIcons. |
|
|
364
|
+
| `Octicons` | P3 | — | As MaterialIcons. |
|
|
365
|
+
| `SimpleLineIcons` | P3 | — | As MaterialIcons. |
|
|
366
|
+
|
|
367
|
+
### Refused (3)
|
|
368
|
+
|
|
369
|
+
| export | tier | GTK | why |
|
|
370
|
+
|---|---|---|---|
|
|
371
|
+
| `createIconSet` | — | — | Builds an icon component from a glyph map and a FONT FILE, rendering a codepoint as text. A GTK symbolic icon is an SVG the theme owns, addressed by name — so there is no font to hand in and no codepoint to render. |
|
|
372
|
+
| `createIconSetFromFontello` | — | — | As createIconSet. |
|
|
373
|
+
| `createIconSetFromIcoMoon` | — | — | As createIconSet. |
|
|
374
|
+
|
|
375
|
+
## `expo-image`
|
|
376
|
+
|
|
377
|
+
Imported from `expo-image`; answered by `@gjsify/react-native/expo-image`.
|
|
378
|
+
|
|
379
|
+
### Planned (3)
|
|
380
|
+
|
|
381
|
+
| export | tier | GTK | why |
|
|
382
|
+
|---|---|---|---|
|
|
383
|
+
| `Image` | P2 | Gtk.Picture | The same widget react-native’s Image already uses, plus caching, transitions and blurhash. The widget half is answered; the rest is a decoding-and-cache pipeline this layer does not own yet. Import Image from react-native for the widget half. |
|
|
384
|
+
| `ImageBackground` | P2 | Gtk.Picture in a Gtk.Overlay | As Image. |
|
|
385
|
+
| `useImage` | P3 | — | Loads a source into an image object ahead of render. It needs the pipeline Image needs. |
|
|
386
|
+
|
|
387
|
+
## `expo-constants`
|
|
388
|
+
|
|
389
|
+
Imported from `expo-constants`; answered by `@gjsify/react-native/expo-constants`.
|
|
390
|
+
|
|
391
|
+
### Refused (3)
|
|
392
|
+
|
|
393
|
+
| export | tier | GTK | why |
|
|
394
|
+
|---|---|---|---|
|
|
395
|
+
| `default` | — | — | The Expo config object — `expoConfig`, `appOwnership`, `executionEnvironment`, `manifest`, `sessionId`. A desktop application’s identity is its Gio.Application id and its metadata is its desktop entry; there is no manifest here to read, and a shape that answered with plausible nulls would be read as "not configured" rather than "does not apply". |
|
|
396
|
+
| `ExecutionEnvironment` | — | — | Whether the app runs in Expo Go, a dev client or a standalone build. None of the three exists here. |
|
|
397
|
+
| `AppOwnership` | — | — | As ExecutionEnvironment. |
|
|
398
|
+
|
|
399
|
+
## `expo-system-ui`
|
|
400
|
+
|
|
401
|
+
Imported from `expo-system-ui`; answered by `@gjsify/react-native/expo-system-ui`.
|
|
402
|
+
|
|
403
|
+
### Refused (2)
|
|
404
|
+
|
|
405
|
+
| export | tier | GTK | why |
|
|
406
|
+
|---|---|---|---|
|
|
407
|
+
| `setBackgroundColorAsync` | — | — | Paints the window’s root view behind React. On GTK that is the application stylesheet’s job and Adwaita already answers it per colour scheme — a per-call override would fight the theme and win only until the scheme changes. |
|
|
408
|
+
| `getBackgroundColorAsync` | — | — | Reads back what setBackgroundColorAsync wrote. Nothing wrote it. |
|
|
409
|
+
|
|
410
|
+
## `expo-splash-screen`
|
|
411
|
+
|
|
412
|
+
Imported from `expo-splash-screen`; answered by `@gjsify/react-native/expo-splash-screen`.
|
|
413
|
+
|
|
414
|
+
### Refused (5)
|
|
415
|
+
|
|
416
|
+
| export | tier | GTK | why |
|
|
417
|
+
|---|---|---|---|
|
|
418
|
+
| `preventAutoHideAsync` | — | — | Holds a native splash screen up while the app loads. A GTK application MAPS ITS WINDOW when it is ready, which is the desktop equivalent and is Gio.Application’s own job — the same refusal the router table gives expo-router’s SplashScreen. |
|
|
419
|
+
| `hideAsync` | — | — | Hides a splash screen that was never shown. |
|
|
420
|
+
| `hide` | — | — | The synchronous form, and it has the same answer. |
|
|
421
|
+
| `preventAutoHide` | — | — | The synchronous form of preventAutoHideAsync. |
|
|
422
|
+
| `setOptions` | — | — | Configures the fade of a screen that does not exist. |
|
|
423
|
+
|
|
424
|
+
## `expo-audio`
|
|
425
|
+
|
|
426
|
+
Imported from `expo-audio`; answered by `@gjsify/react-native/expo-audio`.
|
|
427
|
+
|
|
428
|
+
### Planned (4)
|
|
429
|
+
|
|
430
|
+
| export | tier | GTK | why |
|
|
431
|
+
|---|---|---|---|
|
|
432
|
+
| `useAudioPlayer` | P3 | Gtk.MediaFile | Playback is a MEDIA question rather than a view-vocabulary one: GTK has Gtk.MediaFile and Gtk.MediaStream, and which package owns them is its own decision with its own measurement (ADR 0036, "What this does not decide"). |
|
|
433
|
+
| `useAudioRecorder` | P3 | — | Recording is GStreamer rather than GTK, and it is the same open decision as playback. |
|
|
434
|
+
| `AudioModule` | P3 | — | The module surface behind the hooks. Same track. |
|
|
435
|
+
| `setAudioModeAsync` | P3 | — | Session policy for a phone’s audio focus. Same track. |
|
|
436
|
+
|
|
437
|
+
## `expo-video`
|
|
438
|
+
|
|
439
|
+
Imported from `expo-video`; answered by `@gjsify/react-native/expo-video`.
|
|
440
|
+
|
|
441
|
+
### Planned (3)
|
|
442
|
+
|
|
443
|
+
| export | tier | GTK | why |
|
|
444
|
+
|---|---|---|---|
|
|
445
|
+
| `VideoView` | P3 | Gtk.Video | GTK has the widget. Which package owns media is the open decision expo-audio names; it is not the view vocabulary’s. |
|
|
446
|
+
| `useVideoPlayer` | P3 | Gtk.MediaFile | As VideoView. |
|
|
447
|
+
| `VideoContentFit` | P3 | — | The fit constants; they land with the widget. |
|
|
448
|
+
|
|
449
|
+
## `react-native-webview`
|
|
450
|
+
|
|
451
|
+
Imported from `react-native-webview`; answered by `@gjsify/react-native/react-native-webview`.
|
|
452
|
+
|
|
453
|
+
### Planned (2)
|
|
454
|
+
|
|
455
|
+
| export | tier | GTK | why |
|
|
456
|
+
|---|---|---|---|
|
|
457
|
+
| `WebView` | P3 | WebKitGTK’s WebKit.WebView | A real widget with a real answer, and its platform story is its own: WebKit’s availability differs per OS (ADR 0022) and it is the heaviest dependency any of these surfaces would add. It belongs to the webkit track. |
|
|
458
|
+
| `default` | P3 | — | The default export is WebView; it has the same answer. |
|
|
459
|
+
|
|
460
|
+
## `nativewind`
|
|
461
|
+
|
|
462
|
+
Imported from `nativewind`; answered by `@gjsify/react-native/nativewind`.
|
|
463
|
+
|
|
464
|
+
### Refused (5)
|
|
465
|
+
|
|
466
|
+
| export | tier | GTK | why |
|
|
467
|
+
|---|---|---|---|
|
|
468
|
+
| `cssInterop` | — | — | ADR 0032 § 12 already decided this surface: the class VOCABULARY is consumed and none of its toolchain is. `className` works on every primitive here with no runtime — resolving this would pull bindings to React Native’s StyleSheet, Appearance, Dimensions and PixelRatio into the critical path, which is the two-lossy-mappings-stacked shape that rules out react-native-web. |
|
|
469
|
+
| `remapProps` | — | — | As cssInterop. |
|
|
470
|
+
| `styled` | — | — | As cssInterop. Write `className` on the primitive. |
|
|
471
|
+
| `vars` | — | — | CSS variables at runtime. GTK CSS has its own (`@define-color` and the Adwaita palette), and they are set through the application stylesheet rather than through a prop. |
|
|
472
|
+
| `useColorScheme` | — | — | Its own hook over React Native’s Appearance. `useColorScheme` from react-native is answered here and reads Adw.StyleManager:dark, which is what the user is actually looking at. |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";const accessor=e=>e.replace(/-([a-z0-9])/g,(e,t)=>t.toUpperCase());export{accessor};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";const e=Symbol.for(`gjsify.react-native.AnimatedValue`);function isAnimatedValue(t){return typeof t==`object`&&!!t&&t[e]===!0}export{e as ANIMATED_VALUE,isAnimatedValue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{PrimitiveError as e}from"../primitives/errors.js";import t from"gi://Adw?version=1";const adwEasing=e=>t.Easing[e],n={linear:{in:`LINEAR`,out:`LINEAR`,inOut:`LINEAR`,hole:``},ease:{in:`EASE_IN`,out:`EASE_OUT`,inOut:null,hole:`inOut(ease) composes React Native’s own cubic bezier(0.42, 0, 1, 1) with itself, and no AdwEasing member reproduces it — measured against all 35, the nearest is EASE_IN_OUT_SINE at 1.20e-2 and the CSS-named EASE_IN_OUT at 2.86e-2. Write inOut(quad) or inOut(cubic), both of which map exactly`},quad:{in:`EASE_IN_QUAD`,out:`EASE_OUT_QUAD`,inOut:`EASE_IN_OUT_QUAD`,hole:``},cubic:{in:`EASE_IN_CUBIC`,out:`EASE_OUT_CUBIC`,inOut:`EASE_IN_OUT_CUBIC`,hole:``},quart:{in:`EASE_IN_QUART`,out:`EASE_OUT_QUART`,inOut:`EASE_IN_OUT_QUART`,hole:``},quint:{in:`EASE_IN_QUINT`,out:`EASE_OUT_QUINT`,inOut:`EASE_IN_OUT_QUINT`,hole:``},sin:{in:`EASE_IN_SINE`,out:`EASE_OUT_SINE`,inOut:`EASE_IN_OUT_SINE`,hole:``},circle:{in:`EASE_IN_CIRC`,out:`EASE_OUT_CIRC`,inOut:`EASE_IN_OUT_CIRC`,hole:``},exp:{in:`EASE_IN_EXPO`,out:`EASE_OUT_EXPO`,inOut:`EASE_IN_OUT_EXPO`,hole:``},back:{in:`EASE_IN_BACK`,out:`EASE_OUT_BACK`,inOut:null,hole:`inOut(back) is 6.62e-2 away from EASE_IN_OUT_BACK — measured, so the two are not the same curve. AdwEasing’s back has a fixed overshoot and React Native composes its own halves`},bounce:{in:`EASE_OUT_BOUNCE`,out:`EASE_IN_BOUNCE`,inOut:null,hole:`inOut(bounce) is 4.06e-1 away from EASE_IN_OUT_BOUNCE — measured, and that is a different animation rather than a rounding difference`}},r={1:`linear`,2:`quad`,3:`cubic`,4:`quart`,5:`quint`},i=1.70158,a=new WeakMap;function easingMember(t,r){if(typeof t!=`function`)throw new e(`Animated.timing`,r,`takes one of Easing's own values, and received ${t===null?`null`:typeof t}`);let i=a.get(t);if(i===void 0)throw new e(`Animated.timing`,r,"is a function this layer did not mint. `Adw.TimedAnimation:easing` is an ENUM with no callback form (measured), so an arbitrary easing function cannot drive an animation at all — only a value from this package’s `Easing` can, and each one carries the AdwEasing member it was measured equal to. Sampling the function to guess the nearest member is what this refusal exists instead of");let o=n[i.family]?.[i.direction]??null;if(o===null)throw new e(`Animated.timing`,`${r} Easing.${i.direction}(Easing.${i.family})`,n[i.family]?.hole??`has no AdwEasing counterpart`);return o}function mint(r,i){let token=a=>{let o=n[r]?.[i]??null;if(o===null)throw new e(`Animated.Easing`,`${i}(${r})`,n[r]?.hole??``);return t.easing_ease(adwEasing(o),a)};return a.set(token,{family:r,direction:i}),token}const family=e=>mint(e,`in`),REFUSED=(t,n)=>{throw new e(`Animated.Easing`,t,n)};function redirect(e,t){if(typeof e!=`function`)return REFUSED(t,`takes an easing function, and received ${e===null?`null`:typeof e}`);let r=a.get(e);return r===void 0?REFUSED(t,"takes one of Easing’s own values. Reflecting an arbitrary function is arithmetic React Native can do and `Adw.TimedAnimation` cannot use: its `easing` is an enum, so the result has to name a member, and only a token this module minted does"):r.direction===`in`?n[r.family]?.[t]===null?REFUSED(`${t}(${r.family})`,n[r.family]?.hole??``):mint(r.family,t):REFUSED(`${t}(${r.direction}(${r.family}))`,`composes two directions, and AdwEasing has exactly three per family — there is no member for a twice-reflected curve. Apply the combinator to the family itself`)}const o={linear:family(`linear`),ease:family(`ease`),quad:family(`quad`),cubic:family(`cubic`),sin:family(`sin`),circle:family(`circle`),exp:family(`exp`),bounce:family(`bounce`),poly(e){let t=r[e];return t===void 0?REFUSED(`poly(${e})`,`has no AdwEasing member. The enum carries quad, cubic, quart and quint — exponents 2 to 5 — plus linear for 1, and nothing beyond`):family(t)},back(e=i){return e===i?family(`back`):REFUSED(`back(${e})`,`parameterises the overshoot, and AdwEasing's EASE_IN_BACK has a fixed one — measured equal to React Native's back() at its own default ${i} and to nothing else. Drop the argument, or animate the overshoot yourself with a second timing`)},elastic(e=1){return REFUSED(`elastic(${e})`,"is a cos³·cos oscillation, and no AdwEasing member is within 1.99e-1 of it — measured against all 35, so this is a missing curve rather than a rounding difference. `Adw.SpringAnimation` is the honest counterpart and it is a different animation class, not an easing")},bezier(e,t,n,r){return REFUSED(`bezier(${e}, ${t}, ${n}, ${r})`,"`Adw.TimedAnimation:easing` is an enum, so a curve it has no member for cannot be expressed at all. `Easing.ease` is the one bezier with a member (0.42, 0, 1, 1 — measured equal to EASE_IN at 1.6e-6)")},step0(e){return REFUSED(`step0`,"is a step function, and every AdwEasing member is continuous. A step is an assignment rather than an animation — write the value with `setValue`")},step1(e){return REFUSED(`step1`,"is a step function, and every AdwEasing member is continuous. A step is an assignment rather than an animation — write the value with `setValue`")},in:e=>e,out:e=>redirect(e,`out`),inOut:e=>redirect(e,`inOut`)},s=Object.keys(n),easingTriple=e=>n[e];export{s as EASING_FAMILIES,o as Easing,adwEasing,easingMember,easingTriple};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{ANIMATED_VALUE as e,isAnimatedValue as t}from"./brand.js";import{PrimitiveError as n}from"../primitives/errors.js";import{Easing as r}from"./easing.js";import{ANIMATED_PROPERTIES as i}from"./properties.js";import{AnimatedView as a}from"../components.js";import{timing as o}from"./timing.js";import{AnimatedValue as s}from"./value.js";const refuse=(e,t)=>(...r)=>{throw new n(`Animated`,e,t)},c="is a node in React Native’s animated GRAPH, evaluated per frame by its own driver. `Adw.TimedAnimation` interpolates one number between two others and has no composition of its own (measured: it installs value-from, value-to, duration, easing, repeat-count, reverse and alternate — no inputs). Building the graph over it is reachable and it is a project, not a member: derive the number in your own code and drive one value per property",l="composes several animations into one handle. Each would be its own `Adw.TimedAnimation` on its own frame clock, and the handle has to reconcile their four end conditions (done, skip, pause, and the clock widget unmounting) into one callback — the same bookkeeping `timing.ts` does for a single run, times the composition. Sequence them from the end callback until it is built",u={Value:s,timing:o,View:a,Text:refuse(`Text`,"is not built. `Animated.View` is, and the binding mechanism behind it is per-primitive data rather than View-specific — so this is a small addition with a measurement missing, not a design gap. Wrap the text in an `<Animated.View>`"),Image:refuse(`Image`,"is not built, for `Animated.Text`’s reason. Wrap it in an `<Animated.View>`"),ScrollView:refuse(`ScrollView`,"is not built, for `Animated.Text`’s reason. Wrap it in an `<Animated.View>`, or animate the view inside it"),FlatList:refuse(`FlatList`,"is not built, and it is the one in this group that is NOT one line away: `FlatList` owns its `Gtk.ListView` and drives it from data (see `lists/controller.ts`), so an animated prop would have to reach a row the model produced rather than an element React rendered"),SectionList:refuse(`SectionList`,"is not built, for `Animated.FlatList`’s reason — it is the same component"),createAnimatedComponent:refuse(`createAnimatedComponent`,"wraps an ARBITRARY component, and an animated style here needs to know which GTK widget property a style key becomes (`properties.ts`) — knowledge an arbitrary component does not carry. React Native can do it because its host view accepts a style object; this layer partitions the style into widget properties and GTK CSS before a widget ever sees it"),ValueXY:refuse(`ValueXY`,"is a pair of values, and this subset animates one number. Two `Animated.Value`s and two timings say the same thing with no shared clock — which is also the honest description of what a desktop can offer, since the two properties are written separately either way"),Color:refuse(`Color`,"animates a colour, and paint on this layer is GTK CSS (measured, `paint.ts`) — there is no widget property for a background or a text colour to drive. `properties.ts` records the same refusal for the style key"),Interpolation:refuse(`Interpolation`,c),Node:refuse(`Node`,c),add:refuse(`add`,c),subtract:refuse(`subtract`,c),divide:refuse(`divide`,c),multiply:refuse(`multiply`,c),modulo:refuse(`modulo`,c),diffClamp:refuse(`diffClamp`,c),spring:refuse(`spring`,"`Adw.SpringAnimation` is the exact counterpart and it is a different class with a different configuration — damping, mass, stiffness and an epsilon against React Native’s tension/friction/bounciness/speed, which are not the same parameters under other names. Mapping them needs a measurement this subset does not have"),decay:refuse(`decay`,"animates from a velocity with no end value, and `Adw.TimedAnimation` is defined by its `value-to`. `Adw.SpringAnimation` with a zero-stiffness spring is the shape to measure, and nobody has"),sequence:refuse(`sequence`,l),parallel:refuse(`parallel`,l),stagger:refuse(`stagger`,l),loop:refuse(`loop`,l),delay:refuse(`delay`,"is a composition of one animation with a wait, and `Adw.TimedAnimation` has no delay (measured). It is also what `timing({ delay })` refuses, for the same reason"),event:refuse(`event`,"maps a native event’s payload onto animated values through an argument-mapping language, and there is no native event bridge here — a GTK signal is connected to a JavaScript function directly (`components.ts`). Write the value from the handler"),Event:refuse(`Event`,"is `Animated.event`’s class, and has the same answer"),attachNativeEvent:refuse(`attachNativeEvent`,`attaches an animated value to a native view’s event stream over the bridge. There is no bridge; this layer renders in-process onto GTK`),forkEvent:refuse(`forkEvent`,"is `Animated.event`’s plumbing, and has the same answer"),unforkEvent:refuse(`unforkEvent`,"is `Animated.event`’s plumbing, and has the same answer")};export{i as ANIMATED_PROPERTIES,e as ANIMATED_VALUE,u as Animated,s as AnimatedValue,r as Easing,t as isAnimatedValue,o as timing};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{PrimitiveError as e}from"../primitives/errors.js";import{normalise as t,partition as n,variantDeclarations as r}from"../primitives/style.js";const i={opacity:{property:`opacity`,css:`opacity`}},a={transform:"is a `Gsk.Transform` on a render node, not a widget property — measured, `GtkBox` installs 41 properties and not one of them translates, scales or rotates. A translation is expressible as a `Gtk.Fixed` child position, which is a different widget and a different tree, so it is a component rather than an animated key",translateX:"is `transform`’s, and has the same answer",translateY:"is `transform`’s, and has the same answer",scale:"is `transform`’s, and has the same answer",rotate:"is `transform`’s, and has the same answer",width:"`Gtk.Widget:width-request` is a MINIMUM and not a size, so animating it animates the floor under GTK’s own measurement while the widget stays free to be wider. The honest desktop counterpart is a layout change, which is React’s to make",height:"is `width`’s, and has the same answer",backgroundColor:"is paint, and L1 partitions paint into GTK CSS (measured, `paint.ts`) — an `Adw.Animation` writes a VALUE into a property, and a background colour is a declaration in a stylesheet, with no widget property behind it",color:"is `backgroundColor`’s, and has the same answer",borderRadius:"is `backgroundColor`’s, and has the same answer",fontSize:`is a Pango attribute on a label’s own text rather than a widget property, so there is nothing for an animation to write`,top:"resolves to an ALIGNMENT plus a margin on a `Gtk.Overlay` child (`intents.ts`), which is two facts and one of them an enum — not one number to interpolate",left:"is `top`’s, and has the same answer",right:"is `top`’s, and has the same answer",bottom:"is `top`’s, and has the same answer"};function animatedProperty(t,n){let r=i[n];if(r!==void 0)return r;let o=a[n];throw new e(t,`style={{ ${n}: <Animated.Value> }}`,o??`is not a style key this layer can animate. The animatable set is: ${Object.keys(i).join(`, `)} — an animation writes a GTK widget property, and most of React Native’s style vocabulary becomes GTK CSS or a layout decision instead`)}function assertNoStaticClash(i,a,o,s){let c=o.map(e=>animatedProperty(i,e).css);if(c.length===0)return;let{props:l,groups:u}=t(a,s,i),d=[...n(l).css,...Object.values(r(u,s,i)).flat()];for(let t of c){let n=d.find(e=>e.startsWith(`${t}:`));if(n!==void 0)throw new e(i,`an animated "${t}" beside "${n}"`,`paints one appearance through two independent channels: this element’s style resolves to the GTK CSS declaration "${n}", and the animation writes the widget property "${t}". GTK applies both and this layer cannot say which one a reader ends up seeing. Drop the static one, or animate something else`)}}export{i as ANIMATED_PROPERTIES,animatedProperty,assertNoStaticClash};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{PrimitiveError as e}from"../primitives/errors.js";import{adwEasing as t,easingMember as n}from"./easing.js";import r from"gi://Adw?version=1";const i={delay:"has no counterpart on `Adw.TimedAnimation` — measured, it installs `value-from value-to duration easing repeat-count reverse alternate` and nothing that waits. Start the animation from a timeout if the wait matters",iterations:"would be `Adw.TimedAnimation:repeat-count`, which really is there — and it is refused because it is `Animated.loop`’s job, and `loop` is a composition this subset does not build. Nothing measured needs it, and a knob with no composition around it is half a feature",isInteraction:"registers the animation with `InteractionManager`, which is tier P3 and not built. A flag that silently registered with nothing would be worse than the refusal",onComplete:"is React Native’s own internal end hook. Pass the callback to `start()`, which is the public one",platformConfig:`carries native-driver configuration for a bridge that does not exist here`,debugID:"is a React Native devtools identifier, and this layer’s devtools are `@gjsify/devtools` over D-Bus"},a=[`toValue`,`duration`,`easing`,`useNativeDriver`];function readConfig(o){if(typeof o!=`object`||!o)throw new e(`Animated.timing`,`config`,`takes a configuration object, and received ${o===null?`null`:typeof o}`);let s=o;for(let t of Object.keys(s))if(!a.includes(t))throw new e(`Animated.timing`,`config.${t}`,i[t]??`is not a configuration key this layer answers for. Accepted: ${a.join(`, `)}`);let c=s.toValue;if(typeof c!=`number`||!Number.isFinite(c))throw new e(`Animated.timing`,`config.toValue`,`takes a finite number. React Native also accepts an Animated.Value, an {x, y} pair and a colour there; this subset animates one number to another, so anything else is refused rather than coerced (received ${c===null?`null`:typeof c})`);let l=s.duration===void 0?500:s.duration;if(typeof l!=`number`||!Number.isInteger(l)||l<0)throw new e(`Animated.timing`,`config.duration`,`is \`Adw.TimedAnimation:duration\`, a guint of milliseconds, so it takes a non-negative integer (received ${String(l)})`);return{to:c,duration:l,easing:s.easing===void 0?r.Easing.EASE_IN_OUT:t(n(s.easing,`config.easing`))}}var TimingRun=class{#e;#t;#n;#r;#i=null;#a=0;#o;#s=0;#c=!1;#l=!0;constructor(e,t){let{to:n,duration:r,easing:i}=readConfig(t);this.#e=e,this.#t=n,this.#n=r,this.#r=i}start(e){this.#o=e,this.#s=this.#e.__getValue(),this.#c=!0,this.#l=!1,this.#e.__claim(this)}stop(){this.#c&&this.#e.stopAnimation()}reset(){this.#c&&this.#e.resetAnimation()}clockAvailable(e){let t=new r.TimedAnimation({widget:e,valueFrom:this.#s,valueTo:this.#t,duration:this.#n,easing:this.#r,target:r.CallbackAnimationTarget.new(e=>this.#e.__publish(e))});this.#i=t,this.#a=t.connect(`done`,()=>this.#u(!0)),t.play()}clockLost(){this.#u(!1)}interrupted(){this.#u(!1)}rewind(){this.#e.__publish(this.#s)}#u(e){if(this.#l)return;this.#l=!0,this.#c=!1;let t=this.#i;this.#i=null,t!==null&&(e===!1&&t.state===r.AnimationState.PLAYING&&t.pause(),this.#a!==0&&t.disconnect(this.#a),this.#a=0),e&&this.#e.__release(this);let n=this.#o;this.#o=void 0,n?.({finished:e})}};function timing(e,t){return new TimingRun(e,t)}export{timing};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{ANIMATED_VALUE as e}from"./brand.js";import{PrimitiveError as t}from"../primitives/errors.js";let n=1;const finite=(e,n)=>{if(typeof n!=`number`||!Number.isFinite(n))throw new t(`Animated.Value`,e,`takes a finite number, and received ${n===null?`null`:typeof n}${typeof n==`number`?` (${n})`:``}. A NaN or an Infinity reaches GTK as a double and paints nothing, with no diagnostic`);return n};var AnimatedValue=class{#e;#t;#n;#r;constructor(t){this[e]=!0,this.id=n++,this.#t=new Set,this.#n=null,this.#r=null,this.#e=finite(`constructor`,t)}__getValue(){return this.#e}setValue(e){let t=finite(`setValue`,e);this.#o(),this.#i(t)}stopAnimation(e){this.#o(),e?.(this.#e)}resetAnimation(e){let t=this.#r;this.#r=null,this.#n=null,t?.interrupted(),t?.rewind(),e?.(this.#e)}__attach(e){return this.#t.add(e),e.write(this.#e),this.#r!==null&&this.#n===null&&(this.#n=e,this.#r.clockAvailable(e.widget)),()=>{if(this.#t.delete(e),this.#n!==e)return;this.#n=null;let t=this.#r;this.#r=null,t?.clockLost()}}__clockWidget(){for(let e of this.#t)return e.widget;return null}__claim(e){this.#o(),this.#r=e;let t=this.#a();t!==null&&(this.#n=t,e.clockAvailable(t.widget))}__release(e){this.#r===e&&(this.#r=null,this.#n=null)}__publish(e){this.#i(e)}#i(e){this.#e=e;for(let t of this.#t)t.write(e)}#a(){for(let e of this.#t)return e;return null}#o(){let e=this.#r;this.#r=null,this.#n=null,e?.interrupted()}};export{AnimatedValue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{accessor as e}from"./accessor.js";import t from"gi://Gtk?version=4.0";const n={low:t.AccessibleAnnouncementPriority.LOW,medium:t.AccessibleAnnouncementPriority.MEDIUM,high:t.AccessibleAnnouncementPriority.HIGH};let r=0;const liveRegionWatchCount=()=>r;function onLiveRegion(t,i){let a=n[i.priority],o=e(i.read),s=t,c=t.connect(i.signal,()=>{let e=s[o];typeof e!=`string`||e===``||t.announce(e,a)});return r+=1,()=>{t.disconnect(c),--r}}export{liveRegionWatchCount,onLiveRegion};
|
package/lib/esm/app-registry.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./_virtual/_rolldown/runtime.js";import{UnsupportedError as e}from"./unsupported.js";import t from"gi://Adw?version=1";import n from"gi://Gtk?version=4.0";import{runAdwaitaApp as
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{UnsupportedError as e}from"./unsupported.js";import t from"gi://Adw?version=1";import{createElement as n}from"react";import r from"gi://Gtk?version=4.0";import{runAdwaitaApp as i}from"@gjsify/adwaita-app";import{createRoot as a}from"@gjsify/gtk-host/react";const o=new Map;function buildWindow(e,n,i){let a=new t.ApplicationWindow({application:e,title:i.title??n,defaultWidth:i.defaultWidth??900,defaultHeight:i.defaultHeight??700}),o=new t.ToolbarView;o.add_top_bar(new t.HeaderBar);let s=new r.Box({orientation:r.Orientation.VERTICAL});return o.set_content(s),a.set_content(o),{window:a,content:s}}const s={registerComponent(e,t){return o.set(e,{provider:t}),e},getAppKeys(){return[...o.keys()]},getRunnable(e){return o.get(e)},async runApplication(e,t){let r=o.get(e);if(r===void 0){let t=[...o.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.`))}let s={root:null},c=await i({applicationId:t.applicationId,css:t.css,createWindow:i=>{let{window:o,content:c}=buildWindow(i,e,t),l=r.provider();return s.root=a(c),s.root.render(n(l,t.initialProps??{})),o}});return s.root?.unmount(),c},unmountApplicationComponentAtRootTag(){throw new e(`AppRegistry`)}};function registerRootComponent(e,t){return s.registerComponent(`main`,()=>e),s.runApplication(`main`,t)}export{s as AppRegistry,registerRootComponent};
|
package/lib/esm/components.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./_virtual/_rolldown/runtime.js";import{
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{accessor as e}from"./accessor.js";import{isAnimatedValue as t}from"./animated/brand.js";import{PrimitiveError as n}from"./primitives/errors.js";import{onLiveRegion as r}from"./announce.js";import{ParentContext as i,ParentProvider as a}from"./parent-context.js";import{onGesture as o,onPressStateChange as s}from"./press.js";import{createHandle as c}from"./primitives/handles.js";import{flattenStyle as l}from"./primitives/style.js";import{declaresAbsolute as u,resolvePrimitive as d}from"./primitives/resolve.js";import{animatedProperty as f,assertNoStaticClash as p}from"./animated/properties.js";import{styleConfig as m}from"./style-config.js";import h from"gi://Gio?version=2.0";import{Children as g,createElement as _,isValidElement as v,useContext as y,useEffect as b,useMemo as x,useRef as S,useState as C}from"react";const isTextNode=e=>typeof e==`string`||typeof e==`number`;function isAbsoluteChild(e,t){if(!v(e))return!1;try{return u(e.props,t)}catch{return!1}}function childFacts(e,t){let n=0,r=!1;for(let i of e)isTextNode(i)?r=!0:isAbsoluteChild(i,t)&&n++;return{absolute:n,count:e.length,text:r}}function useSignals(t,n){let r=S(null),i=S(n);return i.current=n,{props:x(()=>{let n={};for(let a of t)n[`on:${a.signal}`]=()=>{let t=i.current[a.prop];if(typeof t!=`function`)return;if(a.read===null){t();return}let n=r.current;t(n===null?void 0:n[e(a.read)])};return n},[t.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,a=y(i),o=m(),s=g.toArray(r.children),l=d(e,r,{tokens:o.tokens,sheet:o.sheet,...a===null?{}:{parent:a},children:childFacts(s,o.tokens)}),u=Object.keys(l.intent);if(u.length>0)throw new n(e,u.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 f=useSignals(l.events,r),p=r.ref,h=l.handle,_=l.node.tag,v=x(()=>e=>{f.widgetRef.current=e;let t=e==null?e:c(h,e,_);typeof p==`function`?p(t):p!=null&&(p.current=t)},[p,f.widgetRef,h,_]);useGestures(l.gestures,r,f.widgetRef),useLiveRegions(l.announcements,f.widgetRef);let b=useFiles(l.files),S={...f.props,ref:v,...b.outer};l.slot!==null&&(S.slot=l.slot);let C={...b.content};l.contentSlot!==null&&(C.slot=l.contentSlot);let w={...b.backdrop};l.backdropSlot!==null&&(w.slot=l.backdropSlot);let T=x(()=>l.childContext,[JSON.stringify(l.childContext),l.childContext]);return{plan:l,children:s,inherited:a?.props??{},extra:S,contentExtra:C,backdropExtra:w,published:T,tokens:o.tokens,widgetRef:f.widgetRef}}function useFiles(e){return x(()=>{let t={outer:{},content:{},backdrop:{}};for(let n of e)t[n.on][n.property]=n.kind===`path`?h.File.new_for_path(n.value):h.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=S(t);r.current=t;let i=e.map(e=>`${e.prop}>${e.signal}`).join(`|`);b(()=>{let e=n.current;if(i===``||e==null)return;let t=i.split(`|`).map(t=>{let[n,i]=t.split(`>`);return o(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(`|`);b(()=>{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 render(e){let{plan:t,children:n,inherited:r,extra:i,contentExtra:o,backdropExtra:s,published:c,tokens:l}=e,wrap=e=>_(a,{value:c},...e);if(t.content===null){let e=n.some(isTextNode)?n:[wrap(n)];return _(t.node.tag,nodeProps(t.node,r,i),...e)}let u=t.absoluteSlot===null?[]:n.filter(e=>isAbsoluteChild(e,l)),d=t.absoluteSlot===null?n:n.filter(e=>!isAbsoluteChild(e,l)),f=_(t.content.tag,nodeProps(t.content,{},o),wrap(d)),p=t.backdrop===null?[]:[_(t.backdrop.tag,nodeProps(t.backdrop,{},s))];return _(t.node.tag,nodeProps(t.node,r,i),...p,f,...u.length===0?[]:[wrap(u)])}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]=C(!1),i=usePlan(`Pressable`,t===null?e:{...e,children:t({pressed:n})}),a=i.widgetRef;return b(()=>{if(t===null)return;let e=a.current;if(e!=null)return s(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 KeyboardAvoidingView(e){return render(usePlan(`KeyboardAvoidingView`,e))}function StatusBar(e){return null}const w="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`,w)},setHidden:()=>{throw new n(`StatusBar`,`setHidden`,w)},setBackgroundColor:()=>{throw new n(`StatusBar`,`setBackgroundColor`,w)},setTranslucent:()=>{throw new n(`StatusBar`,`setTranslucent`,w)},setNetworkActivityIndicatorVisible:()=>{throw new n(`StatusBar`,`setNetworkActivityIndicatorVisible`,w)},pushStackEntry:()=>{throw new n(`StatusBar`,`pushStackEntry`,w)},popStackEntry:()=>{throw new n(`StatusBar`,`popStackEntry`,w)},replaceStackEntry:()=>{throw new n(`StatusBar`,`replaceStackEntry`,w)},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 splitAnimatedStyle(e,n){let r=l(n),i={},a=[];for(let[n,o]of Object.entries(r)){if(!t(o)){i[n]=o;continue}f(e,n),a.push({key:n,value:o})}return{plain:i,bindings:a}}function AnimatedView(t){let n=m(),{plain:r,bindings:i}=splitAnimatedStyle(`Animated.View`,t.style),a={...t,style:r};p(`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=S(i);l.current=i,b(()=>{let t=s.current;if(c===``||t==null)return;let n=t,r=l.current.map(r=>{let i=e(f(`Animated.View`,r.key).property);return r.value.__attach({widget:t,write:e=>{n[i]=e}})});return()=>{for(let e of r)e()}},[c,s]);let u={};for(let t of i)u[e(f(`Animated.View`,t.key).property)]=t.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,Pressable,SafeAreaView,ScrollView,StatusBar,Switch,Text,TextInput,TouchableHighlight,TouchableOpacity,TouchableWithoutFeedback,View,nodeProps,usePlan};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=[`OWN_EXPORT_NAMES`,`PrimitiveError`,`SUPPORTED_NAMES`,`SUPPORT_TABLE`,`UnsupportedError`,`configureStyle`,`explainUnsupported`,`isImportable`,`isOwnExport`,`primitives`,`registerRootComponent`,`resetStyleConfig`,`styleConfig`];export{e as OWN_EXPORT_NAMES};
|
|
1
|
+
const e=[`OWN_EXPORT_NAMES`,`PRIMITIVE_VARIANTS`,`PrimitiveError`,`SUPPORTED_NAMES`,`SUPPORT_TABLE`,`UnsupportedError`,`acceptsProp`,`configureStyle`,`explainProp`,`explainUnsupported`,`isImportable`,`isOwnExport`,`primitives`,`propAnswer`,`propNames`,`propTable`,`registerRootComponent`,`resetStyleConfig`,`styleConfig`];export{e as OWN_EXPORT_NAMES};
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{unsupported as e}from"../unsupported.js";const t=e(`useAudioPlayer`,`expo-audio`),n=e(`useAudioRecorder`,`expo-audio`),r=e(`AudioModule`,`expo-audio`),i=e(`setAudioModeAsync`,`expo-audio`);export{r as AudioModule,i as setAudioModeAsync,t as useAudioPlayer,n as useAudioRecorder};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{unsupported as e}from"../unsupported.js";const t=e(`ExecutionEnvironment`,`expo-constants`),n=e(`AppOwnership`,`expo-constants`);export{n as AppOwnership,t as ExecutionEnvironment};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{unsupported as e}from"../unsupported.js";const t=e(`loadAsync`,`expo-font`),n=e(`unloadAsync`,`expo-font`),r=e(`unloadAllAsync`,`expo-font`),i=e(`FontDisplay`,`expo-font`);export{i as FontDisplay,t as loadAsync,r as unloadAllAsync,n as unloadAsync};
|