@symbiote-native/solid 1.0.0 → 2.0.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/README.md +9 -10
- package/babel-preset.cjs +0 -5
- package/build/components/activity-indicator-props.d.ts +5 -0
- package/build/components/activity-indicator-props.js +1 -0
- package/build/components/button-props.d.ts +5 -0
- package/build/components/button-props.js +1 -0
- package/build/components/flat-list/index.jsx +3 -3
- package/build/components/{image-background.d.ts → image-background-props.d.ts} +2 -3
- package/build/components/image-background-props.js +1 -0
- package/build/components/image-props.d.ts +5 -0
- package/build/components/image-props.js +6 -0
- package/build/components/{input-accessory-view.d.ts → input-accessory-view-props.d.ts} +1 -2
- package/build/components/input-accessory-view-props.js +5 -0
- package/build/components/keyboard-avoiding-view.jsx +9 -4
- package/build/components/modal.jsx +6 -6
- package/build/components/{pressable.d.ts → pressable-props.d.ts} +8 -7
- package/build/components/pressable-props.js +13 -0
- package/build/components/{refresh-control.d.ts → refresh-control-props.d.ts} +3 -3
- package/build/components/refresh-control-props.js +7 -0
- package/build/components/safe-area-view-props.d.ts +10 -0
- package/build/components/safe-area-view-props.js +5 -0
- package/build/components/{scroll-view/shared.d.ts → scroll-view-props.d.ts} +7 -13
- package/build/components/scroll-view-props.js +29 -0
- package/build/components/switch-props.d.ts +6 -0
- package/build/components/switch-props.js +5 -0
- package/build/components/text-input-props.d.ts +8 -0
- package/build/components/text-input-props.js +1 -0
- package/build/components/{text.d.ts → text-props.d.ts} +3 -3
- package/build/components/text-props.js +11 -0
- package/build/components/touchable-native-feedback/touchable-native-feedback-props.d.ts +8 -0
- package/build/components/touchable-native-feedback/touchable-native-feedback-props.js +1 -0
- package/build/components/touchable-props.d.ts +18 -0
- package/build/components/touchable-props.js +1 -0
- package/build/components/touchable-without-feedback/touchable-without-feedback-props.d.ts +6 -0
- package/build/components/touchable-without-feedback/touchable-without-feedback-props.js +1 -0
- package/build/components/{view.d.ts → view-props.d.ts} +2 -3
- package/build/components/view-props.js +11 -0
- package/build/components/virtualized-list/index.android.js +5 -4
- package/build/components/virtualized-list/index.ios.js +6 -6
- package/build/components/virtualized-list/shared.d.ts +1 -3
- package/build/components/virtualized-list/shared.jsx +87 -98
- package/build/components/virtualized-list/sticky-header.d.ts +6 -0
- package/build/components/{scroll-view → virtualized-list}/sticky-header.jsx +28 -36
- package/build/components.d.ts +20 -30
- package/build/components.js +6 -33
- package/build/create-portal/index.jsx +1 -1
- package/build/descriptor-to-solid.js +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +11 -3
- package/build/jsx-runtime.d.ts +39 -2
- package/build/modules/animated/index.d.ts +0 -4
- package/build/modules/animated/index.js +16 -22
- package/build/modules/image.d.ts +3 -0
- package/build/modules/image.js +12 -0
- package/build/register.d.ts +1 -1
- package/build/register.js +12 -28
- package/build/renderer.js +79 -16
- package/build/utils/stable-keys.d.ts +1 -1
- package/build/utils/stable-keys.js +6 -5
- package/metro-css-parser.cjs +2 -1
- package/package.json +5 -10
- package/babel-lower-host-primitives.cjs +0 -323
- package/build/components/activity-indicator/index.android.d.ts +0 -2
- package/build/components/activity-indicator/index.android.js +0 -11
- package/build/components/activity-indicator/index.d.ts +0 -1
- package/build/components/activity-indicator/index.ios.d.ts +0 -2
- package/build/components/activity-indicator/index.ios.js +0 -10
- package/build/components/activity-indicator/index.js +0 -4
- package/build/components/activity-indicator/shared.d.ts +0 -8
- package/build/components/activity-indicator/shared.js +0 -51
- package/build/components/button.d.ts +0 -7
- package/build/components/button.jsx +0 -45
- package/build/components/image-background.jsx +0 -74
- package/build/components/image.d.ts +0 -9
- package/build/components/image.js +0 -75
- package/build/components/input-accessory-view.jsx +0 -39
- package/build/components/pressable.jsx +0 -211
- package/build/components/refresh-control.jsx +0 -36
- package/build/components/safe-area-view.d.ts +0 -11
- package/build/components/safe-area-view.jsx +0 -24
- package/build/components/scroll-view/index.android.d.ts +0 -2
- package/build/components/scroll-view/index.android.js +0 -11
- package/build/components/scroll-view/index.d.ts +0 -2
- package/build/components/scroll-view/index.ios.d.ts +0 -2
- package/build/components/scroll-view/index.ios.js +0 -8
- package/build/components/scroll-view/index.js +0 -9
- package/build/components/scroll-view/shared.jsx +0 -334
- package/build/components/scroll-view/sticky-header.d.ts +0 -18
- package/build/components/switch/index.android.d.ts +0 -2
- package/build/components/switch/index.android.js +0 -12
- package/build/components/switch/index.d.ts +0 -1
- package/build/components/switch/index.ios.d.ts +0 -2
- package/build/components/switch/index.ios.js +0 -11
- package/build/components/switch/index.js +0 -4
- package/build/components/switch/shared.d.ts +0 -11
- package/build/components/switch/shared.js +0 -87
- package/build/components/text-input.d.ts +0 -10
- package/build/components/text-input.js +0 -290
- package/build/components/text.jsx +0 -27
- package/build/components/touchable/index.d.ts +0 -22
- package/build/components/touchable/index.jsx +0 -247
- package/build/components/touchable-native-feedback/index.d.ts +0 -16
- package/build/components/touchable-native-feedback/index.jsx +0 -68
- package/build/components/view.jsx +0 -49
- package/build/state-style.d.ts +0 -1
- package/build/state-style.js +0 -13
package/README.md
CHANGED
|
@@ -61,16 +61,15 @@ exactly what react-refresh's `isLikelyComponentType` heuristic looks for. It the
|
|
|
61
61
|
React Fiber tree that does not exist in this path, and the update is swallowed with no error. Force a
|
|
62
62
|
full reload instead: `unstable_forceFullRefreshPatterns: [/\.tsx$/]`.
|
|
63
63
|
|
|
64
|
-
##
|
|
65
|
-
|
|
66
|
-
`
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
device numbers this bought — do not hand-copy them here, they move with every engine/adapter cut.
|
|
64
|
+
## Primitives are plain intrinsic tags — `<view>`/`<text>`/`<pressable>`, no component involved
|
|
65
|
+
|
|
66
|
+
An app writes the lowercase tags directly (`view`, `text`, `pressable`, …) — `babel-preset-solid`'s
|
|
67
|
+
own `isComponent` check already treats a lowercase name as an element, so JSX compiles straight to
|
|
68
|
+
`createElement`/`setProp` calls against `symbiote-view` etc., no import and nothing to opt into.
|
|
69
|
+
This retires the compile-time lowering transform that used to rewrite a `<View>`/`<Text>`/
|
|
70
|
+
`<Pressable>` COMPONENT call site into the same intrinsics (`babel-lower-host-primitives.cjs`,
|
|
71
|
+
deleted 2026-09-08) — there is no component call site left to rewrite. See root `CLAUDE.md`,
|
|
72
|
+
"Where we stand against stock React Native", for the measured device numbers.
|
|
74
73
|
|
|
75
74
|
## `./renderer` is a compiler target, not a convenience export
|
|
76
75
|
|
package/babel-preset.cjs
CHANGED
|
@@ -24,11 +24,6 @@
|
|
|
24
24
|
// React-JSX transform gets a chance to claim the same JSX nodes.
|
|
25
25
|
module.exports = function symbioteSolidBabelPreset(_api, options = {}) {
|
|
26
26
|
return {
|
|
27
|
-
// Babel runs PLUGINS before PRESETS, which is exactly the order this needs: the lowering
|
|
28
|
-
// rewrites <View>/<Text> to their intrinsic tags while they are still JSX, so babel-preset-solid
|
|
29
|
-
// then compiles them as elements (createElement + setProp) instead of as components
|
|
30
|
-
// (createComponent + a props Proxy). Reversed, there would be nothing left to rewrite.
|
|
31
|
-
plugins: [require('./babel-lower-host-primitives.cjs')],
|
|
32
27
|
presets: [
|
|
33
28
|
[
|
|
34
29
|
require('babel-preset-solid'),
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IActivityIndicatorProps as IActivityIndicatorBaseProps } from '@symbiote-native/components';
|
|
2
|
+
import type { IClassNameValue } from '@symbiote-native/engine';
|
|
3
|
+
export type IActivityIndicatorProps = IActivityIndicatorBaseProps & {
|
|
4
|
+
class?: IClassNameValue;
|
|
5
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -66,7 +66,7 @@ export function FlatList(props) {
|
|
|
66
66
|
: props.columnWrapperStyle,
|
|
67
67
|
]);
|
|
68
68
|
function renderRow(info) {
|
|
69
|
-
return (<
|
|
69
|
+
return (<view style={rowStyle()}>
|
|
70
70
|
<Index each={info().item.items}>
|
|
71
71
|
{(item, column) => {
|
|
72
72
|
// Called ONCE and untracked, the shape VirtualizedList's own cell build uses: a
|
|
@@ -79,10 +79,10 @@ export function FlatList(props) {
|
|
|
79
79
|
// separators handle — the divider sits between rows, not between columns.
|
|
80
80
|
separators: info().separators,
|
|
81
81
|
})));
|
|
82
|
-
return
|
|
82
|
+
return <view style={COLUMN_STYLE}>{content}</view>;
|
|
83
83
|
}}
|
|
84
84
|
</Index>
|
|
85
|
-
</
|
|
85
|
+
</view>);
|
|
86
86
|
}
|
|
87
87
|
// The divider between rows shows real items (last of the row above, first of the row below), so
|
|
88
88
|
// the caller's separator, typed on ItemT, never sees the IRow wrapper.
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import type { IImageProps } from '@symbiote-native/components';
|
|
2
|
+
import type { IClassNameValue, IStyleProp, IViewStyle } from '@symbiote-native/engine';
|
|
1
3
|
import type { JSX } from '../jsx-runtime';
|
|
2
|
-
import { type IImageProps } from '@symbiote-native/components';
|
|
3
|
-
import { type IClassNameValue, type IStyleProp, type IViewStyle } from '@symbiote-native/engine';
|
|
4
4
|
export interface IImageBackgroundProps extends Omit<IImageProps, 'style'> {
|
|
5
5
|
style?: IStyleProp<IViewStyle>;
|
|
6
6
|
imageStyle?: IStyleProp<IViewStyle> | string;
|
|
7
7
|
class?: IClassNameValue;
|
|
8
8
|
children?: JSX.Element;
|
|
9
9
|
}
|
|
10
|
-
export declare function ImageBackground(props: IImageBackgroundProps): JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// The `<image>` tag's prop surface. `renderImage`'s whole fold — the source / src / srcSet
|
|
2
|
+
// resolution, the width+height fold into style, resizeMode and tintColor read back off the style,
|
|
3
|
+
// alt -> accessibilityLabel, the array shape native expects — runs in the tag's own behavior
|
|
4
|
+
// (`registerImageBehavior`, wired by `../register`), so the wrapper that used to call it is gone.
|
|
5
|
+
// The Image STATICS moved to `../modules/image`: an imperative API with no view.
|
|
6
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { JSX } from '../jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import type { IAccessibilityProps, IAriaProps } from '@symbiote-native/components';
|
|
3
3
|
import type { IClassNameValue, IStyleProp, IViewStyle } from '@symbiote-native/engine';
|
|
4
4
|
export interface IInputAccessoryViewProps extends IAccessibilityProps, IAriaProps {
|
|
5
5
|
nativeID?: string;
|
|
@@ -8,4 +8,3 @@ export interface IInputAccessoryViewProps extends IAccessibilityProps, IAriaProp
|
|
|
8
8
|
class?: IClassNameValue;
|
|
9
9
|
children?: JSX.Element;
|
|
10
10
|
}
|
|
11
|
-
export declare function InputAccessoryView(props: IInputAccessoryViewProps): JSX.Element;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// The `<input-accessory-view>` tag's prop surface. The wrapper that used to carry it is gone —
|
|
2
|
+
// `renderInputAccessoryView`'s nativeID / backgroundColor / style mapping runs in the tag's own
|
|
3
|
+
// behavior (`registerInputAccessoryViewBehavior`, wired by `../register`), and the aria/role fold
|
|
4
|
+
// runs in the engine's `fabricProps`.
|
|
5
|
+
export {};
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
import { createMemo, createSignal, onCleanup, splitProps } from 'solid-js';
|
|
26
26
|
import { computeInset, keyboardAvoidingEventNamesFor, readKeyboardFrame, readLayoutFrame, readPrefersCrossFadeTransitions, resolveKeyboardAvoidingLayout, DEFAULT_VERTICAL_OFFSET, } from '@symbiote-native/components';
|
|
27
27
|
import { Keyboard, Platform, dlog, } from '@symbiote-native/engine';
|
|
28
|
-
import {
|
|
28
|
+
import { withStableKeys } from '../utils/stable-keys.js';
|
|
29
29
|
// Read by KeyboardAvoidingView itself; everything else (the aria/role aliases, accessibility*,
|
|
30
30
|
// testID, class) forwards onto the wrapper View, which folds them once through
|
|
31
31
|
// resolveAccessibilityProps and widens the vanished-key case with withStableKeys.
|
|
@@ -144,9 +144,14 @@ export function KeyboardAvoidingView(props) {
|
|
|
144
144
|
// Last, so KAV's own measure always runs; the caller's handler is invoked from inside it.
|
|
145
145
|
onLayout: handleLayout,
|
|
146
146
|
}));
|
|
147
|
+
// The half `View` used to supply, now that the wrapper is a bare tag: `spread` has no removal
|
|
148
|
+
// pass, so a key that stops being emitted (`rest` is a splitProps proxy, and `wrapperStyle` is
|
|
149
|
+
// absent in some behaviors) would keep its last value on the native view forever
|
|
150
|
+
// (.claude/rules/solid-descriptor-bridge.md §1).
|
|
151
|
+
const stableWrapperProps = withStableKeys(wrapperProps);
|
|
147
152
|
// 'nested' ('position') pushes the children in an inner View by `bottom: inset`; the wrapper modes
|
|
148
153
|
// ('padding' / 'height' / no behavior) adjust the single wrapper directly.
|
|
149
|
-
return (<
|
|
150
|
-
{isNested() ? (<
|
|
151
|
-
</
|
|
154
|
+
return (<view {...stableWrapperProps()}>
|
|
155
|
+
{isNested() ? (<view style={innerStyle()}>{local.children}</view>) : (local.children)}
|
|
156
|
+
</view>);
|
|
152
157
|
}
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
// user's components, which is the case the render-fn boundary rules OUT of core
|
|
19
19
|
// (.claude/rules/component-render-fn-boundary.md), so the bridge would have nothing to do with the
|
|
20
20
|
// half that matters and would hand back a root whose container child we would then have to reach
|
|
21
|
-
// into to `insert` into. renderModal always paints the SAME two-tag shape (one
|
|
22
|
-
// wrapping one collapsable
|
|
21
|
+
// into to `insert` into. renderModal always paints the SAME two-tag shape (one modal host
|
|
22
|
+
// wrapping one collapsable view container; only prop VALUES vary), so the tags are written
|
|
23
23
|
// out and the computed props read off the fixed positions — the same call React's createElement
|
|
24
24
|
// chain, Vue's h() chain and Svelte's markup all make. `children` then reaches the container
|
|
25
25
|
// through the compiler's own `insert`, which is the point of view.tsx's header.
|
|
@@ -100,7 +100,7 @@ export function Modal(props) {
|
|
|
100
100
|
style: local.style,
|
|
101
101
|
passthrough: resolveAccessibilityProps(rest),
|
|
102
102
|
});
|
|
103
|
-
// root =
|
|
103
|
+
// root = modal > [container]; the user children nest UNDER the container View, never as
|
|
104
104
|
// a direct sibling of the host (RN's modal content layout, render-modal.ts).
|
|
105
105
|
const container = () => {
|
|
106
106
|
const [first] = descriptor().children;
|
|
@@ -118,8 +118,8 @@ export function Modal(props) {
|
|
|
118
118
|
class: local.class,
|
|
119
119
|
}));
|
|
120
120
|
return (<Show when={shouldRender()}>
|
|
121
|
-
<
|
|
122
|
-
<
|
|
123
|
-
</
|
|
121
|
+
<modal {...hostBag()}>
|
|
122
|
+
<view {...containerBag()}>{local.children}</view>
|
|
123
|
+
</modal>
|
|
124
124
|
</Show>);
|
|
125
125
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Ref } from 'solid-js';
|
|
2
2
|
import type { JSX } from '../jsx-runtime';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import type { IAccessibilityProps, IAriaProps, IPressHandler, IPressState, IPressableAndroidRippleConfig, IRectOffset } from '@symbiote-native/components';
|
|
4
|
+
import type { IClassNameValue, IStyleProp, IViewStyle } from '@symbiote-native/engine';
|
|
5
|
+
import type { IHostInstance } from '../host-instance';
|
|
5
6
|
export type { IPressState, IPressableAndroidRippleConfig, } from '@symbiote-native/components';
|
|
6
7
|
type IPressableStyle = IStyleProp<IViewStyle> | ((state: IPressState) => IStyleProp<IViewStyle>);
|
|
7
|
-
type IPressableChildren = JSX.Element | ((state: Accessor<IPressState>) => JSX.Element);
|
|
8
8
|
export interface IPressableProps extends IAccessibilityProps, IAriaProps {
|
|
9
9
|
onPress?: IPressHandler;
|
|
10
10
|
onPressIn?: IPressHandler;
|
|
@@ -13,10 +13,12 @@ export interface IPressableProps extends IAccessibilityProps, IAriaProps {
|
|
|
13
13
|
onLongPress?: IPressHandler;
|
|
14
14
|
delayLongPress?: number;
|
|
15
15
|
disabled?: boolean;
|
|
16
|
+
focusable?: boolean;
|
|
16
17
|
cancelable?: boolean;
|
|
17
18
|
hitSlop?: IRectOffset;
|
|
18
19
|
pressRetentionOffset?: IRectOffset;
|
|
19
20
|
unstable_pressDelay?: number;
|
|
21
|
+
minPressDuration?: number;
|
|
20
22
|
android_ripple?: IPressableAndroidRippleConfig;
|
|
21
23
|
android_disableSound?: boolean;
|
|
22
24
|
onHoverIn?: IPressHandler;
|
|
@@ -25,7 +27,6 @@ export interface IPressableProps extends IAccessibilityProps, IAriaProps {
|
|
|
25
27
|
delayHoverOut?: number;
|
|
26
28
|
style?: IPressableStyle;
|
|
27
29
|
class?: IClassNameValue;
|
|
28
|
-
|
|
30
|
+
ref?: Ref<IHostInstance>;
|
|
31
|
+
children?: JSX.Element;
|
|
29
32
|
}
|
|
30
|
-
export declare function Pressable(props: IPressableProps): JSX.Element;
|
|
31
|
-
export declare function TouchablePressable(props: IPressableProps): JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// The `<pressable>` tag's prop surface. The press machine — timers, the retention region, the
|
|
2
|
+
// long-press and hover legs, the `disabled`/`focusable`/`accessible` folds and the Android ripple —
|
|
3
|
+
// lives on the engine node as `core/components/src/behaviors/pressable.ts`, wired by
|
|
4
|
+
// `../register`.
|
|
5
|
+
//
|
|
6
|
+
// THERE IS NO RENDER-PROP CHILD, and that is the one surface a tag cannot carry — same fact as
|
|
7
|
+
// Vue's scoped slot (`adapters/vue/src/components/pressable-props.ts`), Solid's own version of it.
|
|
8
|
+
// Press state lives on the engine node and never crosses back into Solid's reactivity as an
|
|
9
|
+
// accessor, so `{state => …}` has no channel any more. A `style` CALLBACK still works — the engine
|
|
10
|
+
// resolves it at both values of `pressed` (`isStyleCallback`, `core/engine/src/node.ts`) — and a
|
|
11
|
+
// `:active` CSS rule is cheaper still. A CHILD that needs the state has to be given it: mirror
|
|
12
|
+
// `onPressIn`/`onPressOut` into a local signal, which is what any app styling a descendant does.
|
|
13
|
+
export {};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { JSX } from '../jsx-runtime';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import type { IAccessibilityProps, IAriaProps } from '@symbiote-native/components';
|
|
3
|
+
import type { IClassNameValue } from '@symbiote-native/engine';
|
|
4
4
|
export interface IRefreshControlProps extends IAccessibilityProps, IAriaProps {
|
|
5
5
|
refreshing: boolean;
|
|
6
|
+
id?: string;
|
|
6
7
|
onRefresh?: () => void | Promise<void>;
|
|
7
8
|
tintColor?: string;
|
|
8
9
|
title?: string;
|
|
@@ -15,4 +16,3 @@ export interface IRefreshControlProps extends IAccessibilityProps, IAriaProps {
|
|
|
15
16
|
class?: IClassNameValue;
|
|
16
17
|
children?: JSX.Element;
|
|
17
18
|
}
|
|
18
|
-
export declare function RefreshControl(props: IRefreshControlProps): JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// The `<refresh-control>` tag's prop surface. On iOS the tag resolves to Fabric's PullToRefreshView,
|
|
2
|
+
// which lives INSIDE a scroll view as a childless sibling before the content container; on Android it
|
|
3
|
+
// is AndroidSwipeRefreshLayout and WRAPS the scroll view instead. Which shape is built is the scroll
|
|
4
|
+
// view's job, and the controlled-spinner handshake — mirror what native reported, command the value
|
|
5
|
+
// back down when the app's `refreshing` disagrees — is the tag's own behavior
|
|
6
|
+
// (`registerRefreshControlBehavior`, wired by `../register`).
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { JSX } from '../jsx-runtime';
|
|
2
|
+
import type { IAccessibilityProps, IAriaProps } from '@symbiote-native/components';
|
|
3
|
+
import type { IClassNameValue, IStyleProp, ISymbioteEvent, IViewStyle } from '@symbiote-native/engine';
|
|
4
|
+
export interface ISafeAreaViewProps extends IAccessibilityProps, IAriaProps {
|
|
5
|
+
style?: IStyleProp<IViewStyle>;
|
|
6
|
+
id?: string;
|
|
7
|
+
class?: IClassNameValue;
|
|
8
|
+
onLayout?: (event: ISymbioteEvent) => void;
|
|
9
|
+
children?: JSX.Element;
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// The `<safe-area-view>` tag's prop surface. The wrapper forwarded a bag and nothing else — the
|
|
2
|
+
// host does all the inset math, there is no JS-side layout anywhere in this project, and the
|
|
3
|
+
// `id -> nativeID` alias plus the aria/role fold both run below the adapter (`foldHostBag` and the
|
|
4
|
+
// engine's `fabricProps`). So there was nothing left for a component to hold.
|
|
5
|
+
export {};
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { JSX } from '
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
1
|
+
import type { Ref } from 'solid-js';
|
|
2
|
+
import type { JSX } from '../jsx-runtime';
|
|
3
|
+
import type { ISymbioteEvent } from '@symbiote-native/engine';
|
|
4
|
+
import type { IAccessibilityProps, IAriaProps } from '@symbiote-native/components';
|
|
5
|
+
import type { IClassNameValue, IStyleProp, IViewStyle } from '@symbiote-native/engine';
|
|
6
|
+
import type { IHostInstance } from '../host-instance';
|
|
6
7
|
export type { IScrollViewHandle } from '@symbiote-native/components';
|
|
7
|
-
export type { IStickyHeaderComponentType, IStickyHeaderComponentProps, } from './sticky-header';
|
|
8
8
|
type IScrollHandler = (event: ISymbioteEvent) => void;
|
|
9
|
-
export type IScrollViewHostPlatform = {
|
|
10
|
-
refreshControlMode: 'sibling' | 'wrap';
|
|
11
|
-
};
|
|
12
9
|
export interface IScrollViewProps extends IAccessibilityProps, IAriaProps {
|
|
13
10
|
style?: IStyleProp<IViewStyle>;
|
|
14
11
|
class?: IClassNameValue;
|
|
@@ -31,7 +28,6 @@ export interface IScrollViewProps extends IAccessibilityProps, IAriaProps {
|
|
|
31
28
|
x: number;
|
|
32
29
|
y: number;
|
|
33
30
|
};
|
|
34
|
-
refreshControl?: JSX.Element;
|
|
35
31
|
removeClippedSubviews?: boolean;
|
|
36
32
|
onContentSizeChange?: (width: number, height: number) => void;
|
|
37
33
|
snapToInterval?: number;
|
|
@@ -42,7 +38,6 @@ export interface IScrollViewProps extends IAccessibilityProps, IAriaProps {
|
|
|
42
38
|
disableIntervalMomentum?: boolean;
|
|
43
39
|
stickyHeaderIndices?: number[];
|
|
44
40
|
invertStickyHeaders?: boolean;
|
|
45
|
-
StickyHeaderComponent?: IStickyHeaderComponentType;
|
|
46
41
|
keyboardDismissMode?: 'none' | 'on-drag' | 'interactive';
|
|
47
42
|
keyboardShouldPersistTaps?: boolean | 'always' | 'never' | 'handled';
|
|
48
43
|
maintainVisibleContentPosition?: {
|
|
@@ -79,7 +74,6 @@ export interface IScrollViewProps extends IAccessibilityProps, IAriaProps {
|
|
|
79
74
|
onMomentumScrollBegin?: IScrollHandler;
|
|
80
75
|
onMomentumScrollEnd?: IScrollHandler;
|
|
81
76
|
onScrollToTop?: IScrollHandler;
|
|
82
|
-
ref?: Ref<
|
|
77
|
+
ref?: Ref<IHostInstance>;
|
|
83
78
|
children?: JSX.Element;
|
|
84
79
|
}
|
|
85
|
-
export declare function createScrollView(platform: IScrollViewHostPlatform): (props: IScrollViewProps) => JSX.Element;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// `<scroll-view>` / `<horizontal-scroll-view>`'s prop surface, for Solid. No component left to
|
|
2
|
+
// type — the tag IS the element, and the engine owns everything the wrapper used to assemble:
|
|
3
|
+
// `buildStructure` builds the content node, `slotProps` carries `contentContainerStyle` onto it,
|
|
4
|
+
// `claimedChildren` places a `<refresh-control>` child (a sibling on iOS, an inverting wrap on
|
|
5
|
+
// Android), and the sticky seam lives in `core/components/src/behaviors/scroll-view/`.
|
|
6
|
+
// `../register` names it.
|
|
7
|
+
//
|
|
8
|
+
// `stickyHeaderIndices` works on a bare tag — the behavior walks the COMMITTED children rather
|
|
9
|
+
// than pulling "child at index N" out of a render function, so it needs no wrapper at all. The
|
|
10
|
+
// `sticky-header` TAG is the other spelling, better for markup you control directly since it pins
|
|
11
|
+
// by document order and no index has to stay in step with the children.
|
|
12
|
+
//
|
|
13
|
+
// TWO PROPS ARE NOT WHAT THEY LOOK LIKE:
|
|
14
|
+
//
|
|
15
|
+
// horizontal DELETED from the payload and rewritten from the TAG (`ownerFold`,
|
|
16
|
+
// behaviors/scroll-view/shared.ts). Horizontal scroll is a separate native
|
|
17
|
+
// ViewManager on Android, so the axis is the tag; a prop contradicting it
|
|
18
|
+
// is dropped with a dlog. Typed here for parity and for a ported app.
|
|
19
|
+
// nestedScrollEnabled defaults to `true` in the behavior, on both platforms, which every
|
|
20
|
+
// wrapper used to write by hand.
|
|
21
|
+
//
|
|
22
|
+
// NO `refreshControl` PROP, deliberately — write a `<refresh-control>` CHILD instead; the
|
|
23
|
+
// behavior claims it and places it per platform. Nothing reads a prop by that name, so typing one
|
|
24
|
+
// would compile and paint nothing; leaving it out fails loudly at `tsc` with this comment beside
|
|
25
|
+
// it, same as React's and Vue's barrels.
|
|
26
|
+
//
|
|
27
|
+
// `children` is a Solid `JSX.Element`, so this type is per-adapter by construction
|
|
28
|
+
// (<prop_types_split_agnostic_vs_per_adapter>).
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ISwitchProps as ISwitchBaseProps } from '@symbiote-native/components';
|
|
2
|
+
import type { IClassNameValue } from '@symbiote-native/engine';
|
|
3
|
+
export type { ISwitchTrackColor, ISwitchChangeEvent, } from '@symbiote-native/components';
|
|
4
|
+
export type ISwitchProps = ISwitchBaseProps & {
|
|
5
|
+
class?: IClassNameValue;
|
|
6
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// The `<switch>` tag's prop surface. The controlled handshake the wrapper used to run — the
|
|
2
|
+
// lastNativeReport mirror, the snap-back command when the parent rejects a toggle, the platform
|
|
3
|
+
// track-colour mapping — is the tag's own behavior now (`registerSwitchBehavior`, wired by
|
|
4
|
+
// `../register`), which is also where the iOS/Android command-name split lives.
|
|
5
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Ref } from 'solid-js';
|
|
2
|
+
import type { ITextInputProps as ITextInputBaseProps } from '@symbiote-native/components';
|
|
3
|
+
import type { IClassNameValue } from '@symbiote-native/engine';
|
|
4
|
+
import type { IHostInstance } from '../host-instance';
|
|
5
|
+
export type ITextInputProps = ITextInputBaseProps & {
|
|
6
|
+
class?: IClassNameValue;
|
|
7
|
+
ref?: Ref<IHostInstance>;
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Ref } from 'solid-js';
|
|
2
2
|
import type { JSX } from '../jsx-runtime';
|
|
3
|
-
import {
|
|
3
|
+
import type { IAccessibilityProps, IAriaProps } from '@symbiote-native/components';
|
|
4
4
|
import type { IClassNameValue, IStyleProp, ISymbioteEvent, ITextStyle } from '@symbiote-native/engine';
|
|
5
5
|
import type { IHostInstance } from '../host-instance';
|
|
6
6
|
export interface ITextProps extends IAccessibilityProps, IAriaProps {
|
|
@@ -15,6 +15,7 @@ export interface ITextProps extends IAccessibilityProps, IAriaProps {
|
|
|
15
15
|
numberOfLines?: number;
|
|
16
16
|
ellipsizeMode?: 'head' | 'middle' | 'tail' | 'clip';
|
|
17
17
|
selectable?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
18
19
|
adjustsFontSizeToFit?: boolean;
|
|
19
20
|
minimumFontScale?: number;
|
|
20
21
|
allowFontScaling?: boolean;
|
|
@@ -23,4 +24,3 @@ export interface ITextProps extends IAccessibilityProps, IAriaProps {
|
|
|
23
24
|
ref?: Ref<IHostInstance>;
|
|
24
25
|
children?: JSX.Element;
|
|
25
26
|
}
|
|
26
|
-
export declare function Text(props: ITextProps): JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// The `<text>` tag's prop surface. Same story as `./view-props.ts` — the wrapper forwarded a bag
|
|
2
|
+
// and its two folds live below the adapter now, with one addition: RN's `Text` DEFAULTS
|
|
3
|
+
// (`ellipsizeMode`, `allowFontScaling`) are seeded by the renderer at `createElement` and re-seeded
|
|
4
|
+
// on a patch that clears them, so a bare tag carries them exactly as the component did.
|
|
5
|
+
//
|
|
6
|
+
// THE NESTING (`RCTText` vs `RCTVirtualText`) was never this file's job and still is not. React
|
|
7
|
+
// Native tracks a TextAncestor context so a Text inside another Text renders as a virtual span;
|
|
8
|
+
// here the engine's commit walk carries `hasTextAncestor` down and picks the view name itself
|
|
9
|
+
// (`viewNameFor`, core/engine/src/commit.ts), re-creating the node when the kind flips. Every
|
|
10
|
+
// adapter emits the same flat `text` and the engine resolves it for all of them.
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { INativeFeedbackBackground } from '@symbiote-native/components';
|
|
2
|
+
import type { JSX } from '../../jsx-runtime';
|
|
3
|
+
import type { IPressableProps } from '../pressable-props';
|
|
4
|
+
export interface ITouchableNativeFeedbackProps extends Omit<IPressableProps, 'style' | 'children'> {
|
|
5
|
+
background?: INativeFeedbackBackground;
|
|
6
|
+
useForeground?: boolean;
|
|
7
|
+
children?: JSX.Element;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { JSX } from '../jsx-runtime';
|
|
2
|
+
import type { IPressTimingProps } from '@symbiote-native/components';
|
|
3
|
+
import type { IClassNameValue, IStyleProp, IViewStyle } from '@symbiote-native/engine';
|
|
4
|
+
import type { IPressableProps } from './pressable-props';
|
|
5
|
+
export type ITouchableBaseProps = Omit<IPressableProps, 'style' | 'class' | 'children'> & IPressTimingProps & {
|
|
6
|
+
style?: IStyleProp<IViewStyle>;
|
|
7
|
+
class?: IClassNameValue;
|
|
8
|
+
children?: JSX.Element;
|
|
9
|
+
};
|
|
10
|
+
export interface ITouchableOpacityProps extends ITouchableBaseProps {
|
|
11
|
+
activeOpacity?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ITouchableHighlightProps extends ITouchableBaseProps {
|
|
14
|
+
activeOpacity?: number;
|
|
15
|
+
underlayColor?: string;
|
|
16
|
+
onShowUnderlay?: () => void;
|
|
17
|
+
onHideUnderlay?: () => void;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IPressTimingProps } from '@symbiote-native/components';
|
|
2
|
+
import type { JSX } from '../../jsx-runtime';
|
|
3
|
+
import type { IPressableProps } from '../pressable-props';
|
|
4
|
+
export interface ITouchableWithoutFeedbackProps extends Omit<IPressableProps, 'style' | 'children'>, IPressTimingProps {
|
|
5
|
+
children?: JSX.Element;
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Ref } from 'solid-js';
|
|
2
2
|
import type { JSX } from '../jsx-runtime';
|
|
3
|
-
import {
|
|
3
|
+
import type { IAccessibilityProps, IAriaProps, IResponderProps } from '@symbiote-native/components';
|
|
4
4
|
import type { IClassNameValue, IStyleProp, ISymbioteEvent, IViewStyle } from '@symbiote-native/engine';
|
|
5
5
|
import type { IHostInstance } from '../host-instance';
|
|
6
6
|
export interface IViewProps extends IAccessibilityProps, IAriaProps, IResponderProps {
|
|
@@ -29,4 +29,3 @@ export interface IViewProps extends IAccessibilityProps, IAriaProps, IResponderP
|
|
|
29
29
|
ref?: Ref<IHostInstance>;
|
|
30
30
|
children?: JSX.Element;
|
|
31
31
|
}
|
|
32
|
-
export declare function View(props: IViewProps): JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// The `<view>` tag's prop surface. The wrapper is gone: it forwarded a bag onto one host element
|
|
2
|
+
// and did two folds, both of which now run below the adapter — `id -> nativeID` in the renderer's
|
|
3
|
+
// `foldAliasKey` (which covers `createElement` and every later prop write, not just the wrapper's
|
|
4
|
+
// one path) and the aria/role fold in the engine's `fabricProps`.
|
|
5
|
+
//
|
|
6
|
+
// ONE THING THE WRAPPER DID IS NOT INHERITED, and a consumer that builds a whole bag has to do it
|
|
7
|
+
// itself: `withStableKeys`. Solid's `spread` walks only the CURRENT key set and has no removal
|
|
8
|
+
// pass, so a key that stops being emitted keeps its last value on the native view forever
|
|
9
|
+
// (`.claude/rules/solid-descriptor-bridge.md` §1). A bag whose keys are all statically present —
|
|
10
|
+
// an ordinary attribute list, a `splitProps` rest proxy — is unaffected.
|
|
11
|
+
export {};
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
// cannot sit beside the content the way iOS allows ("addViewAt: failed to insert view … at index 1").
|
|
3
3
|
// Instead the RefreshControl (AndroidSwipeRefreshLayout) WRAPS the scroll host, which nests inside it
|
|
4
4
|
// so the inner scroll takes the gesture before the refresh parent — RN's own ScrollView.js android
|
|
5
|
-
// branch
|
|
5
|
+
// branch, decided by the `<scroll-view>` tag's own engine behavior registered for this platform
|
|
6
|
+
// (`core/components/src/behaviors/scroll-view/index.android.ts`). Metro picks this file on an
|
|
7
|
+
// Android host; no Platform.OS read. iOS and Android share one `createVirtualizedList` now — nothing
|
|
8
|
+
// here differs per platform any more except which file Metro resolves.
|
|
6
9
|
import { createVirtualizedList } from './shared.jsx';
|
|
7
|
-
export const VirtualizedList = createVirtualizedList(
|
|
8
|
-
refreshControlMode: 'wrap',
|
|
9
|
-
});
|
|
10
|
+
export const VirtualizedList = createVirtualizedList();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// VirtualizedList on iOS. The RefreshControl (PullToRefreshView) is a CHILD of the scroll host,
|
|
2
2
|
// rendered as a childless SIBLING BEFORE the content container — RN ScrollView.js's
|
|
3
|
-
// `{refreshControl}{contentContainer}`,
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// `{refreshControl}{contentContainer}`, decided by the `<scroll-view>` tag's own engine behavior
|
|
4
|
+
// registered for this platform (`core/components/src/behaviors/scroll-view/index.ios.ts`), the same
|
|
5
|
+
// one every other adapter's iOS binding registers. Metro picks this file on an iOS host; no
|
|
6
|
+
// Platform.OS read. iOS and Android share one `createVirtualizedList` now — nothing here differs
|
|
7
|
+
// per platform any more except which file Metro resolves.
|
|
6
8
|
import { createVirtualizedList } from './shared.jsx';
|
|
7
|
-
export const VirtualizedList = createVirtualizedList(
|
|
8
|
-
refreshControlMode: 'sibling',
|
|
9
|
-
});
|
|
9
|
+
export const VirtualizedList = createVirtualizedList();
|
|
@@ -2,8 +2,6 @@ import { type Accessor, type Ref } from 'solid-js';
|
|
|
2
2
|
import type { JSX } from '../../jsx-runtime';
|
|
3
3
|
import { type IAccessibilityProps, type IAriaProps, type ICellLayout, type IViewabilityConfig, type IViewabilityConfigCallbackPair, type IViewableItemsChangedInfo, type ISeparatorProps, type ISeparators, type IViewToken, type IVirtualizedListHandle } from '@symbiote-native/components';
|
|
4
4
|
import { type IClassNameValue, type IStyleProp, type ISymbioteEvent, type IViewStyle } from '@symbiote-native/engine';
|
|
5
|
-
import type { IScrollViewHostPlatform } from '../scroll-view/shared';
|
|
6
|
-
export type { IScrollViewHostPlatform };
|
|
7
5
|
export type { ICellLayout, ISeparators, ISeparatorProps, IViewToken, IViewableItemsChangedInfo, IViewabilityConfig, IViewabilityConfigCallbackPair, IVirtualizedListHandle, };
|
|
8
6
|
export interface IVirtualizedListCellInfo<ItemT> {
|
|
9
7
|
item: ItemT;
|
|
@@ -72,4 +70,4 @@ export interface IVirtualizedListProps<ItemT> extends IAccessibilityProps, IAria
|
|
|
72
70
|
}) => void;
|
|
73
71
|
}
|
|
74
72
|
export type IVirtualizedListComponent = <ItemT>(props: IVirtualizedListProps<ItemT>) => JSX.Element;
|
|
75
|
-
export declare function createVirtualizedList(
|
|
73
|
+
export declare function createVirtualizedList(): IVirtualizedListComponent;
|