{"_id":"@andresjesse/bobber-ui","_rev":"4-52d3fc2bc701c2aaeafae67bc1146377","name":"@andresjesse/bobber-ui","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.2":{"name":"@andresjesse/bobber-ui","version":"1.0.2","keywords":["react-native","ios","android"],"author":{"url":"https://github.com/andresjesse","name":"andresjesse","email":"andres.porfirio.tablet@gmail.com"},"license":"MIT","_id":"@andresjesse/bobber-ui@1.0.2","maintainers":[{"name":"andresjesse","email":"andres.porfirio@gmail.com"}],"homepage":"https://github.com/andresjesse/bobber-ui#readme","bugs":{"url":"https://github.com/andresjesse/bobber-ui/issues"},"dist":{"shasum":"f51a2a0c11942e940bf5c8073e84ef6610acca7f","tarball":"https://registry.npmjs.org/@andresjesse/bobber-ui/-/bobber-ui-1.0.2.tgz","fileCount":289,"integrity":"sha512-9vdsGPnALcO8ZwbrsRezy9nn9AXH4Q1IKG8Zg2cga9iyaDvrdvTGyFtxdpF/re8G2klkZbXU6GSRAM+OozCS4A==","signatures":[{"sig":"MEUCIQDiDevVARhVzv4Z2LN+jXVFdmrUm5ENopIGbLdmspSNvgIgXYsQP5qTLUieeaZGPtcuruZ+futPMuFZaJOjEgKPC5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257839},"jest":{"preset":"react-native","modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"02d54e39a7df5b53b4f6a96b85b5fc39b27f6756","scripts":{"ios":"yarn workspace bobber-ui-example ios","lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli lib","android":"yarn workspace bobber-ui-example android","example":"yarn workspace bobber-ui-example","prepare":"bob build","release":"release-it --only-version","typecheck":"tsc"},"_npmUser":{"name":"andresjesse","email":"andres.porfirio@gmail.com"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":false,"trailingComma":"es5"},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore: release ${version}"},"npm":{"publish":true},"github":{"release":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"repository":{"url":"git+https://github.com/andresjesse/bobber-ui.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.6.2","description":"Cross platform React Native UI.","directories":{},"_nodeVersion":"24.11.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"zod":"^4.1.12","expo":"~54.0.29","jest":"^29.7.0","react":"19.1.0","eslint":"^9.35.0","del-cli":"^6.0.0","zustand":"^5.0.8","lefthook":"^2.0.3","prettier":"^2.8.8","@eslint/js":"^9.35.0","commitlint":"^19.8.1","release-it":"^19.0.4","typescript":"^5.9.2","@types/jest":"^29.5.14","expo-router":"~6.0.19","@types/react":"^19.1.12","react-native":"0.81.5","@eslint/compat":"^1.3.2","expo-status-bar":"~3.0.9","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.17","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0","react-native-safe-area-context":"~5.6.0","@commitlint/config-conventional":"^19.8.1","react-native-keyboard-controller":"1.18.5","@release-it/conventional-changelog":"^10.0.1","@react-native-async-storage/async-storage":"2.2.0"},"peerDependencies":{"zod":"*","expo":"*","react":"*","zustand":"*","expo-router":"*","expo-linking":"*","react-native":"*","expo-constants":"*","expo-status-bar":"*","expo-splash-screen":"*","react-native-screens":"*","react-native-safe-area-context":"*","react-native-keyboard-controller":"*","@react-native-async-storage/async-storage":"*"},"_npmOperationalInternal":{"tmp":"tmp/bobber-ui_1.0.2_1775171633202_0.2056385991063283","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"library","tools":["jest","lefthook","release-it","eslint"],"version":"0.56.0","languages":"js"}},"1.0.3":{"name":"@andresjesse/bobber-ui","version":"1.0.3","description":"Cross platform React Native UI.","main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"source":"./src/index.ts","types":"./lib/typescript/src/index.d.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"scripts":{"example":"yarn workspace bobber-ui-example","android":"yarn workspace bobber-ui-example android","ios":"yarn workspace bobber-ui-example ios","clean":"del-cli lib","prepare":"bob build","typecheck":"tsc","test":"jest","release":"release-it --only-version","lint":"eslint \"**/*.{js,ts,tsx}\""},"keywords":["react-native","ios","android"],"repository":{"type":"git","url":"git+https://github.com/andresjesse/bobber-ui.git"},"author":{"name":"andresjesse","email":"andres.porfirio.tablet@gmail.com","url":"https://github.com/andresjesse"},"license":"MIT","bugs":{"url":"https://github.com/andresjesse/bobber-ui/issues"},"homepage":"https://github.com/andresjesse/bobber-ui#readme","publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"devDependencies":{"@commitlint/config-conventional":"^19.8.1","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","@eslint/js":"^9.35.0","@react-native-async-storage/async-storage":"2.2.0","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0","@release-it/conventional-changelog":"^10.0.1","@types/jest":"^29.5.14","@types/react":"^19.1.12","commitlint":"^19.8.1","del-cli":"^6.0.0","eslint":"^9.35.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","expo":"~54.0.29","expo-router":"~6.0.19","expo-status-bar":"~3.0.9","jest":"^29.7.0","lefthook":"^2.0.3","prettier":"^2.8.8","react":"19.1.0","react-native":"0.81.5","react-native-builder-bob":"^0.40.17","react-native-keyboard-controller":"1.18.5","react-native-safe-area-context":"~5.6.0","release-it":"^19.0.4","typescript":"^5.9.2","zod":"^4.1.12","zustand":"^5.0.12"},"peerDependencies":{"@react-native-async-storage/async-storage":"*","expo":"*","expo-constants":"*","expo-linking":"*","expo-router":"*","expo-splash-screen":"*","expo-status-bar":"*","react":"*","react-native":"*","react-native-keyboard-controller":"*","react-native-safe-area-context":"*","react-native-screens":"*","zod":"*","zustand":"*"},"workspaces":["example"],"packageManager":"yarn@4.11.0","react-native-builder-bob":{"source":"src","output":"lib","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"jest":{"preset":"react-native","modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"commitMessage":"chore: release ${version}","tagName":"v${version}"},"npm":{"publish":true},"github":{"release":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"prettier":{"quoteProps":"consistent","singleQuote":false,"tabWidth":2,"trailingComma":"es5","useTabs":false},"create-react-native-library":{"type":"library","languages":"js","tools":["jest","lefthook","release-it","eslint"],"version":"0.56.0"},"gitHead":"e04b7503a541ba42d1fff55faf624e4144cfd087","_id":"@andresjesse/bobber-ui@1.0.3","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-ozeP73osoTa1u3qokIcDeJcxX5I/y7sCix3n0WfWN6hJOQR+bYeT+n+8AUuMIZdY9F28CLg9yPi/lckR4ghyhg==","shasum":"751821c53d254517e669b3c22088b08776f0dda1","tarball":"https://registry.npmjs.org/@andresjesse/bobber-ui/-/bobber-ui-1.0.3.tgz","fileCount":294,"unpackedSize":282453,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD6k4Yxx7r8D0YnRT/DZ5Sp49w3t1JZOkMS8+rekvHlDgIgbmrV48rgpWAMU2+gzr+l+xJ1CfqiaIYahuNoo0TKeF8="}]},"_npmUser":{"name":"andresjesse","email":"andres.porfirio@gmail.com"},"directories":{},"maintainers":[{"name":"andresjesse","email":"andres.porfirio@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bobber-ui_1.0.3_1775774310631_0.3596395177260301"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-02T23:13:53.105Z","modified":"2026-04-09T22:38:30.865Z","1.0.1":"2026-04-02T23:06:39.908Z","1.0.2":"2026-04-02T23:13:53.348Z","1.0.3":"2026-04-09T22:38:30.770Z"},"bugs":{"url":"https://github.com/andresjesse/bobber-ui/issues"},"author":{"name":"andresjesse","email":"andres.porfirio.tablet@gmail.com","url":"https://github.com/andresjesse"},"license":"MIT","homepage":"https://github.com/andresjesse/bobber-ui#readme","keywords":["react-native","ios","android"],"repository":{"type":"git","url":"git+https://github.com/andresjesse/bobber-ui.git"},"description":"Cross platform React Native UI.","maintainers":[{"name":"andresjesse","email":"andres.porfirio@gmail.com"}],"readme":"# bobber-ui\n\n_A UI library just like bobber motorcycles: If it’s not essential for the ride, remove it!_\n\nCross platform React Native UI:\n\n- **Lightweight**: Just like the bike, this lib has no \"fat\" or unnecessary code;\n- **Customizable**: Bobbers are made to be unique. This lib allows the developer to customize components easily;\n- **Timeless**: The Bobber look never goes out of style because it’s based on classic proportions.\n\n## Installation\n\n1. Start a brand new expo project using \"Navigation (TypeScript)\" template:\n\n`yarn create expo --template`\n\n> Select \"Navigation (TypeScript)\"\n\n2. Add bobber-ui:\n\n```sh\nyarn add @andresjesse/bobber-ui\n```\n\n3. Add required dependencies:\n\n```sh\nnpx expo install @react-native-async-storage/async-storage react-native-keyboard-controller zustand zod\n```\n\n4. Update your Root Layout (`app/_layout.tsx`):\n\n```tsx\n// This is a minimal example, check \"example\" project for a full configuration.\n\nimport { Modal, ThemedStatusBar, ThemeProvider } from \"@andresjesse/bobber-ui\";\nimport { Stack } from \"expo-router\";\nimport { KeyboardProvider } from \"react-native-keyboard-controller\";\n\nexport default function RootLayout() {\n  return (\n    <KeyboardProvider>\n      <ThemeProvider defaultColorScheme=\"dark\">\n        <ThemedStatusBar />\n\n        <Stack\n          screenOptions={{\n            headerShown: false,\n            animation: \"fade\",\n          }}\n        />\n\n        <Modal />\n      </ThemeProvider>\n    </KeyboardProvider>\n  );\n}\n```\n\n5. Create a Home Screen (`app/index.tsx`):\n\n```tsx\nimport { Button, ScreenWrapper, Text } from \"@andresjesse/bobber-ui\";\n\nexport default function Screen() {\n  return (\n    <ScreenWrapper.Scrollable>\n      <Text h1>Home</Text>\n      <Button title=\"Hello Bobber\" />\n    </ScreenWrapper.Scrollable>\n  );\n}\n```\n\n## Usage\n\nCheck [example app](/example/) project.\n\n## Contributing\n\n- [Development workflow](CONTRIBUTING.md#development-workflow)\n- [Sending a pull request](CONTRIBUTING.md#sending-a-pull-request)\n- [Code of conduct](CODE_OF_CONDUCT.md)\n\n## Lib Development\n\nTo update this lib:\n\n- Make sure you have a NPM account and it has write permissions in the npm package;\n- Login to your account and generate a new Access Token with 2FA bypass enabled and marked for read and write;\n- Copy your token and add it to `.npmrc`: `//registry.npmjs.org/:_authToken=YOUR_TOKEN_HERE`\n- `yarn prepare`\n- `yarn release`\n\n### TODO:\n\n- Re-enable lefthook;\n- Review use-modal-close-on-back usePreventRemove usage (currently disabled);\n\n## Known Issues\n\n**Zustand Persist**:\n\n- Zustand persist middleware, when imported as `import { createJSONStorage, persist } from \"zustand/middleware\"` causes _\"Cannot use 'import.meta' outside a module\"_ error on Web platform. I've added a custom file in `src/helpers` to avoid it.\n\n## License\n\nMIT\n\n---\n\nMade with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)\n","readmeFilename":"README.md"}