react-native-gtkx 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/animated/composite.d.ts +5 -0
- package/dist/animated/composite.js +132 -0
- package/dist/animated/composite.js.map +1 -0
- package/dist/animated/create-animated.d.ts +12 -0
- package/dist/animated/create-animated.js +17 -0
- package/dist/animated/create-animated.js.map +1 -0
- package/dist/animated/easing.d.ts +11 -0
- package/dist/animated/easing.js +91 -0
- package/dist/animated/easing.js.map +1 -0
- package/dist/animated/frame-loop.d.ts +6 -0
- package/dist/animated/frame-loop.js +25 -0
- package/dist/animated/frame-loop.js.map +1 -0
- package/dist/animated/index.d.ts +6 -0
- package/dist/animated/index.js +7 -0
- package/dist/animated/index.js.map +1 -0
- package/dist/animated/interpolate.d.ts +2 -0
- package/dist/animated/interpolate.js +90 -0
- package/dist/animated/interpolate.js.map +1 -0
- package/dist/animated/native-driver.d.ts +1 -0
- package/dist/animated/native-driver.js +17 -0
- package/dist/animated/native-driver.js.map +1 -0
- package/dist/animated/spring.d.ts +3 -0
- package/dist/animated/spring.js +67 -0
- package/dist/animated/spring.js.map +1 -0
- package/dist/animated/timing.d.ts +3 -0
- package/dist/animated/timing.js +30 -0
- package/dist/animated/timing.js.map +1 -0
- package/dist/animated/types.d.ts +51 -0
- package/dist/animated/types.js +6 -0
- package/dist/animated/types.js.map +1 -0
- package/dist/animated/value-animation.d.ts +9 -0
- package/dist/animated/value-animation.js +65 -0
- package/dist/animated/value-animation.js.map +1 -0
- package/dist/animated/value.d.ts +46 -0
- package/dist/animated/value.js +130 -0
- package/dist/animated/value.js.map +1 -0
- package/dist/apis/alert.d.ts +16 -0
- package/dist/apis/alert.js +33 -0
- package/dist/apis/alert.js.map +1 -0
- package/dist/apis/app-state.d.ts +11 -0
- package/dist/apis/app-state.js +54 -0
- package/dist/apis/app-state.js.map +1 -0
- package/dist/apis/appearance.d.ts +12 -0
- package/dist/apis/appearance.js +33 -0
- package/dist/apis/appearance.js.map +1 -0
- package/dist/apis/dev-settings.d.ts +9 -0
- package/dist/apis/dev-settings.js +25 -0
- package/dist/apis/dev-settings.js.map +1 -0
- package/dist/apis/dimensions.d.ts +14 -0
- package/dist/apis/dimensions.js +80 -0
- package/dist/apis/dimensions.js.map +1 -0
- package/dist/apis/emitter.d.ts +8 -0
- package/dist/apis/emitter.js +35 -0
- package/dist/apis/emitter.js.map +1 -0
- package/dist/apis/hooks.d.ts +11 -0
- package/dist/apis/hooks.js +29 -0
- package/dist/apis/hooks.js.map +1 -0
- package/dist/apis/host.d.ts +45 -0
- package/dist/apis/host.gtkx.d.ts +2 -0
- package/dist/apis/host.gtkx.js +301 -0
- package/dist/apis/host.gtkx.js.map +1 -0
- package/dist/apis/host.js +6 -0
- package/dist/apis/host.js.map +1 -0
- package/dist/apis/index.d.ts +39 -0
- package/dist/apis/index.js +21 -0
- package/dist/apis/index.js.map +1 -0
- package/dist/apis/linking.d.ts +7 -0
- package/dist/apis/linking.js +28 -0
- package/dist/apis/linking.js.map +1 -0
- package/dist/apis/platform.d.ts +14 -0
- package/dist/apis/platform.js +23 -0
- package/dist/apis/platform.js.map +1 -0
- package/dist/components/activity-indicator.d.ts +10 -0
- package/dist/components/activity-indicator.js +21 -0
- package/dist/components/activity-indicator.js.map +1 -0
- package/dist/components/animated.d.ts +34 -0
- package/dist/components/animated.js +152 -0
- package/dist/components/animated.js.map +1 -0
- package/dist/components/app-registry.d.ts +14 -0
- package/dist/components/app-registry.js +61 -0
- package/dist/components/app-registry.js.map +1 -0
- package/dist/components/flat-list.d.ts +48 -0
- package/dist/components/flat-list.js +23 -0
- package/dist/components/flat-list.js.map +1 -0
- package/dist/components/host-node.d.ts +10 -0
- package/dist/components/host-node.js +10 -0
- package/dist/components/host-node.js.map +1 -0
- package/dist/components/image-loader.d.ts +17 -0
- package/dist/components/image-loader.js +54 -0
- package/dist/components/image-loader.js.map +1 -0
- package/dist/components/image.d.ts +19 -0
- package/dist/components/image.js +73 -0
- package/dist/components/image.js.map +1 -0
- package/dist/components/index.d.ts +14 -0
- package/dist/components/index.js +14 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/modal.d.ts +12 -0
- package/dist/components/modal.js +18 -0
- package/dist/components/modal.js.map +1 -0
- package/dist/components/pressable.d.ts +33 -0
- package/dist/components/pressable.js +116 -0
- package/dist/components/pressable.js.map +1 -0
- package/dist/components/rect-store.d.ts +17 -0
- package/dist/components/rect-store.js +40 -0
- package/dist/components/rect-store.js.map +1 -0
- package/dist/components/root.d.ts +8 -0
- package/dist/components/root.js +59 -0
- package/dist/components/root.js.map +1 -0
- package/dist/components/scroll-view.d.ts +56 -0
- package/dist/components/scroll-view.js +324 -0
- package/dist/components/scroll-view.js.map +1 -0
- package/dist/components/switch.d.ts +11 -0
- package/dist/components/switch.js +20 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/text-input.d.ts +23 -0
- package/dist/components/text-input.js +151 -0
- package/dist/components/text-input.js.map +1 -0
- package/dist/components/text.d.ts +11 -0
- package/dist/components/text.js +100 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/use-layout-child.d.ts +36 -0
- package/dist/components/use-layout-child.js +177 -0
- package/dist/components/use-layout-child.js.map +1 -0
- package/dist/components/view.d.ts +13 -0
- package/dist/components/view.js +60 -0
- package/dist/components/view.js.map +1 -0
- package/dist/components/virtualized-list.d.ts +67 -0
- package/dist/components/virtualized-list.js +519 -0
- package/dist/components/virtualized-list.js.map +1 -0
- package/dist/contracts.d.ts +119 -0
- package/dist/contracts.js +5 -0
- package/dist/contracts.js.map +1 -0
- package/dist/gtkx/bridge/index.d.ts +16 -0
- package/dist/gtkx/bridge/index.js +25 -0
- package/dist/gtkx/bridge/index.js.map +1 -0
- package/dist/gtkx/bridge/layout-manager.d.ts +11 -0
- package/dist/gtkx/bridge/layout-manager.js +87 -0
- package/dist/gtkx/bridge/layout-manager.js.map +1 -0
- package/dist/gtkx/bridge/measure.d.ts +9 -0
- package/dist/gtkx/bridge/measure.js +20 -0
- package/dist/gtkx/bridge/measure.js.map +1 -0
- package/dist/gtkx/bridge/theme.d.ts +4 -0
- package/dist/gtkx/bridge/theme.js +5 -0
- package/dist/gtkx/bridge/theme.js.map +1 -0
- package/dist/gtkx/bridge/view-box.d.ts +7 -0
- package/dist/gtkx/bridge/view-box.js +40 -0
- package/dist/gtkx/bridge/view-box.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/apply-style.d.ts +4 -0
- package/dist/layout/apply-style.js +148 -0
- package/dist/layout/apply-style.js.map +1 -0
- package/dist/layout/engine.d.ts +22 -0
- package/dist/layout/engine.js +90 -0
- package/dist/layout/engine.js.map +1 -0
- package/dist/layout/index.d.ts +3 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/node.d.ts +33 -0
- package/dist/layout/node.js +151 -0
- package/dist/layout/node.js.map +1 -0
- package/dist/layout/yoga.d.ts +13 -0
- package/dist/layout/yoga.js +52 -0
- package/dist/layout/yoga.js.map +1 -0
- package/dist/metro/index.d.ts +42 -0
- package/dist/metro/index.js +119 -0
- package/dist/metro/index.js.map +1 -0
- package/dist/runner/host-dev.d.ts +1 -0
- package/dist/runner/host-dev.js +208 -0
- package/dist/runner/host-dev.js.map +1 -0
- package/dist/runner/host.d.ts +1 -0
- package/dist/runner/host.js +101 -0
- package/dist/runner/host.js.map +1 -0
- package/dist/runner/index.d.ts +26 -0
- package/dist/runner/index.js +179 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/style/colors.d.ts +17 -0
- package/dist/style/colors.js +375 -0
- package/dist/style/colors.js.map +1 -0
- package/dist/style/dev-warning.d.ts +2 -0
- package/dist/style/dev-warning.js +18 -0
- package/dist/style/dev-warning.js.map +1 -0
- package/dist/style/index.d.ts +7 -0
- package/dist/style/index.js +14 -0
- package/dist/style/index.js.map +1 -0
- package/dist/style/registry.d.ts +12 -0
- package/dist/style/registry.gtkx.d.ts +2 -0
- package/dist/style/registry.gtkx.js +9 -0
- package/dist/style/registry.gtkx.js.map +1 -0
- package/dist/style/registry.js +23 -0
- package/dist/style/registry.js.map +1 -0
- package/dist/style/split-style.d.ts +6 -0
- package/dist/style/split-style.js +107 -0
- package/dist/style/split-style.js.map +1 -0
- package/dist/style/style-sheet.d.ts +43 -0
- package/dist/style/style-sheet.js +57 -0
- package/dist/style/style-sheet.js.map +1 -0
- package/dist/style/text-align.d.ts +7 -0
- package/dist/style/text-align.js +22 -0
- package/dist/style/text-align.js.map +1 -0
- package/dist/style/visual-css.d.ts +6 -0
- package/dist/style/visual-css.js +133 -0
- package/dist/style/visual-css.js.map +1 -0
- package/dist/vite/index.d.ts +53 -0
- package/dist/vite/index.js +127 -0
- package/dist/vite/index.js.map +1 -0
- package/package.json +88 -0
- package/react-native.config.js +21 -0
- package/types.d.ts +43 -0
- package/types.js +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualized-list.js","sourceRoot":"","sources":["../../src/components/virtualized-list.tsx"],"names":[],"mappings":"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","sourcesContent":["// The windowed list core (RN VirtualizedList model, leaner): only the rows\n// around the viewport are mounted; the content View carries the prefix-sum\n// height so the ScrollView gets the full range; every mounted cell is\n// absolutely positioned at its offset. Heights come from getItemLayout (exact)\n// or estimatedItemSize refined by per-cell onLayout; corrections above the\n// first visible row are anchored by compensating the scroll offset in the\n// same commit (docs/research/list-window.md).\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactElement,\n type ReactNode,\n} from \"react\"\nimport type { StyleProp } from \"../contracts\"\nimport { ActivityIndicator } from \"./activity-indicator\"\nimport {\n ScrollView,\n StickySlot,\n type ScrollEvent,\n type ScrollViewHandle,\n type ScrollViewProps,\n} from \"./scroll-view\"\nimport type { LayoutEvent } from \"./use-layout-child\"\nimport { View } from \"./view\"\n\nexport type ListRenderItemInfo<T> = { item: T; index: number }\n\nexport type ItemLayout = { length: number; offset: number; index: number }\n\n// RN ViewToken: one entry per item in the viewability report.\nexport type ViewToken<T = unknown> = {\n item: T\n key: string\n index: number\n isViewable: boolean\n}\n\nexport type ViewabilityConfig = {\n // Percent (0..100) of the ITEM that must be visible. A fully visible item\n // always counts, even when it covers less than the threshold.\n itemVisiblePercentThreshold?: number\n // Percent (0..100) of the VIEWPORT the item must cover. Takes precedence\n // over itemVisiblePercentThreshold when both are set (RN ViewabilityHelper).\n viewAreaCoveragePercentThreshold?: number\n // The item must stay continuously visible this many ms before it is\n // reported viewable; scrolling out before that cancels the report.\n minimumViewTime?: number\n}\n\n// RN FlatList scroll surface on top of ScrollViewHandle. The handle is not\n// generic: scrollToItem takes the item as unknown and resolves the index with\n// indexOf on the latest data.\nexport type VirtualizedListHandle = ScrollViewHandle & {\n scrollToIndex(params: {\n index: number\n viewPosition?: number\n animated?: boolean\n }): void\n scrollToItem(params: {\n item: unknown\n viewPosition?: number\n animated?: boolean\n }): void\n scrollToOffset(params: { offset: number; animated?: boolean }): void\n}\n\nexport type VirtualizedListProps<T> = Omit<ScrollViewProps, \"children\"> & {\n data: readonly T[]\n renderItem: (info: ListRenderItemInfo<T>) => ReactElement | null\n keyExtractor?: (item: T, index: number) => string\n estimatedItemSize?: number\n getItemLayout?: (data: readonly T[], index: number) => ItemLayout\n // Overscan in viewport multiples (RN semantics, default 5: two viewports\n // above, two below, one visible).\n windowSize?: number\n initialNumToRender?: number\n extraData?: unknown\n // RN inverted semantics: the list opens at the START of the data (visually\n // at the far end — a chat's latest message sits at the bottom), and\n // contentOffset counts from that end. See the projection math below.\n inverted?: boolean\n // RefreshControl parity. Desktop has no pull gesture: `refreshing` renders\n // a spinner row above the content; `onRefresh` is accepted for RN API\n // compatibility but is never triggered by a gesture — app code must call\n // it itself (e.g. from a toolbar button or a keyboard shortcut).\n refreshing?: boolean\n onRefresh?: () => void\n ItemSeparatorComponent?: ComponentType | null\n ListHeaderComponent?: ComponentType | ReactElement | null\n ListFooterComponent?: ComponentType | ReactElement | null\n ListEmptyComponent?: ComponentType | ReactElement | null\n onEndReached?: () => void\n onEndReachedThreshold?: number\n onViewableItemsChanged?: (info: {\n viewableItems: ViewToken<T>[]\n changed: ViewToken<T>[]\n }) => void\n viewabilityConfig?: ViewabilityConfig\n style?: StyleProp\n}\n\nconst renderAux = (\n component: ComponentType | ReactElement | null | undefined,\n): ReactNode => {\n if (component === null || component === undefined) {\n return null\n }\n if (typeof component === \"function\") {\n const Aux = component\n return <Aux />\n }\n return component\n}\n\n// First index whose offset-end is past `target` (binary search over prefix\n// sums; offsets has count+1 entries).\nconst indexAt = (offsets: number[], target: number): number => {\n let low = 0\n let high = offsets.length - 2\n while (low < high) {\n const mid = (low + high) >> 1\n if (offsets[mid + 1]! <= target) {\n low = mid + 1\n } else {\n high = mid\n }\n }\n return low\n}\n\nconst VirtualizedListInner = forwardRef(\n <T,>(\n {\n data,\n renderItem,\n keyExtractor,\n estimatedItemSize = 44,\n getItemLayout,\n windowSize = 5,\n initialNumToRender = 10,\n extraData,\n inverted = false,\n refreshing = false,\n onRefresh,\n ItemSeparatorComponent,\n ListHeaderComponent,\n ListFooterComponent,\n ListEmptyComponent,\n onEndReached,\n onEndReachedThreshold = 0.1,\n onViewableItemsChanged,\n viewabilityConfig,\n onScroll,\n onContentSizeChange,\n onLayout,\n horizontal = false,\n stickyHeaderIndices,\n ...scrollProps\n }: VirtualizedListProps<T>,\n ref: React.Ref<VirtualizedListHandle>,\n ) => {\n const count = data.length\n const scrollRef = useRef<ScrollViewHandle>(null)\n\n const measured = useRef<(number | undefined)[]>([])\n const [version, setVersion] = useState(0)\n // Scroll position along the main axis (contentOffset.x when horizontal).\n // Always in RAW adjustment space — all windowing math below is raw.\n const scrollY = useRef(0)\n // Viewport extent along the main axis (width when horizontal).\n const viewportH = useRef(0)\n // RN-space offset for inverted lists. RN's scaleY(-1) flip puts\n // contentOffset 0 at the far (raw) end of the content, so the exposed\n // offset counts from there: exposed = maxRaw - raw. It is the pinned\n // source of truth across content growth — restoring raw from it is what\n // keeps an inverted chat glued to its latest message on prepend.\n const exposedOffset = useRef(0)\n // Main-axis content size as GTK last reported it (the adjustment range).\n // The raw scroll maximum is contentMain - viewport; before the first\n // report it falls back to the list extent (header/footer not yet known).\n const contentMain = useRef(0)\n const pendingAnchor = useRef(0)\n // scrollToIndex issued while sizes were still estimates: re-run the\n // positioning once after the remount measures real sizes (≤2 scrollTo\n // corrections in total).\n const pendingScrollIndex = useRef<{\n index: number\n viewPosition: number\n animated?: boolean\n } | null>(null)\n const endReachedForSize = useRef(-1)\n // Currently reported viewable tokens keyed by item key (isViewable true).\n const viewableTokens = useRef(new Map<string, ViewToken<T>>())\n // Items meeting the viewability criteria but still waiting out\n // minimumViewTime; cancelled if they leave the viewport first.\n const viewabilityTimers = useRef(\n new Map<string, ReturnType<typeof setTimeout>>(),\n )\n // Keys whose minimumViewTime elapsed while continuously visible.\n const maturedKeys = useRef(new Set<string>())\n // Timers must call the LATEST closure (data may change while pending).\n const recomputeViewabilityRef = useRef<() => void>(() => {})\n\n // Prefix sums; rebuilt on any size correction (O(N) — cheap even at\n // 10k, see the spike). getItemLayout skips measuring entirely.\n const offsets = useMemo(() => {\n const out = new Array<number>(count + 1)\n out[0] = 0\n for (let index = 0; index < count; index += 1) {\n const size = getItemLayout\n ? getItemLayout(data, index).length\n : (measured.current[index] ?? estimatedItemSize)\n out[index + 1] = out[index]! + size\n }\n return out\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [count, version, estimatedItemSize, getItemLayout, data])\n\n // INVERTED PROJECTION. RN implements inverted as a scaleY(-1) flip of\n // the scroller and every cell; the net layout is the data mirrored\n // around the content extent C = offsets[count]: data index i occupies\n // [C - offsets[i+1], C - offsets[i]) in raw scroll space, so data index\n // 0 sits at the far end. The flip also reverses the scroll axis: RN's\n // contentOffset counts from that far end, so the raw GTK offset and the\n // exposed RN offset are complements (exposed = maxRaw - raw).\n const cellStart = (index: number): number =>\n inverted ? offsets[count]! - offsets[index + 1]! : offsets[index]!\n\n const keyOf = (item: T, index: number): string =>\n keyExtractor ? keyExtractor(item, index) : String(index)\n\n const [range, setRange] = useState(() => ({\n first: 0,\n last: Math.min(count, initialNumToRender) - 1,\n }))\n\n const updateRange = (): void => {\n const overscan = Math.max(1, (windowSize - 1) / 2) * viewportH.current\n // Window in visual (scroll) coordinates.\n let start = scrollY.current - overscan\n let end = scrollY.current + viewportH.current + overscan\n if (inverted) {\n // Map the visual window back to data-offset space: visual position v\n // covers data offsets C - v (mirror around the extent), so the\n // visual window [start, end] covers data offsets [C - end, C - start].\n const extent = offsets[count]!\n ;[start, end] = [extent - end, extent - start]\n }\n const first = indexAt(offsets, Math.max(0, start))\n const last = Math.min(count - 1, indexAt(offsets, end))\n setRange((current) =>\n current.first === first && current.last === last\n ? current\n : { first, last },\n )\n }\n\n // Clamp a scroll target to the valid range of the axis.\n const clampOffset = (target: number): number => {\n const max = Math.max(0, offsets[count]! - viewportH.current)\n return Math.min(max, Math.max(0, target))\n }\n\n // Raw scroll maximum along the main axis (adjustment upper - page).\n const maxRawScroll = (): number =>\n Math.max(0, (contentMain.current || offsets[count]!) - viewportH.current)\n\n // Translate an RN-space main-axis offset into raw adjustment space (and\n // back — the mapping is its own inverse).\n const toRaw = (offset: number): number =>\n Math.max(0, maxRawScroll() - offset)\n\n // Raw scroll offset that places `index` in the viewport: viewPosition 0\n // aligns the cell start with the viewport start, 0.5 centers it, 1\n // aligns the cell end with the viewport end. Inverted flips which edge\n // viewPosition 0 means: RN computes the target in data space and the\n // scaleY(-1) flip shows it from the other end, so 0 aligns the cell\n // with the visual BOTTOM — in mirrored raw coordinates that is the\n // complementary alignment.\n const offsetForIndex = (index: number, viewPosition: number): number => {\n const size = offsets[index + 1]! - offsets[index]!\n const align = inverted ? 1 - viewPosition : viewPosition\n return clampOffset(cellStart(index) - align * (viewportH.current - size))\n }\n\n const scrollToAxis = (offset: number, animated?: boolean): void => {\n scrollRef.current?.scrollTo(\n horizontal ? { x: offset, animated } : { y: offset, animated },\n )\n }\n\n const scrollToIndex = (params: {\n index: number\n viewPosition?: number\n animated?: boolean\n }): void => {\n if (count === 0) {\n return\n }\n const index = Math.min(count - 1, Math.max(0, Math.trunc(params.index)))\n const viewPosition = params.viewPosition ?? 0\n // Without getItemLayout the target may rest on estimates: remember the\n // request so the version effect can re-run the positioning once the\n // remounted cells have measured (the ≤2-corrections convergence).\n pendingScrollIndex.current = getItemLayout\n ? null\n : { index, viewPosition, animated: params.animated }\n scrollToAxis(offsetForIndex(index, viewPosition), params.animated)\n }\n\n useImperativeHandle(ref, () => ({\n // Any direct scroll cancels a pending scrollToIndex correction. The\n // caller always speaks RN-space offsets; inverted translates the main\n // axis into raw adjustment space.\n scrollTo: (options) => {\n pendingScrollIndex.current = null\n const main = horizontal ? options.x : options.y\n if (!inverted || main === undefined) {\n scrollRef.current?.scrollTo(options)\n return\n }\n scrollRef.current?.scrollTo({\n ...options,\n ...(horizontal ? { x: toRaw(main) } : { y: toRaw(main) }),\n })\n },\n scrollToEnd: (options) => {\n pendingScrollIndex.current = null\n // Inverted: the END of the data sits at raw offset 0 (visual top).\n if (inverted) {\n scrollToAxis(0, options?.animated)\n return\n }\n scrollRef.current?.scrollToEnd(options)\n },\n scrollToOffset: ({ offset, animated }) => {\n pendingScrollIndex.current = null\n scrollToAxis(inverted ? toRaw(offset) : offset, animated)\n },\n scrollToIndex,\n scrollToItem: ({ item, viewPosition, animated }) => {\n const index = data.indexOf(item as T)\n if (index >= 0) {\n scrollToIndex({ index, viewPosition, animated })\n }\n },\n }))\n\n // Data changes move the window in BOTH directions: growth from an empty\n // list must extend the initial range, shrinking must clamp it.\n useLayoutEffect(() => {\n updateRange()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [count])\n\n // Runs right after offsets rebuilt from new measurements. A pending\n // scrollToIndex supersedes anchoring: re-issue the (now refined) target\n // once and stop — this is the second and final correction.\n useLayoutEffect(() => {\n const pending = pendingScrollIndex.current\n if (pending) {\n pendingScrollIndex.current = null\n pendingAnchor.current = 0\n scrollToAxis(\n offsetForIndex(pending.index, pending.viewPosition),\n pending.animated,\n )\n return\n }\n // Anchor: apply the accumulated correction delta right after offsets\n // rebuilt, in the same frame — the viewport does not visually move.\n if (pendingAnchor.current !== 0) {\n const delta = pendingAnchor.current\n pendingAnchor.current = 0\n scrollToAxis(scrollY.current + delta)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [version])\n\n const onItemLayout = (index: number, size: number): void => {\n if (getItemLayout) {\n return\n }\n const known = measured.current[index] ?? estimatedItemSize\n if (Math.abs(known - size) < 0.5) {\n return\n }\n measured.current[index] = size\n // A size change shifts every cell BEFORE the changed one in visual\n // order — for a normal list that is cells above the window (index <\n // first), compensated by the anchor. Inverted lists skip the anchor\n // entirely: their correction is the exposed-offset restore on the\n // content-size report, which re-pins the view to the far end exactly\n // like RN's flip keeps contentOffset counting from there.\n if (!inverted && index < range.first) {\n pendingAnchor.current += size - known\n }\n setVersion((value) => value + 1)\n }\n\n // VIEWABILITY. Pure math over the prefix sums — no widget queries. All\n // positions are visual (scroll-space): cellStart already folds in the\n // inverted mirror and scrollY/viewportH track the main axis, so the same\n // code serves normal, inverted, and horizontal lists.\n const recomputeViewability = (): void => {\n if (!onViewableItemsChanged) {\n return\n }\n const viewport = viewportH.current\n const extent = offsets[count] ?? 0\n // Items currently meeting the visibility criteria, in index order.\n const eligible = new Map<string, { item: T; index: number }>()\n if (count > 0 && viewport > 0 && extent > 0) {\n const windowStart = scrollY.current\n const windowEnd = windowStart + viewport\n // Visible data-index range: mirror the visual window into data-offset\n // space when inverted (same mapping as updateRange, zero overscan).\n let start = windowStart\n let end = windowEnd\n if (inverted) {\n ;[start, end] = [extent - end, extent - start]\n }\n const first = indexAt(offsets, Math.max(0, start))\n const last = Math.min(count - 1, indexAt(offsets, end))\n const areaThreshold =\n viewabilityConfig?.viewAreaCoveragePercentThreshold\n const itemThreshold = viewabilityConfig?.itemVisiblePercentThreshold\n for (let index = first; index <= last; index += 1) {\n const length = offsets[index + 1]! - offsets[index]!\n const startPos = cellStart(index)\n const visible =\n Math.min(startPos + length, windowEnd) -\n Math.max(startPos, windowStart)\n if (visible <= 0) {\n continue\n }\n let viewable: boolean\n if (visible >= length) {\n // A fully visible item always counts, even when it covers less\n // than the configured share (RN ViewabilityHelper).\n viewable = true\n } else if (areaThreshold !== undefined) {\n viewable = (100 * visible) / viewport >= areaThreshold\n } else if (itemThreshold !== undefined) {\n viewable = (100 * visible) / length >= itemThreshold\n } else {\n // RN default: any visible pixel counts.\n viewable = true\n }\n if (viewable) {\n const item = data[index]!\n eligible.set(keyOf(item, index), { item, index })\n }\n }\n }\n const minimumViewTime = viewabilityConfig?.minimumViewTime ?? 0\n // Leaving the viewport cancels a pending timer and resets maturity —\n // re-entering restarts the continuous-visibility clock.\n for (const [key, timer] of viewabilityTimers.current) {\n if (!eligible.has(key)) {\n clearTimeout(timer)\n viewabilityTimers.current.delete(key)\n }\n }\n for (const key of maturedKeys.current) {\n if (!eligible.has(key)) {\n maturedKeys.current.delete(key)\n }\n }\n const next = new Map<string, ViewToken<T>>()\n for (const [key, entry] of eligible) {\n if (\n minimumViewTime <= 0 ||\n viewableTokens.current.has(key) ||\n maturedKeys.current.has(key)\n ) {\n next.set(key, {\n item: entry.item,\n key,\n index: entry.index,\n isViewable: true,\n })\n } else if (!viewabilityTimers.current.has(key)) {\n const timer = setTimeout(() => {\n viewabilityTimers.current.delete(key)\n maturedKeys.current.add(key)\n recomputeViewabilityRef.current()\n }, minimumViewTime)\n viewabilityTimers.current.set(key, timer)\n }\n }\n // Emit only when the viewable KEY SET changed: newly-viewable tokens\n // first, then the ones that left (isViewable false), each index-ordered.\n const changed: ViewToken<T>[] = []\n for (const token of next.values()) {\n if (!viewableTokens.current.has(token.key)) {\n changed.push(token)\n }\n }\n for (const token of viewableTokens.current.values()) {\n if (!next.has(token.key)) {\n changed.push({ ...token, isViewable: false })\n }\n }\n // Keep tokens fresh (indices may shift under stable keys) but stay\n // silent while the key set is unchanged.\n viewableTokens.current = next\n if (changed.length === 0) {\n return\n }\n onViewableItemsChanged({ viewableItems: [...next.values()], changed })\n }\n useLayoutEffect(() => {\n recomputeViewabilityRef.current = recomputeViewability\n })\n\n const maybeFireEndReached = (): void => {\n // Before the first layout the viewport extent is unknown — every\n // trigger path below re-runs once it is.\n if (!onEndReached || viewportH.current <= 0) {\n return\n }\n const extent = offsets[count]!\n const threshold =\n viewportH.current * Math.max(0, onEndReachedThreshold ?? 0.1)\n // Distance from the viewport to the DATA end (RN semantics: the end\n // of `data`, not the visual bottom). Normal lists keep the data end\n // at raw position `extent`; the inverted projection places it at raw\n // position 0 (the visual top), so the distance is simply the raw\n // scroll offset — an inverted chat fires this while scrolling up\n // into its history, which is where \"load older\" belongs.\n // Content shorter than the viewport has a negative distance, so short\n // lists fire right after the first layout without any scrolling.\n const distance = inverted\n ? scrollY.current\n : extent - (scrollY.current + viewportH.current)\n if (extent > 0 && distance <= threshold) {\n if (endReachedForSize.current !== extent) {\n endReachedForSize.current = extent\n onEndReached()\n }\n }\n }\n\n const handleScroll = (event: ScrollEvent): void => {\n const raw = horizontal\n ? event.nativeEvent.contentOffset.x\n : event.nativeEvent.contentOffset.y\n scrollY.current = raw\n if (inverted) {\n exposedOffset.current = Math.max(0, maxRawScroll() - raw)\n // The caller sees RN-space offsets: contentOffset 0 is the far end\n // where the data starts (a chat's latest message).\n onScroll?.({\n nativeEvent: {\n ...event.nativeEvent,\n contentOffset: {\n x: horizontal\n ? exposedOffset.current\n : event.nativeEvent.contentOffset.x,\n y: horizontal\n ? event.nativeEvent.contentOffset.y\n : exposedOffset.current,\n },\n },\n })\n } else {\n onScroll?.(event)\n }\n updateRange()\n recomputeViewability()\n maybeFireEndReached()\n }\n\n const handleLayout = (event: LayoutEvent): void => {\n onLayout?.(event)\n viewportH.current = horizontal\n ? event.nativeEvent.layout.width\n : event.nativeEvent.layout.height\n if (inverted) {\n // The viewport changed under a pinned exposed offset: re-derive the\n // raw position and window against the value we are about to take.\n // Best effort — the adjustment may still clamp against the previous\n // page size; the next content-size report settles it.\n scrollY.current = toRaw(exposedOffset.current)\n scrollToAxis(scrollY.current)\n }\n updateRange()\n // First layout doubles as the initial viewability/end-reached pass.\n recomputeViewability()\n maybeFireEndReached()\n }\n\n const handleContentSizeChange = (width: number, height: number): void => {\n onContentSizeChange?.(width, height)\n contentMain.current = horizontal ? width : height\n if (!inverted) {\n return\n }\n // The raw scroll range changed under a pinned exposed offset: restore\n // the raw value from it (the adjustment is fresh — GTK emits \"changed\"\n // only after the allocation that resized it). Content prepended to an\n // inverted chat therefore appears WITHOUT the view moving, exactly\n // like RN's contentOffset staying put under the flip. This also\n // performs the initial positioning: exposed 0 = the data start.\n const raw = toRaw(exposedOffset.current)\n scrollY.current = raw\n scrollToAxis(raw)\n updateRange()\n }\n\n // Data or measurement changes move content under a static viewport (no\n // scroll event fires): refresh viewability and the end-reached trigger.\n useEffect(() => {\n recomputeViewability()\n maybeFireEndReached()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [offsets])\n\n // Unmount: cancel every pending minimumViewTime timer.\n useEffect(() => {\n const timers = viewabilityTimers.current\n return () => {\n for (const timer of timers.values()) {\n clearTimeout(timer)\n }\n timers.clear()\n }\n }, [])\n\n // Sticky cells (vertical, non-inverted): the ACTIVE header must stay\n // mounted even when its own offset left the window — extend the mount\n // set with it; geometry comes from the registry offsets, pinning is the\n // ScrollView registry's job (same mechanism as plain sticky children).\n const stickySorted =\n stickyHeaderIndices && !horizontal && !inverted\n ? [...stickyHeaderIndices].sort((a, b) => a - b)\n : []\n let activeStickyIndex = -1\n for (const stickyIndex of stickySorted) {\n if (stickyIndex < count && cellStart(stickyIndex) <= scrollY.current) {\n activeStickyIndex = stickyIndex\n }\n }\n\n const renderCell = (index: number): ReactNode => {\n const item = data[index]!\n const key = keyOf(item, index)\n // Vertical cells stretch across the width and sit at their offset;\n // horizontal cells stretch across the height and take their own\n // width from content (so onLayout can measure it).\n const cellStyle: StyleProp = horizontal\n ? { position: \"absolute\", left: cellStart(index), top: 0, bottom: 0 }\n : { position: \"absolute\", left: 0, right: 0, top: cellStart(index) }\n const measure = (event: {\n nativeEvent: { layout: { width: number; height: number } }\n }): void =>\n onItemLayout(\n index,\n horizontal\n ? event.nativeEvent.layout.width\n : event.nativeEvent.layout.height,\n )\n const body = (\n <>\n {renderItem({ item, index })}\n {index < count - 1 && ItemSeparatorComponent ? (\n <ItemSeparatorComponent />\n ) : null}\n </>\n )\n if (stickySorted.includes(index)) {\n return (\n <StickySlot\n key={key}\n stickyKey={`cell-${key}`}\n top={cellStart(index)}\n style={cellStyle}\n onLayout={measure}\n >\n {body}\n </StickySlot>\n )\n }\n return (\n <View\n key={key}\n style={cellStyle}\n onLayout={measure}\n >\n {body}\n </View>\n )\n }\n\n const cells: ReactNode[] = []\n if (count > 0) {\n if (activeStickyIndex >= 0 && activeStickyIndex < range.first) {\n cells.push(renderCell(activeStickyIndex))\n }\n const last = Math.min(range.last, count - 1)\n for (let index = range.first; index <= last; index += 1) {\n cells.push(renderCell(index))\n }\n }\n\n // extraData participates in identity so memoized parents re-render rows.\n void extraData\n // Accepted for RN parity only; no desktop gesture ever calls it.\n void onRefresh\n\n return (\n <ScrollView\n {...scrollProps}\n horizontal={horizontal}\n ref={scrollRef}\n onScroll={handleScroll}\n onContentSizeChange={handleContentSizeChange}\n onLayout={handleLayout}\n >\n {refreshing ? (\n // Desktop RefreshControl: no pull gesture exists, so `refreshing`\n // simply shows an in-flow spinner row above the list content.\n <View style={{ alignItems: \"center\", padding: 8 }}>\n <ActivityIndicator />\n </View>\n ) : null}\n {/* RN's flip mirrors the chrome too: on an inverted list the footer\n sits at the visual top and the header at the visual bottom. */}\n {renderAux(inverted ? ListFooterComponent : ListHeaderComponent)}\n {count === 0 && renderAux(ListEmptyComponent)}\n {count > 0 && (\n <View\n style={\n horizontal\n ? { width: offsets[count]! }\n : { height: offsets[count]! }\n }\n >\n {cells}\n </View>\n )}\n {renderAux(inverted ? ListHeaderComponent : ListFooterComponent)}\n </ScrollView>\n )\n },\n)\nVirtualizedListInner.displayName = \"VirtualizedList\"\n\nexport const VirtualizedList = VirtualizedListInner as <T>(\n props: VirtualizedListProps<T> & { ref?: React.Ref<VirtualizedListHandle> },\n) => ReactElement\n"]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export type DimensionValue = number | `${number}%` | "auto";
|
|
2
|
+
export type FlexAlignType = "flex-start" | "flex-end" | "center" | "stretch" | "baseline";
|
|
3
|
+
export type LayoutStyle = Partial<{
|
|
4
|
+
alignContent: "flex-start" | "flex-end" | "center" | "stretch" | "space-between" | "space-around";
|
|
5
|
+
alignItems: FlexAlignType;
|
|
6
|
+
alignSelf: "auto" | FlexAlignType;
|
|
7
|
+
aspectRatio: number | string;
|
|
8
|
+
bottom: DimensionValue;
|
|
9
|
+
columnGap: number;
|
|
10
|
+
direction: "inherit" | "ltr" | "rtl";
|
|
11
|
+
display: "none" | "flex";
|
|
12
|
+
flex: number;
|
|
13
|
+
flexBasis: DimensionValue;
|
|
14
|
+
flexDirection: "row" | "row-reverse" | "column" | "column-reverse";
|
|
15
|
+
flexGrow: number;
|
|
16
|
+
flexShrink: number;
|
|
17
|
+
flexWrap: "wrap" | "nowrap" | "wrap-reverse";
|
|
18
|
+
gap: number;
|
|
19
|
+
height: DimensionValue;
|
|
20
|
+
justifyContent: "flex-start" | "flex-end" | "center" | "space-between" | "space-around" | "space-evenly";
|
|
21
|
+
left: DimensionValue;
|
|
22
|
+
margin: DimensionValue;
|
|
23
|
+
marginBottom: DimensionValue;
|
|
24
|
+
marginHorizontal: DimensionValue;
|
|
25
|
+
marginLeft: DimensionValue;
|
|
26
|
+
marginRight: DimensionValue;
|
|
27
|
+
marginTop: DimensionValue;
|
|
28
|
+
marginVertical: DimensionValue;
|
|
29
|
+
maxHeight: DimensionValue;
|
|
30
|
+
maxWidth: DimensionValue;
|
|
31
|
+
minHeight: DimensionValue;
|
|
32
|
+
minWidth: DimensionValue;
|
|
33
|
+
overflow: "visible" | "hidden" | "scroll";
|
|
34
|
+
padding: DimensionValue;
|
|
35
|
+
paddingBottom: DimensionValue;
|
|
36
|
+
paddingHorizontal: DimensionValue;
|
|
37
|
+
paddingLeft: DimensionValue;
|
|
38
|
+
paddingRight: DimensionValue;
|
|
39
|
+
paddingTop: DimensionValue;
|
|
40
|
+
paddingVertical: DimensionValue;
|
|
41
|
+
position: "absolute" | "relative" | "static";
|
|
42
|
+
right: DimensionValue;
|
|
43
|
+
rowGap: number;
|
|
44
|
+
top: DimensionValue;
|
|
45
|
+
width: DimensionValue;
|
|
46
|
+
}>;
|
|
47
|
+
export type TransformPart = {
|
|
48
|
+
translateX: number;
|
|
49
|
+
} | {
|
|
50
|
+
translateY: number;
|
|
51
|
+
} | {
|
|
52
|
+
scale: number;
|
|
53
|
+
} | {
|
|
54
|
+
scaleX: number;
|
|
55
|
+
} | {
|
|
56
|
+
scaleY: number;
|
|
57
|
+
} | {
|
|
58
|
+
rotate: `${number}deg` | `${number}rad`;
|
|
59
|
+
};
|
|
60
|
+
export type VisualStyle = Partial<{
|
|
61
|
+
backgroundColor: string;
|
|
62
|
+
borderBottomColor: string;
|
|
63
|
+
borderBottomLeftRadius: number;
|
|
64
|
+
borderBottomRightRadius: number;
|
|
65
|
+
borderBottomWidth: number;
|
|
66
|
+
borderColor: string;
|
|
67
|
+
borderLeftColor: string;
|
|
68
|
+
borderLeftWidth: number;
|
|
69
|
+
borderRadius: number;
|
|
70
|
+
borderRightColor: string;
|
|
71
|
+
borderRightWidth: number;
|
|
72
|
+
borderStyle: "solid" | "dotted" | "dashed";
|
|
73
|
+
borderTopColor: string;
|
|
74
|
+
borderTopLeftRadius: number;
|
|
75
|
+
borderTopRightRadius: number;
|
|
76
|
+
borderTopWidth: number;
|
|
77
|
+
borderWidth: number;
|
|
78
|
+
color: string;
|
|
79
|
+
fontFamily: string;
|
|
80
|
+
fontSize: number;
|
|
81
|
+
fontStyle: "normal" | "italic";
|
|
82
|
+
fontWeight: "normal" | "bold" | "100" | "200" | "300" | "400" | "500" | "600" | "700" | "800" | "900";
|
|
83
|
+
letterSpacing: number;
|
|
84
|
+
lineHeight: number;
|
|
85
|
+
opacity: number;
|
|
86
|
+
textAlign: "auto" | "left" | "right" | "center" | "justify";
|
|
87
|
+
transform: TransformPart[];
|
|
88
|
+
}>;
|
|
89
|
+
export type PointerEventsValue = "auto" | "none" | "box-none" | "box-only";
|
|
90
|
+
export type FlatStyle = LayoutStyle & VisualStyle & {
|
|
91
|
+
pointerEvents?: PointerEventsValue;
|
|
92
|
+
};
|
|
93
|
+
export type StyleProp<T = FlatStyle> = T | null | undefined | false | ReadonlyArray<StyleProp<T>>;
|
|
94
|
+
export type SplitStyle = {
|
|
95
|
+
layout: LayoutStyle;
|
|
96
|
+
visual: VisualStyle;
|
|
97
|
+
};
|
|
98
|
+
export type Rect = {
|
|
99
|
+
x: number;
|
|
100
|
+
y: number;
|
|
101
|
+
width: number;
|
|
102
|
+
height: number;
|
|
103
|
+
};
|
|
104
|
+
export type MeasureConstraintMode = "undefined" | "exactly" | "at-most";
|
|
105
|
+
export type MeasureSize = {
|
|
106
|
+
width: number;
|
|
107
|
+
height: number;
|
|
108
|
+
};
|
|
109
|
+
export type MeasureFn = (width: number, widthMode: MeasureConstraintMode, height: number, heightMode: MeasureConstraintMode) => MeasureSize;
|
|
110
|
+
export interface LayoutNodeApi {
|
|
111
|
+
setStyle(style: LayoutStyle): void;
|
|
112
|
+
setMeasureFn(measure: MeasureFn | null): void;
|
|
113
|
+
markDirty(): void;
|
|
114
|
+
getRect(): Rect | null;
|
|
115
|
+
setOnLayout(callback: ((rect: Rect) => void) | null): void;
|
|
116
|
+
}
|
|
117
|
+
export type SubscriptionHandle = {
|
|
118
|
+
remove(): void;
|
|
119
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Shared contracts between the layout engine (task 004), the style system
|
|
2
|
+
// (task 005), the API modules (task 007) and components (task 006).
|
|
3
|
+
// FROZEN during parallel development: changes go through the orchestrator only.
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,oEAAoE;AACpE,gFAAgF","sourcesContent":["// Shared contracts between the layout engine (task 004), the style system\n// (task 005), the API modules (task 007) and components (task 006).\n// FROZEN during parallel development: changes go through the orchestrator only.\n\n// --- style ------------------------------------------------------------------\n\nexport type DimensionValue = number | `${number}%` | \"auto\"\n\nexport type FlexAlignType =\n \"flex-start\" | \"flex-end\" | \"center\" | \"stretch\" | \"baseline\"\n\n// Layout-affecting props: classified by the style system (005), consumed by\n// the layout engine (004) which maps them onto Yoga node setters.\nexport type LayoutStyle = Partial<{\n alignContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"stretch\"\n | \"space-between\"\n | \"space-around\"\n alignItems: FlexAlignType\n alignSelf: \"auto\" | FlexAlignType\n aspectRatio: number | string\n bottom: DimensionValue\n columnGap: number\n direction: \"inherit\" | \"ltr\" | \"rtl\"\n display: \"none\" | \"flex\"\n flex: number\n flexBasis: DimensionValue\n flexDirection: \"row\" | \"row-reverse\" | \"column\" | \"column-reverse\"\n flexGrow: number\n flexShrink: number\n flexWrap: \"wrap\" | \"nowrap\" | \"wrap-reverse\"\n gap: number\n height: DimensionValue\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\"\n left: DimensionValue\n margin: DimensionValue\n marginBottom: DimensionValue\n marginHorizontal: DimensionValue\n marginLeft: DimensionValue\n marginRight: DimensionValue\n marginTop: DimensionValue\n marginVertical: DimensionValue\n maxHeight: DimensionValue\n maxWidth: DimensionValue\n minHeight: DimensionValue\n minWidth: DimensionValue\n overflow: \"visible\" | \"hidden\" | \"scroll\"\n padding: DimensionValue\n paddingBottom: DimensionValue\n paddingHorizontal: DimensionValue\n paddingLeft: DimensionValue\n paddingRight: DimensionValue\n paddingTop: DimensionValue\n paddingVertical: DimensionValue\n position: \"absolute\" | \"relative\" | \"static\"\n right: DimensionValue\n rowGap: number\n top: DimensionValue\n width: DimensionValue\n}>\n\nexport type TransformPart =\n | { translateX: number }\n | { translateY: number }\n | { scale: number }\n | { scaleX: number }\n | { scaleY: number }\n | { rotate: `${number}deg` | `${number}rad` }\n\n// Visual props: classified by the style system (005), compiled into GTK CSS\n// classes via the bridge `css` helper. Text-specific props apply to <Text>.\nexport type VisualStyle = Partial<{\n backgroundColor: string\n borderBottomColor: string\n borderBottomLeftRadius: number\n borderBottomRightRadius: number\n borderBottomWidth: number\n borderColor: string\n borderLeftColor: string\n borderLeftWidth: number\n borderRadius: number\n borderRightColor: string\n borderRightWidth: number\n borderStyle: \"solid\" | \"dotted\" | \"dashed\"\n borderTopColor: string\n borderTopLeftRadius: number\n borderTopRightRadius: number\n borderTopWidth: number\n borderWidth: number\n color: string\n fontFamily: string\n fontSize: number\n fontStyle: \"normal\" | \"italic\"\n fontWeight:\n | \"normal\"\n | \"bold\"\n | \"100\"\n | \"200\"\n | \"300\"\n | \"400\"\n | \"500\"\n | \"600\"\n | \"700\"\n | \"800\"\n | \"900\"\n letterSpacing: number\n lineHeight: number\n opacity: number\n // NOT emitted to CSS (no such GTK CSS property): the Text component (006)\n // applies it via label props using the pure style/text-align helper.\n textAlign: \"auto\" | \"left\" | \"right\" | \"center\" | \"justify\"\n // NOT emitted to CSS: applied by the engine through the layout manager\n // layout-child transforms (Animated fast path).\n transform: TransformPart[]\n}>\n\n// RN pointerEvents (also allowed in styles since RN 0.71); behavioral, so\n// it belongs to neither the layout nor the visual bucket — splitStyle\n// ignores it and View reads it from the flattened style.\nexport type PointerEventsValue = \"auto\" | \"none\" | \"box-none\" | \"box-only\"\n\nexport type FlatStyle = LayoutStyle &\n VisualStyle & {\n pointerEvents?: PointerEventsValue\n }\n\n// Style prop as components accept it: single object, array (with falsy holes).\nexport type StyleProp<T = FlatStyle> =\n T | null | undefined | false | ReadonlyArray<StyleProp<T>>\n\n// Result of classifying a flattened style (produced by 005):\nexport type SplitStyle = {\n layout: LayoutStyle\n visual: VisualStyle\n}\n\n// --- layout engine ----------------------------------------------------------\n\nexport type Rect = {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport type MeasureConstraintMode = \"undefined\" | \"exactly\" | \"at-most\"\n\nexport type MeasureSize = { width: number; height: number }\n\n// Measure callback for leaf nodes (text, images): implemented by components\n// using bridge probes; called by the engine during Yoga layout passes.\nexport type MeasureFn = (\n width: number,\n widthMode: MeasureConstraintMode,\n height: number,\n heightMode: MeasureConstraintMode,\n) => MeasureSize\n\n// Handle the engine gives every mounted component (004 implements, 006 consumes).\nexport interface LayoutNodeApi {\n setStyle(style: LayoutStyle): void\n setMeasureFn(measure: MeasureFn | null): void\n markDirty(): void\n getRect(): Rect | null\n setOnLayout(callback: ((rect: Rect) => void) | null): void\n}\n\n// --- subscriptions (007) ----------------------------------------------------\n\nexport type SubscriptionHandle = { remove(): void }\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
2
|
+
import * as Gdk from "@gtkx/gi/gdk";
|
|
3
|
+
import * as Gio from "@gtkx/gi/gio";
|
|
4
|
+
import * as GLib from "@gtkx/gi/glib";
|
|
5
|
+
import * as Graphene from "@gtkx/gi/graphene";
|
|
6
|
+
import * as Gsk from "@gtkx/gi/gsk";
|
|
7
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
8
|
+
import * as Pango from "@gtkx/gi/pango";
|
|
9
|
+
export { Adw, Gdk, Gio, GLib, Graphene, Gsk, Gtk, Pango };
|
|
10
|
+
export { GtkApplication, GtkApplicationWindow, GtkBox, GtkEntry, GtkGestureClick, GtkLabel, GtkPicture, GtkScrolledWindow, GtkSpinner, GtkSwitch, GtkTextView, GtkWindow, } from "@gtkx/jsx/gtk";
|
|
11
|
+
export { createPortal, createRoot, quit, useApplication, useParentWindow, useProperty, useSignal, type Root, } from "@gtkx/react";
|
|
12
|
+
export { css, cx, injectGlobal } from "@gtkx/css";
|
|
13
|
+
export { createTextProbe, measureWidget, toNumber } from "./measure";
|
|
14
|
+
export { getViewBoxComponent, setBoxPassthrough } from "./view-box";
|
|
15
|
+
export { allocateChild, attachRnLayout, detachRnLayout, queueAllocate, queueResize, type RnLayoutHooks, type RnLayoutOrientation, } from "./layout-manager";
|
|
16
|
+
export { colorScheme, styleManager } from "./theme";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// The ONLY module allowed to import @gtkx/* (enforced by eslint no-restricted-imports).
|
|
2
|
+
// gtkx is an RC dependency: when its API moves, this bridge absorbs the change.
|
|
3
|
+
//
|
|
4
|
+
// rc.1 caveats baked into this surface (see docs/research/yoga-gtk-spike.md):
|
|
5
|
+
// - 64-bit FFI values arrive as BigInt → normalize with toNumber() at this boundary
|
|
6
|
+
// import-then-export (not `export * as`): the latter is the one syntax the
|
|
7
|
+
// stock @react-native/babel-preset cannot transform — this form keeps
|
|
8
|
+
// consumer apps on their unmodified RN Babel config.
|
|
9
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
10
|
+
import * as Gdk from "@gtkx/gi/gdk";
|
|
11
|
+
import * as Gio from "@gtkx/gi/gio";
|
|
12
|
+
import * as GLib from "@gtkx/gi/glib";
|
|
13
|
+
import * as Graphene from "@gtkx/gi/graphene";
|
|
14
|
+
import * as Gsk from "@gtkx/gi/gsk";
|
|
15
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
16
|
+
import * as Pango from "@gtkx/gi/pango";
|
|
17
|
+
export { Adw, Gdk, Gio, GLib, Graphene, Gsk, Gtk, Pango };
|
|
18
|
+
export { GtkApplication, GtkApplicationWindow, GtkBox, GtkEntry, GtkGestureClick, GtkLabel, GtkPicture, GtkScrolledWindow, GtkSpinner, GtkSwitch, GtkTextView, GtkWindow, } from "@gtkx/jsx/gtk";
|
|
19
|
+
export { createPortal, createRoot, quit, useApplication, useParentWindow, useProperty, useSignal, } from "@gtkx/react";
|
|
20
|
+
export { css, cx, injectGlobal } from "@gtkx/css";
|
|
21
|
+
export { createTextProbe, measureWidget, toNumber } from "./measure";
|
|
22
|
+
export { getViewBoxComponent, setBoxPassthrough } from "./view-box";
|
|
23
|
+
export { allocateChild, attachRnLayout, detachRnLayout, queueAllocate, queueResize, } from "./layout-manager";
|
|
24
|
+
export { colorScheme, styleManager } from "./theme";
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gtkx/bridge/index.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,oFAAoF;AAEpF,2EAA2E;AAC3E,sEAAsE;AACtE,qDAAqD;AACrD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAC7C,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;AAEzD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,MAAM,EACN,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,cAAc,EACd,eAAe,EACf,WAAW,EACX,SAAS,GAEV,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,GAGZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA","sourcesContent":["// The ONLY module allowed to import @gtkx/* (enforced by eslint no-restricted-imports).\n// gtkx is an RC dependency: when its API moves, this bridge absorbs the change.\n//\n// rc.1 caveats baked into this surface (see docs/research/yoga-gtk-spike.md):\n// - 64-bit FFI values arrive as BigInt → normalize with toNumber() at this boundary\n\n// import-then-export (not `export * as`): the latter is the one syntax the\n// stock @react-native/babel-preset cannot transform — this form keeps\n// consumer apps on their unmodified RN Babel config.\nimport * as Adw from \"@gtkx/gi/adw\"\nimport * as Gdk from \"@gtkx/gi/gdk\"\nimport * as Gio from \"@gtkx/gi/gio\"\nimport * as GLib from \"@gtkx/gi/glib\"\nimport * as Graphene from \"@gtkx/gi/graphene\"\nimport * as Gsk from \"@gtkx/gi/gsk\"\nimport * as Gtk from \"@gtkx/gi/gtk\"\nimport * as Pango from \"@gtkx/gi/pango\"\n\nexport { Adw, Gdk, Gio, GLib, Graphene, Gsk, Gtk, Pango }\n\nexport {\n GtkApplication,\n GtkApplicationWindow,\n GtkBox,\n GtkEntry,\n GtkGestureClick,\n GtkLabel,\n GtkPicture,\n GtkScrolledWindow,\n GtkSpinner,\n GtkSwitch,\n GtkTextView,\n GtkWindow,\n} from \"@gtkx/jsx/gtk\"\n\nexport {\n createPortal,\n createRoot,\n quit,\n useApplication,\n useParentWindow,\n useProperty,\n useSignal,\n type Root,\n} from \"@gtkx/react\"\n\nexport { css, cx, injectGlobal } from \"@gtkx/css\"\n\nexport { createTextProbe, measureWidget, toNumber } from \"./measure\"\nexport { getViewBoxComponent, setBoxPassthrough } from \"./view-box\"\nexport {\n allocateChild,\n attachRnLayout,\n detachRnLayout,\n queueAllocate,\n queueResize,\n type RnLayoutHooks,\n type RnLayoutOrientation,\n} from \"./layout-manager\"\nexport { colorScheme, styleManager } from \"./theme\"\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
export type RnLayoutOrientation = "horizontal" | "vertical";
|
|
3
|
+
export type RnLayoutHooks = {
|
|
4
|
+
measure(orientation: RnLayoutOrientation, forSize: number): number;
|
|
5
|
+
allocate(width: number, height: number): void;
|
|
6
|
+
};
|
|
7
|
+
export declare const attachRnLayout: (widget: Gtk.Widget, hooks: RnLayoutHooks) => void;
|
|
8
|
+
export declare const detachRnLayout: (widget: Gtk.Widget) => void;
|
|
9
|
+
export declare const allocateChild: (child: Gtk.Widget, x: number, y: number, width: number, height: number) => void;
|
|
10
|
+
export declare const queueAllocate: (widget: Gtk.Widget) => void;
|
|
11
|
+
export declare const queueResize: (widget: Gtk.Widget) => void;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// RnGtkxLayout — a GObject subclass of GtkLayoutManager registered entirely
|
|
2
|
+
// from JS (docs/research/layout-manager.md, "B0"). The manager obeys ONLY the
|
|
3
|
+
// layout engine: measure() reports the engine-provided size (minimum ==
|
|
4
|
+
// natural, children are never queried) and allocate() delegates to the engine,
|
|
5
|
+
// which places every child at exactly its computed rect via allocateChild().
|
|
6
|
+
// This is what removes the GTK-vs-RN layout conflicts at the root: window
|
|
7
|
+
// minimum ratchet, overflow children inflating ancestors, and widget minimums
|
|
8
|
+
// pushing rects.
|
|
9
|
+
import * as Gdk from "@gtkx/gi/gdk";
|
|
10
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
11
|
+
import { registerClass } from "@gtkx/runtime";
|
|
12
|
+
// The class must exist before any instance is created, but registration needs
|
|
13
|
+
// GObject to be initialized — both hold after the bridge is imported, so the
|
|
14
|
+
// class is registered lazily on first attach (also keeps the module safe to
|
|
15
|
+
// import in environments without a display).
|
|
16
|
+
let RnGtkxLayoutClass = null;
|
|
17
|
+
const hooksByManager = new WeakMap();
|
|
18
|
+
const ensureRegistered = () => {
|
|
19
|
+
if (RnGtkxLayoutClass) {
|
|
20
|
+
return RnGtkxLayoutClass;
|
|
21
|
+
}
|
|
22
|
+
class RnGtkxLayout extends Gtk.LayoutManager {
|
|
23
|
+
measure(_widget, orientation, forSize) {
|
|
24
|
+
const hooks = hooksByManager.get(this);
|
|
25
|
+
if (!hooks) {
|
|
26
|
+
return [0, 0, -1, -1];
|
|
27
|
+
}
|
|
28
|
+
const size = hooks.measure(orientation === Gtk.Orientation.HORIZONTAL ? "horizontal" : "vertical", forSize);
|
|
29
|
+
return [size, size, -1, -1];
|
|
30
|
+
}
|
|
31
|
+
// Trailing vfunc params (baseline; widget) are dropped — JS tolerates the
|
|
32
|
+
// arity mismatch and the linter rejects unused trailing args.
|
|
33
|
+
allocate(_widget, width, height) {
|
|
34
|
+
hooksByManager.get(this)?.allocate(width, height);
|
|
35
|
+
}
|
|
36
|
+
getRequestMode() {
|
|
37
|
+
return Gtk.SizeRequestMode.CONSTANT_SIZE;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Explicit typeName: bundlers minify class names and registerClass derives
|
|
41
|
+
// the GType name from klass.name by default (FINDINGS §1).
|
|
42
|
+
registerClass(RnGtkxLayout, { typeName: "RnGtkxLayout" });
|
|
43
|
+
RnGtkxLayoutClass = RnGtkxLayout;
|
|
44
|
+
return RnGtkxLayout;
|
|
45
|
+
};
|
|
46
|
+
// Replaces the widget's layout manager with an RnGtkxLayout driven by `hooks`.
|
|
47
|
+
// The container must attach its children in a layout-child-free way (GtkBox
|
|
48
|
+
// append / set_parent) — GtkFixed.put demands a GtkFixedLayoutChild from the
|
|
49
|
+
// current manager and is incompatible (FINDINGS §2).
|
|
50
|
+
export const attachRnLayout = (widget, hooks) => {
|
|
51
|
+
const Klass = ensureRegistered();
|
|
52
|
+
if (hooksByManager.has(widget.getLayoutManager())) {
|
|
53
|
+
throw new Error("attachRnLayout: widget already has an RnGtkxLayout");
|
|
54
|
+
}
|
|
55
|
+
const manager = new Klass();
|
|
56
|
+
hooksByManager.set(manager, hooks);
|
|
57
|
+
widget.setLayoutManager(manager);
|
|
58
|
+
};
|
|
59
|
+
// Drops the hooks and hands layout back to a fresh manager of the widget's
|
|
60
|
+
// own class default. Safe to call on widgets that were never attached.
|
|
61
|
+
export const detachRnLayout = (widget) => {
|
|
62
|
+
const manager = widget.getLayoutManager();
|
|
63
|
+
if (!manager || !hooksByManager.has(manager)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
hooksByManager.delete(manager);
|
|
67
|
+
widget.setLayoutManager(null);
|
|
68
|
+
};
|
|
69
|
+
// Places one child at an exact rect. Only meaningful from inside an allocate()
|
|
70
|
+
// hook — GTK forbids size-allocating outside the layout phase.
|
|
71
|
+
export const allocateChild = (child, x, y, width, height) => {
|
|
72
|
+
child.sizeAllocate(new Gdk.Rectangle({
|
|
73
|
+
x: Math.round(x),
|
|
74
|
+
y: Math.round(y),
|
|
75
|
+
width: Math.max(0, Math.round(width)),
|
|
76
|
+
height: Math.max(0, Math.round(height)),
|
|
77
|
+
}), -1);
|
|
78
|
+
};
|
|
79
|
+
// Engine flush → new rects for the same container size: schedule allocation
|
|
80
|
+
// only. A measure-affecting change must use queueResize instead.
|
|
81
|
+
export const queueAllocate = (widget) => {
|
|
82
|
+
widget.queueAllocate();
|
|
83
|
+
};
|
|
84
|
+
export const queueResize = (widget) => {
|
|
85
|
+
widget.queueResize();
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=layout-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-manager.js","sourceRoot":"","sources":["../../../src/gtkx/bridge/layout-manager.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,wEAAwE;AACxE,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,8EAA8E;AAC9E,iBAAiB;AACjB,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAY7C,8EAA8E;AAC9E,6EAA6E;AAC7E,4EAA4E;AAC5E,6CAA6C;AAC7C,IAAI,iBAAiB,GAAyC,IAAI,CAAA;AAElE,MAAM,cAAc,GAAG,IAAI,OAAO,EAAoC,CAAA;AAEtE,MAAM,gBAAgB,GAAG,GAAgC,EAAE;IACzD,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IAED,MAAM,YAAa,SAAQ,GAAG,CAAC,aAAa;QACjC,OAAO,CACd,OAAmB,EACnB,WAA4B,EAC5B,OAAe;YAEf,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACvB,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CACxB,WAAW,KAAK,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EACtE,OAAO,CACR,CAAA;YACD,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7B,CAAC;QAED,0EAA0E;QAC1E,8DAA8D;QACrD,QAAQ,CACf,OAAmB,EACnB,KAAa,EACb,MAAc;YAEd,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACnD,CAAC;QAEQ,cAAc;YACrB,OAAO,GAAG,CAAC,eAAe,CAAC,aAAa,CAAA;QAC1C,CAAC;KACF;IAED,2EAA2E;IAC3E,2DAA2D;IAC3D,aAAa,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAA;IACzD,iBAAiB,GAAG,YAAY,CAAA;IAChC,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,6EAA6E;AAC7E,qDAAqD;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,MAAkB,EAClB,KAAoB,EACd,EAAE;IACR,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAuB,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACvE,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,KAAK,EAAE,CAAA;IAC3B,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAClC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,2EAA2E;AAC3E,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAkB,EAAQ,EAAE;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAA8B,CAAA;IACrE,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAM;IACR,CAAC;IACD,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9B,MAAM,CAAC,gBAAgB,CAAC,IAAoC,CAAC,CAAA;AAC/D,CAAC,CAAA;AAED,+EAA+E;AAC/E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAiB,EACjB,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACR,EAAE;IACR,KAAK,CAAC,YAAY,CAChB,IAAI,GAAG,CAAC,SAAS,CAAC;QAChB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KACxC,CAAC,EACF,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAED,4EAA4E;AAC5E,iEAAiE;AACjE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAkB,EAAQ,EAAE;IACxD,MAAM,CAAC,aAAa,EAAE,CAAA;AACxB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAkB,EAAQ,EAAE;IACtD,MAAM,CAAC,WAAW,EAAE,CAAA;AACtB,CAAC,CAAA","sourcesContent":["// RnGtkxLayout — a GObject subclass of GtkLayoutManager registered entirely\n// from JS (docs/research/layout-manager.md, \"B0\"). The manager obeys ONLY the\n// layout engine: measure() reports the engine-provided size (minimum ==\n// natural, children are never queried) and allocate() delegates to the engine,\n// which places every child at exactly its computed rect via allocateChild().\n// This is what removes the GTK-vs-RN layout conflicts at the root: window\n// minimum ratchet, overflow children inflating ancestors, and widget minimums\n// pushing rects.\nimport * as Gdk from \"@gtkx/gi/gdk\"\nimport * as Gtk from \"@gtkx/gi/gtk\"\nimport { registerClass } from \"@gtkx/runtime\"\n\nexport type RnLayoutOrientation = \"horizontal\" | \"vertical\"\n\nexport type RnLayoutHooks = {\n // Engine-provided size for the given axis; minimum == natural == this value.\n measure(orientation: RnLayoutOrientation, forSize: number): number\n // Called during GTK's allocation phase with the container's final size.\n // The engine must size-allocate every child (allocateChild) synchronously.\n allocate(width: number, height: number): void\n}\n\n// The class must exist before any instance is created, but registration needs\n// GObject to be initialized — both hold after the bridge is imported, so the\n// class is registered lazily on first attach (also keeps the module safe to\n// import in environments without a display).\nlet RnGtkxLayoutClass: (new () => Gtk.LayoutManager) | null = null\n\nconst hooksByManager = new WeakMap<Gtk.LayoutManager, RnLayoutHooks>()\n\nconst ensureRegistered = (): new () => Gtk.LayoutManager => {\n if (RnGtkxLayoutClass) {\n return RnGtkxLayoutClass\n }\n\n class RnGtkxLayout extends Gtk.LayoutManager {\n override measure(\n _widget: Gtk.Widget,\n orientation: Gtk.Orientation,\n forSize: number,\n ): [number, number, number, number] {\n const hooks = hooksByManager.get(this)\n if (!hooks) {\n return [0, 0, -1, -1]\n }\n const size = hooks.measure(\n orientation === Gtk.Orientation.HORIZONTAL ? \"horizontal\" : \"vertical\",\n forSize,\n )\n return [size, size, -1, -1]\n }\n\n // Trailing vfunc params (baseline; widget) are dropped — JS tolerates the\n // arity mismatch and the linter rejects unused trailing args.\n override allocate(\n _widget: Gtk.Widget,\n width: number,\n height: number,\n ): void {\n hooksByManager.get(this)?.allocate(width, height)\n }\n\n override getRequestMode(): Gtk.SizeRequestMode {\n return Gtk.SizeRequestMode.CONSTANT_SIZE\n }\n }\n\n // Explicit typeName: bundlers minify class names and registerClass derives\n // the GType name from klass.name by default (FINDINGS §1).\n registerClass(RnGtkxLayout, { typeName: \"RnGtkxLayout\" })\n RnGtkxLayoutClass = RnGtkxLayout\n return RnGtkxLayout\n}\n\n// Replaces the widget's layout manager with an RnGtkxLayout driven by `hooks`.\n// The container must attach its children in a layout-child-free way (GtkBox\n// append / set_parent) — GtkFixed.put demands a GtkFixedLayoutChild from the\n// current manager and is incompatible (FINDINGS §2).\nexport const attachRnLayout = (\n widget: Gtk.Widget,\n hooks: RnLayoutHooks,\n): void => {\n const Klass = ensureRegistered()\n if (hooksByManager.has(widget.getLayoutManager() as Gtk.LayoutManager)) {\n throw new Error(\"attachRnLayout: widget already has an RnGtkxLayout\")\n }\n const manager = new Klass()\n hooksByManager.set(manager, hooks)\n widget.setLayoutManager(manager)\n}\n\n// Drops the hooks and hands layout back to a fresh manager of the widget's\n// own class default. Safe to call on widgets that were never attached.\nexport const detachRnLayout = (widget: Gtk.Widget): void => {\n const manager = widget.getLayoutManager() as Gtk.LayoutManager | null\n if (!manager || !hooksByManager.has(manager)) {\n return\n }\n hooksByManager.delete(manager)\n widget.setLayoutManager(null as unknown as Gtk.LayoutManager)\n}\n\n// Places one child at an exact rect. Only meaningful from inside an allocate()\n// hook — GTK forbids size-allocating outside the layout phase.\nexport const allocateChild = (\n child: Gtk.Widget,\n x: number,\n y: number,\n width: number,\n height: number,\n): void => {\n child.sizeAllocate(\n new Gdk.Rectangle({\n x: Math.round(x),\n y: Math.round(y),\n width: Math.max(0, Math.round(width)),\n height: Math.max(0, Math.round(height)),\n }),\n -1,\n )\n}\n\n// Engine flush → new rects for the same container size: schedule allocation\n// only. A measure-affecting change must use queueResize instead.\nexport const queueAllocate = (widget: Gtk.Widget): void => {\n widget.queueAllocate()\n}\n\nexport const queueResize = (widget: Gtk.Widget): void => {\n widget.queueResize()\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
export type MeasureOrientation = "horizontal" | "vertical";
|
|
3
|
+
export type MeasureResult = {
|
|
4
|
+
minimum: number;
|
|
5
|
+
natural: number;
|
|
6
|
+
};
|
|
7
|
+
export declare const toNumber: (value: number | bigint) => number;
|
|
8
|
+
export declare const measureWidget: (widget: Gtk.Widget, orientation: MeasureOrientation, forSize?: number) => MeasureResult;
|
|
9
|
+
export declare const createTextProbe: () => Gtk.Label;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
// 64-bit FFI values cross the boundary as BigInt — normalize before doing math.
|
|
3
|
+
export const toNumber = (value) => typeof value === "bigint" ? Number(value) : value;
|
|
4
|
+
// Gtk.Widget.measure() works synchronously on unmapped widgets (request phase),
|
|
5
|
+
// returns [min, nat, minBaseline, natBaseline]. This is the Yoga measure input.
|
|
6
|
+
export const measureWidget = (widget, orientation, forSize = -1) => {
|
|
7
|
+
const gtkOrientation = orientation === "horizontal"
|
|
8
|
+
? Gtk.Orientation.HORIZONTAL
|
|
9
|
+
: Gtk.Orientation.VERTICAL;
|
|
10
|
+
const constraint = forSize > 0 ? Math.floor(forSize) : -1;
|
|
11
|
+
const [minimum, natural] = widget.measure(gtkOrientation, constraint);
|
|
12
|
+
return { minimum: toNumber(minimum), natural: toNumber(natural) };
|
|
13
|
+
};
|
|
14
|
+
// Offscreen label used as a Pango-backed text measurer for Yoga text nodes.
|
|
15
|
+
export const createTextProbe = () => {
|
|
16
|
+
const probe = new Gtk.Label();
|
|
17
|
+
probe.setWrap(true);
|
|
18
|
+
return probe;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.js","sourceRoot":"","sources":["../../../src/gtkx/bridge/measure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AASnC,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAU,EAAE,CACzD,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAEnD,gFAAgF;AAChF,gFAAgF;AAChF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,MAAkB,EAClB,WAA+B,EAC/B,OAAO,GAAG,CAAC,CAAC,EACG,EAAE;IACjB,MAAM,cAAc,GAClB,WAAW,KAAK,YAAY;QAC1B,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU;QAC5B,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAA;IAC9B,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;IACrE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAA;AACnE,CAAC,CAAA;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,GAAc,EAAE;IAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,CAAA;IAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACnB,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\"\n\nexport type MeasureOrientation = \"horizontal\" | \"vertical\"\n\nexport type MeasureResult = {\n minimum: number\n natural: number\n}\n\n// 64-bit FFI values cross the boundary as BigInt — normalize before doing math.\nexport const toNumber = (value: number | bigint): number =>\n typeof value === \"bigint\" ? Number(value) : value\n\n// Gtk.Widget.measure() works synchronously on unmapped widgets (request phase),\n// returns [min, nat, minBaseline, natBaseline]. This is the Yoga measure input.\nexport const measureWidget = (\n widget: Gtk.Widget,\n orientation: MeasureOrientation,\n forSize = -1,\n): MeasureResult => {\n const gtkOrientation =\n orientation === \"horizontal\"\n ? Gtk.Orientation.HORIZONTAL\n : Gtk.Orientation.VERTICAL\n const constraint = forSize > 0 ? Math.floor(forSize) : -1\n const [minimum, natural] = widget.measure(gtkOrientation, constraint)\n return { minimum: toNumber(minimum), natural: toNumber(natural) }\n}\n\n// Offscreen label used as a Pango-backed text measurer for Yoga text nodes.\nexport const createTextProbe = (): Gtk.Label => {\n const probe = new Gtk.Label()\n probe.setWrap(true)\n return probe\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
2
|
+
export const styleManager = () => Adw.StyleManager.getDefault();
|
|
3
|
+
// Appearance API (task 007) subscribes to notify::dark on the style manager.
|
|
4
|
+
export const colorScheme = () => styleManager().getDark() ? "dark" : "light";
|
|
5
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/gtkx/bridge/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AAInC,MAAM,CAAC,MAAM,YAAY,GAAG,GAAqB,EAAE,CACjD,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,CAAA;AAE/B,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,GAAgB,EAAE,CAC3C,YAAY,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA","sourcesContent":["import * as Adw from \"@gtkx/gi/adw\"\n\nexport type ColorScheme = \"light\" | \"dark\"\n\nexport const styleManager = (): Adw.StyleManager =>\n Adw.StyleManager.getDefault()\n\n// Appearance API (task 007) subscribes to notify::dark on the style manager.\nexport const colorScheme = (): ColorScheme =>\n styleManager().getDark() ? \"dark\" : \"light\"\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { createElementComponent } from "@gtkx/react/internal";
|
|
3
|
+
/** box-none toggle: picking consults this live, no invalidation needed. */
|
|
4
|
+
export declare const setBoxPassthrough: (widget: Gtk.Widget, enabled: boolean) => void;
|
|
5
|
+
type ViewBoxComponent = ReturnType<typeof createElementComponent>;
|
|
6
|
+
export declare const getViewBoxComponent: () => ViewBoxComponent;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// RnGtkxViewBox — the GtkBox subclass every View renders. Its contains()
|
|
2
|
+
// consults a per-widget flag: a "pass-through" box is never returned by
|
|
3
|
+
// GTK's pick (RN pointerEvents="box-none" — the box is transparent while
|
|
4
|
+
// children stay pickable, and toggling the mode never remounts the
|
|
5
|
+
// subtree); otherwise it reproduces the default bounds check. Registered
|
|
6
|
+
// lazily like RnGtkxLayout (registration needs GObject, class identity
|
|
7
|
+
// must exist before the first instance).
|
|
8
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
9
|
+
import { createElementComponent } from "@gtkx/react/internal";
|
|
10
|
+
import { registerClass } from "@gtkx/runtime";
|
|
11
|
+
const passthrough = new WeakSet();
|
|
12
|
+
/** box-none toggle: picking consults this live, no invalidation needed. */
|
|
13
|
+
export const setBoxPassthrough = (widget, enabled) => {
|
|
14
|
+
if (enabled) {
|
|
15
|
+
passthrough.add(widget);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
passthrough.delete(widget);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
let component = null;
|
|
22
|
+
export const getViewBoxComponent = () => {
|
|
23
|
+
if (component) {
|
|
24
|
+
return component;
|
|
25
|
+
}
|
|
26
|
+
class RnGtkxViewBox extends Gtk.Box {
|
|
27
|
+
contains(x, y) {
|
|
28
|
+
if (passthrough.has(this)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
// The default widget behavior: inside the widget's own bounds.
|
|
32
|
+
return x >= 0 && y >= 0 && x < this.getWidth() && y < this.getHeight();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Explicit typeName: bundlers minify class names.
|
|
36
|
+
registerClass(RnGtkxViewBox, { typeName: "RnGtkxViewBox" });
|
|
37
|
+
component = createElementComponent("RnGtkxViewBox");
|
|
38
|
+
return component;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=view-box.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-box.js","sourceRoot":"","sources":["../../../src/gtkx/bridge/view-box.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wEAAwE;AACxE,yEAAyE;AACzE,mEAAmE;AACnE,yEAAyE;AACzE,uEAAuE;AACvE,yCAAyC;AACzC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,WAAW,GAAG,IAAI,OAAO,EAAU,CAAA;AAEzC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAkB,EAClB,OAAgB,EACV,EAAE;IACR,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC,CAAA;AAID,IAAI,SAAS,GAA4B,IAAI,CAAA;AAE7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAqB,EAAE;IACxD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,aAAc,SAAQ,GAAG,CAAC,GAAG;QACxB,QAAQ,CAAC,CAAS,EAAE,CAAS;YACpC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAA;YACd,CAAC;YACD,+DAA+D;YAC/D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QACxE,CAAC;KACF;IACD,kDAAkD;IAClD,aAAa,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAA;IAC3D,SAAS,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAA;IACnD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA","sourcesContent":["// RnGtkxViewBox — the GtkBox subclass every View renders. Its contains()\n// consults a per-widget flag: a \"pass-through\" box is never returned by\n// GTK's pick (RN pointerEvents=\"box-none\" — the box is transparent while\n// children stay pickable, and toggling the mode never remounts the\n// subtree); otherwise it reproduces the default bounds check. Registered\n// lazily like RnGtkxLayout (registration needs GObject, class identity\n// must exist before the first instance).\nimport * as Gtk from \"@gtkx/gi/gtk\"\nimport { createElementComponent } from \"@gtkx/react/internal\"\nimport { registerClass } from \"@gtkx/runtime\"\n\nconst passthrough = new WeakSet<object>()\n\n/** box-none toggle: picking consults this live, no invalidation needed. */\nexport const setBoxPassthrough = (\n widget: Gtk.Widget,\n enabled: boolean,\n): void => {\n if (enabled) {\n passthrough.add(widget)\n } else {\n passthrough.delete(widget)\n }\n}\n\ntype ViewBoxComponent = ReturnType<typeof createElementComponent>\n\nlet component: ViewBoxComponent | null = null\n\nexport const getViewBoxComponent = (): ViewBoxComponent => {\n if (component) {\n return component\n }\n\n class RnGtkxViewBox extends Gtk.Box {\n override contains(x: number, y: number): boolean {\n if (passthrough.has(this)) {\n return false\n }\n // The default widget behavior: inside the widget's own bounds.\n return x >= 0 && y >= 0 && x < this.getWidth() && y < this.getHeight()\n }\n }\n // Explicit typeName: bundlers minify class names.\n registerClass(RnGtkxViewBox, { typeName: \"RnGtkxViewBox\" })\n component = createElementComponent(\"RnGtkxViewBox\")\n return component\n}\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ActivityIndicator, Animated, AppRegistry, Easing, FlatList, Image, Modal, Pressable, Root, SafeAreaView, ScrollView, SectionList, StatusBar, Switch, Text, TextInput, TouchableOpacity, View, type ActivityIndicatorProps, type FlatListProps, type ImageProps, type ImageSource, type LayoutEvent, type ListRenderItemInfo, type ModalProps, type PressableProps, type PressableStateCallbackType, type PressEvent, type RootProps, type RunApplicationParams, type ScrollEvent, type ScrollViewHandle, type ScrollViewProps, type SectionListProps, type SwitchProps, type TextInputProps, type TextProps, type TouchableOpacityProps, type ViewabilityConfig, type ViewProps, type ViewToken, } from "./components/index";
|
|
2
|
+
export type { FlatListHandle } from "./components/flat-list";
|
|
3
|
+
export { Alert, Appearance, AppState, DevSettings, Dimensions, Linking, Platform, useColorScheme, useWindowDimensions, type AlertButton, type AlertButtonStyle, type AlertOptions, type AppearancePreferences, type AppStateEvent, type AppStateStatus, type ColorSchemeName, type DimensionKey, type DimensionsPayload, type PlatformSelectSpec, type ScaledSize, } from "./apis/index";
|
|
4
|
+
export { PlatformColor, StyleSheet } from "./style/index";
|
|
5
|
+
export type { DimensionValue, FlatStyle, LayoutStyle, PointerEventsValue, StyleProp, TransformPart, VisualStyle, } from "./contracts";
|
|
6
|
+
export declare const version = "0.1.0";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Public surface of react-native-gtkx, mirroring the `react-native` module.
|
|
2
|
+
// Components: 006 · APIs: 007 · StyleSheet: 005 · layout engine underneath: 004.
|
|
3
|
+
export { ActivityIndicator, Animated, AppRegistry, Easing, FlatList, Image, Modal, Pressable, Root, SafeAreaView, ScrollView, SectionList, StatusBar, Switch, Text, TextInput, TouchableOpacity, View, } from "./components/index";
|
|
4
|
+
export { Alert, Appearance, AppState, DevSettings, Dimensions, Linking, Platform, useColorScheme, useWindowDimensions, } from "./apis/index";
|
|
5
|
+
export { PlatformColor, StyleSheet } from "./style/index";
|
|
6
|
+
export const version = "0.1.0";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,iFAAiF;AAEjF,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,MAAM,EACN,IAAI,EACJ,SAAS,EACT,gBAAgB,EAChB,IAAI,GAwBL,MAAM,oBAAoB,CAAA;AAM3B,OAAO,EACL,KAAK,EACL,UAAU,EACV,QAAQ,EACR,WAAW,EACX,UAAU,EACV,OAAO,EACP,QAAQ,EACR,cAAc,EACd,mBAAmB,GAYpB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAYzD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA","sourcesContent":["// Public surface of react-native-gtkx, mirroring the `react-native` module.\n// Components: 006 · APIs: 007 · StyleSheet: 005 · layout engine underneath: 004.\n\nexport {\n ActivityIndicator,\n Animated,\n AppRegistry,\n Easing,\n FlatList,\n Image,\n Modal,\n Pressable,\n Root,\n SafeAreaView,\n ScrollView,\n SectionList,\n StatusBar,\n Switch,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n type ActivityIndicatorProps,\n type FlatListProps,\n type ImageProps,\n type ImageSource,\n type LayoutEvent,\n type ListRenderItemInfo,\n type ModalProps,\n type PressableProps,\n type PressableStateCallbackType,\n type PressEvent,\n type RootProps,\n type RunApplicationParams,\n type ScrollEvent,\n type ScrollViewHandle,\n type ScrollViewProps,\n type SectionListProps,\n type SwitchProps,\n type TextInputProps,\n type TextProps,\n type TouchableOpacityProps,\n type ViewabilityConfig,\n type ViewProps,\n type ViewToken,\n} from \"./components/index\"\n\n// List scroll handle (scrollTo/scrollToEnd/scrollToIndex/scrollToItem/\n// scrollToOffset) — exported straight from the component module.\nexport type { FlatListHandle } from \"./components/flat-list\"\n\nexport {\n Alert,\n Appearance,\n AppState,\n DevSettings,\n Dimensions,\n Linking,\n Platform,\n useColorScheme,\n useWindowDimensions,\n type AlertButton,\n type AlertButtonStyle,\n type AlertOptions,\n type AppearancePreferences,\n type AppStateEvent,\n type AppStateStatus,\n type ColorSchemeName,\n type DimensionKey,\n type DimensionsPayload,\n type PlatformSelectSpec,\n type ScaledSize,\n} from \"./apis/index\"\n\nexport { PlatformColor, StyleSheet } from \"./style/index\"\n\nexport type {\n DimensionValue,\n FlatStyle,\n LayoutStyle,\n PointerEventsValue,\n StyleProp,\n TransformPart,\n VisualStyle,\n} from \"./contracts\"\n\nexport const version = \"0.1.0\"\n"]}
|