@symbiote-native/vue 3.2.0 → 3.4.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/build/components/checkbox-props.d.ts +3 -0
- package/build/components/checkbox-props.js +1 -0
- package/build/components/flat-list/index.d.ts +4 -3
- package/build/components/flat-list/index.js +18 -21
- package/build/components/input-accessory-view-props.d.ts +4 -4
- package/build/components/keyboard-avoiding-view.d.ts +11 -3
- package/build/components/keyboard-avoiding-view.js +38 -69
- package/build/components/layout-conformance-props.d.ts +4 -0
- package/build/components/layout-conformance-props.js +1 -0
- package/build/components/modal/index.d.ts +18 -5
- package/build/components/modal/index.js +53 -24
- package/build/components/refresh-control-props.d.ts +7 -7
- package/build/components/scroll-view/scroll-view-props.d.ts +8 -5
- package/build/components/section-list/index.d.ts +1 -1
- package/build/components/section-list/index.js +2 -6
- package/build/components/text-props.d.ts +3 -3
- package/build/components/touchable-props.d.ts +6 -6
- package/build/components/virtualized-list/index.d.ts +5 -75
- package/build/components/virtualized-list/index.js +130 -558
- package/build/components/virtualized-list/list-children.d.ts +18 -0
- package/build/components/virtualized-list/list-children.js +81 -0
- package/build/components/virtualized-list/list-elements.d.ts +7 -0
- package/build/components/virtualized-list/list-elements.js +29 -0
- package/build/components/virtualized-list/list-scroll-props.d.ts +20 -0
- package/build/components/virtualized-list/list-scroll-props.js +9 -0
- package/build/components/virtualized-list/narrow-props.d.ts +79 -0
- package/build/components/virtualized-list/narrow-props.js +89 -0
- package/build/components/virtualized-list/nested-scope.d.ts +3 -0
- package/build/components/virtualized-list/nested-scope.js +12 -0
- package/build/components/virtualized-list/user-handlers.d.ts +3 -0
- package/build/components/virtualized-list/user-handlers.js +24 -0
- package/build/components/virtualized-list/virtualized-list-props.d.ts +82 -0
- package/build/components/virtualized-list/virtualized-list-props.js +41 -0
- package/build/components/virtualized-section-list/index.d.ts +20 -5
- package/build/components/virtualized-section-list/index.js +81 -95
- package/build/components/virtualized-section-list/section-item-cell.d.ts +18 -0
- package/build/components/virtualized-section-list/section-item-cell.js +52 -0
- package/build/composables/define-native-view-component.d.ts +3 -0
- package/build/composables/define-native-view-component.js +23 -0
- package/build/composables/use-animated-value.d.ts +7 -0
- package/build/composables/use-animated-value.js +14 -0
- package/build/composables/use-color-scheme.d.ts +1 -1
- package/build/composables/use-event.d.ts +6 -0
- package/build/composables/use-event.js +22 -0
- package/build/create-transition/index.d.ts +2 -2
- package/build/create-transition/index.js +1 -1
- package/build/descriptor-to-vue.d.ts +1 -1
- package/build/descriptor-to-vue.js +6 -2
- package/build/index.d.ts +16 -4
- package/build/index.js +18 -31
- package/build/jsx-runtime.d.ts +2 -0
- package/build/modules/animated/index.d.ts +54 -41
- package/build/modules/animated/index.js +2 -26
- package/build/modules/app-registry/index.d.ts +3 -3
- package/build/modules/app-registry/index.js +2 -2
- package/build/modules/status-bar.js +22 -24
- package/build/utils/normalize-attrs.js +10 -4
- package/metro-vue-transformer.cjs +165 -224
- package/package.json +6 -6
|
@@ -12,10 +12,11 @@
|
|
|
12
12
|
// refresh) stay GATED on listener presence so the inner VirtualizedList keeps building
|
|
13
13
|
// RefreshControl / computing edge-reached strictly on demand.
|
|
14
14
|
import { defineComponent, getCurrentInstance, h, shallowRef, } from '@vue/runtime-core';
|
|
15
|
-
import { flattenSections, resolveStickySectionHeaders,
|
|
15
|
+
import { cellGapsFor, createSeparatorBoard, flattenSections, layoutOverSections, renderSectionEntry, resolveScrollLocation, resolveStickySectionHeaders, routeScrollHandle, sectionEntryKey, } from '@symbiote-native/components';
|
|
16
16
|
import { Platform, dlog, } from '@symbiote-native/engine';
|
|
17
17
|
import { VirtualizedList } from '../virtualized-list/index.js';
|
|
18
18
|
import { normalizeVueAttrs } from '../../utils/normalize-attrs.js';
|
|
19
|
+
import { SectionItemCell } from './section-item-cell.js';
|
|
19
20
|
// VirtualizedList's generic construct signature can't be resolved by h()'s overloads, so drive
|
|
20
21
|
// it through a loose functional-component handle instead.
|
|
21
22
|
const VirtualizedListHost = VirtualizedList;
|
|
@@ -36,39 +37,85 @@ function isRecord(value) {
|
|
|
36
37
|
function isVirtualizedListHandle(value) {
|
|
37
38
|
return isRecord(value) && typeof value.scrollToOffset === 'function';
|
|
38
39
|
}
|
|
39
|
-
function buildSectionDelegate(getInner,
|
|
40
|
+
function buildSectionDelegate(getInner, locate) {
|
|
40
41
|
return {
|
|
41
42
|
scrollToLocation: (params) => {
|
|
42
|
-
const
|
|
43
|
-
if (
|
|
43
|
+
const target = locate(params);
|
|
44
|
+
if (target === undefined) {
|
|
44
45
|
dlog(`Vue VirtualizedSectionList scrollToLocation: section ${params.sectionIndex} out of range`);
|
|
45
46
|
return;
|
|
46
47
|
}
|
|
47
48
|
dlog(`Vue VirtualizedSectionList scrollToLocation section=${params.sectionIndex} ` +
|
|
48
|
-
`item=${params.itemIndex} -> flat ${
|
|
49
|
-
getInner()?.scrollToIndex(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
`item=${params.itemIndex} -> flat ${target.index}`);
|
|
50
|
+
getInner()?.scrollToIndex(target);
|
|
51
|
+
},
|
|
52
|
+
...routeScrollHandle(getInner),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// The separator slot for a gap: the section one, or the item one where a section's own beats
|
|
56
|
+
// the list's
|
|
57
|
+
function separatorRenderFor(gap, slots) {
|
|
58
|
+
if (gap.props === undefined)
|
|
59
|
+
return undefined;
|
|
60
|
+
const { props } = gap;
|
|
61
|
+
const slot = gap.kind === 'section'
|
|
62
|
+
? slots.sectionSeparator
|
|
63
|
+
: (props.section.ItemSeparatorComponent ?? slots.separator);
|
|
64
|
+
if (slot === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
return ({ isHighlighted, override }) => slot({ highlighted: isHighlighted, ...props, ...override });
|
|
67
|
+
}
|
|
68
|
+
// The inner list's #item slot: each flattened entry goes to the matching consumer slot, an item
|
|
69
|
+
// to a cell that paints its own separators. A slot the consumer left off renders nothing
|
|
70
|
+
function entryRendererFor(rendering) {
|
|
71
|
+
const { slots, entries, board, keyOf } = rendering;
|
|
72
|
+
return info => renderSectionEntry({
|
|
73
|
+
header: ({ section }) => slots.sectionHeader?.({ section }) ?? [],
|
|
74
|
+
footer: ({ section }) => slots.sectionFooter?.({ section }) ?? [],
|
|
75
|
+
item: entry => {
|
|
76
|
+
const gaps = cellGapsFor(entries, info.index);
|
|
77
|
+
const previous = entries[info.index - 1];
|
|
78
|
+
const render = entry.section.renderItem ?? slots.item;
|
|
79
|
+
return h(SectionItemCell, {
|
|
80
|
+
board,
|
|
81
|
+
cellKey: keyOf(entry),
|
|
82
|
+
prevCellKey: previous === undefined ? undefined : keyOf(previous),
|
|
83
|
+
renderItem: separators => render?.({
|
|
84
|
+
item: entry.item,
|
|
85
|
+
index: entry.itemIndex,
|
|
86
|
+
section: entry.section,
|
|
87
|
+
separators,
|
|
88
|
+
}) ?? [],
|
|
89
|
+
leadingSeparator: separatorRenderFor(gaps.leading, slots),
|
|
90
|
+
trailingSeparator: separatorRenderFor(gaps.trailing, slots),
|
|
91
|
+
inverted: rendering.isInverted,
|
|
54
92
|
});
|
|
55
93
|
},
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
94
|
+
}, info.item);
|
|
95
|
+
}
|
|
96
|
+
// The three synthesized events become inner-list handlers ONLY when listened, so the inner list
|
|
97
|
+
// keeps gating (no parasitic RefreshControl / edge-reached work for an unlistened event)
|
|
98
|
+
function synthesizedEvents(listens, emit) {
|
|
99
|
+
return {
|
|
100
|
+
onEndReached: listens('onEndReached')
|
|
101
|
+
? (eventInfo) => emit('endReached', eventInfo)
|
|
102
|
+
: undefined,
|
|
103
|
+
onStartReached: listens('onStartReached')
|
|
104
|
+
? (eventInfo) => emit('startReached', eventInfo)
|
|
105
|
+
: undefined,
|
|
106
|
+
onRefresh: listens('onRefresh') ? () => emit('refresh') : undefined,
|
|
62
107
|
};
|
|
63
108
|
}
|
|
64
|
-
export const VirtualizedSectionList = defineComponent((props, { attrs, expose, emit, slots
|
|
109
|
+
export const VirtualizedSectionList = defineComponent((props, { attrs, expose, emit, slots }) => {
|
|
110
|
+
const board = createSeparatorBoard();
|
|
65
111
|
const inner = shallowRef(null);
|
|
66
112
|
const setInner = (instance) => {
|
|
67
113
|
inner.value = isVirtualizedListHandle(instance) ? instance : null;
|
|
68
114
|
};
|
|
69
|
-
//
|
|
115
|
+
// Both change every render (sections may change), the delegate reads them lazily
|
|
70
116
|
let headerIndices = [];
|
|
71
|
-
|
|
117
|
+
let stickyHeaderIndices;
|
|
118
|
+
expose(buildSectionDelegate(() => inner.value, params => resolveScrollLocation(headerIndices, stickyHeaderIndices, params)));
|
|
72
119
|
// Emits are stripped from $attrs by Vue; detect listener presence off the instance's own
|
|
73
120
|
// vnode props instead, so an emit bridge is wired ONLY when the consumer actually listens.
|
|
74
121
|
const instance = getCurrentInstance();
|
|
@@ -80,92 +127,31 @@ export const VirtualizedSectionList = defineComponent((props, { attrs, expose, e
|
|
|
80
127
|
const sections = Array.isArray(props.sections)
|
|
81
128
|
? props.sections
|
|
82
129
|
: [];
|
|
83
|
-
const
|
|
84
|
-
// The passthrough tail: declared props + declared emits' onX are already removed from $attrs,
|
|
85
|
-
// so what's left is the VirtualizedList passthrough (kebab-folded for the inner list).
|
|
86
|
-
const forwarded = normalizeVueAttrs(attrs);
|
|
87
|
-
const { entries, headerIndices: indices } = flattenSections(sections, slots.sectionSeparator !== undefined);
|
|
130
|
+
const { entries, headerIndices: indices } = flattenSections(sections);
|
|
88
131
|
headerIndices = indices;
|
|
132
|
+
const keyOf = (entry) => sectionEntryKey(entry, props.keyExtractor);
|
|
89
133
|
// RN sticks section headers by default only on iOS; Android does not unless asked.
|
|
90
|
-
|
|
134
|
+
stickyHeaderIndices = resolveStickySectionHeaders(props.stickySectionHeadersEnabled, indices, Platform.OS);
|
|
91
135
|
dlog(`Vue VirtualizedSectionList: ${sections.length} sections flattened to ${entries.length} entries`);
|
|
92
|
-
// The inner list's #item slot: dispatch each flattened entry to the matching consumer slot,
|
|
93
|
-
// returning its VNode[] (empty when the consumer left that slot off).
|
|
94
|
-
const renderEntry = (info) => {
|
|
95
|
-
const entry = info.item;
|
|
96
|
-
if (entry.kind === 'header') {
|
|
97
|
-
return slots.sectionHeader
|
|
98
|
-
? slots.sectionHeader({ section: entry.section })
|
|
99
|
-
: [];
|
|
100
|
-
}
|
|
101
|
-
if (entry.kind === 'footer') {
|
|
102
|
-
return slots.sectionFooter
|
|
103
|
-
? slots.sectionFooter({ section: entry.section })
|
|
104
|
-
: [];
|
|
105
|
-
}
|
|
106
|
-
if (entry.kind === 'section-separator') {
|
|
107
|
-
return slots.sectionSeparator ? slots.sectionSeparator() : [];
|
|
108
|
-
}
|
|
109
|
-
return slots.item
|
|
110
|
-
? slots.item({
|
|
111
|
-
item: entry.item,
|
|
112
|
-
index: entry.itemIndex,
|
|
113
|
-
section: entry.section,
|
|
114
|
-
separators: info.separators,
|
|
115
|
-
})
|
|
116
|
-
: [];
|
|
117
|
-
};
|
|
118
|
-
// The user's #separator is typed on ItemT, but the inner stream is the entry wrapper; unwrap
|
|
119
|
-
// each entry back to its ItemT (shared unwrapEntryItem) before the inner list invokes it.
|
|
120
|
-
const entrySeparatorSlot = slots.separator === undefined
|
|
121
|
-
? undefined
|
|
122
|
-
: (entryProps) => slots.separator({
|
|
123
|
-
...entryProps,
|
|
124
|
-
leadingItem: unwrapEntryItem(entryProps.leadingItem),
|
|
125
|
-
trailingItem: unwrapEntryItem(entryProps.trailingItem),
|
|
126
|
-
});
|
|
127
|
-
const entryKeyExtractor = (entry, index) => sectionEntryKey(entry, index, keyExtractor);
|
|
128
|
-
// Hand the callback `sections`, not the entries: RN's inner VirtualizedList gets
|
|
129
|
-
// `data={this.props.sections}` (VirtualizedSectionList.js:216) while ours streams the
|
|
130
|
-
// FLATTENED entries, so the same user code would otherwise see a different argument here
|
|
131
|
-
// than on RN.
|
|
132
|
-
//
|
|
133
|
-
// UPSTREAM-DIVERGENCE(react-native): the flat INDEX matches RN's (two rows per section,
|
|
134
|
-
// header and footer) only while the #sectionSeparator slot is unset. With it,
|
|
135
|
-
// flattenSections emits an extra 'section-separator' row per boundary that RN renders inside
|
|
136
|
-
// the neighbouring cell, so indices shift by one per boundary from the second section on.
|
|
137
|
-
// Deliberate - that row is how this adapter paints the separator; a caller combining the two
|
|
138
|
-
// must account for it.
|
|
139
|
-
const getItemLayout = props.getItemLayout;
|
|
140
|
-
const entryItemLayout = getItemLayout === undefined
|
|
141
|
-
? undefined
|
|
142
|
-
: (_entries, index) => getItemLayout(sections, index);
|
|
143
|
-
// The three synthesized events become inner-VL handlers ONLY when listened, so the inner list
|
|
144
|
-
// keeps gating (no parasitic RefreshControl / edge-reached work for an unlistened event).
|
|
145
|
-
const endReached = listens('onEndReached')
|
|
146
|
-
? (eventInfo) => emit('endReached', eventInfo)
|
|
147
|
-
: undefined;
|
|
148
|
-
const startReached = listens('onStartReached')
|
|
149
|
-
? (eventInfo) => emit('startReached', eventInfo)
|
|
150
|
-
: undefined;
|
|
151
|
-
const refresh = listens('onRefresh')
|
|
152
|
-
? () => emit('refresh')
|
|
153
|
-
: undefined;
|
|
154
136
|
return h(VirtualizedListHost, {
|
|
155
|
-
|
|
137
|
+
// The passthrough tail: declared props and emits are already out of $attrs
|
|
138
|
+
...normalizeVueAttrs(attrs),
|
|
156
139
|
ref: setInner,
|
|
157
140
|
data: entries,
|
|
158
141
|
getItem: (_source, index) => entries[index],
|
|
159
142
|
getItemCount: () => entries.length,
|
|
160
|
-
keyExtractor:
|
|
161
|
-
getItemLayout:
|
|
143
|
+
keyExtractor: keyOf,
|
|
144
|
+
getItemLayout: layoutOverSections(props.getItemLayout, sections),
|
|
162
145
|
stickyHeaderIndices,
|
|
163
|
-
|
|
164
|
-
onStartReached: startReached,
|
|
165
|
-
onRefresh: refresh,
|
|
146
|
+
...synthesizedEvents(listens, emit),
|
|
166
147
|
}, {
|
|
167
|
-
item:
|
|
168
|
-
|
|
148
|
+
item: entryRendererFor({
|
|
149
|
+
slots,
|
|
150
|
+
entries,
|
|
151
|
+
board,
|
|
152
|
+
keyOf,
|
|
153
|
+
isInverted: attrs.inverted === true,
|
|
154
|
+
}),
|
|
169
155
|
header: slots.header,
|
|
170
156
|
footer: slots.footer,
|
|
171
157
|
empty: slots.empty,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type VNode } from '@vue/runtime-core';
|
|
2
|
+
import { type ISeparatorBoard, type ISeparators } from '@symbiote-native/components';
|
|
3
|
+
type IRendered = VNode[] | VNode;
|
|
4
|
+
export type ISeparatorState = {
|
|
5
|
+
isHighlighted: boolean;
|
|
6
|
+
override: Record<string, unknown> | undefined;
|
|
7
|
+
};
|
|
8
|
+
export type ISectionItemCellProps = {
|
|
9
|
+
board: ISeparatorBoard<Record<string, unknown>>;
|
|
10
|
+
cellKey: string;
|
|
11
|
+
prevCellKey: string | undefined;
|
|
12
|
+
renderItem: (separators: ISeparators) => IRendered;
|
|
13
|
+
leadingSeparator: ((state: ISeparatorState) => IRendered) | undefined;
|
|
14
|
+
trailingSeparator: ((state: ISeparatorState) => IRendered) | undefined;
|
|
15
|
+
inverted: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare const SectionItemCell: import("vue").DefineSetupFnComponent<ISectionItemCellProps, {}, {}, ISectionItemCellProps & {}, import("vue").PublicProps>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Item cell with its separators around it, as in RN's `ItemWithSeparator`
|
|
2
|
+
// Their state sits in a shared board, т.к. `highlight()` also lights the previous cell's one
|
|
3
|
+
import { defineComponent, Fragment, h, shallowRef, watch, } from '@vue/runtime-core';
|
|
4
|
+
import { createCellSeparators, } from '@symbiote-native/components';
|
|
5
|
+
const CELL_PROPS = [
|
|
6
|
+
'board',
|
|
7
|
+
'cellKey',
|
|
8
|
+
'prevCellKey',
|
|
9
|
+
'renderItem',
|
|
10
|
+
'leadingSeparator',
|
|
11
|
+
'trailingSeparator',
|
|
12
|
+
'inverted',
|
|
13
|
+
];
|
|
14
|
+
export const SectionItemCell = defineComponent((props) => {
|
|
15
|
+
const state = shallowRef(props.board.read(props.cellKey));
|
|
16
|
+
watch(() => [props.board, props.cellKey], ([board, cellKey], _previous, onCleanup) => {
|
|
17
|
+
state.value = board.read(cellKey);
|
|
18
|
+
const unsubscribe = board.subscribe(cellKey, () => {
|
|
19
|
+
state.value = board.read(cellKey);
|
|
20
|
+
});
|
|
21
|
+
onCleanup(() => {
|
|
22
|
+
unsubscribe();
|
|
23
|
+
board.release(cellKey);
|
|
24
|
+
});
|
|
25
|
+
}, { immediate: true, flush: 'sync' });
|
|
26
|
+
const separators = createCellSeparators(props.board, () => ({
|
|
27
|
+
cellKey: props.cellKey,
|
|
28
|
+
prevCellKey: props.prevCellKey,
|
|
29
|
+
has: {
|
|
30
|
+
leading: props.leadingSeparator !== undefined,
|
|
31
|
+
trailing: props.trailingSeparator !== undefined,
|
|
32
|
+
},
|
|
33
|
+
}));
|
|
34
|
+
return () => {
|
|
35
|
+
const { leadingHighlighted, leadingOverride } = state.value;
|
|
36
|
+
const { trailingHighlighted, trailingOverride } = state.value;
|
|
37
|
+
const leading = props.leadingSeparator?.({
|
|
38
|
+
isHighlighted: leadingHighlighted,
|
|
39
|
+
override: leadingOverride,
|
|
40
|
+
}) ?? [];
|
|
41
|
+
const trailing = props.trailingSeparator?.({
|
|
42
|
+
isHighlighted: trailingHighlighted,
|
|
43
|
+
override: trailingOverride,
|
|
44
|
+
}) ?? [];
|
|
45
|
+
const element = props.renderItem(separators);
|
|
46
|
+
return h(Fragment, [
|
|
47
|
+
props.inverted ? trailing : leading,
|
|
48
|
+
element,
|
|
49
|
+
props.inverted ? leading : trailing,
|
|
50
|
+
]);
|
|
51
|
+
};
|
|
52
|
+
}, { name: 'SectionItemCell', props: CELL_PROPS });
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type VNode } from '@vue/runtime-core';
|
|
2
|
+
import type { ICreateNativeViewController } from '@symbiote-native/components';
|
|
3
|
+
export declare function defineNativeViewComponent<THandle extends object>(name: string, createController: ICreateNativeViewController<THandle>): import("vue").DefineComponent<{}, () => VNode | null, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineComponent, onUnmounted } from '@vue/runtime-core';
|
|
2
|
+
import { createHostNodeHolder } from '@symbiote-native/components';
|
|
3
|
+
import { descriptorToVue } from '../descriptor-to-vue.js';
|
|
4
|
+
import { normalizeVueAttrs } from '../utils/normalize-attrs.js';
|
|
5
|
+
// A Vue component over a package's native view: every attr is a prop of the native view, the
|
|
6
|
+
// handle of its controller is exposed to a template ref
|
|
7
|
+
export function defineNativeViewComponent(name, createController) {
|
|
8
|
+
return defineComponent({
|
|
9
|
+
name,
|
|
10
|
+
// Nothing may leak onto the wrapper, the attrs are the props of the native view
|
|
11
|
+
inheritAttrs: false,
|
|
12
|
+
setup(_props, { attrs, expose }) {
|
|
13
|
+
const host = createHostNodeHolder();
|
|
14
|
+
const controller = createController(host.getNode);
|
|
15
|
+
expose(controller.handle);
|
|
16
|
+
onUnmounted(() => controller.dispose?.());
|
|
17
|
+
return () => {
|
|
18
|
+
const descriptor = controller.render(normalizeVueAttrs(attrs));
|
|
19
|
+
return descriptor ? descriptorToVue(host.capture(descriptor)) : null;
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AnimatedColor, type AnimatedValue, type AnimatedValueXY, type IAnimatedValueConfig, type IColorInput } from '@symbiote-native/engine';
|
|
2
|
+
export declare function useAnimatedValue(initialValue: number, config?: IAnimatedValueConfig): AnimatedValue;
|
|
3
|
+
export declare function useAnimatedValueXY(initialValue: {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
}, config?: IAnimatedValueConfig): AnimatedValueXY;
|
|
7
|
+
export declare function useAnimatedColor(inputValue?: IColorInput, config?: IAnimatedValueConfig): AnimatedColor;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// RN's `useAnimatedValue`, `useAnimatedValueXY` and `useAnimatedColor` as composables: `setup()`
|
|
2
|
+
// runs once per component, so each call is the one instance. `markRaw` keeps `reactive()` from
|
|
3
|
+
// wrapping the node in a Proxy
|
|
4
|
+
import { markRaw } from '@vue/runtime-core';
|
|
5
|
+
import { createAnimatedColor, createAnimatedValue, createAnimatedValueXY, } from '@symbiote-native/engine';
|
|
6
|
+
export function useAnimatedValue(initialValue, config) {
|
|
7
|
+
return markRaw(createAnimatedValue(initialValue, config));
|
|
8
|
+
}
|
|
9
|
+
export function useAnimatedValueXY(initialValue, config) {
|
|
10
|
+
return markRaw(createAnimatedValueXY(initialValue, config));
|
|
11
|
+
}
|
|
12
|
+
export function useAnimatedColor(inputValue, config) {
|
|
13
|
+
return markRaw(createAnimatedColor(inputValue, config));
|
|
14
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MaybeRef, MaybeRefOrGetter, ShallowRef } from '@vue/runtime-core';
|
|
2
|
+
import type { IEventEmitterOf, IEventName, IEventPayload, IEventsMap } from '@symbiote-native/engine';
|
|
3
|
+
/** Calls the listener for each event, the latest one, and stops when the owner unmounts */
|
|
4
|
+
export declare function useEventListener<TEventsMap extends IEventsMap, TName extends IEventName<TEventsMap>>(emitter: MaybeRefOrGetter<IEventEmitterOf<TEventsMap>>, eventName: MaybeRefOrGetter<TName>, listener: MaybeRef<TEventsMap[TName]>): void;
|
|
5
|
+
/** The payload of the last event, `initialValue` (or `null`) until the first one */
|
|
6
|
+
export declare function useEvent<TEventsMap extends IEventsMap, TName extends IEventName<TEventsMap>>(emitter: MaybeRefOrGetter<IEventEmitterOf<TEventsMap>>, eventName: MaybeRefOrGetter<TName>, initialValue?: IEventPayload<TEventsMap, TName> | null): Readonly<ShallowRef<IEventPayload<TEventsMap, TName> | null>>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Vue twins of `useEvent` and `useEventListener` of the `expo` package, for any emitter
|
|
2
|
+
import { shallowRef, toValue, unref, watch } from '@vue/runtime-core';
|
|
3
|
+
import { bindEventListener } from '@symbiote-native/engine';
|
|
4
|
+
/** Calls the listener for each event, the latest one, and stops when the owner unmounts */
|
|
5
|
+
export function useEventListener(emitter, eventName,
|
|
6
|
+
// A ref, not a getter: a function here is the listener itself
|
|
7
|
+
listener) {
|
|
8
|
+
watch([() => toValue(emitter), () => toValue(eventName)], ([source, name], _previous, onCleanup) => {
|
|
9
|
+
// The listener is read at each event, a new one is not a new subscription
|
|
10
|
+
onCleanup(bindEventListener(source, name, () => unref(listener)));
|
|
11
|
+
}, { immediate: true });
|
|
12
|
+
}
|
|
13
|
+
/** The payload of the last event, `initialValue` (or `null`) until the first one */
|
|
14
|
+
export function useEvent(emitter, eventName, initialValue = null) {
|
|
15
|
+
const event = shallowRef(initialValue);
|
|
16
|
+
watch([() => toValue(emitter), () => toValue(eventName)], ([source, name], _previous, onCleanup) => {
|
|
17
|
+
onCleanup(bindEventListener(source, name, () => (next) => {
|
|
18
|
+
event.value = next;
|
|
19
|
+
}));
|
|
20
|
+
}, { immediate: true });
|
|
21
|
+
return event;
|
|
22
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type VNode } from '@vue/runtime-core';
|
|
2
|
-
export
|
|
2
|
+
export type ITransitionProps = {
|
|
3
3
|
duration?: number;
|
|
4
4
|
appear?: boolean;
|
|
5
|
-
}
|
|
5
|
+
};
|
|
6
6
|
export declare const Transition: import("vue").DefineComponent<{
|
|
7
7
|
duration: number;
|
|
8
8
|
appear: boolean;
|
|
@@ -21,7 +21,7 @@ function animatedOpacity(el, initial) {
|
|
|
21
21
|
}
|
|
22
22
|
function fadeTo(el, toValue, duration, done) {
|
|
23
23
|
const value = opacityOf.get(el) ?? animatedOpacity(el, toValue === 1 ? 0 : 1);
|
|
24
|
-
timing(value, { toValue, duration }).start(({ finished }) => {
|
|
24
|
+
timing(value, { toValue, duration, useNativeDriver: false }).start(({ finished }) => {
|
|
25
25
|
if (finished)
|
|
26
26
|
done();
|
|
27
27
|
});
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type VNode } from '@vue/runtime-core';
|
|
2
2
|
import type { IDescriptor } from '@symbiote-native/components';
|
|
3
|
-
export declare function descriptorToVue(node: IDescriptor): VNode;
|
|
3
|
+
export declare function descriptorToVue(node: IDescriptor, extraChildren?: readonly VNode[]): VNode;
|
|
@@ -4,10 +4,14 @@
|
|
|
4
4
|
// renderer → engine → Fabric, exactly like a hand-written h('view'). The React
|
|
5
5
|
// twin is `adapters/react/src/descriptor-to-react.ts`.
|
|
6
6
|
import { h } from '@vue/runtime-core';
|
|
7
|
-
|
|
7
|
+
// `extraChildren` are caller vnodes (a component's slot) that go after the descriptor's own
|
|
8
|
+
export function descriptorToVue(node, extraChildren = []) {
|
|
8
9
|
// String type → host element (the Vue renderer's createElement → descriptorFor maps it to
|
|
9
10
|
// a Fabric name); array children, since these are host elements, not slotted components.
|
|
10
|
-
return h(node.type, { ...node.props, key: node.key },
|
|
11
|
+
return h(node.type, { ...node.props, key: node.key }, [
|
|
12
|
+
...node.children.map(toChild),
|
|
13
|
+
...extraChildren,
|
|
14
|
+
]);
|
|
11
15
|
}
|
|
12
16
|
function toChild(child) {
|
|
13
17
|
return typeof child === 'string' ? child : descriptorToVue(child);
|
package/build/index.d.ts
CHANGED
|
@@ -25,9 +25,12 @@ export { TouchableNativeFeedback } from '@symbiote-native/components';
|
|
|
25
25
|
export type { INativeFeedbackBackground, IThemeAttrBackground, IRippleBackground, } from '@symbiote-native/components';
|
|
26
26
|
export type { ITouchableNativeFeedbackProps } from './components/touchable-native-feedback-props';
|
|
27
27
|
export type { IButtonProps } from './components/button-props';
|
|
28
|
+
export type { ICheckboxProps } from './components/checkbox-props';
|
|
28
29
|
export type { ITextInputProps } from './components/text-input/text-input-props';
|
|
29
30
|
export type { ITextInputHandle, ITextInputChangeEvent, } from '@symbiote-native/components';
|
|
30
31
|
export { VirtualizedList } from './components/virtualized-list';
|
|
32
|
+
export { useVirtualizedListScope } from './components/virtualized-list/nested-scope';
|
|
33
|
+
export type { IListScope } from '@symbiote-native/components';
|
|
31
34
|
export type { IVirtualizedListProps, IVirtualizedListSlots, IVirtualizedListEmits, IVirtualizedListHandle, ISeparators, ISeparatorProps, IViewToken, IViewableItemsChangedInfo, IViewabilityConfig, IViewabilityConfigCallbackPair, ICellLayout, } from './components/virtualized-list';
|
|
32
35
|
export { FlatList } from './components/flat-list';
|
|
33
36
|
export type { IFlatListProps, IFlatListSlots, IFlatListEmits, IFlatListHandle, } from './components/flat-list';
|
|
@@ -36,6 +39,8 @@ export type { IVirtualizedSectionListProps, IVirtualizedSectionListSlots, IVirtu
|
|
|
36
39
|
export { SectionList } from './components/section-list';
|
|
37
40
|
export type { ISection, ISectionListProps, ISectionListSlots, ISectionListEmits, ISectionListHandle, } from './components/section-list';
|
|
38
41
|
export type { ISafeAreaViewProps } from './components/safe-area-view-props';
|
|
42
|
+
export type { ILayoutConformanceProps } from './components/layout-conformance-props';
|
|
43
|
+
export type { ILayoutConformanceMode } from '@symbiote-native/components';
|
|
39
44
|
export type { IRefreshControlProps } from './components/refresh-control-props';
|
|
40
45
|
export { descriptorToVue } from './descriptor-to-vue';
|
|
41
46
|
export { normalizeVueAttrs } from './utils/normalize-attrs';
|
|
@@ -50,19 +55,22 @@ export { KeyboardAvoidingView } from './components/keyboard-avoiding-view';
|
|
|
50
55
|
export type { IKeyboardAvoidingBehavior, IKeyboardAvoidingViewProps, IKeyboardAvoidingViewEmits, } from './components/keyboard-avoiding-view';
|
|
51
56
|
export { StatusBar } from './modules/status-bar';
|
|
52
57
|
export type { IStatusBarProps, IStatusBarStyle } from './modules/status-bar';
|
|
53
|
-
export { AppRegistry, setHostRegistrar } from './modules/app-registry';
|
|
54
|
-
export type { IComponentProvider, IAppParameters, IRunnable, IHostRegistrar, IWrapperComponentProvider, IRegistry, IHeadlessTask, ITaskProvider, ITaskCanceller, ITaskCancelProvider, } from './modules/app-registry';
|
|
58
|
+
export { AppRegistry, HeadlessJsTaskError, setHostRegistrar, } from './modules/app-registry';
|
|
59
|
+
export type { IComponentProvider, IAppConfig, IAppParameters, IRunnable, IHostRegistrar, IWrapperComponentProvider, IRegistry, IHeadlessTask, ITaskProvider, ITaskCanceller, ITaskCancelProvider, } from './modules/app-registry';
|
|
55
60
|
export { useColorScheme } from './composables/use-color-scheme';
|
|
61
|
+
export { useAnimatedColor, useAnimatedValue, useAnimatedValueXY, } from './composables/use-animated-value';
|
|
56
62
|
export { useWindowDimensions } from './composables/use-window-dimensions';
|
|
57
63
|
export { createPermissionHook } from './composables/create-permission-hook';
|
|
58
64
|
export { createResourceHook } from './composables/create-resource-hook';
|
|
65
|
+
export { defineNativeViewComponent } from './composables/define-native-view-component';
|
|
59
66
|
export { createEventValueHook } from './composables/create-event-value-hook';
|
|
60
|
-
export {
|
|
67
|
+
export { useEvent, useEventListener } from './composables/use-event';
|
|
68
|
+
export { Alert, Share, ActionSheetIOS, Linking, Vibration, ToastAndroid, Settings, I18nManager, Dimensions, Appearance, AppState, Keyboard, KEYBOARD_EVENT, TextInputState, BackHandler, PermissionsAndroid, PERMISSIONS, RESULTS, AccessibilityInfo, LayoutAnimation, } from '@symbiote-native/engine';
|
|
61
69
|
export type { IAlertType, IAlertButtonStyle, IAlertButton, IAlertButtons, IAlertOptions, IShareContent, IShareOptions, IShareAction, IActionSheetIOSOptions, IShareActionSheetIOSOptions, IShareActionSheetError, IUrlEvent, II18nManagerConstants, IDisplayMetrics, IDisplayMetricsAndroid, IDimensionsPayload, IDimensionsSet, IDimensionsKey, IDimensionsChangeListener, IDimensionsStatic, IColorSchemeName, IColorSchemePreference, IAppStateStatus, IAppStateEvent, IKeyboardEventName, IKeyboardEvent, IKeyboardMetrics, IBackPressEventName, IBackPressHandler, IPermission, IPermissionStatus, IRationale, IAccessibilityChangeEvent, IAccessibilityChangeEventName, IAccessibilityChangeEventHandler, IAccessibilityAnnouncementFinishedEvent, IAnnounceForAccessibilityOptions, IAccessibilityEventType, ILayoutAnimationType, ILayoutAnimationProperty, ILayoutAnimationConfig, ILayoutAnimationAnim, } from '@symbiote-native/engine';
|
|
62
70
|
export { Platform, StyleSheet, processColor, setColorProcessor, dlog, isDebug, } from '@symbiote-native/engine';
|
|
63
71
|
export type { ISymbioteEvent, ISymbioteNode, IRootTag, } from '@symbiote-native/engine';
|
|
64
72
|
export type { IViewStyle, ITextStyle, IFlexAlign, IFlexJustify, IPlatformStatic, IPlatformOSType, IPlatformConstantsIOS, IPlatformConstantsAndroid, IPlatformSelectSpec, } from '@symbiote-native/engine';
|
|
65
|
-
export { setNativeViewConfigSource
|
|
73
|
+
export { setNativeViewConfigSource } from '@symbiote-native/engine';
|
|
66
74
|
export type { INativeViewConfig, INativeViewConfigSource, } from '@symbiote-native/engine';
|
|
67
75
|
export type { IEnterKeyHint, IInputMode, ISubmitBehavior, ITextInputSelection, IImageStatics, } from '@symbiote-native/components';
|
|
68
76
|
export { PixelRatio, PanResponder, PlatformColor, DynamicColorIOS, InteractionManager, } from '@symbiote-native/engine';
|
|
@@ -70,3 +78,7 @@ export type { IPixelRatioStatic } from '@symbiote-native/engine';
|
|
|
70
78
|
export type { IPanResponderGestureState, IPanResponderCallbacks, IGestureResponderHandlers, IPanResponderInstance, } from '@symbiote-native/engine';
|
|
71
79
|
export type { IColorValue, IOpaqueColorValue, IDynamicColorIOSTuple, } from '@symbiote-native/engine';
|
|
72
80
|
export type { IInteractionEvent, ISimpleTask, IPromiseTask, ITask, IHandle, } from '@symbiote-native/engine';
|
|
81
|
+
export { DeviceEventEmitter, Easing, EventEmitter, NativeAppEventEmitter, NativeEventEmitter, } from '@symbiote-native/engine';
|
|
82
|
+
export type { IEasing, IEasingFunction, IEmitterSubscription, IEventEmitter, IEventEmitterModule, IEventSubscription, INativeEventListener, } from '@symbiote-native/engine';
|
|
83
|
+
export { codegenNativeCommands, codegenNativeComponent, DevMenu, DevSettings, LogBox, NativeComponentRegistry, NativeModules, Networking, PushNotificationIOS, ReactNativeVersion, registerCallableModule, requireNativeComponent, Systrace, Touchable, TurboModuleRegistry, UIManager, UTFSequence, } from '@symbiote-native/engine';
|
|
84
|
+
export type { IDevSettings } from '@symbiote-native/engine';
|
package/build/index.js
CHANGED
|
@@ -6,34 +6,13 @@
|
|
|
6
6
|
// import sitting beside a re-export of the same specifier both go lazy under Metro's production
|
|
7
7
|
// `inlineRequires` and the registration silently never runs in a release build. See register.ts.
|
|
8
8
|
import './register.js';
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// `
|
|
12
|
-
// set. Volar/`@vue/language-core` generates virtual TS referencing `import(lib).unref`,
|
|
13
|
-
// `import(lib).GlobalComponents`, `.GlobalDirectives`, `.ShallowRef`, `.ObjectDirective` — always
|
|
14
|
-
// off `lib`'s ROOT import, never a subpath — so pointing `lib` at us without this line breaks
|
|
15
|
-
// EVERY `.vue` SFC's template check with `Cannot find name` the moment Volar's codegen touches any
|
|
16
|
-
// of them. `lib`'s other consumer, `optionsWrapper`'s `(await import(lib)).defineComponent(...)`,
|
|
17
|
-
// only fires for a plain `<script>` `export default {}` block (`isExportRawObject`,
|
|
18
|
-
// `@vue/language-core/lib/codegen/script/index.js`) — every `.vue` file in this repo uses
|
|
19
|
-
// `<script setup>`, so that branch never runs and defineComponent needing to resolve from here too
|
|
20
|
-
// is moot in practice, not something this wildcard has to get right on its own.
|
|
21
|
-
//
|
|
22
|
-
// WHY `lib` NEEDS TO BE US AT ALL: plain `"vue"` (Volar's default) types `__VLS_IntrinsicElements`
|
|
23
|
-
// and `GlobalComponents` off `vue`'s own `jsx-runtime`/ambient augmentation — the SAME
|
|
24
|
-
// `view`/`text`/`image`/`switch`-collide-with-real-SVG-elements problem documented in
|
|
25
|
-
// `jsx-runtime.ts` and `intrinsic-elements.ts`, but for `.vue` TEMPLATES rather than TSX. Volar's
|
|
26
|
-
// native-vs-component branch (`!isNativeTag(tag)`) reads `IntrinsicElements` from
|
|
27
|
-
// `import('${lib}/jsx-runtime')`, so redirecting `lib` to our own package is what finally reaches
|
|
28
|
-
// OUR jsx-runtime.ts (real `IViewProps`/`ITextProps`/… on all 4 collision tags) for those four.
|
|
9
|
+
// Volar reads `unref`, `GlobalComponents` and the rest off the ROOT import of `lib`, which is this
|
|
10
|
+
// package (`vueCompilerOptions.lib`), so the barrel re-exports all of `vue`
|
|
11
|
+
// Pointing `lib` here also routes `.vue` template tags to our `jsx-runtime.ts` and its prop types
|
|
29
12
|
export * from 'vue';
|
|
30
13
|
export { mount, unmount, setAppConfigurator } from './render.js';
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// target in the SAME surface — including one you only hold a ref to — and keeps the content's
|
|
34
|
-
// reactive owner at the call site (provide/inject resolve from where it was written). Reaching a
|
|
35
|
-
// second, independently mount()ed surface is a different mechanism: createTunnel, which copies
|
|
36
|
-
// into an <Out/> the destination has to render. See create-portal/index.ts.
|
|
14
|
+
// Vue's `Teleport` moves host nodes within one surface, `to` must be a node this renderer mounted
|
|
15
|
+
// Another `mount()`ed surface is the job of `createTunnel`, see create-portal/index.ts
|
|
37
16
|
export { Teleport } from './create-portal/index.js';
|
|
38
17
|
export { createTunnel } from './create-tunnel/index.js';
|
|
39
18
|
// Vue's own Transition/TransitionGroup are runtime-dom-only (CSS class toggling) and
|
|
@@ -53,6 +32,7 @@ export { setImageSourceResolver } from '@symbiote-native/components';
|
|
|
53
32
|
// `TouchableNativeFeedback.Ripple(…)` / `.SelectableBackground(…)` are unchanged.
|
|
54
33
|
export { TouchableNativeFeedback } from '@symbiote-native/components';
|
|
55
34
|
export { VirtualizedList } from './components/virtualized-list/index.js';
|
|
35
|
+
export { useVirtualizedListScope } from './components/virtualized-list/nested-scope.js';
|
|
56
36
|
export { FlatList } from './components/flat-list/index.js';
|
|
57
37
|
export { VirtualizedSectionList } from './components/virtualized-section-list/index.js';
|
|
58
38
|
export { SectionList } from './components/section-list/index.js';
|
|
@@ -69,21 +49,28 @@ export { KeyboardAvoidingView } from './components/keyboard-avoiding-view.js';
|
|
|
69
49
|
export { StatusBar } from './modules/status-bar.js';
|
|
70
50
|
// RN's app entry point over `mount`. setHostRegistrar wires RN's own registrar so the native
|
|
71
51
|
// Fabric host finds our runnable by app key.
|
|
72
|
-
export { AppRegistry, setHostRegistrar } from './modules/app-registry/index.js';
|
|
52
|
+
export { AppRegistry, HeadlessJsTaskError, setHostRegistrar, } from './modules/app-registry/index.js';
|
|
73
53
|
// Vue composables over the core device-state modules.
|
|
74
54
|
export { useColorScheme } from './composables/use-color-scheme.js';
|
|
55
|
+
export { useAnimatedColor, useAnimatedValue, useAnimatedValueXY, } from './composables/use-animated-value.js';
|
|
75
56
|
export { useWindowDimensions } from './composables/use-window-dimensions.js';
|
|
76
57
|
export { createPermissionHook } from './composables/create-permission-hook.js';
|
|
77
58
|
export { createResourceHook } from './composables/create-resource-hook.js';
|
|
59
|
+
export { defineNativeViewComponent } from './composables/define-native-view-component.js';
|
|
78
60
|
export { createEventValueHook } from './composables/create-event-value-hook.js';
|
|
61
|
+
export { useEvent, useEventListener } from './composables/use-event.js';
|
|
79
62
|
// Imperative runtime modules: the SAME module both adapters share, re-exported from @symbiote-native/engine.
|
|
80
|
-
export { Alert, Share, ActionSheetIOS, Linking, Vibration, ToastAndroid, Settings, I18nManager, Dimensions, Appearance, AppState, Keyboard, KEYBOARD_EVENT, BackHandler, PermissionsAndroid, PERMISSIONS, RESULTS, AccessibilityInfo, LayoutAnimation, } from '@symbiote-native/engine';
|
|
63
|
+
export { Alert, Share, ActionSheetIOS, Linking, Vibration, ToastAndroid, Settings, I18nManager, Dimensions, Appearance, AppState, Keyboard, KEYBOARD_EVENT, TextInputState, BackHandler, PermissionsAndroid, PERMISSIONS, RESULTS, AccessibilityInfo, LayoutAnimation, } from '@symbiote-native/engine';
|
|
81
64
|
// Re-export the framework-agnostic engine surface (pure utilities + diagnostics).
|
|
82
65
|
export { Platform, StyleSheet, processColor, setColorProcessor, dlog, isDebug, } from '@symbiote-native/engine';
|
|
83
66
|
// Wired once by the app entry on a real host (like setColorProcessor): hands the engine
|
|
84
|
-
// RN's ViewConfig registry so third-party Fabric views auto-derive their metadata
|
|
85
|
-
|
|
86
|
-
export { setNativeViewConfigSource, setDeviceEventSource, } from '@symbiote-native/engine';
|
|
67
|
+
// RN's ViewConfig registry so third-party Fabric views auto-derive their metadata
|
|
68
|
+
export { setNativeViewConfigSource } from '@symbiote-native/engine';
|
|
87
69
|
// Pure utilities that moved to the engine (single source, both adapters re-export):
|
|
88
70
|
// PixelRatio + PanResponder, plus the color builders and the interaction scheduler.
|
|
89
71
|
export { PixelRatio, PanResponder, PlatformColor, DynamicColorIOS, InteractionManager, } from '@symbiote-native/engine';
|
|
72
|
+
// The device event bus and the easing curves, shared verbatim from the engine
|
|
73
|
+
export { DeviceEventEmitter, Easing, EventEmitter, NativeAppEventEmitter, NativeEventEmitter, } from '@symbiote-native/engine';
|
|
74
|
+
// RN's dev and native-module utilities, shared verbatim from the engine. The ones RN owns forward
|
|
75
|
+
// to its own module, which `registerApp` hands over
|
|
76
|
+
export { codegenNativeCommands, codegenNativeComponent, DevMenu, DevSettings, LogBox, NativeComponentRegistry, NativeModules, Networking, PushNotificationIOS, ReactNativeVersion, registerCallableModule, requireNativeComponent, Systrace, Touchable, TurboModuleRegistry, UIManager, UTFSequence, } from '@symbiote-native/engine';
|
package/build/jsx-runtime.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { IViewProps } from './components/view-props';
|
|
|
4
4
|
import type { ITextProps } from './components/text-props';
|
|
5
5
|
import type { IPressableProps } from './components/pressable-props';
|
|
6
6
|
import type { IButtonProps } from './components/button-props';
|
|
7
|
+
import type { ICheckboxProps } from './components/checkbox-props';
|
|
7
8
|
import type { IImageProps } from './components/image-props';
|
|
8
9
|
import type { IImageBackgroundProps } from './components/image-background-props';
|
|
9
10
|
import type { IInputAccessoryViewProps } from './components/input-accessory-view-props';
|
|
@@ -23,6 +24,7 @@ export interface ICrossedPrimitiveProps {
|
|
|
23
24
|
text: ITextProps;
|
|
24
25
|
pressable: IPressableProps;
|
|
25
26
|
button: IButtonProps;
|
|
27
|
+
checkbox: ICheckboxProps;
|
|
26
28
|
image: IImageProps;
|
|
27
29
|
'image-background': IImageBackgroundProps;
|
|
28
30
|
'input-accessory-view': IInputAccessoryViewProps;
|