├── .watchmanconfig
├── .nvmrc
├── src
├── __tests__
│ └── index.test.tsx
└── index.tsx
├── .gitattributes
├── tsconfig.build.json
├── Example
├── assets
│ ├── icon.png
│ ├── favicon.png
│ ├── adaptive-icon.png
│ ├── splash-icon.png
│ └── merry-christmas-png.png
├── tsconfig.json
├── index.js
├── babel.config.js
├── metro.config.js
├── package.json
├── app.json
└── src
│ └── App.tsx
├── screenshots
└── auto-scrolling.gif
├── babel.config.js
├── lefthook.yml
├── .editorconfig
├── .yarnrc.yml
├── .github
├── ISSUE_TEMPLATE
│ ├── config.yml
│ └── bug_report.yml
├── FUNDING.yml
├── actions
│ └── setup
│ │ └── action.yml
└── workflows
│ └── ci.yml
├── tsconfig.json
├── eslint.config.mjs
├── LICENSE
├── .gitignore
├── README.md
├── package.json
└── .yarn
└── plugins
└── @yarnpkg
└── plugin-workspace-tools.cjs
/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | v20.19.0
2 |
--------------------------------------------------------------------------------
/src/__tests__/index.test.tsx:
--------------------------------------------------------------------------------
1 | it.todo('write a test');
2 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.pbxproj -text
2 | # specific for windows script files
3 | *.bat text eol=crlf
4 |
--------------------------------------------------------------------------------
/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig",
3 | "exclude": ["example", "lib"]
4 | }
5 |
--------------------------------------------------------------------------------
/Example/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/homielab/react-native-auto-scroll/HEAD/Example/assets/icon.png
--------------------------------------------------------------------------------
/Example/assets/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/homielab/react-native-auto-scroll/HEAD/Example/assets/favicon.png
--------------------------------------------------------------------------------
/Example/assets/adaptive-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/homielab/react-native-auto-scroll/HEAD/Example/assets/adaptive-icon.png
--------------------------------------------------------------------------------
/Example/assets/splash-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/homielab/react-native-auto-scroll/HEAD/Example/assets/splash-icon.png
--------------------------------------------------------------------------------
/screenshots/auto-scrolling.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/homielab/react-native-auto-scroll/HEAD/screenshots/auto-scrolling.gif
--------------------------------------------------------------------------------
/Example/assets/merry-christmas-png.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/homielab/react-native-auto-scroll/HEAD/Example/assets/merry-christmas-png.png
--------------------------------------------------------------------------------
/Example/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig",
3 | "compilerOptions": {
4 | // Avoid expo-cli auto-generating a tsconfig
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | overrides: [
3 | {
4 | exclude: /\/node_modules\//,
5 | presets: ['module:react-native-builder-bob/babel-preset'],
6 | },
7 | {
8 | include: /\/node_modules\//,
9 | presets: ['module:@react-native/babel-preset'],
10 | },
11 | ],
12 | };
13 |
--------------------------------------------------------------------------------
/lefthook.yml:
--------------------------------------------------------------------------------
1 | pre-commit:
2 | parallel: true
3 | commands:
4 | lint:
5 | glob: "*.{js,ts,jsx,tsx}"
6 | run: npx eslint {staged_files}
7 | types:
8 | glob: "*.{js,ts, jsx, tsx}"
9 | run: npx tsc
10 | commit-msg:
11 | parallel: true
12 | commands:
13 | commitlint:
14 | run: npx commitlint --edit
15 |
--------------------------------------------------------------------------------
/Example/index.js:
--------------------------------------------------------------------------------
1 | import { registerRootComponent } from 'expo';
2 |
3 | import App from './src/App';
4 |
5 | // registerRootComponent calls AppRegistry.registerComponent('main', () => App);
6 | // It also ensures that whether you load the app in Expo Go or in a native build,
7 | // the environment is set up appropriately
8 | registerRootComponent(App);
9 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig helps developers define and maintain consistent
2 | # coding styles between different editors and IDEs
3 | # editorconfig.org
4 |
5 | root = true
6 |
7 | [*]
8 |
9 | indent_style = space
10 | indent_size = 2
11 |
12 | end_of_line = lf
13 | charset = utf-8
14 | trim_trailing_whitespace = true
15 | insert_final_newline = true
16 |
--------------------------------------------------------------------------------
/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | nodeLinker: node-modules
2 | nmHoistingLimits: workspaces
3 |
4 | plugins:
5 | - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
6 | spec: "@yarnpkg/plugin-interactive-tools"
7 | - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
8 | spec: "@yarnpkg/plugin-workspace-tools"
9 |
10 | yarnPath: .yarn/releases/yarn-3.6.1.cjs
11 |
--------------------------------------------------------------------------------
/Example/babel.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const { getConfig } = require('react-native-builder-bob/babel-config');
3 | const pkg = require('../package.json');
4 |
5 | const root = path.resolve(__dirname, '..');
6 |
7 | module.exports = function (api) {
8 | api.cache(true);
9 |
10 | return getConfig(
11 | {
12 | presets: ['babel-preset-expo'],
13 | },
14 | { root, pkg }
15 | );
16 | };
17 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: Feature Request 💡
4 | url: https://github.com/homielab/homielab-react-native-auto-scroll/discussions/new?category=ideas
5 | about: If you have a feature request, please create a new discussion on GitHub.
6 | - name: Discussions on GitHub 💬
7 | url: https://github.com/homielab/homielab-react-native-auto-scroll/discussions
8 | about: If this library works as promised but you need help, please ask questions there.
9 |
--------------------------------------------------------------------------------
/Example/metro.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const { getDefaultConfig } = require('@expo/metro-config');
3 | const { withMetroConfig } = require('react-native-monorepo-config');
4 |
5 | const root = path.resolve(__dirname, '..');
6 |
7 | /**
8 | * Metro configuration
9 | * https://facebook.github.io/metro/docs/configuration
10 | *
11 | * @type {import('metro-config').MetroConfig}
12 | */
13 | const config = withMetroConfig(getDefaultConfig(__dirname), {
14 | root,
15 | dirname: __dirname,
16 | });
17 |
18 | config.resolver.unstable_enablePackageExports = true;
19 |
20 | module.exports = config;
21 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: homielab
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/Example/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@homielab/react-native-auto-scroll-example",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "scripts": {
6 | "start": "expo start",
7 | "android": "expo start --android",
8 | "ios": "expo start --ios",
9 | "web": "expo start --web"
10 | },
11 | "dependencies": {
12 | "@expo/metro-runtime": "~5.0.4",
13 | "expo": "~53.0.20",
14 | "expo-status-bar": "~2.2.3",
15 | "react": "19.0.0",
16 | "react-dom": "19.0.0",
17 | "react-native": "0.79.5",
18 | "react-native-web": "~0.20.0"
19 | },
20 | "devDependencies": {
21 | "@babel/core": "^7.20.0",
22 | "react-native-builder-bob": "^0.40.13",
23 | "react-native-monorepo-config": "^0.1.9"
24 | },
25 | "private": true
26 | }
27 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "rootDir": ".",
4 | "paths": {
5 | "@homielab/react-native-auto-scroll": ["./src/index"]
6 | },
7 | "allowUnreachableCode": false,
8 | "allowUnusedLabels": false,
9 | "esModuleInterop": true,
10 | "forceConsistentCasingInFileNames": true,
11 | "jsx": "react-jsx",
12 | "lib": ["ESNext"],
13 | "module": "ESNext",
14 | "moduleResolution": "bundler",
15 | "noEmit": true,
16 | "noFallthroughCasesInSwitch": true,
17 | "noImplicitReturns": true,
18 | "noImplicitUseStrict": false,
19 | "noStrictGenericChecks": false,
20 | "noUncheckedIndexedAccess": true,
21 | "noUnusedLocals": true,
22 | "noUnusedParameters": true,
23 | "resolveJsonModule": true,
24 | "skipLibCheck": true,
25 | "strict": true,
26 | "target": "ESNext",
27 | "verbatimModuleSyntax": true
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Example/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "expo": {
3 | "name": "example",
4 | "slug": "example",
5 | "version": "1.0.0",
6 | "orientation": "portrait",
7 | "icon": "./assets/icon.png",
8 | "userInterfaceStyle": "light",
9 | "newArchEnabled": true,
10 | "splash": {
11 | "image": "./assets/splash-icon.png",
12 | "resizeMode": "contain",
13 | "backgroundColor": "#ffffff"
14 | },
15 | "ios": {
16 | "supportsTablet": true,
17 | "bundleIdentifier": "homielab.reactnativeautoscroll.example"
18 | },
19 | "android": {
20 | "adaptiveIcon": {
21 | "foregroundImage": "./assets/adaptive-icon.png",
22 | "backgroundColor": "#ffffff"
23 | },
24 | "edgeToEdgeEnabled": true,
25 | "package": "homielab.reactnativeautoscroll.example"
26 | },
27 | "web": {
28 | "favicon": "./assets/favicon.png"
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { fixupConfigRules } from '@eslint/compat';
2 | import { FlatCompat } from '@eslint/eslintrc';
3 | import js from '@eslint/js';
4 | import prettier from 'eslint-plugin-prettier';
5 | import { defineConfig } from 'eslint/config';
6 | import path from 'node:path';
7 | import { fileURLToPath } from 'node:url';
8 |
9 | const __filename = fileURLToPath(import.meta.url);
10 | const __dirname = path.dirname(__filename);
11 | const compat = new FlatCompat({
12 | baseDirectory: __dirname,
13 | recommendedConfig: js.configs.recommended,
14 | allConfig: js.configs.all,
15 | });
16 |
17 | export default defineConfig([
18 | {
19 | extends: fixupConfigRules(compat.extends('@react-native', 'prettier')),
20 | plugins: { prettier },
21 | rules: {
22 | 'react/react-in-jsx-scope': 'off',
23 | 'prettier/prettier': 'error',
24 | },
25 | },
26 | {
27 | ignores: ['node_modules/', 'lib/'],
28 | },
29 | ]);
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 homielab
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in all
12 | copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 | SOFTWARE.
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OSX
2 | #
3 | .DS_Store
4 |
5 | # XDE
6 | .expo/
7 |
8 | # VSCode
9 | .vscode/
10 | jsconfig.json
11 |
12 | # Xcode
13 | #
14 | build/
15 | *.pbxuser
16 | !default.pbxuser
17 | *.mode1v3
18 | !default.mode1v3
19 | *.mode2v3
20 | !default.mode2v3
21 | *.perspectivev3
22 | !default.perspectivev3
23 | xcuserdata
24 | *.xccheckout
25 | *.moved-aside
26 | DerivedData
27 | *.hmap
28 | *.ipa
29 | *.xcuserstate
30 | project.xcworkspace
31 | **/.xcode.env.local
32 |
33 | # Android/IJ
34 | #
35 | .classpath
36 | .cxx
37 | .gradle
38 | .idea
39 | .project
40 | .settings
41 | local.properties
42 | android.iml
43 |
44 | # Cocoapods
45 | #
46 | example/ios/Pods
47 |
48 | # Ruby
49 | example/vendor/
50 |
51 | # node.js
52 | #
53 | node_modules/
54 | npm-debug.log
55 | yarn-debug.log
56 | yarn-error.log
57 |
58 | # BUCK
59 | buck-out/
60 | \.buckd/
61 | android/app/libs
62 | android/keystores/debug.keystore
63 |
64 | # Yarn
65 | .yarn/*
66 | !.yarn/patches
67 | !.yarn/plugins
68 | !.yarn/releases
69 | !.yarn/sdks
70 | !.yarn/versions
71 |
72 | # Expo
73 | .expo/
74 |
75 | # Turborepo
76 | .turbo/
77 |
78 | # generated by bob
79 | lib/
80 |
81 | # React Native Codegen
82 | ios/generated
83 | android/generated
84 |
85 | # React Native Nitro Modules
86 | nitrogen/
87 |
--------------------------------------------------------------------------------
/.github/actions/setup/action.yml:
--------------------------------------------------------------------------------
1 | name: Setup
2 | description: Setup Node.js and install dependencies
3 |
4 | runs:
5 | using: composite
6 | steps:
7 | - name: Setup Node.js
8 | uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
9 | with:
10 | node-version-file: .nvmrc
11 |
12 | - name: Restore dependencies
13 | id: yarn-cache
14 | uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
15 | with:
16 | path: |
17 | **/node_modules
18 | .yarn/install-state.gz
19 | key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}-${{ hashFiles('**/package.json', '!node_modules/**') }}
20 | restore-keys: |
21 | ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
22 | ${{ runner.os }}-yarn-
23 |
24 | - name: Install dependencies
25 | if: steps.yarn-cache.outputs.cache-hit != 'true'
26 | run: yarn install --immutable
27 | shell: bash
28 |
29 | - name: Cache dependencies
30 | if: steps.yarn-cache.outputs.cache-hit != 'true'
31 | uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
32 | with:
33 | path: |
34 | **/node_modules
35 | .yarn/install-state.gz
36 | key: ${{ steps.yarn-cache.outputs.cache-primary-key }}
37 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 | on:
3 | push:
4 | branches:
5 | - main
6 | pull_request:
7 | branches:
8 | - main
9 | merge_group:
10 | types:
11 | - checks_requested
12 |
13 | jobs:
14 | lint:
15 | runs-on: ubuntu-latest
16 | steps:
17 | - name: Checkout
18 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
19 |
20 | - name: Setup
21 | uses: ./.github/actions/setup
22 |
23 | - name: Lint files
24 | run: yarn lint
25 |
26 | - name: Typecheck files
27 | run: yarn typecheck
28 |
29 | test:
30 | runs-on: ubuntu-latest
31 | steps:
32 | - name: Checkout
33 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
34 |
35 | - name: Setup
36 | uses: ./.github/actions/setup
37 |
38 | - name: Run unit tests
39 | run: yarn test --maxWorkers=2 --coverage
40 |
41 | build-library:
42 | runs-on: ubuntu-latest
43 | steps:
44 | - name: Checkout
45 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
46 |
47 | - name: Setup
48 | uses: ./.github/actions/setup
49 |
50 | - name: Build package
51 | run: yarn prepare
52 |
53 | build-web:
54 | runs-on: ubuntu-latest
55 | steps:
56 | - name: Checkout
57 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
58 |
59 | - name: Setup
60 | uses: ./.github/actions/setup
61 |
62 | - name: Build example for Web
63 | run: |
64 | yarn example expo export --platform web
65 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.yml:
--------------------------------------------------------------------------------
1 | name: 🐛 Bug report
2 | description: Report a reproducible bug or regression in this library.
3 | labels: [bug]
4 | body:
5 | - type: markdown
6 | attributes:
7 | value: |
8 | # Bug report
9 |
10 | 👋 Hi!
11 |
12 | **Please fill the following carefully before opening a new issue ❗**
13 | *(Your issue may be closed if it doesn't provide the required pieces of information)*
14 | - type: checkboxes
15 | attributes:
16 | label: Before submitting a new issue
17 | description: Please perform simple checks first.
18 | options:
19 | - label: I tested using the latest version of the library, as the bug might be already fixed.
20 | required: true
21 | - label: I tested using a [supported version](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md) of react native.
22 | required: true
23 | - label: I checked for possible duplicate issues, with possible answers.
24 | required: true
25 | - type: textarea
26 | id: summary
27 | attributes:
28 | label: Bug summary
29 | description: |
30 | Provide a clear and concise description of what the bug is.
31 | If needed, you can also provide other samples: error messages / stack traces, screenshots, gifs, etc.
32 | validations:
33 | required: true
34 | - type: input
35 | id: library-version
36 | attributes:
37 | label: Library version
38 | description: What version of the library are you using?
39 | placeholder: "x.x.x"
40 | validations:
41 | required: true
42 | - type: textarea
43 | id: react-native-info
44 | attributes:
45 | label: Environment info
46 | description: Run `react-native info` in your terminal and paste the results here.
47 | render: shell
48 | validations:
49 | required: true
50 | - type: textarea
51 | id: steps-to-reproduce
52 | attributes:
53 | label: Steps to reproduce
54 | description: |
55 | You must provide a clear list of steps and code to reproduce the problem.
56 | value: |
57 | 1. …
58 | 2. …
59 | validations:
60 | required: true
61 | - type: input
62 | id: reproducible-example
63 | attributes:
64 | label: Reproducible example repository
65 | description: Please provide a link to a repository on GitHub with a reproducible example.
66 | validations:
67 | required: true
68 |
--------------------------------------------------------------------------------
/Example/src/App.tsx:
--------------------------------------------------------------------------------
1 | import AutoScroll from '@homielab/react-native-auto-scroll';
2 | import * as React from 'react';
3 | import { Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
4 |
5 | const MSG = [
6 | 'Happy Birthday!',
7 | 'Congratulations on another year well lived',
8 | 'Best wishes on your birthday – may you have many, many more',
9 | 'Wishing you the happiest of birthdays',
10 | 'Best wishes for a fantastic person on your birthday',
11 | 'I hope you treat yourself to something special on your birthday – you deserve it!',
12 | ];
13 |
14 | export default class App extends React.Component {
15 | state = {
16 | msgIndex: 0,
17 | };
18 |
19 | updateText = () => {
20 | this.setState({
21 | msgIndex:
22 | this.state.msgIndex === MSG.length - 1 ? 0 : this.state.msgIndex + 1,
23 | });
24 | };
25 |
26 | render() {
27 | const msg = MSG[this.state.msgIndex];
28 | return (
29 |
30 |
31 |
35 |
36 |
37 |
38 |
39 | {msg}
40 |
41 |
42 |
43 |
44 |
45 | {msg}
46 |
47 |
48 |
49 |
50 |
51 | Change Birthday Wish
52 |
53 |
54 |
55 | );
56 | }
57 | }
58 |
59 | const styles = StyleSheet.create({
60 | container: {
61 | flex: 1,
62 | paddingTop: 200,
63 | backgroundColor: 'white',
64 | },
65 | image: {
66 | width: 200,
67 | height: 200,
68 | },
69 | banner: {
70 | backgroundColor: 'red',
71 | marginVertical: 10,
72 | padding: 10,
73 | },
74 | welcome: {
75 | color: 'white',
76 | fontSize: 20,
77 | fontWeight: 'bold',
78 | },
79 | buttonContainer: {
80 | marginTop: 10,
81 | alignItems: 'center',
82 | },
83 | button: {
84 | backgroundColor: 'blue',
85 | justifyContent: 'center',
86 | paddingVertical: 10,
87 | paddingHorizontal: 20,
88 | borderRadius: 20,
89 | maxWidth: 200,
90 | },
91 | buttonText: {
92 | color: 'white',
93 | textAlign: 'center',
94 | },
95 | });
96 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # @homielab/react-native-auto-scroll
2 |
3 | [](https://badge.fury.io/js/@homielab%2Freact-native-auto-scroll) [](https://circleci.com/gh/homielab/react-native-auto-scroll/tree/main) [](https://github.com/homielab/react-native-auto-scroll/graphs/contributors)
4 |
5 | Auto horizontal scroll. You only need to wrap the component between ``, it is the same as the `