{"id":18596419,"url":"https://github.com/waynekim92/react-native-good-ui","last_synced_at":"2025-11-02T06:30:23.489Z","repository":{"id":153897693,"uuid":"583215248","full_name":"WayneKim92/react-native-good-ui","owner":"WayneKim92","description":"good UI that supports react-native based android, ios and web.","archived":false,"fork":false,"pushed_at":"2024-03-01T16:23:50.000Z","size":692,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-21T09:20:33.369Z","etag":null,"topics":["component","react","react-native","react-native-web"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WayneKim92.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-12-29T05:27:07.000Z","updated_at":"2024-09-23T10:48:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"1173d7dc-c41c-4a60-b476-7fce0d6a023a","html_url":"https://github.com/WayneKim92/react-native-good-ui","commit_stats":null,"previous_names":["waynekim92/good-ui"],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WayneKim92%2Freact-native-good-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WayneKim92%2Freact-native-good-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WayneKim92%2Freact-native-good-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WayneKim92%2Freact-native-good-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WayneKim92","download_url":"https://codeload.github.com/WayneKim92/react-native-good-ui/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239379326,"owners_count":19628684,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["component","react","react-native","react-native-web"],"created_at":"2024-11-07T01:24:17.084Z","updated_at":"2025-11-02T06:30:23.446Z","avatar_url":"https://github.com/WayneKim92.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# good-ui\n\ngood UI that supports react-native based android, ios and web\n\n![화면 기록 2024-03-02 오전 1 16 48](https://github.com/WayneKim92/good-ui/assets/75321423/84dc872a-6369-4da7-aa91-9c567c26ca4e)\n\n## Requirement\n```sh\n# Enter commend in root directory at your react-native project\n# If you want to use it in Web, refer to https://docs.expo.dev/versions/latest/sdk/reanimated/\nyarn add react-native-reanimated\n```\n\n## Installation\n\n```sh\nyarn add react-native-good-ui\n```\n\n## Usage\n\n```jsx\nimport React, { useState } from 'react';\nimport { StyleSheet, ViewStyle } from 'react-native';\nimport {\n  Button,\n  Column,\n  Divider,\n  EdgeInsets,\n  Input,\n  Row,\n  Select,\n  Spacer,\n  Text,\n  ZIndex,\n  storage,\n} from 'react-native-good-ui';\nimport {\n  useSharedValue,\n  useAnimatedStyle,\n  withSpring,\n} from 'react-native-reanimated';\n\nimport type { AnimateStyle } from 'react-native-reanimated';\n\nconst storageKey = '@storage_test';\n\nexport default function App() {\n  const [storageValue, setStorageValue] = useState('');\n\n  React.useEffect(() =\u003e {\n    const fetch = async () =\u003e {\n      const aStorage = await storage.load(storageKey);\n\n      if (aStorage) {\n        setStorageValue(\n          `Storage Value : ${aStorage}, but it will be removed  in the next run.`\n        );\n        await storage.remove(storageKey);\n      } else {\n        await storage.save(storageKey, 'hello world');\n        setStorageValue(\n          `Storage Value : null,  but It will be present in the next run.`\n        );\n      }\n    };\n\n    fetch().then();\n  }, []);\n\n  const offset = useSharedValue(0);\n\n  const animatedStyles = useAnimatedStyle(() =\u003e {\n    return {\n      transform: [{ translateX: offset.value }],\n    } as AnimateStyle\u003cViewStyle\u003e;\n  });\n\n  const body = (\n    \u003cReact.Fragment\u003e\n      \u003cText preset={'header3'}\u003eComponents\u003c/Text\u003e\n\n      \u003cSpacer preset={'large'} /\u003e\n\n      \u003cText preset={'header5'}\u003eDivider\u003c/Text\u003e\n\n      \u003cDivider /\u003e\n      \u003cDivider text={'message'} textEdgeInsets={'medium'} /\u003e\n\n      \u003cColumn style={{ height: 200 }} alignItems={'center'}\u003e\n        \u003cDivider\n          direction={'vertical'}\n          text={'Message'}\n          textEdgeInsets={'small'}\n        /\u003e\n      \u003c/Column\u003e\n      \u003cDivider direction={'vertical'} /\u003e\n\n      \u003cSpacer preset={'huge'} /\u003e\n\n      \u003cText preset={'header5'}\u003eSelect\u003c/Text\u003e\n      \u003cSelect\n        width={150}\n        options={['Option 1', 'Option 2', 'Option 3']}\n        style={{ zIndex: ZIndex.float + 1 }}\n        onSelect={(option) =\u003e console.log(option)}\n      /\u003e\n\n      \u003cSelect\n        options={['옵션 1', '옵션 2', '옵션 3']}\n        onSelect={(option) =\u003e console.log(option)}\n      /\u003e\n\n      \u003cSpacer preset={'huge'} /\u003e\n\n      \u003cText preset={'header5'}\u003eButton\u003c/Text\u003e\n      \u003cButton text={'Button'} onPress={() =\u003e console.log('onPress')} /\u003e\n\n      \u003cSpacer preset={'huge'} /\u003e\n      \u003cText preset={'header5'}\u003eInput\u003c/Text\u003e\n      \u003cInput placeholder={'입력'} /\u003e\n\n      \u003cSpacer preset={'huge'} /\u003e\n      \u003cText preset={'header5'}\u003eStorage\u003c/Text\u003e\n      \u003cText\u003e{storageValue}\u003c/Text\u003e\n\n      \u003cSpacer preset={'huge'} /\u003e\n\n      \u003cText preset={'header5'}\u003eAnimated View\u003c/Text\u003e\n      \u003cSpacer direction={'both'} preset={'medium'} /\u003e\n      \u003cRow\n        animatable={true}\n        elevation={24}\n        round={'medium'}\n        roundShape={'all'}\n        style={[styles.box, animatedStyles]}\n      /\u003e\n      \u003cSpacer preset={'large'} /\u003e\n      \u003cButton\n        onPress={() =\u003e {\n          offset.value = withSpring(Math.random() * 255);\n        }}\n        text={'Move'}\n      /\u003e\n\n      \u003cSpacer preset={'large'} /\u003e\n\n      \u003cText preset={'header5'}\u003eLayout\u003c/Text\u003e\n      \u003cSpacer preset={'medium'} /\u003e\n      \u003cColumn\n        style={styles.layout1}\n        round={'medium'}\n        edgeInsets={EdgeInsets.fromVH('medium', 'medium')}\n      \u003e\n        \u003cColumn style={styles.layout2} round={'small'} /\u003e\n      \u003c/Column\u003e\n\n      \u003cSpacer preset={'large'} /\u003e\n\n      \u003cText preset={'header5'}\u003eText\u003c/Text\u003e\n      \u003cText preset={'header1'}\u003eheader1\u003c/Text\u003e\n      \u003cText preset={'header2'}\u003eheader2\u003c/Text\u003e\n      \u003cText preset={'header3'}\u003eheader3\u003c/Text\u003e\n      \u003cText preset={'header4'}\u003eheader4\u003c/Text\u003e\n      \u003cText preset={'header5'}\u003eheader5\u003c/Text\u003e\n      \u003cText preset={'header6'}\u003eheader6\u003c/Text\u003e\n      \u003cText preset={'subtitle1'}\u003esubtitle1\u003c/Text\u003e\n      \u003cText preset={'subtitle2'}\u003esubtitle2\u003c/Text\u003e\n      \u003cText preset={'body1'}\u003ebody1\u003c/Text\u003e\n      \u003cText preset={'body2'}\u003ebody2\u003c/Text\u003e\n      \u003cText preset={'caption'}\u003ecaption\u003c/Text\u003e\n      \u003cText preset={'overline'}\u003eoverline\u003c/Text\u003e\n    \u003c/React.Fragment\u003e\n  );\n\n  return (\n    \u003cRow\u003e\n      \u003cColumn style={styles.container} edgeInsets={EdgeInsets.right('medium')}\u003e\n        {body}\n      \u003c/Column\u003e\n      \u003cColumn style={styles.container2}\u003e{body}\u003c/Column\u003e\n    \u003c/Row\u003e\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    flexShrink: 1,\n    alignItems: 'stretch',\n    backgroundColor: 'white',\n  },\n  container2: {\n    flex: 1,\n    flexShrink: 1,\n    alignItems: 'flex-start',\n    backgroundColor: 'white',\n  },\n  box: {\n    width: 100,\n    height: 100,\n    backgroundColor: '#6DB32A',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  layout1: {\n    backgroundColor: 'red',\n    width: 100,\n    height: 100,\n  },\n  layout2: {\n    backgroundColor: 'yellow',\n    width: 50,\n    height: 50,\n  },\n});\n\n```\n\n## Contributing\n\nSee the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.\n\n## License\n\nMIT\n\n---\n\nMade with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaynekim92%2Freact-native-good-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwaynekim92%2Freact-native-good-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaynekim92%2Freact-native-good-ui/lists"}