diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index d5700888..00000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ - diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index a4521d87..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: [require.resolve('@grapp/eslint-config/react-native')], -} diff --git a/docs/.eslintrc.js b/apps/docs/.eslintrc.js similarity index 100% rename from docs/.eslintrc.js rename to apps/docs/.eslintrc.js diff --git a/docs/.gitignore b/apps/docs/.gitignore similarity index 100% rename from docs/.gitignore rename to apps/docs/.gitignore diff --git a/.prettierrc.js b/apps/docs/.prettierrc.js similarity index 100% rename from .prettierrc.js rename to apps/docs/.prettierrc.js diff --git a/docs/babel.config.js b/apps/docs/babel.config.js similarity index 100% rename from docs/babel.config.js rename to apps/docs/babel.config.js diff --git a/docs/bun.lockb b/apps/docs/bun.lockb similarity index 100% rename from docs/bun.lockb rename to apps/docs/bun.lockb diff --git a/docs/components/Components.module.css b/apps/docs/components/Components.module.css similarity index 100% rename from docs/components/Components.module.css rename to apps/docs/components/Components.module.css diff --git a/docs/components/Components.tsx b/apps/docs/components/Components.tsx similarity index 100% rename from docs/components/Components.tsx rename to apps/docs/components/Components.tsx diff --git a/docs/components/Device.module.css b/apps/docs/components/Device.module.css similarity index 100% rename from docs/components/Device.module.css rename to apps/docs/components/Device.module.css diff --git a/docs/components/Device.tsx b/apps/docs/components/Device.tsx similarity index 100% rename from docs/components/Device.tsx rename to apps/docs/components/Device.tsx diff --git a/docs/components/Divider.module.css b/apps/docs/components/Divider.module.css similarity index 100% rename from docs/components/Divider.module.css rename to apps/docs/components/Divider.module.css diff --git a/docs/components/Divider.tsx b/apps/docs/components/Divider.tsx similarity index 100% rename from docs/components/Divider.tsx rename to apps/docs/components/Divider.tsx diff --git a/docs/components/Example.module.css b/apps/docs/components/Example.module.css similarity index 100% rename from docs/components/Example.module.css rename to apps/docs/components/Example.module.css diff --git a/docs/components/Example.tsx b/apps/docs/components/Example.tsx similarity index 100% rename from docs/components/Example.tsx rename to apps/docs/components/Example.tsx diff --git a/docs/components/Placeholder.module.css b/apps/docs/components/Placeholder.module.css similarity index 100% rename from docs/components/Placeholder.module.css rename to apps/docs/components/Placeholder.module.css diff --git a/docs/components/Placeholder.tsx b/apps/docs/components/Placeholder.tsx similarity index 100% rename from docs/components/Placeholder.tsx rename to apps/docs/components/Placeholder.tsx diff --git a/docs/components/svg/icon-design.svg b/apps/docs/components/svg/icon-design.svg similarity index 100% rename from docs/components/svg/icon-design.svg rename to apps/docs/components/svg/icon-design.svg diff --git a/docs/components/svg/icon-glasses.svg b/apps/docs/components/svg/icon-glasses.svg similarity index 100% rename from docs/components/svg/icon-glasses.svg rename to apps/docs/components/svg/icon-glasses.svg diff --git a/docs/components/svg/icon-grid.svg b/apps/docs/components/svg/icon-grid.svg similarity index 100% rename from docs/components/svg/icon-grid.svg rename to apps/docs/components/svg/icon-grid.svg diff --git a/docs/components/svg/icon-multiple-devices.svg b/apps/docs/components/svg/icon-multiple-devices.svg similarity index 100% rename from docs/components/svg/icon-multiple-devices.svg rename to apps/docs/components/svg/icon-multiple-devices.svg diff --git a/docs/components/svg/icon-smartphone-tablet.svg b/apps/docs/components/svg/icon-smartphone-tablet.svg similarity index 100% rename from docs/components/svg/icon-smartphone-tablet.svg rename to apps/docs/components/svg/icon-smartphone-tablet.svg diff --git a/docs/components/svg/stacks-logo.svg b/apps/docs/components/svg/stacks-logo.svg similarity index 100% rename from docs/components/svg/stacks-logo.svg rename to apps/docs/components/svg/stacks-logo.svg diff --git a/docs/examples/bleed/bleed.tsx b/apps/docs/examples/bleed/bleed.tsx similarity index 100% rename from docs/examples/bleed/bleed.tsx rename to apps/docs/examples/bleed/bleed.tsx diff --git a/docs/examples/box/align-x.tsx b/apps/docs/examples/box/align-x.tsx similarity index 100% rename from docs/examples/box/align-x.tsx rename to apps/docs/examples/box/align-x.tsx diff --git a/docs/examples/box/align-y.tsx b/apps/docs/examples/box/align-y.tsx similarity index 100% rename from docs/examples/box/align-y.tsx rename to apps/docs/examples/box/align-y.tsx diff --git a/docs/examples/box/flex.tsx b/apps/docs/examples/box/flex.tsx similarity index 100% rename from docs/examples/box/flex.tsx rename to apps/docs/examples/box/flex.tsx diff --git a/docs/examples/box/gap.tsx b/apps/docs/examples/box/gap.tsx similarity index 100% rename from docs/examples/box/gap.tsx rename to apps/docs/examples/box/gap.tsx diff --git a/docs/examples/box/margin.tsx b/apps/docs/examples/box/margin.tsx similarity index 100% rename from docs/examples/box/margin.tsx rename to apps/docs/examples/box/margin.tsx diff --git a/docs/examples/box/padding.tsx b/apps/docs/examples/box/padding.tsx similarity index 100% rename from docs/examples/box/padding.tsx rename to apps/docs/examples/box/padding.tsx diff --git a/docs/examples/box/size.tsx b/apps/docs/examples/box/size.tsx similarity index 100% rename from docs/examples/box/size.tsx rename to apps/docs/examples/box/size.tsx diff --git a/docs/examples/columns/align-x.tsx b/apps/docs/examples/columns/align-x.tsx similarity index 100% rename from docs/examples/columns/align-x.tsx rename to apps/docs/examples/columns/align-x.tsx diff --git a/docs/examples/columns/align-y.tsx b/apps/docs/examples/columns/align-y.tsx similarity index 100% rename from docs/examples/columns/align-y.tsx rename to apps/docs/examples/columns/align-y.tsx diff --git a/docs/examples/columns/collapse-below.tsx b/apps/docs/examples/columns/collapse-below.tsx similarity index 100% rename from docs/examples/columns/collapse-below.tsx rename to apps/docs/examples/columns/collapse-below.tsx diff --git a/docs/examples/columns/flex.tsx b/apps/docs/examples/columns/flex.tsx similarity index 100% rename from docs/examples/columns/flex.tsx rename to apps/docs/examples/columns/flex.tsx diff --git a/docs/examples/columns/reverse.tsx b/apps/docs/examples/columns/reverse.tsx similarity index 100% rename from docs/examples/columns/reverse.tsx rename to apps/docs/examples/columns/reverse.tsx diff --git a/docs/examples/float-box/float-box.tsx b/apps/docs/examples/float-box/float-box.tsx similarity index 100% rename from docs/examples/float-box/float-box.tsx rename to apps/docs/examples/float-box/float-box.tsx diff --git a/docs/examples/grid/grid.tsx b/apps/docs/examples/grid/grid.tsx similarity index 100% rename from docs/examples/grid/grid.tsx rename to apps/docs/examples/grid/grid.tsx diff --git a/docs/examples/inline/align-x.tsx b/apps/docs/examples/inline/align-x.tsx similarity index 100% rename from docs/examples/inline/align-x.tsx rename to apps/docs/examples/inline/align-x.tsx diff --git a/docs/examples/inline/align-y.tsx b/apps/docs/examples/inline/align-y.tsx similarity index 100% rename from docs/examples/inline/align-y.tsx rename to apps/docs/examples/inline/align-y.tsx diff --git a/docs/examples/inline/space.tsx b/apps/docs/examples/inline/space.tsx similarity index 100% rename from docs/examples/inline/space.tsx rename to apps/docs/examples/inline/space.tsx diff --git a/docs/examples/inset/inset.tsx b/apps/docs/examples/inset/inset.tsx similarity index 100% rename from docs/examples/inset/inset.tsx rename to apps/docs/examples/inset/inset.tsx diff --git a/docs/examples/rows/align-x.tsx b/apps/docs/examples/rows/align-x.tsx similarity index 100% rename from docs/examples/rows/align-x.tsx rename to apps/docs/examples/rows/align-x.tsx diff --git a/docs/examples/rows/align-y.tsx b/apps/docs/examples/rows/align-y.tsx similarity index 100% rename from docs/examples/rows/align-y.tsx rename to apps/docs/examples/rows/align-y.tsx diff --git a/docs/examples/rows/flex.tsx b/apps/docs/examples/rows/flex.tsx similarity index 100% rename from docs/examples/rows/flex.tsx rename to apps/docs/examples/rows/flex.tsx diff --git a/docs/examples/rows/rows.tsx b/apps/docs/examples/rows/rows.tsx similarity index 100% rename from docs/examples/rows/rows.tsx rename to apps/docs/examples/rows/rows.tsx diff --git a/docs/examples/stack/align.tsx b/apps/docs/examples/stack/align.tsx similarity index 100% rename from docs/examples/stack/align.tsx rename to apps/docs/examples/stack/align.tsx diff --git a/docs/examples/stack/divider.tsx b/apps/docs/examples/stack/divider.tsx similarity index 100% rename from docs/examples/stack/divider.tsx rename to apps/docs/examples/stack/divider.tsx diff --git a/docs/examples/stack/horizontal.tsx b/apps/docs/examples/stack/horizontal.tsx similarity index 100% rename from docs/examples/stack/horizontal.tsx rename to apps/docs/examples/stack/horizontal.tsx diff --git a/docs/examples/stack/space.tsx b/apps/docs/examples/stack/space.tsx similarity index 100% rename from docs/examples/stack/space.tsx rename to apps/docs/examples/stack/space.tsx diff --git a/docs/examples/tiles/columns.tsx b/apps/docs/examples/tiles/columns.tsx similarity index 100% rename from docs/examples/tiles/columns.tsx rename to apps/docs/examples/tiles/columns.tsx diff --git a/docs/examples/tiles/fill.tsx b/apps/docs/examples/tiles/fill.tsx similarity index 100% rename from docs/examples/tiles/fill.tsx rename to apps/docs/examples/tiles/fill.tsx diff --git a/docs/examples/tiles/space.tsx b/apps/docs/examples/tiles/space.tsx similarity index 100% rename from docs/examples/tiles/space.tsx rename to apps/docs/examples/tiles/space.tsx diff --git a/docs/next-env.d.ts b/apps/docs/next-env.d.ts similarity index 100% rename from docs/next-env.d.ts rename to apps/docs/next-env.d.ts diff --git a/docs/next.config.js b/apps/docs/next.config.js similarity index 100% rename from docs/next.config.js rename to apps/docs/next.config.js diff --git a/docs/package.json b/apps/docs/package.json similarity index 100% rename from docs/package.json rename to apps/docs/package.json diff --git a/docs/pages/_app.mdx b/apps/docs/pages/_app.mdx similarity index 100% rename from docs/pages/_app.mdx rename to apps/docs/pages/_app.mdx diff --git a/docs/pages/_meta.json b/apps/docs/pages/_meta.json similarity index 100% rename from docs/pages/_meta.json rename to apps/docs/pages/_meta.json diff --git a/docs/pages/about.mdx b/apps/docs/pages/about.mdx similarity index 100% rename from docs/pages/about.mdx rename to apps/docs/pages/about.mdx diff --git a/docs/pages/docs/_meta.json b/apps/docs/pages/docs/_meta.json similarity index 100% rename from docs/pages/docs/_meta.json rename to apps/docs/pages/docs/_meta.json diff --git a/docs/pages/docs/components.mdx b/apps/docs/pages/docs/components.mdx similarity index 100% rename from docs/pages/docs/components.mdx rename to apps/docs/pages/docs/components.mdx diff --git a/docs/pages/docs/components/_meta.json b/apps/docs/pages/docs/components/_meta.json similarity index 100% rename from docs/pages/docs/components/_meta.json rename to apps/docs/pages/docs/components/_meta.json diff --git a/docs/pages/docs/components/bleed.mdx b/apps/docs/pages/docs/components/bleed.mdx similarity index 100% rename from docs/pages/docs/components/bleed.mdx rename to apps/docs/pages/docs/components/bleed.mdx diff --git a/docs/pages/docs/components/box.mdx b/apps/docs/pages/docs/components/box.mdx similarity index 100% rename from docs/pages/docs/components/box.mdx rename to apps/docs/pages/docs/components/box.mdx diff --git a/docs/pages/docs/components/columns.mdx b/apps/docs/pages/docs/components/columns.mdx similarity index 100% rename from docs/pages/docs/components/columns.mdx rename to apps/docs/pages/docs/components/columns.mdx diff --git a/docs/pages/docs/components/float-box.mdx b/apps/docs/pages/docs/components/float-box.mdx similarity index 100% rename from docs/pages/docs/components/float-box.mdx rename to apps/docs/pages/docs/components/float-box.mdx diff --git a/docs/pages/docs/components/grid.mdx b/apps/docs/pages/docs/components/grid.mdx similarity index 100% rename from docs/pages/docs/components/grid.mdx rename to apps/docs/pages/docs/components/grid.mdx diff --git a/docs/pages/docs/components/hidden.mdx b/apps/docs/pages/docs/components/hidden.mdx similarity index 100% rename from docs/pages/docs/components/hidden.mdx rename to apps/docs/pages/docs/components/hidden.mdx diff --git a/docs/pages/docs/components/inline.mdx b/apps/docs/pages/docs/components/inline.mdx similarity index 100% rename from docs/pages/docs/components/inline.mdx rename to apps/docs/pages/docs/components/inline.mdx diff --git a/docs/pages/docs/components/inset.mdx b/apps/docs/pages/docs/components/inset.mdx similarity index 100% rename from docs/pages/docs/components/inset.mdx rename to apps/docs/pages/docs/components/inset.mdx diff --git a/docs/pages/docs/components/rows.mdx b/apps/docs/pages/docs/components/rows.mdx similarity index 100% rename from docs/pages/docs/components/rows.mdx rename to apps/docs/pages/docs/components/rows.mdx diff --git a/docs/pages/docs/components/stack.mdx b/apps/docs/pages/docs/components/stack.mdx similarity index 100% rename from docs/pages/docs/components/stack.mdx rename to apps/docs/pages/docs/components/stack.mdx diff --git a/docs/pages/docs/components/tiles.mdx b/apps/docs/pages/docs/components/tiles.mdx similarity index 100% rename from docs/pages/docs/components/tiles.mdx rename to apps/docs/pages/docs/components/tiles.mdx diff --git a/docs/pages/docs/getting-started.mdx b/apps/docs/pages/docs/getting-started.mdx similarity index 100% rename from docs/pages/docs/getting-started.mdx rename to apps/docs/pages/docs/getting-started.mdx diff --git a/docs/pages/docs/hooks.mdx b/apps/docs/pages/docs/hooks.mdx similarity index 100% rename from docs/pages/docs/hooks.mdx rename to apps/docs/pages/docs/hooks.mdx diff --git a/docs/pages/docs/index.mdx b/apps/docs/pages/docs/index.mdx similarity index 100% rename from docs/pages/docs/index.mdx rename to apps/docs/pages/docs/index.mdx diff --git a/docs/pages/docs/migration-guide.mdx b/apps/docs/pages/docs/migration-guide.mdx similarity index 100% rename from docs/pages/docs/migration-guide.mdx rename to apps/docs/pages/docs/migration-guide.mdx diff --git a/docs/pages/docs/types.mdx b/apps/docs/pages/docs/types.mdx similarity index 100% rename from docs/pages/docs/types.mdx rename to apps/docs/pages/docs/types.mdx diff --git a/docs/pages/docs/usage.mdx b/apps/docs/pages/docs/usage.mdx similarity index 100% rename from docs/pages/docs/usage.mdx rename to apps/docs/pages/docs/usage.mdx diff --git a/docs/pages/index.mdx b/apps/docs/pages/index.mdx similarity index 100% rename from docs/pages/index.mdx rename to apps/docs/pages/index.mdx diff --git a/docs/postcss.config.js b/apps/docs/postcss.config.js similarity index 100% rename from docs/postcss.config.js rename to apps/docs/postcss.config.js diff --git a/docs/public/android-chrome-192x192.png b/apps/docs/public/android-chrome-192x192.png similarity index 100% rename from docs/public/android-chrome-192x192.png rename to apps/docs/public/android-chrome-192x192.png diff --git a/docs/public/android-chrome-512x512.png b/apps/docs/public/android-chrome-512x512.png similarity index 100% rename from docs/public/android-chrome-512x512.png rename to apps/docs/public/android-chrome-512x512.png diff --git a/docs/public/apple-touch-icon.png b/apps/docs/public/apple-touch-icon.png similarity index 100% rename from docs/public/apple-touch-icon.png rename to apps/docs/public/apple-touch-icon.png diff --git a/docs/public/favicon-16x16.png b/apps/docs/public/favicon-16x16.png similarity index 100% rename from docs/public/favicon-16x16.png rename to apps/docs/public/favicon-16x16.png diff --git a/docs/public/favicon-32x32.png b/apps/docs/public/favicon-32x32.png similarity index 100% rename from docs/public/favicon-32x32.png rename to apps/docs/public/favicon-32x32.png diff --git a/docs/public/favicon.ico b/apps/docs/public/favicon.ico similarity index 100% rename from docs/public/favicon.ico rename to apps/docs/public/favicon.ico diff --git a/docs/public/og-slogan.png b/apps/docs/public/og-slogan.png similarity index 100% rename from docs/public/og-slogan.png rename to apps/docs/public/og-slogan.png diff --git a/docs/public/og-website.png b/apps/docs/public/og-website.png similarity index 100% rename from docs/public/og-website.png rename to apps/docs/public/og-website.png diff --git a/docs/public/stacks-preview.png b/apps/docs/public/stacks-preview.png similarity index 100% rename from docs/public/stacks-preview.png rename to apps/docs/public/stacks-preview.png diff --git a/docs/styles.css b/apps/docs/styles.css similarity index 100% rename from docs/styles.css rename to apps/docs/styles.css diff --git a/docs/tailwind.config.js b/apps/docs/tailwind.config.js similarity index 100% rename from docs/tailwind.config.js rename to apps/docs/tailwind.config.js diff --git a/docs/theme.config.jsx b/apps/docs/theme.config.jsx similarity index 100% rename from docs/theme.config.jsx rename to apps/docs/theme.config.jsx diff --git a/docs/tsconfig.json b/apps/docs/tsconfig.json similarity index 100% rename from docs/tsconfig.json rename to apps/docs/tsconfig.json diff --git a/docs/unistyles.ts b/apps/docs/unistyles.ts similarity index 100% rename from docs/unistyles.ts rename to apps/docs/unistyles.ts diff --git a/example/.gitignore b/apps/example/.gitignore similarity index 92% rename from example/.gitignore rename to apps/example/.gitignore index f5bc3011..bcac280a 100644 --- a/example/.gitignore +++ b/apps/example/.gitignore @@ -5,6 +5,7 @@ node_modules/ # Expo .expo/ +.build/ dist/ web-build/ @@ -35,3 +36,4 @@ yarn-error.* *.tsbuildinfo app/playground/ +components/Screen2.tsx diff --git a/example/app.json b/apps/example/app.json similarity index 67% rename from example/app.json rename to apps/example/app.json index c8fb7d5d..a797c15c 100644 --- a/example/app.json +++ b/apps/example/app.json @@ -5,6 +5,7 @@ "version": "1.0.0", "icon": "./assets/icon.png", "userInterfaceStyle": "light", + "newArchEnabled": true, "splash": { "image": "./assets/splash.png", "resizeMode": "contain", @@ -15,7 +16,10 @@ ], "ios": { "supportsTablet": true, - "bundleIdentifier": "com.anonymous.stacks" + "bundleIdentifier": "com.anonymous.stacks", + "infoPlist": { + "ITSAppUsesNonExemptEncryption": false + } }, "android": { "adaptiveIcon": { @@ -30,6 +34,14 @@ "plugins": [ "expo-router" ], - "scheme": "stacks" + "scheme": "stacks", + "extra": { + "router": { + "origin": false + }, + "eas": { + "projectId": "6c5fdf69-115c-4880-99f1-880467bece9b" + } + } } } diff --git a/example/app/_layout.tsx b/apps/example/app/_layout.tsx similarity index 85% rename from example/app/_layout.tsx rename to apps/example/app/_layout.tsx index 711d3fed..493de0fb 100644 --- a/example/app/_layout.tsx +++ b/apps/example/app/_layout.tsx @@ -1,7 +1,7 @@ /* eslint-disable import/no-default-export */ -import { Stack } from 'expo-router'; +import * as React from 'react'; -import './styles/unistyles'; +import { Stack } from 'expo-router'; const Layout = () => { return ; diff --git a/example/app/bleed/index.tsx b/apps/example/app/bleed/index.tsx similarity index 90% rename from example/app/bleed/index.tsx rename to apps/example/app/bleed/index.tsx index fc7655a9..2198b925 100644 --- a/example/app/bleed/index.tsx +++ b/apps/example/app/bleed/index.tsx @@ -5,8 +5,8 @@ import * as React from 'react'; import { Bleed, Stack } from '@grapp/stacks'; -import { Placeholder } from '../components/Placeholder'; -import { Screen } from '../components/Screen'; +import { Placeholder } from '../../components/Placeholder'; +import { Screen } from '../../components/Screen'; const Page = () => { return ( diff --git a/example/app/columns/index.tsx b/apps/example/app/columns/index.tsx similarity index 84% rename from example/app/columns/index.tsx rename to apps/example/app/columns/index.tsx index 55ef151d..c804cca6 100644 --- a/example/app/columns/index.tsx +++ b/apps/example/app/columns/index.tsx @@ -2,31 +2,27 @@ import * as React from 'react'; /* eslint-disable import/no-default-export */ -import { Column, Columns, Hidden, Stack } from '@grapp/stacks'; +import { Box, Column, Columns, Hidden, Stack } from '@grapp/stacks'; -import { Placeholder } from '../components/Placeholder'; -import { Screen } from '../components/Screen'; +import { Placeholder } from '../../components/Placeholder'; +import { Screen } from '../../components/Screen'; const Page = () => { return ( - - - - - - - - - + + + + + + + + + + + @@ -77,8 +73,10 @@ const Page = () => { - - + + + + @@ -121,7 +119,7 @@ const Page = () => { - + diff --git a/example/app/float-box/index.tsx b/apps/example/app/float-box/index.tsx similarity index 91% rename from example/app/float-box/index.tsx rename to apps/example/app/float-box/index.tsx index bdcc7a0b..032d78de 100644 --- a/example/app/float-box/index.tsx +++ b/apps/example/app/float-box/index.tsx @@ -4,8 +4,8 @@ import * as React from 'react'; /* eslint-disable import/no-default-export */ import { FloatBox } from '@grapp/stacks'; -import { Placeholder } from '../components/Placeholder'; -import { Screen } from '../components/Screen'; +import { Placeholder } from '../../components/Placeholder'; +import { Screen } from '../../components/Screen'; const Page = () => { return ( diff --git a/example/app/grid/index.tsx b/apps/example/app/grid/index.tsx similarity index 100% rename from example/app/grid/index.tsx rename to apps/example/app/grid/index.tsx diff --git a/example/app/index.tsx b/apps/example/app/index.tsx similarity index 86% rename from example/app/index.tsx rename to apps/example/app/index.tsx index a9b83b0e..4fa065e2 100644 --- a/example/app/index.tsx +++ b/apps/example/app/index.tsx @@ -1,16 +1,16 @@ /* eslint-disable react-native/no-raw-text */ /* eslint-disable import/no-default-export */ -import { createStyleSheet, useStyles } from 'react-native-unistyles'; - -import { Stack } from '@grapp/stacks'; +import * as React from 'react'; +import { StyleSheet } from 'react-native-unistyles'; import { Link } from 'expo-router'; -import { Screen } from './components/Screen'; +import { Stack } from '@grapp/stacks'; + +import { Screen } from '../components/Screen'; const Page = () => { - const { styles } = useStyles(stylesheet); return ( @@ -51,7 +51,7 @@ const Page = () => { ); }; -const stylesheet = createStyleSheet({ +const styles = StyleSheet.create({ link: { color: '#0B0F1A', }, diff --git a/example/app/inline/index.tsx b/apps/example/app/inline/index.tsx similarity index 97% rename from example/app/inline/index.tsx rename to apps/example/app/inline/index.tsx index 437c402b..66b21a1e 100644 --- a/example/app/inline/index.tsx +++ b/apps/example/app/inline/index.tsx @@ -4,8 +4,8 @@ import * as React from 'react'; /* eslint-disable import/no-default-export */ import { Inline, Stack } from '@grapp/stacks'; -import { Placeholder } from '../components/Placeholder'; -import { Screen } from '../components/Screen'; +import { Placeholder } from '../../components/Placeholder'; +import { Screen } from '../../components/Screen'; const Page = () => { return ( diff --git a/example/app/inset/index.tsx b/apps/example/app/inset/index.tsx similarity index 82% rename from example/app/inset/index.tsx rename to apps/example/app/inset/index.tsx index 8057c46f..02a6c3aa 100644 --- a/example/app/inset/index.tsx +++ b/apps/example/app/inset/index.tsx @@ -4,12 +4,12 @@ import * as React from 'react'; /* eslint-disable import/no-default-export */ import { Inset, Stack } from '@grapp/stacks'; -import { Placeholder } from '../components/Placeholder'; -import { Screen } from '../components/Screen'; +import { Placeholder } from '../../components/Placeholder'; +import { Screen } from '../../components/Screen'; const Page = () => { return ( - + @@ -37,6 +37,9 @@ const Page = () => { + + + ); }; diff --git a/apps/example/app/rows/index.tsx b/apps/example/app/rows/index.tsx new file mode 100644 index 00000000..d901c4e1 --- /dev/null +++ b/apps/example/app/rows/index.tsx @@ -0,0 +1,36 @@ +/* eslint-disable react-native/no-raw-text */ +import * as React from 'react'; +import { Hide, mq } from 'react-native-unistyles'; + +/* eslint-disable import/no-default-export */ +import { Hidden, Row, Rows } from '@grapp/stacks'; + +import { Placeholder } from '../../components/Placeholder'; + +const Page = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default Page; diff --git a/example/app/stack/index.tsx b/apps/example/app/stack/index.tsx similarity index 90% rename from example/app/stack/index.tsx rename to apps/example/app/stack/index.tsx index 363082cf..e0770b14 100644 --- a/example/app/stack/index.tsx +++ b/apps/example/app/stack/index.tsx @@ -2,11 +2,11 @@ import * as React from 'react'; /* eslint-disable import/no-default-export */ -import { Stack } from '@grapp/stacks'; +import { Box, Stack } from '@grapp/stacks'; -import { Divider } from '../components/Divider'; -import { Placeholder } from '../components/Placeholder'; -import { Screen } from '../components/Screen'; +import { Divider } from '../../components/Divider'; +import { Placeholder } from '../../components/Placeholder'; +import { Screen } from '../../components/Screen'; const Page = () => { return ( diff --git a/example/app/tiles/index.tsx b/apps/example/app/tiles/index.tsx similarity index 94% rename from example/app/tiles/index.tsx rename to apps/example/app/tiles/index.tsx index d358d6f3..1f707db0 100644 --- a/example/app/tiles/index.tsx +++ b/apps/example/app/tiles/index.tsx @@ -4,8 +4,8 @@ import * as React from 'react'; /* eslint-disable import/no-default-export */ import { Tiles } from '@grapp/stacks'; -import { Placeholder } from '../components/Placeholder'; -import { Screen } from '../components/Screen'; +import { Placeholder } from '../../components/Placeholder'; +import { Screen } from '../../components/Screen'; const Page = () => { return ( diff --git a/example/assets/adaptive-icon.png b/apps/example/assets/adaptive-icon.png similarity index 100% rename from example/assets/adaptive-icon.png rename to apps/example/assets/adaptive-icon.png diff --git a/example/assets/favicon.png b/apps/example/assets/favicon.png similarity index 100% rename from example/assets/favicon.png rename to apps/example/assets/favicon.png diff --git a/example/assets/icon.png b/apps/example/assets/icon.png similarity index 100% rename from example/assets/icon.png rename to apps/example/assets/icon.png diff --git a/example/assets/splash.png b/apps/example/assets/splash.png similarity index 100% rename from example/assets/splash.png rename to apps/example/assets/splash.png diff --git a/apps/example/babel.config.js b/apps/example/babel.config.js new file mode 100644 index 00000000..f076f994 --- /dev/null +++ b/apps/example/babel.config.js @@ -0,0 +1,15 @@ +module.exports = api => { + api.cache(true); + return { + presets: ['babel-preset-expo'], + plugins: [ + require.resolve('../plugin'), + [ + 'react-native-unistyles/plugin', + { + autoProcessImports: ['@grapp/stacks'], + }, + ], + ], + }; +}; diff --git a/apps/example/bun.lockb b/apps/example/bun.lockb new file mode 100755 index 00000000..fd54fa4e Binary files /dev/null and b/apps/example/bun.lockb differ diff --git a/example/app/components/Divider.tsx b/apps/example/components/Divider.tsx similarity index 100% rename from example/app/components/Divider.tsx rename to apps/example/components/Divider.tsx diff --git a/example/app/components/Placeholder.tsx b/apps/example/components/Placeholder.tsx similarity index 90% rename from example/app/components/Placeholder.tsx rename to apps/example/components/Placeholder.tsx index 1b5269b7..825ca2a7 100644 --- a/example/app/components/Placeholder.tsx +++ b/apps/example/components/Placeholder.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { Platform, Text } from 'react-native'; -import { createStyleSheet, useStyles } from 'react-native-unistyles'; +import { StyleSheet } from 'react-native-unistyles'; import { AxisX, AxisY, Box, Flex, FloatBox, Space } from '@grapp/stacks'; @@ -25,7 +25,6 @@ export const Placeholder = (props: Props) => { label, backgroundColor = '#1BCABE', } = props; - const { styles } = useStyles(stylesheet); const common = { backgroundColor, @@ -58,7 +57,7 @@ export const Placeholder = (props: Props) => { ); }; -const stylesheet = createStyleSheet({ +const styles = StyleSheet.create({ root: { borderColor: '#1D525640', borderWidth: 1, diff --git a/example/app/components/Screen.tsx b/apps/example/components/Screen.tsx similarity index 87% rename from example/app/components/Screen.tsx rename to apps/example/components/Screen.tsx index 88a139dd..ce00aee3 100644 --- a/example/app/components/Screen.tsx +++ b/apps/example/components/Screen.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-native/no-color-literals */ import * as React from 'react'; import { Button, ScrollView as RNScrollView, ScrollViewProps } from 'react-native'; -import { createStyleSheet, UnistylesRuntime, useStyles } from 'react-native-unistyles'; +import { StyleSheet, UnistylesRuntime } from 'react-native-unistyles'; import { Box, @@ -81,16 +81,20 @@ export const Screen = (props: ScreenProps) => { ); }; -const Content = Row.from(props => { +const Content = Row.from((props: Props) => { const { paddingX } = useScreen(); return ; }); -const ScrollView = Row.from(props => { +const Footer = Row.from((props: Props) => { + const { children } = props; + return {children}; +}); + +const ScrollView = Row.from((props: Props & ScrollViewProps) => { const { children, contentContainerStyle, flex = 'fluid', horizontal } = props; const { paddingX } = useScreen(); const { multiply } = useSpacingHelpers(); - const { styles } = useStyles(stylesheet); return ( @@ -108,7 +112,7 @@ const ScrollView = Row.from(props => { ); }); -const stylesheet = createStyleSheet({ +const styles = StyleSheet.create({ scrollContainer: { flexGrow: 1, }, @@ -116,3 +120,4 @@ const stylesheet = createStyleSheet({ Screen.Content = Content; Screen.ScrollView = ScrollView; +Screen.Footer = Footer; diff --git a/apps/example/eas.json b/apps/example/eas.json new file mode 100644 index 00000000..a35f07d4 --- /dev/null +++ b/apps/example/eas.json @@ -0,0 +1,16 @@ +{ + "cli": { + "version": ">= 14.7.1", + "appVersionSource": "remote" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "ios": { + "simulator": true + } + } + } +} + diff --git a/apps/example/index.js b/apps/example/index.js new file mode 100644 index 00000000..f9748a71 --- /dev/null +++ b/apps/example/index.js @@ -0,0 +1,3 @@ +import 'expo-router/entry'; + +import './styles/unistyles'; diff --git a/apps/example/justfile b/apps/example/justfile new file mode 100644 index 00000000..8567e9ed --- /dev/null +++ b/apps/example/justfile @@ -0,0 +1,23 @@ +ios_app := "stacks.app" + +ignore := "> /dev/null" + +dev *flags: + bun run expo start --dev-client {{flags}} + +build platform: + bun run eas build --local \ + --platform {{platform}} \ + --output .build/{{ if platform == "android" { "android.apk" } else { "ios.tar.gz" } }} \ + --profile development + +install platform: + #!/usr/bin/env sh + if [ "{{platform}}" = "android" ]; then + echo "android installation steps here"; + else \ + tar -xvzf .build/ios.tar.gz -C .build + xcrun simctl install booted .build/{{ios_app}} + rm -rf .build/{{ios_app}} + fi + diff --git a/example/metro.config.js b/apps/example/metro.config.js similarity index 100% rename from example/metro.config.js rename to apps/example/metro.config.js diff --git a/apps/example/package.json b/apps/example/package.json new file mode 100644 index 00000000..5460c8d7 --- /dev/null +++ b/apps/example/package.json @@ -0,0 +1,30 @@ +{ + "name": "stacks", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "@expo/metro-runtime": "~4.0.1", + "@grapp/stacks": "link:@grapp/stacks", + "expo": "~52.0.28", + "expo-constants": "~17.0.5", + "expo-image": "^2.0.4", + "expo-linking": "~7.0.5", + "expo-router": "~4.0.17", + "expo-status-bar": "~2.0.1", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-native": "0.77.0", + "react-native-edge-to-edge": "^1.4.3", + "react-native-nitro-modules": "^0.21.0", + "react-native-safe-area-context": "^5.1.0", + "react-native-screens": "4.4.0", + "react-native-unistyles": "3.0.0-beta.6", + "react-native-web": "~0.19.13" + }, + "devDependencies": { + "@babel/core": "^7.26.7", + "eas-cli": "^14.7.1", + "expo-dev-client": "^5.0.11" + }, + "private": true +} diff --git a/example/app/styles/unistyles.ts b/apps/example/styles/unistyles.ts similarity index 71% rename from example/app/styles/unistyles.ts rename to apps/example/styles/unistyles.ts index 2fc53b77..5434249b 100644 --- a/example/app/styles/unistyles.ts +++ b/apps/example/styles/unistyles.ts @@ -1,4 +1,4 @@ -import { UnistylesRegistry } from 'react-native-unistyles'; +import { StyleSheet } from 'react-native-unistyles'; const breakpoints = { mobile: 0, @@ -13,6 +13,11 @@ const theme = { }, }; +const themes = { + light: theme, + dark: theme, +}; + type Breakpoints = typeof breakpoints; type Themes = { @@ -28,10 +33,10 @@ declare module '@grapp/stacks' { export interface StacksBreakpoints extends Breakpoints {} } -UnistylesRegistry.addBreakpoints(breakpoints) - .addThemes({ - light: theme, - }) - .addConfig({ - adaptiveThemes: true, - }); +StyleSheet.configure({ + settings: { + initialTheme: 'light', + }, + breakpoints, + themes, +}); diff --git a/example/tsconfig.json b/apps/example/tsconfig.json similarity index 100% rename from example/tsconfig.json rename to apps/example/tsconfig.json diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..6dbb74a1 --- /dev/null +++ b/biome.json @@ -0,0 +1,111 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**", + "!**/.next", + "!**/dist", + "!**/.turbo", + "!**/dev-dist", + "!**/.zed", + "!**/.vscode", + "!**/routeTree.gen.ts", + "!**/src-tauri", + "!**/.nuxt", + "!bts.jsonc", + "!**/.expo", + "!**/.wrangler", + "!**/.alchemy", + "!**/.svelte-kit", + "!**/wrangler.jsonc", + "!**/.source", + "!**/convex/_generated", + "!**/benchmark" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "lineWidth": 120 + }, + "assist": { + "actions": { + "source": { + "organizeImports": { + "level": "on", + "options": { + "groups": [ + ["react", "react-native"], + ["react-native-*"], + ":BLANK_LINE:", + [{ "type": false, "source": "@*/**" }], + ":BLANK_LINE:", + [{ "type": true }] + ] + } + } + } + } + }, + + "linter": { + "enabled": true, + "includes": ["**", "!**/__tests__/**"], + "rules": { + "recommended": true, + "correctness": { + "useExhaustiveDependencies": "info" + }, + "nursery": { + "useSortedClasses": { + "level": "warn", + "fix": "safe", + "options": { + "functions": ["clsx", "cva", "cn"] + } + } + }, + "style": { + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error", + "noNonNullAssertion": "error" + }, + "suspicious": { + "noConsole": "error", + "noDebugger": "off", + "noShadowRestrictedNames": "off", + "noExplicitAny": "off" + } + } + }, + "json": { + "formatter": { + "indentStyle": "space" + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "indentStyle": "space" + } + }, + "css": { + "parser": { + "tailwindDirectives": true + } + } +} diff --git a/bun.lockb b/bun.lockb index b4e3e703..a4528c75 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/docs/.prettierrc.js b/docs/.prettierrc.js deleted file mode 100644 index ea9bf5ce..00000000 --- a/docs/.prettierrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@grapp/prettier-config') diff --git a/example/android/.gitignore b/example/android/.gitignore deleted file mode 100644 index 877b87e9..00000000 --- a/example/android/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# OSX -# -.DS_Store - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml -*.hprof - -# Bundle artifacts -*.jsbundle diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle deleted file mode 100644 index afc91e0b..00000000 --- a/example/android/app/build.gradle +++ /dev/null @@ -1,176 +0,0 @@ -apply plugin: "com.android.application" -apply plugin: "org.jetbrains.kotlin.android" -apply plugin: "com.facebook.react" - -def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() - -/** - * This is the configuration block to customize your React Native Android app. - * By default you don't need to apply any configuration, just uncomment the lines you need. - */ -react { - entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) - reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() - hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" - codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() - - // Use Expo CLI to bundle the app, this ensures the Metro config - // works correctly with Expo projects. - cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) - bundleCommand = "export:embed" - - /* Folders */ - // The root of your project, i.e. where "package.json" lives. Default is '..' - // root = file("../") - // The folder where the react-native NPM package is. Default is ../node_modules/react-native - // reactNativeDir = file("../node_modules/react-native") - // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen - // codegenDir = file("../node_modules/@react-native/codegen") - - /* Variants */ - // The list of variants to that are debuggable. For those we're going to - // skip the bundling of the JS bundle and the assets. By default is just 'debug'. - // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. - // debuggableVariants = ["liteDebug", "prodDebug"] - - /* Bundling */ - // A list containing the node command and its flags. Default is just 'node'. - // nodeExecutableAndArgs = ["node"] - - // - // The path to the CLI configuration file. Default is empty. - // bundleConfig = file(../rn-cli.config.js) - // - // The name of the generated asset file containing your JS bundle - // bundleAssetName = "MyApplication.android.bundle" - // - // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' - // entryFile = file("../js/MyApplication.android.js") - // - // A list of extra flags to pass to the 'bundle' commands. - // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle - // extraPackagerArgs = [] - - /* Hermes Commands */ - // The hermes compiler command to run. By default it is 'hermesc' - // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" - // - // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" - // hermesFlags = ["-O", "-output-source-map"] -} - -/** - * Set this to true to Run Proguard on Release builds to minify the Java bytecode. - */ -def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() - -/** - * The preferred build flavor of JavaScriptCore (JSC) - * - * For example, to use the international variant, you can use: - * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` - * - * The international variant includes ICU i18n library and necessary data - * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that - * give correct results when using with locales other than en-US. Note that - * this variant is about 6MiB larger per architecture than default. - */ -def jscFlavor = 'org.webkit:android-jsc:+' - -android { - ndkVersion rootProject.ext.ndkVersion - - buildToolsVersion rootProject.ext.buildToolsVersion - compileSdk rootProject.ext.compileSdkVersion - - namespace 'com.anonymous.stacks' - defaultConfig { - applicationId 'com.anonymous.stacks' - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0.0" - - buildConfigField("boolean", "REACT_NATIVE_UNSTABLE_USE_RUNTIME_SCHEDULER_ALWAYS", (findProperty("reactNative.unstable_useRuntimeSchedulerAlways") ?: true).toString()) - } - signingConfigs { - debug { - storeFile file('debug.keystore') - storePassword 'android' - keyAlias 'androiddebugkey' - keyPassword 'android' - } - } - buildTypes { - debug { - signingConfig signingConfigs.debug - } - release { - // Caution! In production, you need to generate your own keystore file. - // see https://reactnative.dev/docs/signed-apk-android. - signingConfig signingConfigs.debug - shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } - packagingOptions { - jniLibs { - useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) - } - } -} - -// Apply static values from `gradle.properties` to the `android.packagingOptions` -// Accepts values in comma delimited lists, example: -// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini -["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> - // Split option: 'foo,bar' -> ['foo', 'bar'] - def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); - // Trim all elements in place. - for (i in 0.. 0) { - println "android.packagingOptions.$prop += $options ($options.length)" - // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' - options.each { - android.packagingOptions[prop] += it - } - } -} - -dependencies { - // The version of react-native is set by the React Native Gradle Plugin - implementation("com.facebook.react:react-android") - - def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; - def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; - def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; - - if (isGifEnabled) { - // For animated gif support - implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") - } - - if (isWebpEnabled) { - // For webp support - implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") - if (isWebpAnimatedEnabled) { - // Animated webp support - implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") - } - } - - implementation("com.facebook.react:flipper-integration") - - if (hermesEnabled.toBoolean()) { - implementation("com.facebook.react:hermes-android") - } else { - implementation jscFlavor - } -} - -apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); -applyNativeModulesAppBuildGradle(project) diff --git a/example/android/app/debug.keystore b/example/android/app/debug.keystore deleted file mode 100644 index 364e105e..00000000 Binary files a/example/android/app/debug.keystore and /dev/null differ diff --git a/example/android/app/proguard-rules.pro b/example/android/app/proguard-rules.pro deleted file mode 100644 index 551eb41d..00000000 --- a/example/android/app/proguard-rules.pro +++ /dev/null @@ -1,14 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# react-native-reanimated --keep class com.swmansion.reanimated.** { *; } --keep class com.facebook.react.turbomodule.** { *; } - -# Add any project specific keep options here: diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 3ec2507b..00000000 --- a/example/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index be254ed4..00000000 --- a/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/example/android/app/src/main/java/com/anonymous/stacks/MainActivity.kt b/example/android/app/src/main/java/com/anonymous/stacks/MainActivity.kt deleted file mode 100644 index ac3acf4b..00000000 --- a/example/android/app/src/main/java/com/anonymous/stacks/MainActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.anonymous.stacks - -import android.os.Build -import android.os.Bundle - -import com.facebook.react.ReactActivity -import com.facebook.react.ReactActivityDelegate -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled -import com.facebook.react.defaults.DefaultReactActivityDelegate - -import expo.modules.ReactActivityDelegateWrapper - -class MainActivity : ReactActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - // Set the theme to AppTheme BEFORE onCreate to support - // coloring the background, status bar, and navigation bar. - // This is required for expo-splash-screen. - setTheme(R.style.AppTheme); - super.onCreate(null) - } - - /** - * Returns the name of the main component registered from JavaScript. This is used to schedule - * rendering of the component. - */ - override fun getMainComponentName(): String = "main" - - /** - * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] - * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] - */ - override fun createReactActivityDelegate(): ReactActivityDelegate { - return ReactActivityDelegateWrapper( - this, - BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, - object : DefaultReactActivityDelegate( - this, - mainComponentName, - fabricEnabled - ){}) - } - - /** - * Align the back button behavior with Android S - * where moving root activities to background instead of finishing activities. - * @see onBackPressed - */ - override fun invokeDefaultOnBackPressed() { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { - if (!moveTaskToBack(false)) { - // For non-root activities, use the default implementation to finish them. - super.invokeDefaultOnBackPressed() - } - return - } - - // Use the default back button implementation on Android S - // because it's doing more than [Activity.moveTaskToBack] in fact. - super.invokeDefaultOnBackPressed() - } -} diff --git a/example/android/app/src/main/java/com/anonymous/stacks/MainApplication.kt b/example/android/app/src/main/java/com/anonymous/stacks/MainApplication.kt deleted file mode 100644 index 51475d12..00000000 --- a/example/android/app/src/main/java/com/anonymous/stacks/MainApplication.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.anonymous.stacks - -import android.app.Application -import android.content.res.Configuration -import androidx.annotation.NonNull - -import com.facebook.react.PackageList -import com.facebook.react.ReactApplication -import com.facebook.react.ReactNativeHost -import com.facebook.react.ReactPackage -import com.facebook.react.ReactHost -import com.facebook.react.config.ReactFeatureFlags -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load -import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost -import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.flipper.ReactNativeFlipper -import com.facebook.soloader.SoLoader - -import expo.modules.ApplicationLifecycleDispatcher -import expo.modules.ReactNativeHostWrapper - -class MainApplication : Application(), ReactApplication { - - override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( - this, - object : DefaultReactNativeHost(this) { - override fun getPackages(): List { - // Packages that cannot be autolinked yet can be added manually here, for example: - // packages.add(new MyReactNativePackage()); - return PackageList(this).packages - } - - override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" - - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } - ) - - override val reactHost: ReactHost - get() = getDefaultReactHost(this.applicationContext, reactNativeHost) - - override fun onCreate() { - super.onCreate() - SoLoader.init(this, false) - if (!BuildConfig.REACT_NATIVE_UNSTABLE_USE_RUNTIME_SCHEDULER_ALWAYS) { - ReactFeatureFlags.unstable_useRuntimeSchedulerAlways = false - } - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() - } - if (BuildConfig.DEBUG) { - ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager) - } - ApplicationLifecycleDispatcher.onApplicationCreate(this) - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) - } -} diff --git a/example/android/app/src/main/res/drawable-hdpi/splashscreen_image.png b/example/android/app/src/main/res/drawable-hdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68..00000000 Binary files a/example/android/app/src/main/res/drawable-hdpi/splashscreen_image.png and /dev/null differ diff --git a/example/android/app/src/main/res/drawable-mdpi/splashscreen_image.png b/example/android/app/src/main/res/drawable-mdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68..00000000 Binary files a/example/android/app/src/main/res/drawable-mdpi/splashscreen_image.png and /dev/null differ diff --git a/example/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png b/example/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68..00000000 Binary files a/example/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png and /dev/null differ diff --git a/example/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png b/example/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68..00000000 Binary files a/example/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png and /dev/null differ diff --git a/example/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png b/example/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68..00000000 Binary files a/example/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png and /dev/null differ diff --git a/example/android/app/src/main/res/drawable/rn_edit_text_material.xml b/example/android/app/src/main/res/drawable/rn_edit_text_material.xml deleted file mode 100644 index 73b37e4d..00000000 --- a/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - diff --git a/example/android/app/src/main/res/drawable/splashscreen.xml b/example/android/app/src/main/res/drawable/splashscreen.xml deleted file mode 100644 index c8568e16..00000000 --- a/example/android/app/src/main/res/drawable/splashscreen.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 3941bea9..00000000 --- a/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 3941bea9..00000000 --- a/example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 0a61c1b2..00000000 Binary files a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index ac03dbf6..00000000 Binary files a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 26deb972..00000000 Binary files a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index fd1a2c71..00000000 Binary files a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index e1173a94..00000000 Binary files a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 4d3ac7a4..00000000 Binary files a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index d57caa30..00000000 Binary files a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index ff086fdc..00000000 Binary files a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 95ac5824..00000000 Binary files a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 0a07e73a..00000000 Binary files a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index f7f1d069..00000000 Binary files a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 6508f742..00000000 Binary files a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 499e372b..00000000 Binary files a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 49a464ee..00000000 Binary files a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index d54716bf..00000000 Binary files a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/example/android/app/src/main/res/values-night/colors.xml b/example/android/app/src/main/res/values-night/colors.xml deleted file mode 100644 index 3c05de5b..00000000 --- a/example/android/app/src/main/res/values-night/colors.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/example/android/app/src/main/res/values/colors.xml b/example/android/app/src/main/res/values/colors.xml deleted file mode 100644 index f387b901..00000000 --- a/example/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - #ffffff - #ffffff - #023c69 - #ffffff - \ No newline at end of file diff --git a/example/android/app/src/main/res/values/strings.xml b/example/android/app/src/main/res/values/strings.xml deleted file mode 100644 index cc553af4..00000000 --- a/example/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - stacks - contain - false - \ No newline at end of file diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index f03e23f8..00000000 --- a/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/example/android/build.gradle b/example/android/build.gradle deleted file mode 100644 index 513b7661..00000000 --- a/example/android/build.gradle +++ /dev/null @@ -1,40 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext { - buildToolsVersion = findProperty('android.buildToolsVersion') ?: '34.0.0' - minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '23') - compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '34') - targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') - kotlinVersion = findProperty('android.kotlinVersion') ?: '1.8.10' - - ndkVersion = "25.1.8937393" - } - repositories { - google() - mavenCentral() - } - dependencies { - classpath('com.android.tools.build:gradle') - classpath('com.facebook.react:react-native-gradle-plugin') - } -} - -apply plugin: "com.facebook.react.rootproject" - -allprojects { - repositories { - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) - } - maven { - // Android JSC is installed from npm - url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) - } - - google() - mavenCentral() - maven { url 'https://www.jitpack.io' } - } -} diff --git a/example/android/gradle.properties b/example/android/gradle.properties deleted file mode 100644 index 41b173c4..00000000 --- a/example/android/gradle.properties +++ /dev/null @@ -1,56 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true - -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true - -# Use this property to specify which architecture you want to build. -# You can also override it from the CLI using -# ./gradlew -PreactNativeArchitectures=x86_64 -reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 - -# Use this property to enable support to the new architecture. -# This will allow you to use TurboModules and the Fabric render in -# your application. You should enable this flag either if you want -# to write custom TurboModules/Fabric components OR use libraries that -# are providing them. -newArchEnabled=false - -# Use this property to enable or disable the Hermes JS engine. -# If set to false, you will be using JSC instead. -hermesEnabled=true - -# Enable GIF support in React Native images (~200 B increase) -expo.gif.enabled=true -# Enable webp support in React Native images (~85 KB increase) -expo.webp.enabled=true -# Enable animated webp support (~3.4 MB increase) -# Disabled by default because iOS doesn't support animated webp -expo.webp.animated=false - -# Enable network inspector -EX_DEV_CLIENT_NETWORK_INSPECTOR=true - -# Use legacy packaging to compress native libraries in the resulting APK. -expo.useLegacyPackaging=false diff --git a/example/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7f93135c..00000000 Binary files a/example/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index d11cdd90..00000000 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/example/android/gradlew b/example/android/gradlew deleted file mode 100755 index 1aa94a42..00000000 --- a/example/android/gradlew +++ /dev/null @@ -1,249 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/example/android/gradlew.bat b/example/android/gradlew.bat deleted file mode 100644 index 53a6b238..00000000 --- a/example/android/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/example/android/settings.gradle b/example/android/settings.gradle deleted file mode 100644 index f314de0c..00000000 --- a/example/android/settings.gradle +++ /dev/null @@ -1,18 +0,0 @@ -rootProject.name = 'stacks' - -dependencyResolutionManagement { - versionCatalogs { - reactAndroidLibs { - from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) - } - } -} - -apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); -useExpoModules() - -apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); -applyNativeModulesSettingsGradle(settings) - -include ':app' -includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile()) diff --git a/example/app/rows/index.tsx b/example/app/rows/index.tsx deleted file mode 100644 index 5d95db0a..00000000 --- a/example/app/rows/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -/* eslint-disable react-native/no-raw-text */ -import * as React from 'react'; - -/* eslint-disable import/no-default-export */ -import { Row, Rows } from '@grapp/stacks'; - -import { Placeholder } from '../components/Placeholder'; - -const Page = () => { - return ( - - - - - - - - - - - - - - - - ); -}; - -export default Page; diff --git a/example/babel.config.js b/example/babel.config.js deleted file mode 100644 index 16a77b1f..00000000 --- a/example/babel.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = api => { - api.cache(true); - return { - presets: ['babel-preset-expo'], - plugins: [require.resolve('../plugin')], - }; -}; diff --git a/example/bun.lockb b/example/bun.lockb deleted file mode 100755 index e4ce20fc..00000000 Binary files a/example/bun.lockb and /dev/null differ diff --git a/example/ios/.gitignore b/example/ios/.gitignore deleted file mode 100644 index 8beb3443..00000000 --- a/example/ios/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace -.xcode.env.local - -# Bundle artifacts -*.jsbundle - -# CocoaPods -/Pods/ diff --git a/example/ios/.xcode.env b/example/ios/.xcode.env deleted file mode 100644 index 3d5782c7..00000000 --- a/example/ios/.xcode.env +++ /dev/null @@ -1,11 +0,0 @@ -# This `.xcode.env` file is versioned and is used to source the environment -# used when running script phases inside Xcode. -# To customize your local environment, you can create an `.xcode.env.local` -# file that is not versioned. - -# NODE_BINARY variable contains the PATH to the node executable. -# -# Customize the NODE_BINARY variable here. -# For example, to use nvm with brew, add the following line -# . "$(brew --prefix nvm)/nvm.sh" --no-use -export NODE_BINARY=$(command -v node) diff --git a/example/ios/Podfile b/example/ios/Podfile deleted file mode 100644 index aaeb45d9..00000000 --- a/example/ios/Podfile +++ /dev/null @@ -1,82 +0,0 @@ -require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") -require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") - -require 'json' -podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} - -ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' -ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] - -platform :ios, podfile_properties['ios.deploymentTarget'] || '13.4' -install! 'cocoapods', - :deterministic_uuids => false - -prepare_react_native_project! - -# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. -# because `react-native-flipper` depends on (FlipperKit,...), which will be excluded. To fix this, -# you can also exclude `react-native-flipper` in `react-native.config.js` -# -# ```js -# module.exports = { -# dependencies: { -# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), -# } -# } -# ``` -flipper_config = FlipperConfiguration.disabled -if ENV['NO_FLIPPER'] == '1' then - # Explicitly disabled through environment variables - flipper_config = FlipperConfiguration.disabled -elsif podfile_properties.key?('ios.flipper') then - # Configure Flipper in Podfile.properties.json - if podfile_properties['ios.flipper'] == 'true' then - flipper_config = FlipperConfiguration.enabled(["Debug", "Release"]) - elsif podfile_properties['ios.flipper'] != 'false' then - flipper_config = FlipperConfiguration.enabled(["Debug", "Release"], { 'Flipper' => podfile_properties['ios.flipper'] }) - end -end - -target 'stacks' do - use_expo_modules! - config = use_native_modules! - - use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] - use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] - - use_react_native!( - :path => config[:reactNativePath], - :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/..", - # Note that if you have use_frameworks! enabled, Flipper will not work if enabled - :flipper_configuration => flipper_config - ) - - post_install do |installer| - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false - ) - - # This is necessary for Xcode 14, because it signs resource bundles by default - # when building for devices. - installer.target_installation_results.pod_target_installation_results - .each do |pod_name, target_installation_result| - target_installation_result.resource_bundle_targets.each do |resource_bundle_target| - resource_bundle_target.build_configurations.each do |config| - config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' - end - end - end - end - - post_integrate do |installer| - begin - expo_patch_react_imports!(installer) - rescue => e - Pod::UI.warn e - end - end -end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock deleted file mode 100644 index 25298088..00000000 --- a/example/ios/Podfile.lock +++ /dev/null @@ -1,1408 +0,0 @@ -PODS: - - boost (1.83.0) - - DoubleConversion (1.1.6) - - EXConstants (15.4.5): - - ExpoModulesCore - - EXFont (11.10.3): - - ExpoModulesCore - - Expo (50.0.14): - - ExpoModulesCore - - ExpoFileSystem (16.0.8): - - ExpoModulesCore - - ExpoHead (3.4.8): - - ExpoModulesCore - - ExpoImage (1.10.6): - - ExpoModulesCore - - SDWebImage (~> 5.17.0) - - SDWebImageAVIFCoder (~> 0.10.1) - - SDWebImageSVGCoder (~> 1.7.0) - - SDWebImageWebPCoder (~> 0.13.0) - - ExpoKeepAwake (12.8.2): - - ExpoModulesCore - - ExpoModulesCore (1.11.12): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - React-NativeModulesApple - - React-RCTAppDelegate - - ReactCommon/turbomodule/core - - EXSplashScreen (0.26.4): - - ExpoModulesCore - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - FBLazyVector (0.73.6) - - FBReactNativeSpec (0.73.6): - - RCT-Folly (= 2022.05.16.00) - - RCTRequired (= 0.73.6) - - RCTTypeSafety (= 0.73.6) - - React-Core (= 0.73.6) - - React-jsi (= 0.73.6) - - ReactCommon/turbomodule/core (= 0.73.6) - - fmt (6.2.1) - - glog (0.3.5) - - hermes-engine (0.73.6): - - hermes-engine/Pre-built (= 0.73.6) - - hermes-engine/Pre-built (0.73.6) - - libaom (3.0.0): - - libvmaf (>= 2.2.0) - - libavif (0.11.1): - - libavif/libaom (= 0.11.1) - - libavif/core (0.11.1) - - libavif/libaom (0.11.1): - - libaom (>= 2.0.0) - - libavif/core - - libevent (2.1.12) - - libvmaf (2.3.1) - - libwebp (1.3.2): - - libwebp/demux (= 1.3.2) - - libwebp/mux (= 1.3.2) - - libwebp/sharpyuv (= 1.3.2) - - libwebp/webp (= 1.3.2) - - libwebp/demux (1.3.2): - - libwebp/webp - - libwebp/mux (1.3.2): - - libwebp/demux - - libwebp/sharpyuv (1.3.2) - - libwebp/webp (1.3.2): - - libwebp/sharpyuv - - RCT-Folly (2022.05.16.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - RCT-Folly/Default (= 2022.05.16.00) - - RCT-Folly/Default (2022.05.16.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - RCT-Folly/Fabric (2022.05.16.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - RCT-Folly/Futures (2022.05.16.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - libevent - - RCTRequired (0.73.6) - - RCTTypeSafety (0.73.6): - - FBLazyVector (= 0.73.6) - - RCTRequired (= 0.73.6) - - React-Core (= 0.73.6) - - React (0.73.6): - - React-Core (= 0.73.6) - - React-Core/DevSupport (= 0.73.6) - - React-Core/RCTWebSocket (= 0.73.6) - - React-RCTActionSheet (= 0.73.6) - - React-RCTAnimation (= 0.73.6) - - React-RCTBlob (= 0.73.6) - - React-RCTImage (= 0.73.6) - - React-RCTLinking (= 0.73.6) - - React-RCTNetwork (= 0.73.6) - - React-RCTSettings (= 0.73.6) - - React-RCTText (= 0.73.6) - - React-RCTVibration (= 0.73.6) - - React-callinvoker (0.73.6) - - React-Codegen (0.73.6): - - DoubleConversion - - FBReactNativeSpec - - glog - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-rncore - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-Core (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default (= 0.73.6) - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/CoreModulesHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/Default (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/DevSupport (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default (= 0.73.6) - - React-Core/RCTWebSocket (= 0.73.6) - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector (= 0.73.6) - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTActionSheetHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTAnimationHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTBlobHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTImageHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTLinkingHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTNetworkHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTSettingsHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTTextHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTVibrationHeaders (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-Core/RCTWebSocket (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default (= 0.73.6) - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.6.1) - - Yoga - - React-CoreModules (0.73.6): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety (= 0.73.6) - - React-Codegen - - React-Core/CoreModulesHeaders (= 0.73.6) - - React-jsi (= 0.73.6) - - React-NativeModulesApple - - React-RCTBlob - - React-RCTImage (= 0.73.6) - - ReactCommon - - SocketRocket (= 0.6.1) - - React-cxxreact (0.73.6): - - boost (= 1.83.0) - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.6) - - React-debug (= 0.73.6) - - React-jsi (= 0.73.6) - - React-jsinspector (= 0.73.6) - - React-logger (= 0.73.6) - - React-perflogger (= 0.73.6) - - React-runtimeexecutor (= 0.73.6) - - React-debug (0.73.6) - - React-Fabric (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/animations (= 0.73.6) - - React-Fabric/attributedstring (= 0.73.6) - - React-Fabric/componentregistry (= 0.73.6) - - React-Fabric/componentregistrynative (= 0.73.6) - - React-Fabric/components (= 0.73.6) - - React-Fabric/core (= 0.73.6) - - React-Fabric/imagemanager (= 0.73.6) - - React-Fabric/leakchecker (= 0.73.6) - - React-Fabric/mounting (= 0.73.6) - - React-Fabric/scheduler (= 0.73.6) - - React-Fabric/telemetry (= 0.73.6) - - React-Fabric/templateprocessor (= 0.73.6) - - React-Fabric/textlayoutmanager (= 0.73.6) - - React-Fabric/uimanager (= 0.73.6) - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/animations (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/components/inputaccessory (= 0.73.6) - - React-Fabric/components/legacyviewmanagerinterop (= 0.73.6) - - React-Fabric/components/modal (= 0.73.6) - - React-Fabric/components/rncore (= 0.73.6) - - React-Fabric/components/root (= 0.73.6) - - React-Fabric/components/safeareaview (= 0.73.6) - - React-Fabric/components/scrollview (= 0.73.6) - - React-Fabric/components/text (= 0.73.6) - - React-Fabric/components/textinput (= 0.73.6) - - React-Fabric/components/unimplementedview (= 0.73.6) - - React-Fabric/components/view (= 0.73.6) - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/inputaccessory (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/modal (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/rncore (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/safeareaview (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/scrollview (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/text (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/textinput (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/unimplementedview (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric/core (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/textlayoutmanager (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/uimanager - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-FabricImage (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired (= 0.73.6) - - RCTTypeSafety (= 0.73.6) - - React-Fabric - - React-graphics - - React-ImageManager - - React-jsi - - React-jsiexecutor (= 0.73.6) - - React-logger - - React-rendererdebug - - React-utils - - ReactCommon - - Yoga - - React-graphics (0.73.6): - - glog - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-Core/Default (= 0.73.6) - - React-utils - - React-hermes (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - RCT-Folly/Futures (= 2022.05.16.00) - - React-cxxreact (= 0.73.6) - - React-jsi - - React-jsiexecutor (= 0.73.6) - - React-jsinspector (= 0.73.6) - - React-perflogger (= 0.73.6) - - React-ImageManager (0.73.6): - - glog - - RCT-Folly/Fabric - - React-Core/Default - - React-debug - - React-Fabric - - React-graphics - - React-rendererdebug - - React-utils - - React-jserrorhandler (0.73.6): - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-debug - - React-jsi - - React-Mapbuffer - - React-jsi (0.73.6): - - boost (= 1.83.0) - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-jsiexecutor (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-cxxreact (= 0.73.6) - - React-jsi (= 0.73.6) - - React-perflogger (= 0.73.6) - - React-jsinspector (0.73.6) - - React-logger (0.73.6): - - glog - - React-Mapbuffer (0.73.6): - - glog - - React-debug - - react-native-safe-area-context (4.8.2): - - React-Core - - react-native-unistyles (2.5.5): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - React-nativeconfig (0.73.6) - - React-NativeModulesApple (0.73.6): - - glog - - hermes-engine - - React-callinvoker - - React-Core - - React-cxxreact - - React-jsi - - React-runtimeexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-perflogger (0.73.6) - - React-RCTActionSheet (0.73.6): - - React-Core/RCTActionSheetHeaders (= 0.73.6) - - React-RCTAnimation (0.73.6): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTAnimationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-RCTAppDelegate (0.73.6): - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-CoreModules - - React-hermes - - React-nativeconfig - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-RCTNetwork - - React-runtimescheduler - - ReactCommon - - React-RCTBlob (0.73.6): - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Codegen - - React-Core/RCTBlobHeaders - - React-Core/RCTWebSocket - - React-jsi - - React-NativeModulesApple - - React-RCTNetwork - - ReactCommon - - React-RCTFabric (0.73.6): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-Core - - React-debug - - React-Fabric - - React-FabricImage - - React-graphics - - React-ImageManager - - React-jsi - - React-nativeconfig - - React-RCTImage - - React-RCTText - - React-rendererdebug - - React-runtimescheduler - - React-utils - - Yoga - - React-RCTImage (0.73.6): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTImageHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTNetwork - - ReactCommon - - React-RCTLinking (0.73.6): - - React-Codegen - - React-Core/RCTLinkingHeaders (= 0.73.6) - - React-jsi (= 0.73.6) - - React-NativeModulesApple - - ReactCommon - - ReactCommon/turbomodule/core (= 0.73.6) - - React-RCTNetwork (0.73.6): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTNetworkHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-RCTSettings (0.73.6): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTSettingsHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-RCTText (0.73.6): - - React-Core/RCTTextHeaders (= 0.73.6) - - Yoga - - React-RCTVibration (0.73.6): - - RCT-Folly (= 2022.05.16.00) - - React-Codegen - - React-Core/RCTVibrationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-rendererdebug (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - RCT-Folly (= 2022.05.16.00) - - React-debug - - React-rncore (0.73.6) - - React-runtimeexecutor (0.73.6): - - React-jsi (= 0.73.6) - - React-runtimescheduler (0.73.6): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker - - React-cxxreact - - React-debug - - React-jsi - - React-rendererdebug - - React-runtimeexecutor - - React-utils - - React-utils (0.73.6): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-debug - - ReactCommon (0.73.6): - - React-logger (= 0.73.6) - - ReactCommon/turbomodule (= 0.73.6) - - ReactCommon/turbomodule (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.6) - - React-cxxreact (= 0.73.6) - - React-jsi (= 0.73.6) - - React-logger (= 0.73.6) - - React-perflogger (= 0.73.6) - - ReactCommon/turbomodule/bridging (= 0.73.6) - - ReactCommon/turbomodule/core (= 0.73.6) - - ReactCommon/turbomodule/bridging (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.6) - - React-cxxreact (= 0.73.6) - - React-jsi (= 0.73.6) - - React-logger (= 0.73.6) - - React-perflogger (= 0.73.6) - - ReactCommon/turbomodule/core (0.73.6): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.6) - - React-cxxreact (= 0.73.6) - - React-jsi (= 0.73.6) - - React-logger (= 0.73.6) - - React-perflogger (= 0.73.6) - - RNScreens (3.29.0): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - SDWebImage (5.17.0): - - SDWebImage/Core (= 5.17.0) - - SDWebImage/Core (5.17.0) - - SDWebImageAVIFCoder (0.10.1): - - libavif (>= 0.11.0) - - SDWebImage (~> 5.10) - - SDWebImageSVGCoder (1.7.0): - - SDWebImage/Core (~> 5.6) - - SDWebImageWebPCoder (0.13.0): - - libwebp (~> 1.0) - - SDWebImage/Core (~> 5.17) - - SocketRocket (0.6.1) - - Yoga (1.14.0) - -DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - EXConstants (from `../node_modules/expo-constants/ios`) - - EXFont (from `../node_modules/expo-font/ios`) - - Expo (from `../node_modules/expo`) - - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - - ExpoHead (from `../node_modules/expo-router/ios`) - - ExpoImage (from `../node_modules/expo-image/ios`) - - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - - ExpoModulesCore (from `../node_modules/expo-modules-core`) - - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`) - - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - libevent (~> 2.1.12) - - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../node_modules/react-native/`) - - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Codegen (from `build/generated/ios`) - - React-Core (from `../node_modules/react-native/`) - - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - - React-Fabric (from `../node_modules/react-native/ReactCommon`) - - React-FabricImage (from `../node_modules/react-native/ReactCommon`) - - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - - react-native-unistyles (from `../node_modules/react-native-unistyles`) - - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) - - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - - React-RCTFabric (from `../node_modules/react-native/React`) - - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../node_modules/react-native/ReactCommon`) - - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - RNScreens (from `../node_modules/react-native-screens`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - fmt - - libaom - - libavif - - libevent - - libvmaf - - libwebp - - SDWebImage - - SDWebImageAVIFCoder - - SDWebImageSVGCoder - - SDWebImageWebPCoder - - SocketRocket - -EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - EXConstants: - :path: "../node_modules/expo-constants/ios" - EXFont: - :path: "../node_modules/expo-font/ios" - Expo: - :path: "../node_modules/expo" - ExpoFileSystem: - :path: "../node_modules/expo-file-system/ios" - ExpoHead: - :path: "../node_modules/expo-router/ios" - ExpoImage: - :path: "../node_modules/expo-image/ios" - ExpoKeepAwake: - :path: "../node_modules/expo-keep-awake/ios" - ExpoModulesCore: - :path: "../node_modules/expo-modules-core" - EXSplashScreen: - :path: "../node_modules/expo-splash-screen/ios" - FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" - FBReactNativeSpec: - :path: "../node_modules/react-native/React/FBReactNativeSpec" - glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" - hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2024-02-20-RNv0.73.5-18f99ace4213052c5e7cdbcd39ee9766cd5df7e4 - RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" - RCTRequired: - :path: "../node_modules/react-native/Libraries/RCTRequired" - RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" - React: - :path: "../node_modules/react-native/" - React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" - React-Codegen: - :path: build/generated/ios - React-Core: - :path: "../node_modules/react-native/" - React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" - React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" - React-debug: - :path: "../node_modules/react-native/ReactCommon/react/debug" - React-Fabric: - :path: "../node_modules/react-native/ReactCommon" - React-FabricImage: - :path: "../node_modules/react-native/ReactCommon" - React-graphics: - :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" - React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" - React-ImageManager: - :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" - React-jserrorhandler: - :path: "../node_modules/react-native/ReactCommon/jserrorhandler" - React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" - React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" - React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" - React-logger: - :path: "../node_modules/react-native/ReactCommon/logger" - React-Mapbuffer: - :path: "../node_modules/react-native/ReactCommon" - react-native-safe-area-context: - :path: "../node_modules/react-native-safe-area-context" - react-native-unistyles: - :path: "../node_modules/react-native-unistyles" - React-nativeconfig: - :path: "../node_modules/react-native/ReactCommon" - React-NativeModulesApple: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" - React-perflogger: - :path: "../node_modules/react-native/ReactCommon/reactperflogger" - React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" - React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" - React-RCTAppDelegate: - :path: "../node_modules/react-native/Libraries/AppDelegate" - React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" - React-RCTFabric: - :path: "../node_modules/react-native/React" - React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" - React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" - React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" - React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" - React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" - React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" - React-rendererdebug: - :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" - React-rncore: - :path: "../node_modules/react-native/ReactCommon" - React-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" - React-runtimescheduler: - :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" - React-utils: - :path: "../node_modules/react-native/ReactCommon/react/utils" - ReactCommon: - :path: "../node_modules/react-native/ReactCommon" - RNScreens: - :path: "../node_modules/react-native-screens" - Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" - -SPEC CHECKSUMS: - boost: d3f49c53809116a5d38da093a8aa78bf551aed09 - DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953 - EXConstants: 988aa430ca0f76b43cd46b66e7fae3287f9cc2fc - EXFont: f20669cb266ef48b004f1eb1f2b20db96cd1df9f - Expo: e01a77c6fa4bc80a6d1bb949cda1d12d21044abd - ExpoFileSystem: eecaf6796aed0f4dd20042dc2ca2cac6c4bc1185 - ExpoHead: 8224345e80abcf4c97b31c99805dd5a3c8d3404d - ExpoImage: 8cf2d51de3d03b7e984e9b0ba8f19c0c22057001 - ExpoKeepAwake: 0f5cad99603a3268e50af9a6eb8b76d0d9ac956c - ExpoModulesCore: 61dc57c6e2a35f2f84baf488146db624e03af4cd - EXSplashScreen: 5538a51beec451bf1fcf5198e3062790e2534df3 - FBLazyVector: f64d1e2ea739b4d8f7e4740cde18089cd97fe864 - FBReactNativeSpec: 9f2b8b243131565335437dba74923a8d3015e780 - fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 - hermes-engine: 9cecf9953a681df7556b8cc9c74905de8f3293c0 - libaom: 144606b1da4b5915a1054383c3a4459ccdb3c661 - libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 - libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - libvmaf: 27f523f1e63c694d14d534cd0fddd2fab0ae8711 - libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 - RCT-Folly: 7169b2b1c44399c76a47b5deaaba715eeeb476c0 - RCTRequired: ca1d7414aba0b27efcfa2ccd37637edb1ab77d96 - RCTTypeSafety: 678e344fb976ff98343ca61dc62e151f3a042292 - React: e296bcebb489deaad87326067204eb74145934ab - React-callinvoker: d0b7015973fa6ccb592bb0363f6bc2164238ab8c - React-Codegen: f034a5de6f28e15e8d95d171df17e581d5309268 - React-Core: 44c936d0ab879e9c32e5381bd7596a677c59c974 - React-CoreModules: 558228e12cddb9ca00ff7937894cc5104a21be6b - React-cxxreact: 1fcf565012c203655b3638f35aa03c13c2ed7e9e - React-debug: d444db402065cca460d9c5b072caab802a04f729 - React-Fabric: 7d11905695e42f8bdaedddcf294959b43b290ab8 - React-FabricImage: 6e06a512d2fb5f55669c721578736785d915d4f5 - React-graphics: 5500206f7c9a481456365403c9fcf1638de108b7 - React-hermes: 783023e43af9d6be4fbaeeb96b5beee00649a5f7 - React-ImageManager: df193215ff3cf1a8dad297e554c89c632e42436c - React-jserrorhandler: a4d0f541c5852cf031db2f82f51de90be55b1334 - React-jsi: ae102ccb38d2e4d0f512b7074d0c9b4e1851f402 - React-jsiexecutor: bd12ec75873d3ef0a755c11f878f2c420430f5a9 - React-jsinspector: 85583ef014ce53d731a98c66a0e24496f7a83066 - React-logger: 3eb80a977f0d9669468ef641a5e1fabbc50a09ec - React-Mapbuffer: 84ea43c6c6232049135b1550b8c60b2faac19fab - react-native-safe-area-context: 0ee144a6170530ccc37a0fd9388e28d06f516a89 - react-native-unistyles: 1dcd0ced61eb90b726e1e4a575eb1b857a7ba685 - React-nativeconfig: b4d4e9901d4cabb57be63053fd2aa6086eb3c85f - React-NativeModulesApple: cd26e56d56350e123da0c1e3e4c76cb58a05e1ee - React-perflogger: 5f49905de275bac07ac7ea7f575a70611fa988f2 - React-RCTActionSheet: 37edf35aeb8e4f30e76c82aab61f12d1b75c04ec - React-RCTAnimation: a69de7f3daa8462743094f4736c455e844ea63f7 - React-RCTAppDelegate: 51fb96b554a6acd0cd7818acecd5aa5ca2f3ab9f - React-RCTBlob: d91771caebf2d015005d750cd1dc2b433ad07c99 - React-RCTFabric: c5b9451d1f2b546119b7a0353226a8a26247d4a9 - React-RCTImage: a0bfe87b6908c7b76bd7d74520f40660bd0ad881 - React-RCTLinking: 5f10be1647952cceddfa1970fdb374087582fc34 - React-RCTNetwork: a0bc3dd45a2dc7c879c80cebb6f9707b2c8bbed6 - React-RCTSettings: 28c202b68afa59afb4067510f2c69c5a530fb9e3 - React-RCTText: 4119d9e53ca5db9502b916e1b146e99798986d21 - React-RCTVibration: 55bd7c48487eb9a2562f2bd3fdc833274f5b0636 - React-rendererdebug: 5fa97ba664806cee4700e95aec42dff1b6f8ea36 - React-rncore: b0a8e1d14dabb7115c7a5b4ec8b9b74d1727d382 - React-runtimeexecutor: bb328dbe2865f3a550df0240df8e2d8c3aaa4c57 - React-runtimescheduler: 9636eee762c699ca7c85751a359101797e4c8b3b - React-utils: d16c1d2251c088ad817996621947d0ac8167b46c - ReactCommon: 2aa35648354bd4c4665b9a5084a7d37097b89c10 - RNScreens: 17e2f657f1b09a71ec3c821368a04acbb7ebcb46 - SDWebImage: 750adf017a315a280c60fde706ab1e552a3ae4e9 - SDWebImageAVIFCoder: 8348fef6d0ec69e129c66c9fe4d74fbfbf366112 - SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c - SDWebImageWebPCoder: af09429398d99d524cae2fe00f6f0f6e491ed102 - SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 - Yoga: d17d2cc8105eed528474683b42e2ea310e1daf61 - -PODFILE CHECKSUM: f49a893ffbc010a1164dabf40c10b77dcdb687c5 - -COCOAPODS: 1.15.2 diff --git a/example/ios/Podfile.properties.json b/example/ios/Podfile.properties.json deleted file mode 100644 index de9f7b75..00000000 --- a/example/ios/Podfile.properties.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "expo.jsEngine": "hermes", - "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true" -} diff --git a/example/ios/stacks.xcodeproj/project.pbxproj b/example/ios/stacks.xcodeproj/project.pbxproj deleted file mode 100644 index d44c01b0..00000000 --- a/example/ios/stacks.xcodeproj/project.pbxproj +++ /dev/null @@ -1,527 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; - 96905EF65AED1B983A6B3ABC /* libPods-stacks.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-stacks.a */; }; - A430B2463B1F4C1F8A0A3037 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE739EEAAC843B19B5AF7B7 /* noop-file.swift */; }; - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 13B07F961A680F5B00A75B9A /* stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = stacks/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = stacks/AppDelegate.mm; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = stacks/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = stacks/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = stacks/main.m; sourceTree = ""; }; - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-stacks.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-stacks.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 5CE739EEAAC843B19B5AF7B7 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "stacks/noop-file.swift"; sourceTree = ""; }; - 6C2E3173556A471DD304B334 /* Pods-stacks.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-stacks.debug.xcconfig"; path = "Target Support Files/Pods-stacks/Pods-stacks.debug.xcconfig"; sourceTree = ""; }; - 7A4D352CD337FB3A3BF06240 /* Pods-stacks.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-stacks.release.xcconfig"; path = "Target Support Files/Pods-stacks/Pods-stacks.release.xcconfig"; sourceTree = ""; }; - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = stacks/SplashScreen.storyboard; sourceTree = ""; }; - BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; - CEE71494D1004593BC83E5E6 /* stacks-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "stacks-Bridging-Header.h"; path = "stacks/stacks-Bridging-Header.h"; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-stacks/ExpoModulesProvider.swift"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 96905EF65AED1B983A6B3ABC /* libPods-stacks.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 13B07FAE1A68108700A75B9A /* stacks */ = { - isa = PBXGroup; - children = ( - BB2F792B24A3F905000567C9 /* Supporting */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.mm */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB71A68108700A75B9A /* main.m */, - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, - 5CE739EEAAC843B19B5AF7B7 /* noop-file.swift */, - CEE71494D1004593BC83E5E6 /* stacks-Bridging-Header.h */, - ); - name = stacks; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-stacks.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* stacks */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - D65327D7A22EEC0BE12398D9 /* Pods */, - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* stacks.app */, - ); - name = Products; - sourceTree = ""; - }; - 92DBD88DE9BF7D494EA9DA96 /* stacks */ = { - isa = PBXGroup; - children = ( - FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, - ); - name = stacks; - sourceTree = ""; - }; - BB2F792B24A3F905000567C9 /* Supporting */ = { - isa = PBXGroup; - children = ( - BB2F792C24A3F905000567C9 /* Expo.plist */, - ); - name = Supporting; - path = stacks/Supporting; - sourceTree = ""; - }; - D65327D7A22EEC0BE12398D9 /* Pods */ = { - isa = PBXGroup; - children = ( - 6C2E3173556A471DD304B334 /* Pods-stacks.debug.xcconfig */, - 7A4D352CD337FB3A3BF06240 /* Pods-stacks.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { - isa = PBXGroup; - children = ( - 92DBD88DE9BF7D494EA9DA96 /* stacks */, - ); - name = ExpoModulesProviders; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 13B07F861A680F5B00A75B9A /* stacks */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "stacks" */; - buildPhases = ( - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, - E3C4E93B40D925CCC4EF376F /* [Expo] Configure project */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - 1EB34A66F9BBA51E11FA9B25 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = stacks; - productName = stacks; - productReference = 13B07F961A680F5B00A75B9A /* stacks.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1130; - TargetAttributes = { - 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1250; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "stacks" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* stacks */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios relative | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; - }; - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-stacks-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 1EB34A66F9BBA51E11FA9B25 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-stacks/Pods-stacks-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-stacks/Pods-stacks-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-stacks/Pods-stacks-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-stacks/Pods-stacks-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - E3C4E93B40D925CCC4EF376F /* [Expo] Configure project */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "[Expo] Configure project"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-stacks/expo-configure-project.sh\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, - A430B2463B1F4C1F8A0A3037 /* noop-file.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-stacks.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = stacks/stacks.entitlements; - CURRENT_PROJECT_VERSION = 1; - ENABLE_BITCODE = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "FB_SONARKIT_ENABLED=1", - ); - INFOPLIST_FILE = stacks/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = com.anonymous.stacks; - PRODUCT_NAME = stacks; - SWIFT_OBJC_BRIDGING_HEADER = "stacks/stacks-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-stacks.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = stacks/stacks.entitlements; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = stacks/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = com.anonymous.stacks; - PRODUCT_NAME = stacks; - SWIFT_OBJC_BRIDGING_HEADER = "stacks/stacks-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "$(inherited)"; - OTHER_CPLUSPLUSFLAGS = "$(inherited)"; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - USE_HERMES = true; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CFLAGS = "$(inherited)"; - OTHER_CPLUSPLUSFLAGS = "$(inherited)"; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - USE_HERMES = true; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "stacks" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "stacks" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/example/ios/stacks.xcodeproj/xcshareddata/xcschemes/stacks.xcscheme b/example/ios/stacks.xcodeproj/xcshareddata/xcschemes/stacks.xcscheme deleted file mode 100644 index c6288f85..00000000 --- a/example/ios/stacks.xcodeproj/xcshareddata/xcschemes/stacks.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/ios/stacks.xcworkspace/contents.xcworkspacedata b/example/ios/stacks.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 4f2c9fa4..00000000 --- a/example/ios/stacks.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/example/ios/stacks/AppDelegate.h b/example/ios/stacks/AppDelegate.h deleted file mode 100644 index 1658a437..00000000 --- a/example/ios/stacks/AppDelegate.h +++ /dev/null @@ -1,7 +0,0 @@ -#import -#import -#import - -@interface AppDelegate : EXAppDelegateWrapper - -@end diff --git a/example/ios/stacks/AppDelegate.mm b/example/ios/stacks/AppDelegate.mm deleted file mode 100644 index 37d415b5..00000000 --- a/example/ios/stacks/AppDelegate.mm +++ /dev/null @@ -1,62 +0,0 @@ -#import "AppDelegate.h" - -#import -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"main"; - - // You can add your custom initial props in the dictionary below. - // They will be passed down to the ViewController used by React Native. - self.initialProps = @{}; - - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self getBundleURL]; -} - -- (NSURL *)getBundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -// Linking API -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { - return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; -} - -// Universal Links -- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { - BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; - return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken -{ - return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error -{ - return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler -{ - return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; -} - -@end diff --git a/example/ios/stacks/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/example/ios/stacks/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png deleted file mode 100644 index 2732229f..00000000 Binary files a/example/ios/stacks/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png and /dev/null differ diff --git a/example/ios/stacks/Images.xcassets/AppIcon.appiconset/Contents.json b/example/ios/stacks/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 90d8d4c2..00000000 --- a/example/ios/stacks/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images": [ - { - "filename": "App-Icon-1024x1024@1x.png", - "idiom": "universal", - "platform": "ios", - "size": "1024x1024" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/example/ios/stacks/Images.xcassets/Contents.json b/example/ios/stacks/Images.xcassets/Contents.json deleted file mode 100644 index ed285c2e..00000000 --- a/example/ios/stacks/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "expo" - } -} diff --git a/example/ios/stacks/Images.xcassets/SplashScreen.imageset/Contents.json b/example/ios/stacks/Images.xcassets/SplashScreen.imageset/Contents.json deleted file mode 100644 index 3cf84897..00000000 --- a/example/ios/stacks/Images.xcassets/SplashScreen.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "image.png", - "scale": "1x" - }, - { - "idiom": "universal", - "scale": "2x" - }, - { - "idiom": "universal", - "scale": "3x" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/example/ios/stacks/Images.xcassets/SplashScreen.imageset/image.png b/example/ios/stacks/Images.xcassets/SplashScreen.imageset/image.png deleted file mode 100644 index c52c2c68..00000000 Binary files a/example/ios/stacks/Images.xcassets/SplashScreen.imageset/image.png and /dev/null differ diff --git a/example/ios/stacks/Images.xcassets/SplashScreenBackground.imageset/Contents.json b/example/ios/stacks/Images.xcassets/SplashScreenBackground.imageset/Contents.json deleted file mode 100644 index 3cf84897..00000000 --- a/example/ios/stacks/Images.xcassets/SplashScreenBackground.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "image.png", - "scale": "1x" - }, - { - "idiom": "universal", - "scale": "2x" - }, - { - "idiom": "universal", - "scale": "3x" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/example/ios/stacks/Images.xcassets/SplashScreenBackground.imageset/image.png b/example/ios/stacks/Images.xcassets/SplashScreenBackground.imageset/image.png deleted file mode 100644 index 33ddf20b..00000000 Binary files a/example/ios/stacks/Images.xcassets/SplashScreenBackground.imageset/image.png and /dev/null differ diff --git a/example/ios/stacks/Info.plist b/example/ios/stacks/Info.plist deleted file mode 100644 index 5e278b8c..00000000 --- a/example/ios/stacks/Info.plist +++ /dev/null @@ -1,72 +0,0 @@ - - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - stacks - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - com.anonymous.stacks - - - - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - armv7 - - UIRequiresFullScreen - - UIStatusBarStyle - UIStatusBarStyleDefault - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Light - UIViewControllerBasedStatusBarAppearance - - - \ No newline at end of file diff --git a/example/ios/stacks/SplashScreen.storyboard b/example/ios/stacks/SplashScreen.storyboard deleted file mode 100644 index ed03a529..00000000 --- a/example/ios/stacks/SplashScreen.storyboard +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/example/ios/stacks/Supporting/Expo.plist b/example/ios/stacks/Supporting/Expo.plist deleted file mode 100644 index 540b7462..00000000 --- a/example/ios/stacks/Supporting/Expo.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - EXUpdatesCheckOnLaunch - ALWAYS - EXUpdatesEnabled - - EXUpdatesLaunchWaitMs - 0 - EXUpdatesSDKVersion - 50.0.0 - - \ No newline at end of file diff --git a/example/ios/stacks/main.m b/example/ios/stacks/main.m deleted file mode 100644 index 25181b6c..00000000 --- a/example/ios/stacks/main.m +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} - diff --git a/example/ios/stacks/noop-file.swift b/example/ios/stacks/noop-file.swift deleted file mode 100644 index b2ffafbf..00000000 --- a/example/ios/stacks/noop-file.swift +++ /dev/null @@ -1,4 +0,0 @@ -// -// @generated -// A blank Swift file must be created for native modules with Swift files to work correctly. -// diff --git a/example/ios/stacks/stacks-Bridging-Header.h b/example/ios/stacks/stacks-Bridging-Header.h deleted file mode 100644 index e11d920b..00000000 --- a/example/ios/stacks/stacks-Bridging-Header.h +++ /dev/null @@ -1,3 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// diff --git a/example/ios/stacks/stacks.entitlements b/example/ios/stacks/stacks.entitlements deleted file mode 100644 index 018a6e20..00000000 --- a/example/ios/stacks/stacks.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - aps-environment - development - - \ No newline at end of file diff --git a/example/package.json b/example/package.json deleted file mode 100644 index 0e2e856a..00000000 --- a/example/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "stacks", - "version": "1.0.0", - "main": "expo-router/entry", - "scripts": { - "start": "expo start", - "android": "expo run:android", - "ios": "expo run:ios", - "web": "expo start --web" - }, - "dependencies": { - "@expo/metro-runtime": "~3.1.3", - "@grapp/stacks": "link:@grapp/stacks", - "expo": "~50.0.14", - "expo-constants": "~15.4.5", - "expo-image": "^1.10.6", - "expo-linking": "~6.2.2", - "expo-router": "~3.4.8", - "expo-status-bar": "~1.11.1", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-native": "0.73.6", - "react-native-safe-area-context": "4.8.2", - "react-native-screens": "~3.29.0", - "react-native-unistyles": "^2.5.5", - "react-native-web": "~0.19.6" - }, - "devDependencies": { - "@babel/core": "^7.20.0" - }, - "private": true -} diff --git a/justfile b/justfile new file mode 100644 index 00000000..d314df32 --- /dev/null +++ b/justfile @@ -0,0 +1,12 @@ +build: + rm -rf ./lib + bun run tsup + +test: + bun run tsc --pretty --noEmit + bun run eslint ./src + +publish tag="latest": test build + @echo "Using tag: {{tag}}" + npm publish --tag {{tag}} + diff --git a/package.json b/package.json index 5e62b211..069c6881 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@grapp/stacks", "description": "A set of components for building layouts in React Native. Powered by React Native Unistyles.", - "version": "3.1.0", + "version": "4.0.0-rc.1", "license": "MIT", "author": "Marcin Dziewulski ", "react-native": "src/index.ts", @@ -16,19 +16,16 @@ "*.md", "package.json" ], - "scripts": { - "build": "rm -rf ./lib && tsup", - "types:check": "tsc --noEmit" - }, "publishConfig": { "access": "public" }, "keywords": [ "react", "react-native", + "react-native-unistyles", "react-native-web", - "typescript", "stacks", + "unistyles", "layout", "ui" ], @@ -39,21 +36,22 @@ "url": "https://github.com/grapp-dev/stacks.git" }, "peerDependencies": { - "react": ">=18.0.0", - "react-native": ">=0.71.0", - "react-native-unistyles": ">=2.0" + "react": ">=19.0.0", + "react-native": ">=0.81.0", + "react-native-unistyles": ">=3.0.0", + "react-native-edge-to-edge": "*", + "react-native-nitro-modules": "*" }, "devDependencies": { - "@grapp/eslint-config": "^0.1.1", - "@grapp/prettier-config": "^0.1.1", - "@grapp/ts-config": "^0.1.3", "@types/node": "^18.11.10", - "@types/react": "~18.2.45", - "react": "^18.2.0", - "react-native": "0.73.6", - "react-native-unistyles": "^2.5.5", - "tsup": "^8.0.2", - "typescript": "^5.4.4" + "@types/react": "^19.2.2", + "react": "^19.2.3", + "react-native": "0.87.1", + "react-native-unistyles": "3.3.0", + "tsup": "^8.5.1", + "typescript": "^6" }, - "cacheDirectories": ["node_modules"] + "cacheDirectories": [ + "node_modules" + ] } diff --git a/packages/stacks/index.ts b/packages/stacks/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/stacks/package.json b/packages/stacks/package.json new file mode 100644 index 00000000..069c6881 --- /dev/null +++ b/packages/stacks/package.json @@ -0,0 +1,57 @@ +{ + "name": "@grapp/stacks", + "description": "A set of components for building layouts in React Native. Powered by React Native Unistyles.", + "version": "4.0.0-rc.1", + "license": "MIT", + "author": "Marcin Dziewulski ", + "react-native": "src/index.ts", + "source": "src/index.ts", + "main": "lib/index.js", + "module": "lib/index.mjs", + "types": "lib/index.d.mts", + "files": [ + "src", + "lib", + "plugin", + "*.md", + "package.json" + ], + "publishConfig": { + "access": "public" + }, + "keywords": [ + "react", + "react-native", + "react-native-unistyles", + "react-native-web", + "stacks", + "unistyles", + "layout", + "ui" + ], + "homepage": "https://stacks.grapp.dev", + "bugs": "https://github.com/grapp-dev/stacks/issues", + "repository": { + "type": "git", + "url": "https://github.com/grapp-dev/stacks.git" + }, + "peerDependencies": { + "react": ">=19.0.0", + "react-native": ">=0.81.0", + "react-native-unistyles": ">=3.0.0", + "react-native-edge-to-edge": "*", + "react-native-nitro-modules": "*" + }, + "devDependencies": { + "@types/node": "^18.11.10", + "@types/react": "^19.2.2", + "react": "^19.2.3", + "react-native": "0.87.1", + "react-native-unistyles": "3.3.0", + "tsup": "^8.5.1", + "typescript": "^6" + }, + "cacheDirectories": [ + "node_modules" + ] +} diff --git a/packages/stacks/src/components/AbsoluteBox.tsx b/packages/stacks/src/components/AbsoluteBox.tsx new file mode 100644 index 00000000..6257b7de --- /dev/null +++ b/packages/stacks/src/components/AbsoluteBox.tsx @@ -0,0 +1,57 @@ +import type * as React from 'react'; +import type { DimensionValue, ViewStyle } from 'react-native'; +import { StyleSheet } from 'react-native-unistyles'; + +import type { ResponsiveProp } from '../types'; +import { resolveResponsiveStyle } from '../utils'; +import { Box } from './Box'; + +type BoxProps = Omit, 'flex'>; + +type AbsoluteBoxProps = { + readonly inset?: ResponsiveProp; + readonly top?: ResponsiveProp; + readonly right?: ResponsiveProp; + readonly bottom?: ResponsiveProp; + readonly left?: ResponsiveProp; +}; + +type Props = BoxProps & AbsoluteBoxProps; + +export const AbsoluteBox = (props: Props) => { + const { children, inset, top, right, bottom, left, style, ...rest } = props; + + return ( + + {children} + + ); +}; + +AbsoluteBox.displayName = 'AbsoluteBox'; + +const styles = StyleSheet.create({ + from: (props: AbsoluteBoxProps) => { + const { inset, top, right, bottom, left } = props; + + return { + position: 'absolute', + top: resolveResponsiveStyle('top' in props ? top : inset), + right: resolveResponsiveStyle('right' in props ? right : inset), + bottom: resolveResponsiveStyle('bottom' in props ? bottom : inset), + left: resolveResponsiveStyle('left' in props ? left : inset), + }; + }, +}); diff --git a/packages/stacks/src/components/Bleed.tsx b/packages/stacks/src/components/Bleed.tsx new file mode 100644 index 00000000..64253141 --- /dev/null +++ b/packages/stacks/src/components/Bleed.tsx @@ -0,0 +1,84 @@ +import type * as React from 'react'; +import type { ViewStyle } from 'react-native'; +import { StyleSheet } from 'react-native-unistyles'; + +import type { ResponsiveProp } from '../types'; +import { resolveNegativeGap } from '../utils'; +import { Box } from './Box'; + +type BoxProps = Omit< + React.ComponentProps, + | 'margin' + | 'marginX' + | 'marginY' + | 'marginTop' + | 'marginRight' + | 'marginBottom' + | 'marginLeft' + | 'marginStart' + | 'marginEnd' +>; + +type BleedProps = { + readonly edge?: ResponsiveProp; + readonly horizontal?: ResponsiveProp; + readonly vertical?: ResponsiveProp; + readonly top?: ResponsiveProp; + readonly right?: ResponsiveProp; + readonly bottom?: ResponsiveProp; + readonly left?: ResponsiveProp; + readonly start?: ResponsiveProp; + readonly end?: ResponsiveProp; +}; + +type Props = BoxProps & BleedProps; + +export const Bleed = (props: Props) => { + const { children, edge, horizontal, vertical, start, end, top, right, bottom, left, style, ...rest } = props; + + return ( + + {children} + + ); +}; + +Bleed.displayName = 'Bleed'; + +const styles = StyleSheet.create((theme) => { + return { + from: (props: BleedProps) => { + const { edge, horizontal, vertical, start, end, top, right, bottom, left } = props; + + const negativeGap = resolveNegativeGap(theme); + + return { + margin: negativeGap(edge), + marginHorizontal: negativeGap(horizontal), + marginVertical: negativeGap(vertical), + marginStart: negativeGap(start), + marginEnd: negativeGap(end), + marginTop: negativeGap(top), + marginRight: negativeGap(right), + marginBottom: negativeGap(bottom), + marginLeft: negativeGap(left), + }; + }, + }; +}); diff --git a/packages/stacks/src/components/Box.tsx b/packages/stacks/src/components/Box.tsx new file mode 100644 index 00000000..b90bf85b --- /dev/null +++ b/packages/stacks/src/components/Box.tsx @@ -0,0 +1,389 @@ +import { type DimensionValue, View, type ViewProps, type ViewStyle } from 'react-native'; +import { StyleSheet } from 'react-native-unistyles'; + +import type { + AxisX, + AxisY, + BackfaceVisibility, + BorderCurve, + BorderRadius, + Color, + Direction, + Flex, + Gap, + Margin, + OutlineStyle, + Overflow, + Padding, + PointerEvent, + ResponsiveProp, + Space, + Stretch, + Wrap, +} from '../types'; +import { + resolveBorderRadius, + resolveColor, + resolveFlexAlignment, + resolveFlexDirection, + resolveFlexSizing, + resolveFlexWrap, + resolveGap, + resolveMargin, + resolvePadding, + resolveResponsiveStyle, +} from '../utils'; +import type { Polymorphic } from '../polymorphic'; + +type BoxProps = { + readonly alignX?: ResponsiveProp; + readonly alignY?: ResponsiveProp; + readonly gap?: ResponsiveProp; + readonly gapX?: ResponsiveProp; + readonly gapY?: ResponsiveProp; + readonly padding?: ResponsiveProp; + readonly paddingX?: ResponsiveProp; + readonly paddingY?: ResponsiveProp; + readonly paddingTop?: ResponsiveProp; + readonly paddingBottom?: ResponsiveProp; + readonly paddingLeft?: ResponsiveProp; + readonly paddingRight?: ResponsiveProp; + readonly paddingEnd?: ResponsiveProp; + readonly paddingStart?: ResponsiveProp; + readonly margin?: ResponsiveProp; + readonly marginX?: ResponsiveProp; + readonly marginY?: ResponsiveProp; + readonly marginTop?: ResponsiveProp; + readonly marginBottom?: ResponsiveProp; + readonly marginLeft?: ResponsiveProp; + readonly marginRight?: ResponsiveProp; + readonly marginStart?: ResponsiveProp; + readonly marginEnd?: ResponsiveProp; + readonly direction?: ResponsiveProp; + readonly wrap?: ResponsiveProp; + readonly flex?: ResponsiveProp; + readonly reverse?: ResponsiveProp; + readonly borderRadius?: ResponsiveProp; + readonly borderTopLeftRadius?: ResponsiveProp; + readonly borderTopRightRadius?: ResponsiveProp; + readonly borderBottomLeftRadius?: ResponsiveProp; + readonly borderBottomRightRadius?: ResponsiveProp; + readonly borderWidth?: ResponsiveProp; + readonly borderTopWidth?: ResponsiveProp; + readonly borderRightWidth?: ResponsiveProp; + readonly borderBottomWidth?: ResponsiveProp; + readonly borderLeftWidth?: ResponsiveProp; + readonly borderColor?: ResponsiveProp; + readonly borderCurve?: ResponsiveProp; + readonly backgroundColor?: ResponsiveProp; + readonly backfaceVisibility?: ResponsiveProp; + readonly outlineColor?: ResponsiveProp; + readonly outlineOffset?: ResponsiveProp; + readonly outlineStyle?: ResponsiveProp; + readonly outlineWidth?: ResponsiveProp; + readonly overflow?: ResponsiveProp; + readonly pointerEvents?: ResponsiveProp; + readonly width?: ResponsiveProp; + readonly height?: ResponsiveProp; +}; + +type As = { + readonly as?: React.ElementType; +}; +type Props = ViewProps & BoxProps & As; +type PolymorphicBox = Polymorphic; + +export const Box: PolymorphicBox = (props: Props) => { + const { + as: Component = View, + children, + flex, + direction, + alignX, + alignY, + gap, + gapX, + gapY, + padding, + paddingX, + paddingY, + paddingTop, + paddingBottom, + paddingLeft, + paddingRight, + paddingEnd, + paddingStart, + margin, + marginX, + marginY, + marginTop, + marginBottom, + marginLeft, + marginRight, + marginStart, + marginEnd, + width, + height, + wrap, + reverse, + borderRadius, + borderTopLeftRadius, + borderTopRightRadius, + borderBottomLeftRadius, + borderBottomRightRadius, + borderWidth, + borderTopWidth, + borderRightWidth, + borderBottomWidth, + borderLeftWidth, + borderColor, + borderCurve, + backgroundColor, + backfaceVisibility, + outlineColor, + outlineOffset, + outlineStyle, + outlineWidth, + overflow, + pointerEvents, + style, + ...rest + } = props; + + const box: BoxProps = { + flex, + direction, + alignX, + alignY, + gap, + gapX, + gapY, + padding, + paddingX, + paddingY, + paddingTop, + paddingBottom, + paddingLeft, + paddingRight, + paddingEnd, + paddingStart, + margin, + marginX, + marginY, + marginTop, + marginBottom, + marginLeft, + marginRight, + marginStart, + marginEnd, + width, + height, + wrap, + reverse, + borderRadius, + borderTopLeftRadius, + borderTopRightRadius, + borderBottomLeftRadius, + borderBottomRightRadius, + borderWidth, + borderTopWidth, + borderRightWidth, + borderBottomWidth, + borderLeftWidth, + borderColor, + borderCurve, + backgroundColor, + backfaceVisibility, + outlineColor, + outlineOffset, + outlineStyle, + outlineWidth, + overflow, + pointerEvents, + }; + + return ( + + {children} + + ); +}; + +Box.displayName = 'Box'; + +const styles = StyleSheet.create((theme) => { + return { + from: (props: BoxProps) => { + const { + gap, + gapX, + gapY, + padding, + paddingX, + paddingY, + paddingTop, + paddingBottom, + paddingLeft, + paddingRight, + paddingEnd, + paddingStart, + margin, + marginX, + marginY, + marginTop, + marginBottom, + marginLeft, + marginRight, + marginStart, + marginEnd, + direction, + reverse, + flex, + alignX, + alignY, + width, + height, + wrap, + borderRadius, + borderTopLeftRadius, + borderTopRightRadius, + borderBottomLeftRadius, + borderBottomRightRadius, + borderWidth, + borderTopWidth, + borderRightWidth, + borderBottomWidth, + borderLeftWidth, + borderColor, + borderCurve, + backgroundColor, + backfaceVisibility, + outlineColor, + outlineOffset, + outlineStyle, + outlineWidth, + overflow, + pointerEvents, + } = props; + + const makeGap = resolveGap(theme); + const makePadding = resolvePadding(theme); + const makeMargin = resolveMargin(theme); + const makeBorderRadius = resolveBorderRadius(theme); + const makeColor = resolveColor(theme); + + const { alignItems, justifyContent } = resolveFlexAlignment({ + alignX, + alignY, + direction, + }); + const { flexBasis, flexGrow, flexShrink } = resolveFlexSizing({ + flex, + direction, + width, + height, + }); + const flexDirection = resolveFlexDirection({ + direction, + reverse, + }); + const resolvedWidth = resolveResponsiveStyle(width); + const resolvedHeight = resolveResponsiveStyle(height); + const resolvedGap = makeGap(gap); + const resolvedRowGap = makeGap(gapY); + const resolvedColumnGap = makeGap(gapX); + const resolvedPadding = makePadding(padding); + const paddingHorizontal = makePadding(paddingX); + const paddingVertical = makePadding(paddingY); + const resolvedPaddingTop = makePadding(paddingTop); + const resolvedPaddingBottom = makePadding(paddingBottom); + const resolvedPaddingLeft = makePadding(paddingLeft); + const resolvedPaddingRight = makePadding(paddingRight); + const resolvedPaddingEnd = makePadding(paddingEnd); + const resolvedPaddingStart = makePadding(paddingStart); + const resolvedMargin = makeMargin(margin); + const marginHorizontal = makeMargin(marginX); + const marginVertical = makeMargin(marginY); + const resolvedMarginTop = makeMargin(marginTop); + const resolvedMarginBottom = makeMargin(marginBottom); + const resolvedMarginLeft = makeMargin(marginLeft); + const resolvedMarginRight = makeMargin(marginRight); + const resolvedMarginStart = makeMargin(marginStart); + const resolvedMarginEnd = makeMargin(marginEnd); + const flexWrap = resolveFlexWrap(wrap); + const resolvedBorderRadius = makeBorderRadius(borderRadius); + const resolvedBorderTopLeftRadius = makeBorderRadius(borderTopLeftRadius); + const resolvedBorderTopRightRadius = makeBorderRadius(borderTopRightRadius); + const resolvedBorderBottomLeftRadius = makeBorderRadius(borderBottomLeftRadius); + const resolvedBorderBottomRightRadius = makeBorderRadius(borderBottomRightRadius); + const resolvedBorderWidth = resolveResponsiveStyle(borderWidth); + const resolvedBorderTopWidth = resolveResponsiveStyle(borderTopWidth); + const resolvedBorderRightWidth = resolveResponsiveStyle(borderRightWidth); + const resolvedBorderBottomWidth = resolveResponsiveStyle(borderBottomWidth); + const resolvedBorderLeftWidth = resolveResponsiveStyle(borderLeftWidth); + const resolvedBorderColor = makeColor(borderColor); + const resolvedBorderCurve = resolveResponsiveStyle(borderCurve); + const resolvedBackgroundColor = makeColor(backgroundColor); + const resolvedBackfaceVisibility = resolveResponsiveStyle(backfaceVisibility); + const resolvedOutlineColor = makeColor(outlineColor); + const resolvedOutlineOffset = resolveResponsiveStyle(outlineOffset); + const resolvedOutlineStyle = resolveResponsiveStyle(outlineStyle); + const resolvedOutlineWidth = resolveResponsiveStyle(outlineWidth); + const resolvedOverflow = resolveResponsiveStyle(overflow); + const resolvedPointerEvents = resolveResponsiveStyle(pointerEvents); + + return { + flexGrow, + flexShrink, + alignItems, + justifyContent, + flexDirection, + width: resolvedWidth, + height: resolvedHeight, + gap: resolvedGap, + rowGap: resolvedRowGap, + columnGap: resolvedColumnGap, + padding: resolvedPadding, + paddingHorizontal, + paddingVertical, + paddingTop: resolvedPaddingTop, + paddingBottom: resolvedPaddingBottom, + paddingLeft: resolvedPaddingLeft, + paddingRight: resolvedPaddingRight, + paddingEnd: resolvedPaddingEnd, + paddingStart: resolvedPaddingStart, + margin: resolvedMargin, + marginHorizontal, + marginVertical, + marginTop: resolvedMarginTop, + marginBottom: resolvedMarginBottom, + marginLeft: resolvedMarginLeft, + marginRight: resolvedMarginRight, + marginStart: resolvedMarginStart, + marginEnd: resolvedMarginEnd, + flexWrap, + flexBasis, + borderRadius: resolvedBorderRadius, + borderTopLeftRadius: resolvedBorderTopLeftRadius, + borderTopRightRadius: resolvedBorderTopRightRadius, + borderBottomLeftRadius: resolvedBorderBottomLeftRadius, + borderBottomRightRadius: resolvedBorderBottomRightRadius, + borderWidth: resolvedBorderWidth, + borderTopWidth: resolvedBorderTopWidth, + borderRightWidth: resolvedBorderRightWidth, + borderBottomWidth: resolvedBorderBottomWidth, + borderLeftWidth: resolvedBorderLeftWidth, + borderColor: resolvedBorderColor, + borderCurve: resolvedBorderCurve, + backgroundColor: resolvedBackgroundColor, + backfaceVisibility: resolvedBackfaceVisibility, + outlineColor: resolvedOutlineColor, + outlineOffset: resolvedOutlineOffset, + outlineStyle: resolvedOutlineStyle, + outlineWidth: resolvedOutlineWidth, + pointerEvents: resolvedPointerEvents, + overflow: resolvedOverflow, + }; + }, + }; +}); diff --git a/packages/stacks/src/components/Column.tsx b/packages/stacks/src/components/Column.tsx new file mode 100644 index 00000000..70cc0723 --- /dev/null +++ b/packages/stacks/src/components/Column.tsx @@ -0,0 +1,39 @@ +import type * as React from 'react'; + +import type { Box } from './Box'; + +type Props = Omit< + React.ComponentProps, + | 'backgroundColor' + | 'borderRadius' + | 'borderTopLeftRadius' + | 'borderTopRightRadius' + | 'borderBottomLeftRadius' + | 'borderBottomRightRadius' + | 'borderWidth' + | 'borderTopWidth' + | 'borderRightWidth' + | 'borderBottomWidth' + | 'borderLeftWidth' + | 'borderColor' +>; + +const columnTypes = new Set(); + +const markAsColumn = (Component: T) => { + columnTypes.add(Component); + return Component; +}; + +export const isColumnType = (type: unknown) => { + return columnTypes.has(type); +}; + +export const Column = markAsColumn((_props: Props): React.ReactElement => { + throw new Error('Column must be a direct child of Columns.'); +}) as React.ComponentType & { + from: (Component: T) => T; +}; + +Column.from = markAsColumn; +Column.displayName = 'Column'; diff --git a/packages/stacks/src/components/Columns.tsx b/packages/stacks/src/components/Columns.tsx new file mode 100644 index 00000000..0065b420 --- /dev/null +++ b/packages/stacks/src/components/Columns.tsx @@ -0,0 +1,125 @@ +import * as React from 'react'; +import type { ViewStyle } from 'react-native'; +import { StyleSheet } from 'react-native-unistyles'; + +import type { AxisX, AxisY, Breakpoint, Flex, ResponsiveProp, Space } from '../types'; +import { mapResponsiveStyle, resolveCollapse, resolveFlexAlignment, resolveResponsiveStyleByCollapse } from '../utils'; +import { Box } from './Box'; +import { Column, isColumnType } from './Column'; + +type BoxProps = Omit, 'alignX' | 'alignY' | 'direction' | 'gap' | 'gapX' | 'gapY'>; +type ColumnElement = React.ReactElement; +type ColumnProps = React.ComponentProps; + +type ColumnsProps = { + readonly children?: ColumnElement | readonly ColumnElement[]; + readonly gap?: ResponsiveProp; + readonly defaultFlex?: ResponsiveProp; + readonly alignX?: ResponsiveProp; + readonly alignY?: ResponsiveProp; + readonly collapseBelow?: Breakpoint; +}; + +type Props = BoxProps & ColumnsProps; + +const getColumnProps = (child: React.ReactNode) => { + if (React.isValidElement(child) && isColumnType(child.type)) { + return child.props; + } + + return undefined; +}; + +const resolveColumnFlex = (props: ColumnProps, defaultFlex: ResponsiveProp) => { + return props.width === undefined ? (props.flex ?? defaultFlex) : 'content'; +}; + +export const Columns = (props: Props) => { + const { children, gap, defaultFlex = 'fluid', alignX, alignY, collapseBelow, style, ...rest } = props; + + return ( + + {React.Children.map(children as React.ReactNode, (child) => { + const columnProps = getColumnProps(child); + + if (columnProps === undefined) { + throw new Error('Columns accepts only Column components as direct children.'); + } + + if (React.isValidElement(child) && child.type !== Column) { + return React.cloneElement(child, { + flex: resolveColumnFlex(columnProps, defaultFlex), + style: [styles.column, columnProps.style, styles.item({ collapseBelow, gap }) as ViewStyle], + }); + } + + const { children, flex, style, ...rest } = columnProps; + + return ( + + {children} + + ); + })} + + ); +}; + +Columns.displayName = 'Columns'; + +const styles = StyleSheet.create((theme) => { + return { + from: (props: ColumnsProps) => { + const { alignX, alignY, collapseBelow, gap } = props; + const { alignItems, justifyContent } = resolveFlexAlignment({ + alignX, + alignY, + direction: 'row', + collapseBelow, + }); + const collapsedGap = resolveResponsiveStyleByCollapse({ + collapseBelow, + collapsed: gap, + }); + const expandedGap = resolveResponsiveStyleByCollapse({ + collapseBelow, + expanded: gap, + }); + const scaledCollapsedGap = mapResponsiveStyle(collapsedGap, theme.stacks.gap); + const scaledExpandedNegativeGap = mapResponsiveStyle(expandedGap, (value) => { + return theme.stacks.gap(value) * -1; + }); + + return { + flexDirection: resolveCollapse({ + collapseBelow, + expanded: 'row', + collapsed: 'column', + }), + gap: scaledCollapsedGap, + marginEnd: scaledExpandedNegativeGap, + alignItems, + justifyContent, + }; + }, + item: (style: Pick) => { + const { collapseBelow, gap } = style; + const expandedGap = resolveResponsiveStyleByCollapse({ + collapseBelow, + expanded: gap, + }); + const scaledExpandedGap = mapResponsiveStyle(expandedGap, theme.stacks.gap); + + return { + paddingEnd: scaledExpandedGap, + }; + }, + column: { + minWidth: 0, + }, + }; +}); diff --git a/packages/stacks/src/components/Inline.tsx b/packages/stacks/src/components/Inline.tsx new file mode 100644 index 00000000..ce8d6b02 --- /dev/null +++ b/packages/stacks/src/components/Inline.tsx @@ -0,0 +1,56 @@ +import type * as React from 'react'; +import type { ViewStyle } from 'react-native'; +import { StyleSheet } from 'react-native-unistyles'; + +import type { AxisX, AxisY, Breakpoint, ResponsiveProp, Space } from '../types'; +import { resolveCollapse, resolveFlexAlignment } from '../utils'; +import { Box } from './Box'; + +type BoxProps = Omit, 'alignX' | 'alignY' | 'direction' | 'wrap'>; + +type InlineProps = { + readonly alignX?: ResponsiveProp; + readonly alignY?: ResponsiveProp; + readonly collapseBelow?: Breakpoint; +}; + +export type Props = BoxProps & InlineProps; + +export const Inline = (props: Props) => { + const { children, alignX, alignY, collapseBelow, style, ...rest } = props; + + return ( + + {children} + + ); +}; + +Inline.displayName = 'Inline'; + +const styles = StyleSheet.create({ + from: (props: InlineProps) => { + const { alignX, alignY, collapseBelow } = props; + const { alignItems, justifyContent } = resolveFlexAlignment({ + alignX, + alignY, + direction: 'row', + collapseBelow, + }); + + return { + flexDirection: resolveCollapse({ + collapseBelow, + expanded: 'row', + collapsed: 'column', + }), + flexWrap: resolveCollapse({ + collapseBelow, + expanded: 'wrap', + collapsed: 'nowrap', + }), + alignItems, + justifyContent, + }; + }, +}); diff --git a/src/components/Inset.tsx b/packages/stacks/src/components/Inset.tsx similarity index 76% rename from src/components/Inset.tsx rename to packages/stacks/src/components/Inset.tsx index 1eb90e01..7d398ef0 100644 --- a/src/components/Inset.tsx +++ b/packages/stacks/src/components/Inset.tsx @@ -1,8 +1,7 @@ -import * as React from 'react'; - -import { Box } from './Box'; +import type * as React from 'react'; import type { ResponsiveProp } from '../types'; +import { Box } from './Box'; type BoxProps = Omit< React.ComponentProps, @@ -17,8 +16,8 @@ type BoxProps = Omit< | 'paddingEnd' >; -export type InsetProps = BoxProps & { - readonly space?: ResponsiveProp; +type InsetProps = { + readonly edge?: ResponsiveProp; readonly horizontal?: ResponsiveProp; readonly vertical?: ResponsiveProp; readonly top?: ResponsiveProp; @@ -29,14 +28,15 @@ export type InsetProps = BoxProps & { readonly end?: ResponsiveProp; }; -export const Inset = (props: InsetProps) => { - const { children, space, horizontal, vertical, start, end, top, right, bottom, left, ...rest } = - props; +type Props = BoxProps & InsetProps; + +export const Inset = (props: Props) => { + const { children, edge, horizontal, vertical, start, end, top, right, bottom, left, ...rest } = props; return ( ; +type RowComponent

= React.ComponentType

; + +const rowTypes = new Set(); + +const markAsRow = (Component: T) => { + rowTypes.add(Component); + return Component; +}; + +export const isRowType = (type: unknown): type is RowComponent => { + return typeof type === 'function' && rowTypes.has(type as RowComponent); +}; + +export const Row = markAsRow((_props: Props): React.ReactElement => { + throw new Error('Row must be a direct child of Rows.'); +}) as RowComponent & { + from: (Component: T) => T; +}; + +Row.from = markAsRow; +Row.displayName = 'Row'; diff --git a/packages/stacks/src/components/Rows.tsx b/packages/stacks/src/components/Rows.tsx new file mode 100644 index 00000000..15451ff2 --- /dev/null +++ b/packages/stacks/src/components/Rows.tsx @@ -0,0 +1,62 @@ +import * as React from 'react'; + +import type { AxisX, AxisY, Flex, ResponsiveProp, Space } from '../types'; +import { Box } from './Box'; +import { isRowType, Row } from './Row'; + +type BoxProps = Omit, 'alignX' | 'alignY' | 'direction' | 'gapX' | 'gapY'>; +type RowProps = React.ComponentProps; +type RowElement = React.ReactElement; + +type RowsProps = { + readonly children?: RowElement | readonly RowElement[]; + readonly defaultFlex?: ResponsiveProp; + readonly alignX?: ResponsiveProp; + readonly alignY?: ResponsiveProp; +}; + +type Props = BoxProps & RowsProps; + +const getRowProps = (child: React.ReactNode) => { + if (React.isValidElement(child) && isRowType(child.type)) { + return child.props; + } + + return undefined; +}; + +const resolveRowFlex = (props: RowProps, defaultFlex: ResponsiveProp) => { + return props.height === undefined ? (props.flex ?? defaultFlex) : 'content'; +}; + +export const Rows = (props: Props) => { + const { children, defaultFlex = 'fluid', ...rest } = props; + + return ( + + {React.Children.map(children as React.ReactNode, (child) => { + const rowProps = getRowProps(child); + + if (rowProps === undefined) { + throw new Error('Rows accepts only Row components as direct children.'); + } + + if (React.isValidElement(child) && child.type !== Row) { + return React.cloneElement(child, { + flex: resolveRowFlex(rowProps, defaultFlex), + }); + } + + const { children, ...rest } = rowProps; + + return ( + + {children} + + ); + })} + + ); +}; + +Rows.displayName = 'Rows'; diff --git a/packages/stacks/src/components/Stack.tsx b/packages/stacks/src/components/Stack.tsx new file mode 100644 index 00000000..73e9b89b --- /dev/null +++ b/packages/stacks/src/components/Stack.tsx @@ -0,0 +1,51 @@ +import * as React from 'react'; +import type { ViewStyle } from 'react-native'; +import { StyleSheet } from 'react-native-unistyles'; + +import type { AxisX, AxisY, ResponsiveProp } from '../types'; +import { flattenChildren, intersperse, resolveFlexAlignment, resolveResponsiveStyle } from '../utils'; +import { Box } from './Box'; + +type BoxProps = Omit, 'alignX' | 'alignY' | 'direction' | 'gapX' | 'gapY'>; + +type StackProps = { + readonly horizontal?: ResponsiveProp; + readonly align?: ResponsiveProp; + readonly divider?: React.ReactElement; +}; + +export type Props = BoxProps & StackProps; + +export const Stack = (props: Props) => { + const { children, flex = 'content', horizontal, align, divider, style, ...rest } = props; + + return ( + + {React.isValidElement(divider) + ? flattenChildren(intersperse(React.Children.toArray(children), divider)) + : children} + + ); +}; + +Stack.displayName = 'Stack'; + +const styles = StyleSheet.create({ + from: (props: Omit) => { + const { align, horizontal } = props; + const { alignItems, justifyContent } = resolveFlexAlignment({ + alignX: align, + alignY: align, + horizontal, + }); + + return { + flexDirection: resolveResponsiveStyle(horizontal, { + false: 'column', + true: 'row', + }), + alignItems, + justifyContent, + }; + }, +}); diff --git a/packages/stacks/src/components/Tiles.tsx b/packages/stacks/src/components/Tiles.tsx new file mode 100644 index 00000000..d70973c0 --- /dev/null +++ b/packages/stacks/src/components/Tiles.tsx @@ -0,0 +1,50 @@ +import * as React from 'react'; +import type { ViewStyle } from 'react-native'; +import { StyleSheet } from 'react-native-unistyles'; + +import type { AxisY, ResponsiveProp, Space } from '../types'; +import { resolveFlexBasis, resolveResponsiveStyle } from '../utils'; +import { Box } from './Box'; + +type BoxProps = Omit, 'alignX' | 'alignY' | 'direction' | 'wrap'>; + +type TilesProps = { + readonly columns?: ResponsiveProp; + readonly fill?: ResponsiveProp; + readonly alignY?: ResponsiveProp; +}; + +type Props = BoxProps & TilesProps; + +export const Tiles = (props: Props) => { + const { children, columns = 1, fill = false, ...rest } = props; + + return ( + + {React.Children.toArray(children).map((child, index) => { + return ( + + {child} + + ); + })} + + ); +}; + +Tiles.displayName = 'Tiles'; + +const styles = StyleSheet.create({ + tile: (props: Omit) => { + const { columns, fill } = props; + + return { + flexBasis: resolveFlexBasis(columns), + flexGrow: resolveResponsiveStyle(fill, { + false: 0, + true: 1, + }), + flexShrink: 0, + }; + }, +}); diff --git a/src/components/index.ts b/packages/stacks/src/components/index.ts similarity index 76% rename from src/components/index.ts rename to packages/stacks/src/components/index.ts index 43500fe2..27f95c01 100644 --- a/src/components/index.ts +++ b/packages/stacks/src/components/index.ts @@ -1,13 +1,11 @@ +export * from './AbsoluteBox'; export * from './Bleed'; export * from './Box'; export * from './Column'; export * from './Columns'; -export * from './FloatBox'; -export * from './Grid'; -export * from './Hidden'; export * from './Inline'; export * from './Inset'; -export * from './Rows'; export * from './Row'; +export * from './Rows'; export * from './Stack'; export * from './Tiles'; diff --git a/src/index.ts b/packages/stacks/src/index.ts similarity index 68% rename from src/index.ts rename to packages/stacks/src/index.ts index 2103701b..195d95f5 100644 --- a/src/index.ts +++ b/packages/stacks/src/index.ts @@ -1,3 +1,2 @@ export * from './components'; -export * from './hooks'; export * from './types'; diff --git a/packages/stacks/src/polymorphic.ts b/packages/stacks/src/polymorphic.ts new file mode 100644 index 00000000..46ae7916 --- /dev/null +++ b/packages/stacks/src/polymorphic.ts @@ -0,0 +1,31 @@ +import type * as React from 'react'; + +type Merge = Omit & P2; + +type ComponentProps = React.ComponentPropsWithRef; + +type PolymorphicProps = Merge< + Omit, 'as' | 'style'>, + Omit & { + readonly as?: ComponentType; + style?: ComponentProps['style']; + } +>; + +export interface Polymorphic< + DefaultComponentType extends React.ElementType, + OwnProps = object, + AllowedComponentType extends React.ElementType = React.ElementType, +> { + displayName: string; + (props: PolymorphicProps): React.ReactElement | null; + ( + props: Merge< + Omit, 'as' | 'style'>, + Omit & { + readonly as: As; + style?: ComponentProps['style']; + } + >, + ): React.ReactElement | null; +} diff --git a/packages/stacks/src/types.ts b/packages/stacks/src/types.ts new file mode 100644 index 00000000..43e6662d --- /dev/null +++ b/packages/stacks/src/types.ts @@ -0,0 +1,46 @@ +import type { UnistylesBreakpoints } from 'react-native-unistyles'; + +export type Breakpoint = keyof UnistylesBreakpoints; +// biome-ignore lint/suspicious/noEmptyInterface: augmented by design-system consumers +export interface StacksColorPalette {} +// biome-ignore lint/suspicious/noEmptyInterface: augmented by design-system consumers +export interface StacksBorderRadius {} +// biome-ignore lint/suspicious/noEmptyInterface: augmented by design-system consumers +export interface StacksGap {} +// biome-ignore lint/suspicious/noEmptyInterface: augmented by design-system consumers +export interface StacksMargin {} +// biome-ignore lint/suspicious/noEmptyInterface: augmented by design-system consumers +export interface StacksPadding {} + +type AnyString = string & {}; +type AnyNumber = number & {}; + +export type StacksConfig = { + colorPaletteKey?: string; + gap: (value?: Gap) => number; + borderRadius: (value?: BorderRadius) => number; + margin: (value?: Margin) => number; + padding: (value?: Padding) => number; +}; + +export type AxisX = 'left' | 'center' | 'right'; +export type AxisY = 'top' | 'center' | 'bottom'; +export type Stretch = 'stretch'; +export type Space = 'between' | 'around' | 'evenly'; +export type Direction = 'row' | 'row-reverse' | 'column' | 'column-reverse'; +export type Wrap = 'wrap' | 'no-wrap' | 'wrap-reverse'; +export type PointerEvent = 'auto' | 'box-none' | 'box-only' | 'none'; +export type Overflow = 'visible' | 'hidden'; +export type BackfaceVisibility = 'visible' | 'hidden'; +export type OutlineStyle = 'solid' | 'dotted' | 'dashed'; +export type BorderCurve = 'circular' | 'continuous'; + +export type Flex = 'content' | 'fluid' | '1/2' | '1/3' | '2/3' | '1/4' | '3/4' | '1/5' | '2/5' | '3/5' | '4/5'; +export type Alignment = AxisX | AxisY | Space | Stretch; +export type Color = keyof StacksColorPalette | AnyString; +export type BorderRadius = keyof StacksBorderRadius | AnyNumber; +export type Gap = keyof StacksGap | AnyNumber; +export type Margin = keyof StacksMargin | AnyNumber; +export type Padding = keyof StacksPadding | AnyNumber; + +export type ResponsiveProp = T | readonly T[]; diff --git a/packages/stacks/src/utils.ts b/packages/stacks/src/utils.ts new file mode 100644 index 00000000..a23eba34 --- /dev/null +++ b/packages/stacks/src/utils.ts @@ -0,0 +1,556 @@ +import * as React from 'react'; +import type { DimensionValue } from 'react-native'; +import { UnistylesRuntime, type UnistylesThemes } from 'react-native-unistyles'; + +import type { Alignment, Breakpoint, Color, Direction, Flex, ResponsiveProp, StacksConfig, Wrap } from './types'; + +type Number = T extends number ? number : T; +type BooleanMap = { true?: True; false?: False }; +type Boolean = T extends BooleanMap ? False | True : never; + +const dual: { + ) => any, DataFirst extends (...args: Array) => any>( + arity: Parameters['length'], + body: DataFirst, + ): DataLast & DataFirst; + ) => any, DataFirst extends (...args: Array) => any>( + isDataFirst: (args: IArguments) => boolean, + body: DataFirst, + ): DataLast & DataFirst; + // biome-ignore lint/complexity/useArrowFunction: ignore +} = function (arity, body) { + if (typeof arity === 'function') { + return function (this: any) { + // biome-ignore lint/complexity/noArguments: ignore + return arity(arguments) ? body.apply(this, arguments as any) : (((self: any) => body(self, ...arguments)) as any); + }; + } + + switch (arity) { + case 0: + case 1: + throw new RangeError(`Invalid arity ${arity}`); + + case 2: + return function (a, b) { + // biome-ignore lint/complexity/noArguments: ignore + if (arguments.length >= 2) { + return body(a, b); + } + // biome-ignore lint/complexity/useArrowFunction: ignore + return function (self: any) { + return body(self, a); + }; + }; + + case 3: + return function (a, b, c) { + // biome-ignore lint/complexity/noArguments: ignore + if (arguments.length >= 3) { + return body(a, b, c); + } + // biome-ignore lint/complexity/useArrowFunction: ignore + return function (self: any) { + return body(self, a, b); + }; + }; + + default: + return function () { + // biome-ignore lint/complexity/noArguments: ignore + if (arguments.length >= arity) { + // @ts-expect-error + // biome-ignore lint/complexity/noArguments: ignore + return body.apply(this, arguments); + } + // biome-ignore lint/complexity/noArguments: ignore + const args = arguments; + // biome-ignore lint/complexity/useArrowFunction: ignore + return function (self: any) { + return body(self, ...args); + }; + }; + } +}; + +export const flattenChildren = (children: React.ReactNode): ReturnType => { + return React.Children.toArray(children).reduce( + (acc: ReturnType, child) => { + if (React.isValidElement(child) && child.type === React.Fragment) { + return acc.concat(flattenChildren(child.props.children)); + } + acc.push(child); + return acc; + }, + [] as ReturnType, + ); +}; + +const reduceWithIndex = (arr: readonly A[], initialValue: B, fn: (acc: B, element: A, index: number) => B): B => { + let e = initialValue; + + for (let t = 0, v = arr.length; t < v; ++t) { + e = fn(e, arr[t] as A, t); + } + + return e; +}; + +export const intersperse = (arr: readonly A[], delimiter: A) => { + return reduceWithIndex(arr, [] as A[], (acc, element, index) => { + if (((arr.length - 1) | 0) === index) { + acc.push(element); + } else { + acc.push(element, delimiter); + } + return acc; + }); +}; + +const normalizeResponsiveProp = (responsiveProp: ResponsiveProp): readonly T[] => { + if (typeof responsiveProp === 'string' || typeof responsiveProp === 'number' || typeof responsiveProp === 'boolean') { + return [responsiveProp]; + } + + if (responsiveProp && Array.isArray(responsiveProp) && responsiveProp.length > 0) { + return responsiveProp; + } + + if (__DEV__) { + // biome-ignore lint/suspicious/noConsole: warn about invalid layout input in development + console.warn(`Invalid ResponsiveProp: ${JSON.stringify(responsiveProp)}`); + } + + return []; +}; + +const getResponsiveValue = dual< + (index: number) => (responsiveProp?: ResponsiveProp) => T | undefined, + (responsiveProp: ResponsiveProp | undefined, index: number) => T | undefined +>(2, (responsiveProp: ResponsiveProp | undefined, index: number) => { + if (typeof responsiveProp === 'undefined') { + return undefined; + } + + const normalized = normalizeResponsiveProp(responsiveProp); + const last = normalized[normalized.length - 1]; + + return normalized[index] ?? last; +}); + +const resolveWithBreakpointEntries = (mapFn: (breakpoints: readonly [string, number][]) => T) => { + const breakpoints = Object.entries(UnistylesRuntime.breakpoints).sort(([, first], [, second]) => { + return first - second; + }); + return mapFn(breakpoints); +}; + +const resolveWithBreakpointKeys = (mapFn: (key: Breakpoint, index: number) => [Breakpoint, T]) => { + return resolveWithBreakpointEntries((breakpoints) => { + const keys = breakpoints.map(([key]) => { + return key as Breakpoint; + }); + + return Object.fromEntries(keys.map(mapFn)) as Partial>; + }); +}; + +const resolveWithBreakpointMap = (mapFn: (key: Breakpoint, index: number) => T) => { + return resolveWithBreakpointKeys((key, index) => { + return [key, mapFn(key, index)]; + }); +}; + +const resolveResponsiveValue = ( + responsiveProp: ResponsiveProp | undefined, + transform: (value: In) => Out, +) => { + if (typeof responsiveProp === 'undefined') { + return undefined; + } + + return resolveWithBreakpointMap((_key, index) => { + const value = getResponsiveValue(responsiveProp, index); + return transform(value as In); + }); +}; + +export function resolveResponsiveStyle>>( + responsiveProp: ResponsiveProp, + to: To, +): Partial | undefined>>; +export function resolveResponsiveStyle>>( + responsiveProp: ResponsiveProp | undefined, + to: To, +): Partial | undefined>> | undefined; +export function resolveResponsiveStyle( + responsiveProp: ResponsiveProp, + to: To, +): Partial | undefined>>; +export function resolveResponsiveStyle( + responsiveProp: ResponsiveProp | undefined, + to: To, +): Partial | undefined>> | undefined; +export function resolveResponsiveStyle( + responsiveProp: ResponsiveProp, +): Partial>; +export function resolveResponsiveStyle( + responsiveProp: ResponsiveProp | undefined, +): Partial> | undefined; + +export function resolveResponsiveStyle( + responsiveProp: ResponsiveProp | undefined, + to?: Partial>, +) { + const resolved = resolveResponsiveValue(responsiveProp, (value) => { + return to ? to[String(value) as PropertyKey] : value; + }); + + if (resolved && to) { + return Object.entries(resolved).reduce>((result, [breakpoint, value]) => { + if (isObject(value)) { + return Object.entries(value).reduce((result, [key, propValue]) => { + const value = Object.assign(isObject(result[key]) ? result[key] : {}, { + [breakpoint]: propValue, + }); + + return Object.assign(result, { + [key]: value, + }); + }, result); + } + + return Object.assign(result, { + [breakpoint]: value, + }); + }, {}); + } + + return resolved; +} + +export function resolveResponsiveProp>( + responsiveProp: ResponsiveProp | undefined, + to: To, +): To[keyof To] | undefined; +export function resolveResponsiveProp(responsiveProp: ResponsiveProp): T | undefined; +export function resolveResponsiveProp(responsiveProp: ResponsiveProp | undefined): T | undefined; +export function resolveResponsiveProp( + responsiveProp: ResponsiveProp | undefined, + to?: Record, +) { + if (typeof responsiveProp === 'undefined') { + return undefined; + } + + return resolveWithBreakpointEntries((breakpoints) => { + const index = breakpoints.findIndex(([breakpoint]) => { + return breakpoint === UnistylesRuntime.breakpoint; + }); + const value = getResponsiveValue(responsiveProp, index); + return to && value !== undefined ? to[value as keyof typeof to] : value; + }); +} + +type CollapseOptions = { + collapseBelow?: Breakpoint; + expanded: T; + collapsed: T; +}; + +type CollapsedResponsivePropOptions = { + collapseBelow?: Breakpoint; + expanded?: ResponsiveProp; + collapsed?: ResponsiveProp; +}; + +type Theme = UnistylesThemes[keyof UnistylesThemes] & { + stacks: StacksConfig; +}; + +type AlignmentOptions = { + alignX?: ResponsiveProp; + alignY?: ResponsiveProp; + direction?: ResponsiveProp; + horizontal?: ResponsiveProp; + collapseBelow?: Breakpoint; +}; + +type FlexSizingOptions = { + flex?: ResponsiveProp; + direction?: ResponsiveProp; + width?: ResponsiveProp; + height?: ResponsiveProp; +}; + +type FlexDirectionOptions = { + direction?: ResponsiveProp; + reverse?: ResponsiveProp; +}; + +const isBreakpointBelow = (currentBreakpoint: Breakpoint, breakpoint?: Breakpoint) => { + if (breakpoint === undefined) { + return false; + } + + const currentValue = UnistylesRuntime.breakpoints[currentBreakpoint]; + const breakpointValue = UnistylesRuntime.breakpoints[breakpoint]; + + return typeof currentValue === 'number' && typeof breakpointValue === 'number' && currentValue < breakpointValue; +}; + +export const resolveCollapse = (options: CollapseOptions) => { + const { collapseBelow, expanded, collapsed } = options; + + return resolveWithBreakpointMap((key) => { + return isBreakpointBelow(key, collapseBelow) ? collapsed : expanded; + }); +}; + +export const resolveResponsiveStyleByCollapse = (options: CollapsedResponsivePropOptions) => { + const { collapseBelow, expanded, collapsed } = options; + + return resolveWithBreakpointMap((key, index) => { + const responsiveProp = isBreakpointBelow(key, collapseBelow) ? collapsed : expanded; + return getResponsiveValue(responsiveProp, index); + }); +}; + +const isObject = (value: unknown): value is Record => { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value); +}; + +const CSS_VARIABLE = /^var\((--[^),]+)\)$/; + +const resolveThemeString = (value: unknown) => { + if (typeof value !== 'string') { + return undefined; + } + + const match = CSS_VARIABLE.exec(value.trim()); + + if (match) { + // @ts-expect-error: ignore + if (typeof document === 'undefined') { + return undefined; + } + // @ts-expect-error: ignore + return getComputedStyle(document.documentElement).getPropertyValue(match[1]).trim(); + } + + return value; +}; + +const getColorPalette = (theme: Theme): Record | undefined => { + const paletteKey = resolveThemeString(theme.stacks.colorPaletteKey); + const palette = paletteKey ? theme[paletteKey as keyof Theme] : undefined; + + return isObject(palette) ? palette : undefined; +}; + +export const resolveColor = (theme: Theme) => { + return (color?: ResponsiveProp) => { + const palette: Record | undefined = getColorPalette(theme); + + return resolveResponsiveValue(color, (value) => { + if (typeof value !== 'string') { + return value; + } + + const resolvedValue = palette?.[value]; + + if (typeof resolvedValue === 'string') { + return resolvedValue; + } + + return value; + }); + }; +}; + +export function mapResponsiveStyle( + responsiveProp: Partial>, + transform: (value: In) => Out, +): Partial>; +export function mapResponsiveStyle( + responsiveProp: Partial> | undefined, + transform: (value: In) => Out, +): Partial> | undefined; + +export function mapResponsiveStyle( + responsiveProp: Partial> | undefined, + transform: (value: In) => Out, +) { + if (responsiveProp === undefined) { + return undefined; + } + + return resolveWithBreakpointMap((key) => { + const value = responsiveProp[key]; + return value === undefined ? undefined : transform(value); + }); +} + +const makeResponsiveStyleResolver = (transform: (value: In) => Out) => { + return (value?: ResponsiveProp) => { + return mapResponsiveStyle(resolveResponsiveStyle(value), transform); + }; +}; + +export const resolveGap = (theme: Theme) => { + return makeResponsiveStyleResolver(theme.stacks.gap); +}; + +export const resolveMargin = (theme: Theme) => { + return makeResponsiveStyleResolver(theme.stacks.margin); +}; + +export const resolvePadding = (theme: Theme) => { + return makeResponsiveStyleResolver(theme.stacks.padding); +}; + +export const resolveNegativeGap = (theme: Theme) => { + return makeResponsiveStyleResolver((value) => { + return theme.stacks.gap(value) * -1; + }); +}; + +export const resolveBorderRadius = (theme: Theme) => { + return makeResponsiveStyleResolver(theme.stacks.borderRadius); +}; + +const isColumnDirection = (direction?: Direction) => { + return direction === undefined || direction === 'column' || direction === 'column-reverse'; +}; + +const reverseDirection = (direction?: Direction) => { + switch (direction) { + case 'row': + return 'row-reverse'; + case 'row-reverse': + return 'row'; + case 'column-reverse': + return 'column'; + default: + return 'column-reverse'; + } +}; + +const alignItemsMap = { + left: 'flex-start', + center: 'center', + right: 'flex-end', + stretch: 'stretch', + top: 'flex-start', + bottom: 'flex-end', +} as const; + +const justifyContentMap = { + left: 'flex-start', + center: 'center', + right: 'flex-end', + top: 'flex-start', + bottom: 'flex-end', + between: 'space-between', + around: 'space-around', + evenly: 'space-evenly', +} as const; + +const flexBasisMap = { + content: 'auto', + fluid: '0%', + '1/2': '50%', + '1/3': '33.3333%', + '1/4': '25%', + '2/3': '66.6667%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', +} as const; + +const wrapMap = { + wrap: 'wrap', + 'no-wrap': 'nowrap', + 'wrap-reverse': 'wrap-reverse', +} as const; + +export const resolveFlexWrap = (wrap?: ResponsiveProp) => { + return resolveResponsiveStyle(wrap, wrapMap); +}; + +export const resolveFlexAlignment = (options: AlignmentOptions) => { + const { alignX, alignY, direction, horizontal, collapseBelow } = options; + + return { + alignItems: resolveWithBreakpointMap((key, index) => { + const getValue = getResponsiveValue(index); + const currentDirection = isBreakpointBelow(key, collapseBelow) + ? 'column' + : (getValue(direction) ?? (getValue(horizontal) ? 'row' : undefined)); + const value = isColumnDirection(currentDirection) ? getValue(alignX) : getValue(alignY); + + return alignItemsMap[value as keyof typeof alignItemsMap]; + }), + justifyContent: resolveWithBreakpointMap((key, index) => { + const getValue = getResponsiveValue(index); + const currentDirection = isBreakpointBelow(key, collapseBelow) + ? 'column' + : (getValue(direction) ?? (getValue(horizontal) ? 'row' : undefined)); + const value = isColumnDirection(currentDirection) ? getValue(alignY) : getValue(alignX); + + return justifyContentMap[value as keyof typeof justifyContentMap]; + }), + }; +}; + +const resolveFlexValue = (options: FlexSizingOptions, index: number) => { + const { flex, direction, width, height } = options; + const getValue = getResponsiveValue(index); + const currentDirection = getValue(direction); + const hasFixedMainAxisSize = isColumnDirection(currentDirection) + ? getValue(height) !== undefined + : getValue(width) !== undefined; + + return hasFixedMainAxisSize ? 'content' : getResponsiveValue(flex, index); +}; + +export const resolveFlexBasis = (columns?: ResponsiveProp) => { + return resolveWithBreakpointMap((_key, index) => { + const value = Math.max(getResponsiveValue(columns, index) ?? 1, 1); + return `${100 / value}%` as DimensionValue; + }); +}; + +export const resolveFlexSizing = (options: FlexSizingOptions) => { + return { + flexBasis: resolveWithBreakpointMap((_key, index) => { + const value = resolveFlexValue(options, index); + return value === undefined ? undefined : flexBasisMap[value]; + }), + flexGrow: resolveWithBreakpointMap((_key, index) => { + const value = resolveFlexValue(options, index); + return value === 'fluid' ? 1 : value === undefined ? undefined : 0; + }), + flexShrink: resolveWithBreakpointMap((_key, index) => { + const value = resolveFlexValue(options, index); + return value === 'fluid' ? 0 : undefined; + }), + }; +}; + +export const resolveFlexDirection = (options: FlexDirectionOptions) => { + const { direction, reverse } = options; + + if (reverse === undefined) { + return resolveResponsiveStyle(direction); + } + + return resolveWithBreakpointMap((_key, index) => { + const currentDirection = getResponsiveValue(direction, index); + const currentReverse = getResponsiveValue(reverse, index); + + return currentReverse ? reverseDirection(currentDirection) : currentDirection; + }); +}; diff --git a/plugin/index.js b/plugin/index.js deleted file mode 100644 index 78233a4d..00000000 --- a/plugin/index.js +++ /dev/null @@ -1,120 +0,0 @@ -module.exports = babel => { - const { types: t } = babel; - - const getAttribute = (attributes, name) => { - return attributes.find(attribute => { - return attribute.name.name === name; - }); - }; - - const makeBreakpointCallExpression = (key, value) => { - const expression = value.type === 'JSXExpressionContainer' ? value.expression : value; - - return t.callExpression( - t.memberExpression( - t.callExpression(t.identifier('useBreakpointComparators'), []), - t.identifier(key), - ), - [expression], - ); - }; - - const transformAttributeFactory = attributes => { - return (attributeName, expressionName) => { - const attribute = getAttribute(attributes, attributeName); - - if (attribute) { - return makeBreakpointCallExpression(expressionName, attribute.value); - } - }; - }; - - const makeImportSpecifier = name => { - const identifier = t.Identifier(name); - return t.ImportSpecifier(identifier, identifier); - }; - - let importDeclaration = undefined; - let program = undefined; - - return { - visitor: { - Program(path) { - program = path; - }, - ImportDeclaration(path) { - if (path.node.source.value === '@grapp/stacks') { - importDeclaration = path; - } - }, - JSXElement(path) { - if (path.node.openingElement && path.node.openingElement.name.name !== 'Hidden') { - return; - } - - const transformAttribute = transformAttributeFactory(path.node.openingElement.attributes); - const belowAttribute = transformAttribute('below', 'isBelow'); - const aboveAttribute = transformAttribute('above', 'isAbove'); - - let logicalExpression = t.booleanLiteral(false); - - if (belowAttribute && aboveAttribute) { - logicalExpression = t.logicalExpression('||', belowAttribute, aboveAttribute); - } else if (belowAttribute) { - logicalExpression = belowAttribute; - } else if (aboveAttribute) { - logicalExpression = aboveAttribute; - } - - if (logicalExpression) { - let child = path.node.children.find(child => { - return ( - child.type === 'JSXElement' || - child.type === 'JSXFragment' || - child.type === 'JSXExpressionContainer' - ); - }); - - if (!child) { - return; - } - - if (child.type === 'JSXExpressionContainer') { - child = child.expression; - } - - const conditionalExpression = t.conditionalExpression( - logicalExpression, - t.nullLiteral(), - child, - ); - - if (path.parent && path.parent.type === 'ReturnStatement') { - path.replaceWith(conditionalExpression); - } else { - path.replaceWith(t.jsxExpressionContainer(conditionalExpression)); - } - - const importHook = makeImportSpecifier('useBreakpointComparators'); - - if (importDeclaration) { - const isImported = importDeclaration.node.specifiers.some(specifier => { - return specifier.imported.name === 'useBreakpointComparators'; - }); - - if ((belowAttribute || aboveAttribute) && !isImported) { - importDeclaration.unshiftContainer('specifiers', importHook); - } - } else { - const specifiers = belowAttribute || aboveAttribute ? [importHook] : []; - - program.unshiftContainer( - 'body', - t.importDeclaration(specifiers, t.stringLiteral('@grapp/stacks')), - ); - } - } - }, - }, - }; -}; diff --git a/src/components/Bleed.tsx b/src/components/Bleed.tsx deleted file mode 100644 index e4e67286..00000000 --- a/src/components/Bleed.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from 'react'; - -import { Box } from './Box'; - -import type { ResponsiveProp } from '../types'; -import { negate } from '../utils'; - -type BoxProps = Omit< - React.ComponentProps, - | 'margin' - | 'marginX' - | 'marginY' - | 'marginTop' - | 'marginRight' - | 'marginBottom' - | 'marginLeft' - | 'marginStart' - | 'marginEnd' ->; - -export type BleedProps = BoxProps & { - readonly space?: ResponsiveProp; - readonly horizontal?: ResponsiveProp; - readonly vertical?: ResponsiveProp; - readonly top?: ResponsiveProp; - readonly right?: ResponsiveProp; - readonly bottom?: ResponsiveProp; - readonly left?: ResponsiveProp; - readonly start?: ResponsiveProp; - readonly end?: ResponsiveProp; -}; - -export const Bleed = (props: BleedProps) => { - const { children, space, horizontal, vertical, start, end, top, right, bottom, left, ...rest } = - props; - - return ( - - {children} - - ); -}; - -Bleed.displayName = 'Bleed'; diff --git a/src/components/Box.tsx b/src/components/Box.tsx deleted file mode 100644 index 50c72845..00000000 --- a/src/components/Box.tsx +++ /dev/null @@ -1,312 +0,0 @@ -import * as React from 'react'; -import { DimensionValue, View, ViewProps } from 'react-native'; -import { createStyleSheet, useStyles } from 'react-native-unistyles'; - -import { useDebugStyle, useResponsiveProp, useSpacingHelpers } from '../hooks'; -import type * as Polymorphic from '../polymorphic'; -import type { AxisX, AxisY, Direction, Flex, ResponsiveProp, Space, Stretch, Wrap } from '../types'; -import { resolveDirectionAndReverse } from '../utils'; - -export type BoxProps = ViewProps & { - readonly alignX?: ResponsiveProp; - readonly alignY?: ResponsiveProp; - readonly gap?: ResponsiveProp; - readonly rowGap?: ResponsiveProp; - readonly columnGap?: ResponsiveProp; - readonly padding?: ResponsiveProp; - readonly paddingX?: ResponsiveProp; - readonly paddingY?: ResponsiveProp; - readonly paddingTop?: ResponsiveProp; - readonly paddingBottom?: ResponsiveProp; - readonly paddingLeft?: ResponsiveProp; - readonly paddingRight?: ResponsiveProp; - readonly paddingEnd?: ResponsiveProp; - readonly paddingStart?: ResponsiveProp; - readonly margin?: ResponsiveProp; - readonly marginX?: ResponsiveProp; - readonly marginY?: ResponsiveProp; - readonly marginTop?: ResponsiveProp; - readonly marginBottom?: ResponsiveProp; - readonly marginLeft?: ResponsiveProp; - readonly marginRight?: ResponsiveProp; - readonly marginStart?: ResponsiveProp; - readonly marginEnd?: ResponsiveProp; - readonly direction?: ResponsiveProp; - readonly wrap?: ResponsiveProp; - readonly flex?: ResponsiveProp; - readonly reverse?: ResponsiveProp; - readonly backgroundColor?: ResponsiveProp; - readonly borderRadius?: ResponsiveProp; - readonly borderTopLeftRadius?: ResponsiveProp; - readonly borderTopRightRadius?: ResponsiveProp; - readonly borderBottomLeftRadius?: ResponsiveProp; - readonly borderBottomRightRadius?: ResponsiveProp; - readonly borderWidth?: ResponsiveProp; - readonly borderTopWidth?: ResponsiveProp; - readonly borderRightWidth?: ResponsiveProp; - readonly borderBottomWidth?: ResponsiveProp; - readonly borderLeftWidth?: ResponsiveProp; - readonly borderColor?: ResponsiveProp; - readonly width?: ResponsiveProp; - readonly height?: ResponsiveProp; - readonly debuggable?: ResponsiveProp; -}; - -type PolymorphicBox = Polymorphic.ForwardRefComponent; - -export const Box = React.forwardRef((props, ref) => { - const { - children, - as: Component = View, - alignX, - alignY, - gap, - rowGap, - columnGap, - padding, - paddingX, - paddingY, - paddingTop, - paddingBottom, - paddingLeft, - paddingRight, - paddingEnd, - paddingStart, - margin, - marginX, - marginY, - marginTop, - marginBottom, - marginLeft, - marginRight, - marginStart, - marginEnd, - direction = 'column', - wrap, - flex, - reverse, - backgroundColor, - width, - height, - borderRadius, - borderTopLeftRadius, - borderTopRightRadius, - borderBottomLeftRadius, - borderBottomRightRadius, - borderColor, - borderWidth, - borderTopWidth, - borderRightWidth, - borderBottomWidth, - borderLeftWidth, - style, - debuggable = true, - ...rest - } = props; - - const { multiply } = useSpacingHelpers(); - const debugStyle = useDebugStyle(); - const resolveResponsiveProp = useResponsiveProp(); - - const reversed = resolveResponsiveProp(reverse); - const flexDirection = resolveDirectionAndReverse(resolveResponsiveProp(direction), reversed); - - const isDirectionColumn = flexDirection === 'column' || flexDirection === 'column-reverse'; - const alignItems = resolveResponsiveProp(isDirectionColumn ? alignX : alignY); - const justifyContent = resolveResponsiveProp(isDirectionColumn ? alignY : alignX); - const defaultWidth = resolveResponsiveProp(width); - const defaultHeight = resolveResponsiveProp(height); - const isDebuggable = resolveResponsiveProp(debuggable); - - const flexWrap = resolveResponsiveProp(wrap); - const flexBasis = resolveResponsiveProp( - isDirectionColumn - ? typeof defaultHeight === 'undefined' - ? flex - : 'content' - : typeof defaultWidth === 'undefined' - ? flex - : 'content', - ); - - const { styles } = useStyles(stylesheet, { - justifyContent, - alignItems, - flexBasis, - flexWrap, - flexDirection, - }); - - return ( - - {children} - - ); -}) as PolymorphicBox; - -Box.displayName = 'Box'; - -const stylesheet = createStyleSheet({ - root: { - variants: { - alignItems: { - left: { - alignItems: 'flex-start', - }, - center: { - alignItems: 'center', - }, - right: { - alignItems: 'flex-end', - }, - stretch: { - alignItems: 'stretch', - }, - top: { - alignItems: 'flex-start', - }, - bottom: { - alignItems: 'flex-end', - }, - between: undefined!, - around: undefined!, - evenly: undefined!, - }, - justifyContent: { - top: { - justifyContent: 'flex-start', - }, - center: { - justifyContent: 'center', - }, - bottom: { - justifyContent: 'flex-end', - }, - stretch: undefined!, - left: { - justifyContent: 'flex-start', - }, - right: { - justifyContent: 'flex-end', - }, - between: { - justifyContent: 'space-between', - }, - around: { - justifyContent: 'space-around', - }, - evenly: { - justifyContent: 'space-evenly', - }, - }, - flexDirection: { - row: { - flexDirection: 'row', - }, - ['row-reverse']: { - flexDirection: 'row-reverse', - }, - column: { - flexDirection: 'column', - }, - ['column-reverse']: { - flexDirection: 'column-reverse', - }, - }, - flexWrap: { - wrap: { - flexWrap: 'wrap', - }, - ['no-wrap']: { - flexWrap: 'nowrap', - }, - ['wrap-reverse']: { - flexWrap: 'wrap-reverse', - }, - }, - flexBasis: { - content: { - flex: 0, - flexBasis: 'auto', - }, - fluid: { - flexGrow: 1, - flexShrink: 0, - flexBasis: '0%', - }, - ['1/2']: { - flexBasis: '50%', - }, - ['1/3']: { - flexBasis: '33.3333%', - }, - ['1/4']: { - flexBasis: '25%', - }, - ['2/3']: { - flexBasis: '66.6667%', - }, - ['3/4']: { - flexBasis: '75%', - }, - ['1/5']: { - flexBasis: '20%', - }, - ['2/5']: { - flexBasis: '40%', - }, - ['3/5']: { - flexBasis: '60%', - }, - ['4/5']: { - flexBasis: '80%', - }, - }, - }, - }, -}); diff --git a/src/components/Column.tsx b/src/components/Column.tsx deleted file mode 100644 index 725c78e6..00000000 --- a/src/components/Column.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react'; - -import { BoxProps } from './Box'; - -export const Column = (_props: BoxProps): JSX.Element => { - throw new Error('[Stacks] Column must be a direct child of Columns.'); -}; - -const markAsColumn = (node: React.FC) => { - // @ts-expect-error: this_is_fine.png - // eslint-disable-next-line functional/immutable-data - node.__isColumn__ = true; -}; - -const from = >(Component: T) => { - // @ts-expect-error: this_is_fine.png - Component.__isColumnForwarded__ = true; - return Component; -}; - -Column.from = from; -Column.displayName = 'Column'; -markAsColumn(Column); diff --git a/src/components/Columns.tsx b/src/components/Columns.tsx deleted file mode 100644 index d076181d..00000000 --- a/src/components/Columns.tsx +++ /dev/null @@ -1,333 +0,0 @@ -import * as React from 'react'; -import { Platform } from 'react-native'; - -import { Box } from './Box'; -import { Column } from './Column'; -import { FloatBox } from './FloatBox'; - -import { - useBreakpointComparators, - useDebugStyle, - useResponsiveProp, - useSpacingHelpers, -} from '../hooks'; -import type { AxisX, AxisY, Breakpoint, Flex, ResponsiveProp, Space } from '../types'; -import { flattenChildren, negate } from '../utils'; - -type BoxProps = Omit< - React.ComponentProps, - 'alignX' | 'alignY' | 'direction' | 'gap' | 'rowGap' | 'columnGap' ->; - -export type ColumnProps = React.ComponentProps; - -export type ColumnsProps = BoxProps & { - readonly space?: ResponsiveProp; - readonly defaultFlex?: ResponsiveProp; - readonly alignX?: ResponsiveProp; - readonly alignY?: ResponsiveProp; - readonly collapseBelow?: Breakpoint; -}; - -const getColumnProps = (node: React.ReactNode): ColumnProps | null => { - return node !== undefined && - node !== null && - typeof node === 'object' && - 'type' in node && - // @ts-expect-error: this_is_fine.png - node.type.__isColumn__ - ? (node.props as ColumnProps) - : null; -}; - -const isColumnForwarded = (node: React.ReactNode): node is React.ReactElement => { - return ( - node !== undefined && - node !== null && - typeof node === 'object' && - 'type' in node && - // @ts-expect-error: this_is_fine.png - node.type.__isColumnForwarded__ && - React.isValidElement(node) - ); -}; - -const resolveBleedOrInset = ( - values: readonly (ResponsiveProp | undefined)[], - space: ResponsiveProp | undefined, -): ResponsiveProp | undefined => { - const value = values.find(value => { - return typeof value !== 'undefined'; - }); - - const isSpaceArray = space && Array.isArray(space); - const isSpaceNumber = typeof space === 'number'; - const isValueArray = value && Array.isArray(value); - const isValueNumber = typeof value === 'number'; - - if (isSpaceNumber && isValueNumber) { - return space + value; - } - - if (isSpaceNumber && isValueArray) { - const l = value.length; - const xs = new Array(l); - - for (let i = 0; i < l; ++i) { - xs[i] = value[i] + space; - } - - return xs; - } - - if (isSpaceArray && isValueArray) { - const l = value.length; - const xs = new Array(l); - - for (let i = 0; i < l; ++i) { - xs[i] = value[i] + (space[i] ?? 0); - } - - return xs; - } - - return space; -}; - -type BackgroundProps = Pick< - BoxProps, - | 'borderWidth' - | 'borderTopWidth' - | 'borderRightWidth' - | 'borderLeftWidth' - | 'borderBottomWidth' - | 'borderColor' - | 'borderRadius' - | 'borderTopRightRadius' - | 'borderTopLeftRadius' - | 'borderBottomRightRadius' - | 'borderBottomLeftRadius' -> & { - readonly color?: ResponsiveProp; - readonly left?: ResponsiveProp; - readonly right?: ResponsiveProp; -}; - -const Background = (props: BackgroundProps) => { - const { - right, - left, - color, - borderWidth, - borderTopWidth, - borderLeftWidth, - borderBottomWidth, - borderRightWidth, - ...rest - } = props; - const { multiply } = useSpacingHelpers(); - const resolveResponsiveProp = useResponsiveProp(); - - const backgroundColor = resolveResponsiveProp(color); - const borderSize = resolveResponsiveProp(borderWidth); - const borderTopSize = resolveResponsiveProp(borderTopWidth); - const borderRightSize = resolveResponsiveProp(borderRightWidth); - const borderBottomSize = resolveResponsiveProp(borderBottomWidth); - const borderLeftSize = resolveResponsiveProp(borderLeftWidth); - const offsetRight = resolveResponsiveProp(right); - const offsetLeft = resolveResponsiveProp(left); - const debugStyle = useDebugStyle(); - - return backgroundColor || borderSize || debugStyle ? ( - - ) : null; -}; - -type PrivateColumnProps = ColumnProps & { - readonly gap?: ResponsiveProp; - readonly defaultFlex: ResponsiveProp; -}; - -const PrivateColumn = (props: PrivateColumnProps) => { - const { - children, - flex, - padding, - paddingRight, - paddingEnd, - paddingX, - width, - backgroundColor, - gap, - defaultFlex, - borderRadius, - borderWidth, - borderTopWidth, - borderRightWidth, - borderBottomWidth, - borderLeftWidth, - borderColor, - borderTopRightRadius, - borderTopLeftRadius, - borderBottomRightRadius, - borderBottomLeftRadius, - ...rest - } = props; - - const inset = React.useMemo(() => { - return resolveBleedOrInset([padding, paddingX, paddingRight, paddingEnd], gap); - }, [padding, paddingX, paddingRight, paddingEnd, gap]); - - return ( - - - {children} - - ); -}; - -export const Columns = (props: ColumnsProps) => { - const { - children, - space = 0, - defaultFlex = 'fluid', - alignX, - reverse, - collapseBelow, - margin, - marginLeft, - marginRight, - marginX, - marginStart, - marginEnd, - backgroundColor, - borderRadius, - borderWidth, - borderTopWidth, - borderRightWidth, - borderBottomWidth, - borderLeftWidth, - borderColor, - borderTopRightRadius, - borderTopLeftRadius, - borderBottomRightRadius, - borderBottomLeftRadius, - ...rest - } = props; - - const breakpoint = useBreakpointComparators(); - const resolveResponsiveProp = useResponsiveProp(); - - const isCollapsed = breakpoint.isBelow(collapseBelow); - const direction = isCollapsed ? 'column' : 'row'; - const isReversed = resolveResponsiveProp(reverse); - const isWeb = Platform.OS === 'web'; - - const negativeSpace = isCollapsed ? undefined : negate(space); - - const bleedStart = React.useMemo(() => { - return resolveBleedOrInset( - [margin, marginX, marginLeft, marginStart], - isReversed && !isWeb ? negativeSpace : undefined, - ); - }, [isReversed, isWeb, space, margin, marginX, marginLeft, marginStart]); - - const bleedEnd = React.useMemo(() => { - return resolveBleedOrInset( - [margin, marginX, marginRight, marginEnd], - isReversed && !isWeb ? undefined : negativeSpace, - ); - }, [isReversed, isWeb, space, margin, marginX, marginRight, marginEnd]); - - const gap = isCollapsed ? undefined : space; - - const color = resolveResponsiveProp(backgroundColor); - - return ( - - - {React.Children.map(flattenChildren(children), child => { - if (isColumnForwarded(child)) { - return ; - } - - const props = getColumnProps(child); - - if (props) { - return ; - } - - return ( - - {child} - - ); - })} - - ); -}; - -Columns.displayName = 'Columns'; diff --git a/src/components/FloatBox.tsx b/src/components/FloatBox.tsx deleted file mode 100644 index 4b4c1d2f..00000000 --- a/src/components/FloatBox.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import * as React from 'react'; -import { DimensionValue, StyleSheet } from 'react-native'; - -import { Box } from './Box'; - -import { useResponsiveProp } from '../hooks'; -import type { ResponsiveProp } from '../types'; - -type BoxProps = React.ComponentProps; - -export type FloatBoxProps = Omit & { - readonly top?: ResponsiveProp; - readonly right?: ResponsiveProp; - readonly bottom?: ResponsiveProp; - readonly left?: ResponsiveProp; - readonly offset?: ResponsiveProp; -}; - -export const FloatBox = (props: FloatBoxProps) => { - const { children, top, right, bottom, left, offset, style, ...rest } = props; - - const resolveResponsiveProp = useResponsiveProp(); - - const all = resolveResponsiveProp(offset); - const edges = { - top, - right, - bottom, - left, - }; - - const fillObject = Object.fromEntries( - Object.entries(edges).map(([key, value]) => { - return [key, key in props ? resolveResponsiveProp(value) : all ?? null]; - }), - ); - - return ( - - {children} - - ); -}; - -FloatBox.displayName = 'FloatBox'; diff --git a/src/components/Grid.tsx b/src/components/Grid.tsx deleted file mode 100644 index b4cf0c74..00000000 --- a/src/components/Grid.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import * as React from 'react'; -import { Platform, Text } from 'react-native'; -import { createStyleSheet, UnistylesRuntime, useStyles } from 'react-native-unistyles'; - -import { Box } from './Box'; -import { FloatBox } from './FloatBox'; - -import { useResponsiveProp, useSpacingHelpers } from '../hooks'; -import type { ResponsiveProp } from '../types'; -import { makeWithIndex } from '../utils'; - -export type GridProps = { - readonly gutter?: ResponsiveProp; - readonly margin?: ResponsiveProp; - readonly columns?: ResponsiveProp; - readonly opacity?: ResponsiveProp; - readonly color?: ResponsiveProp; -}; - -type Options = { - readonly width: number; - readonly columns: number; - readonly gutter: number; - readonly margin: number; -}; - -const calculateColumnWidth = (options: Options) => { - const { columns } = options; - const gutterCount = columns - 1; - return (options.width - options.margin * 2 - gutterCount * options.gutter) / columns; -}; - -const calculateGridWidth = (options: Options) => { - const { columns } = options; - const gutterCount = columns - 1; - return options.width * columns + gutterCount * options.gutter + options.margin * 2; -}; - -export const Grid = (props: GridProps) => { - const { gutter = 2, margin = 2, opacity = 0.2, columns = 8, color = 'red' } = props; - - const { multiply } = useSpacingHelpers(); - const { styles } = useStyles(stylesheet); - const resolveResponsiveProp = useResponsiveProp(); - - const numberOfColumns = resolveResponsiveProp(columns); - const defaultOpacity = resolveResponsiveProp(opacity); - const backgroundColor = resolveResponsiveProp(color); - - const options: Options = { - width: UnistylesRuntime.screen.width, - columns: numberOfColumns, - margin: multiply(resolveResponsiveProp(margin)), - gutter: multiply(resolveResponsiveProp(gutter)), - }; - - const columnWidth = calculateColumnWidth(options); - const gridWidth = calculateGridWidth({ - ...options, - width: columnWidth, - }); - const columnStyle = { opacity: defaultOpacity, backgroundColor }; - - return ( - <> - - {makeWithIndex(numberOfColumns, index => { - return ; - })} - - {gridWidth !== UnistylesRuntime.screen.width ? ( - - {`Calculated grid width (${gridWidth}) doesn't equal to the window width (${UnistylesRuntime.screen.width}). Please, adjust \`Grid\` options.`} - - ) : null} - - ); -}; - -Grid.displayName = 'Grid'; - -const stylesheet = createStyleSheet({ - root: { - pointerEvents: 'none', - }, - text: { - color: 'white', - fontFamily: - Platform.OS === 'android' ? 'monospace' : Platform.OS === 'ios' ? 'Menlo' : 'sans-serif', - }, -}); diff --git a/src/components/Hidden.tsx b/src/components/Hidden.tsx deleted file mode 100644 index 8f648f2b..00000000 --- a/src/components/Hidden.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import * as React from 'react'; - -import type { Breakpoint } from '../types'; - -export type HiddenProps = React.PropsWithChildren<{ - readonly above?: Breakpoint; - readonly below?: Breakpoint; -}>; - -export const Hidden = (_props: HiddenProps): JSX.Element => { - throw new Error( - '[Stacks] Logical expression for the `Hidden` component could not be handled. Open a new issue and provide reproduction code.', - ); -}; diff --git a/src/components/Inline.tsx b/src/components/Inline.tsx deleted file mode 100644 index acf7eb84..00000000 --- a/src/components/Inline.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import * as React from 'react'; - -import { Box } from './Box'; - -import { useBreakpointComparators } from '../hooks'; -import type { AxisX, AxisY, Breakpoint, ResponsiveProp, Space } from '../types'; - -type BoxProps = Omit< - React.ComponentProps, - 'gap' | 'rowGap' | 'columnGap' | 'alignX' | 'alignY' | 'direction' | 'wrap' ->; - -export type InlineProps = BoxProps & { - readonly space?: ResponsiveProp; - readonly spaceX?: ResponsiveProp; - readonly spaceY?: ResponsiveProp; - readonly alignX?: ResponsiveProp; - readonly alignY?: ResponsiveProp; - readonly collapseBelow?: Breakpoint; -}; - -export const Inline = (props: InlineProps) => { - const { space, children, spaceX, spaceY, alignX, alignY, collapseBelow, ...rest } = props; - const breakpoint = useBreakpointComparators(); - - const isCollapsed = breakpoint.isBelow(collapseBelow); - const direction = isCollapsed ? 'column' : 'row'; - const wrap = isCollapsed ? 'no-wrap' : 'wrap'; - - return ( - - {children} - - ); -}; - -Inline.displayName = 'Inline'; diff --git a/src/components/Row.tsx b/src/components/Row.tsx deleted file mode 100644 index cd831f3b..00000000 --- a/src/components/Row.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as React from 'react'; - -import { BoxProps } from './Box'; - -export const Row = (_props: BoxProps): JSX.Element => { - throw new Error('[Stacks] Row must be a direct child of Rows.'); -}; - -const markAsRow = (node: React.FC) => { - // @ts-expect-error: this_is_fine.png - node.__isRow__ = true; -}; - -const from = >(Component: T) => { - // @ts-expect-error: this_is_fine.png - Component.__isRowForwarded__ = true; - return Component; -}; - -Row.from = from; -Row.displayName = 'Row'; -markAsRow(Row); diff --git a/src/components/Rows.tsx b/src/components/Rows.tsx deleted file mode 100644 index 850a6fa5..00000000 --- a/src/components/Rows.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import * as React from 'react'; - -import { Box } from './Box'; -import { Row } from './Row'; - -import type { AxisX, AxisY, Flex, ResponsiveProp, Space } from '../types'; -import { flattenChildren } from '../utils'; - -type BoxProps = Omit< - React.ComponentProps, - 'direction' | 'gap' | 'rowGap' | 'columnGap' | 'alignX' | 'alignY' ->; - -export type RowProps = React.ComponentProps; - -export type RowsProps = BoxProps & { - readonly space?: ResponsiveProp; - readonly defaultFlex?: ResponsiveProp; - readonly alignX?: ResponsiveProp; - readonly alignY?: ResponsiveProp; -}; - -const getRowProps = (node: React.ReactNode): RowProps | null => { - return node !== undefined && - node !== null && - typeof node === 'object' && - 'type' in node && - // @ts-expect-error: this is ok - node.type.__isRow__ - ? (node.props as RowProps) - : null; -}; - -const isRowForwarded = (node: React.ReactNode): node is React.ReactElement => { - return ( - node !== undefined && - node !== null && - typeof node === 'object' && - 'type' in node && - // @ts-expect-error: this is ok - node.type.__isRowForwarded__ && - React.isValidElement(node) - ); -}; - -export const Rows = (props: RowsProps) => { - const { children, space, defaultFlex = 'fluid', ...rest } = props; - - return ( - - {React.Children.map(flattenChildren(children), child => { - if (isRowForwarded(child)) { - return React.cloneElement( - child, - { ...child.props, flex: child.props.flex ?? defaultFlex }, - child.props.children, - ); - } - - const props = getRowProps(child); - - if (props) { - const { children, flex, ...rest } = props; - - return ( - - {children} - - ); - } - - return {child}; - })} - - ); -}; - -Rows.displayName = 'Rows'; diff --git a/src/components/Stack.tsx b/src/components/Stack.tsx deleted file mode 100644 index b035bc85..00000000 --- a/src/components/Stack.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import * as React from 'react'; - -import { Box } from './Box'; - -import { useResponsiveProp } from '../hooks'; -import type { AxisX, AxisY, ResponsiveProp } from '../types'; -import { flattenChildren, intersperse } from '../utils'; - -type BoxProps = Omit< - React.ComponentProps, - 'direction' | 'alignX' | 'alignY' | 'rowGap' | 'columnGap' ->; - -export type StackProps = BoxProps & { - readonly space?: ResponsiveProp; - readonly horizontal?: ResponsiveProp; - readonly align?: ResponsiveProp; - readonly divider?: React.ReactElement; -}; - -export const Stack = (props: StackProps) => { - const { children, flex = 'content', space, horizontal, align, divider, ...rest } = props; - - const resolveResponsiveProp = useResponsiveProp(); - const isHorizontal = resolveResponsiveProp(horizontal); - - const direction = isHorizontal ? 'row' : 'column'; - const alignY = isHorizontal ? align : undefined; - const alignX = isHorizontal ? undefined : align; - - return ( - - {React.isValidElement(divider) - ? flattenChildren(intersperse(React.Children.toArray(children), divider)) - : children} - - ); -}; - -Stack.displayName = 'Stack'; diff --git a/src/components/Tiles.tsx b/src/components/Tiles.tsx deleted file mode 100644 index 902d66e2..00000000 --- a/src/components/Tiles.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from 'react'; - -import { Box } from './Box'; - -import { useResponsiveProp } from '../hooks'; -import type { AxisY, ResponsiveProp, Space } from '../types'; -import { makeWithIndex, splitEvery } from '../utils'; - -type BoxProps = Omit< - React.ComponentProps, - 'gap' | 'rowGap' | 'columnGap' | 'direction' | 'alignX' | 'alignY' ->; - -export type TilesProps = BoxProps & { - readonly columns?: ResponsiveProp; - readonly space?: ResponsiveProp; - readonly spaceX?: ResponsiveProp; - readonly spaceY?: ResponsiveProp; - readonly fill?: ResponsiveProp; - readonly alignY?: ResponsiveProp; -}; - -export const Tiles = (props: TilesProps) => { - const { children, columns = 1, space, spaceX, spaceY, fill = false, reverse, ...rest } = props; - - const resolveResponsiveProp = useResponsiveProp(); - - const numberOfColumns = Math.max(resolveResponsiveProp(columns), 1); - const shouldFill = resolveResponsiveProp(fill); - const rows = splitEvery(React.Children.toArray(children), numberOfColumns); - - return ( - - {rows.map((columns, rowIndex) => { - const elements = makeWithIndex(numberOfColumns, index => { - return columns[index] ?? null; - }); - - return ( - - {elements.map((element, columnIndex) => { - return React.isValidElement(element) || !shouldFill ? ( - - {element} - - ) : null; - })} - - ); - })} - - ); -}; - -Tiles.displayName = 'Tiles'; diff --git a/src/hooks/index.ts b/src/hooks/index.ts deleted file mode 100644 index 25a5b281..00000000 --- a/src/hooks/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './useSpacingHelpers'; -export * from './useDebugStyle'; -export * from './useBreakpointComparators'; -export * from './useResponsiveProp'; diff --git a/src/hooks/useBreakpointComparators.ts b/src/hooks/useBreakpointComparators.ts deleted file mode 100644 index acb65d81..00000000 --- a/src/hooks/useBreakpointComparators.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from 'react'; -import { useStyles } from 'react-native-unistyles'; - -import { Breakpoint } from '../types'; -import { isBreakpointAbove, isBreakpointBelow } from '../utils'; - -export const useBreakpointComparators = () => { - const { breakpoint: currentBreakpoint } = useStyles(); - - const isBelow = React.useCallback( - (breakpoint?: Breakpoint) => { - return isBreakpointBelow(currentBreakpoint, breakpoint); - }, - [currentBreakpoint], - ); - - const isAbove = React.useCallback( - (breakpoint?: Breakpoint) => { - return isBreakpointAbove(currentBreakpoint, breakpoint); - }, - [currentBreakpoint], - ); - - return { isBelow, isAbove }; -}; diff --git a/src/hooks/useDebugStyle.ts b/src/hooks/useDebugStyle.ts deleted file mode 100644 index 866da8ee..00000000 --- a/src/hooks/useDebugStyle.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react'; -import { ViewStyle } from 'react-native'; -import { useStyles } from 'react-native-unistyles'; - -import { randomColor } from '../utils'; - -export const useDebugStyle = () => { - const { theme } = useStyles(); - const backgroundColor = React.useRef(randomColor()).current; - // @ts-expect-error: this_is_fine.png - const debug = theme?.stacks?.debug; - const style = React.useRef(debug ? { backgroundColor } : undefined); - - React.useEffect(() => { - style.current = debug - ? { - backgroundColor, - } - : undefined; - }, [debug]); - - return style.current; -}; diff --git a/src/hooks/useResponsiveProp.ts b/src/hooks/useResponsiveProp.ts deleted file mode 100644 index b134fb9c..00000000 --- a/src/hooks/useResponsiveProp.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as React from 'react'; -import { useStyles } from 'react-native-unistyles'; - -import { ResponsiveProp } from '../types'; -import { resolveResponsiveProp } from '../utils'; - -export const useResponsiveProp = () => { - const { breakpoint } = useStyles(); - - return React.useCallback( - (value: ResponsiveProp) => { - return resolveResponsiveProp(value, breakpoint); - }, - [breakpoint], - ); -}; diff --git a/src/hooks/useSpacingHelpers.ts b/src/hooks/useSpacingHelpers.ts deleted file mode 100644 index 2ef0a273..00000000 --- a/src/hooks/useSpacingHelpers.ts +++ /dev/null @@ -1,44 +0,0 @@ -import * as React from 'react'; -import { useStyles } from 'react-native-unistyles'; - -import { useResponsiveProp } from './useResponsiveProp'; - -type SpacingHelper = { - (value: number): number; - (value: number | undefined): number | undefined; -}; - -export const useSpacingHelpers = () => { - const { theme } = useStyles(); - - const resolveResponsiveProp = useResponsiveProp(); - // @ts-expect-error: this_is_fine.png - const spacing = resolveResponsiveProp(theme?.stacks?.spacing ?? 4); - - const multiply = React.useCallback( - value => { - if (typeof value !== 'undefined') { - return value * spacing; - } - - return undefined; - }, - [spacing], - ) as SpacingHelper; - - const divide = React.useCallback( - value => { - if (typeof value !== 'undefined') { - return value / spacing; - } - - return undefined; - }, - [spacing], - ) as SpacingHelper; - - return { - multiply, - divide, - }; -}; diff --git a/src/polymorphic.ts b/src/polymorphic.ts deleted file mode 100644 index c701baea..00000000 --- a/src/polymorphic.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ - -/* -Adapted from Radix's react-polymorphic package -https://github.com/radix-ui/primitives/tree/main/packages/react/polymorphic - ---- - -MIT License - -Copyright (c) 2020 Modulz - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -import * as React from 'react'; - -/* ------------------------------------------------------------------------------------------------- - * Utility types - * -----------------------------------------------------------------------------------------------*/ -type Merge = Omit & P2; - -/** - * Infers the OwnProps if E is a ForwardRefExoticComponentWithAs - */ -type OwnProps = E extends ForwardRefComponent ? P : {}; - -/** - * Infers the JSX.IntrinsicElement if E is a ForwardRefExoticComponentWithAs - */ -type IntrinsicElement = E extends ForwardRefComponent ? I : never; - -type ForwardRefExoticComponent = React.ForwardRefExoticComponent< - Merge< - E extends React.ElementType ? React.ComponentPropsWithRef : never, - OwnProps & { readonly as?: E } - > ->; - -/* ------------------------------------------------------------------------------------------------- - * ForwardRefComponent - * -----------------------------------------------------------------------------------------------*/ - -interface ForwardRefComponent< - DefaultComponentType, - OwnProps = {}, - /** - * Extends original type to ensure built in React types play nice - * with polymorphic components still e.g. `React.ElementRef` etc. - */ -> extends ForwardRefExoticComponent { - /** - * When `as` prop is passed, use this overload. - * Merges original own props (without DOM props) and the inferred props - * from `as` element with the own props taking precendence. - * - * We explicitly avoid `React.ElementType` and manually narrow the prop types - * so that events are typed when using JSX.IntrinsicElements. - */ - ( - props: As extends React.ComponentType - ? Merge - : never, - ): React.ReactElement | null; -} - -export type { ForwardRefComponent, OwnProps, IntrinsicElement, Merge }; diff --git a/src/types.ts b/src/types.ts deleted file mode 100644 index 8c3a4874..00000000 --- a/src/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-interface */ -import { UnistylesBreakpoints } from 'react-native-unistyles'; - -export interface StacksBreakpoints {} - -export type Breakpoint = keyof StacksBreakpoints | keyof UnistylesBreakpoints; -export type AxisX = 'left' | 'center' | 'right'; -export type AxisY = 'top' | 'center' | 'bottom'; -export type Stretch = 'stretch'; -export type Space = 'between' | 'around' | 'evenly'; -export type Direction = 'row' | 'row-reverse' | 'column' | 'column-reverse'; -export type Wrap = 'wrap' | 'no-wrap' | 'wrap-reverse'; - -export type Flex = - | 'content' - | 'fluid' - | '1/2' - | '1/3' - | '2/3' - | '1/4' - | '3/4' - | '1/5' - | '2/5' - | '3/5' - | '4/5'; - -export type ResponsiveProp = T | readonly T[]; diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index 38c29fec..00000000 --- a/src/utils.ts +++ /dev/null @@ -1,223 +0,0 @@ -import * as React from 'react'; -import { UnistylesRuntime } from 'react-native-unistyles'; - -import { Breakpoint, Direction, ResponsiveProp } from './types'; - -const randomInt = (min: number, max: number) => { - return Math.floor(Math.random() * (max - min)) + min; -}; - -export const randomColor = () => { - const colors = `${randomInt(0, 255)}, ${randomInt(0, 255)}, ${randomInt(0, 255)}`; - return `rgba(${colors}, 0.2)`; -}; - -export const flattenChildren = ( - children: React.ReactNode, -): ReturnType => { - return React.Children.toArray(children).reduce( - (acc: ReturnType, child) => { - if (React.isValidElement(child) && child.type === React.Fragment) { - return acc.concat(flattenChildren(child.props.children)); - } - acc.push(child); - return acc; - }, - [] as ReturnType, - ); -}; - -export const normalizeResponsiveProp = (responsiveProp: ResponsiveProp): readonly T[] => { - if ( - typeof responsiveProp === 'string' || - typeof responsiveProp === 'number' || - typeof responsiveProp === 'boolean' - ) { - return [responsiveProp]; - } - - if (responsiveProp && Array.isArray(responsiveProp) && responsiveProp.length) { - return responsiveProp; - } - - console.warn(`[Stacks] invalid responsive prop: ${JSON.stringify(responsiveProp)}`); - - return []; -}; - -export function resolveResponsiveProp( - responsiveProp: ResponsiveProp, - breakpoint: Breakpoint, -): T; -export function resolveResponsiveProp( - responsiveProp: ResponsiveProp | undefined, - breakpoint: Breakpoint, -): T | undefined; - -export function resolveResponsiveProp( - responsiveProp: ResponsiveProp | undefined, - currentBreakpoint: Breakpoint, -) { - const breakpoints = getBreakpoints(); - - if (responsiveProp !== undefined) { - const normalizedResponsiveProp = normalizeResponsiveProp(responsiveProp); - - const defaultValue = normalizedResponsiveProp[0]; - - if (normalizedResponsiveProp.length === 1) { - return defaultValue; - } - - const index = breakpoints.findIndex(breakpoint => { - return currentBreakpoint === breakpoint[0]; - }); - - if (index > -1) { - const lastIndex = breakpoints.length - 1; - - return ( - normalizedResponsiveProp[(lastIndex - index) | 0] ?? - normalizedResponsiveProp[normalizedResponsiveProp.length - 1] - ); - } - } - - return undefined; -} - -export const resolveDirectionAndReverse = (direction?: Direction, reversed?: boolean) => { - switch (true) { - case direction === 'row' && reversed: - return 'row-reverse'; - case direction === 'row-reverse' && reversed: - return 'row'; - case direction === 'column' && reversed: - return 'column-reverse'; - case direction === 'column-reverse' && reversed: - return 'column'; - default: - return direction; - } -}; - -export const negate = ( - value: ResponsiveProp | undefined, -): ResponsiveProp | undefined => { - if (typeof value === 'number') { - return value * -1; - } - - if (value && Array.isArray(value)) { - const l = value.length; - const xs = new Array(l); - - for (let i = 0; i < l; ++i) { - xs[i] = value[i] * -1; - } - - return xs; - } - - return undefined; -}; - -export const splitEvery = (xs: readonly T[], r: number): readonly (readonly T[])[] => { - if (r < 1 || xs.length <= r) { - return [xs]; - } - - let current = 0; - const result = []; - - while (current < xs.length) { - const index = (current + r) | 0; - result.push(xs.slice(current, index)); - current = index; - } - - return result; -}; - -export const makeWithIndex = (r: number, mapFn: (index: number) => T): readonly T[] => { - if (r <= 0) { - return []; - } - - const result = new Array(r); - - for (let i = 0; i < r; ++i) { - result[i] = mapFn(i); - } - - return result; -}; - -const reduceWithIndex = ( - arr: readonly A[], - initialValue: B, - fn: (acc: B, element: A, index: number) => B, -): B => { - let e = initialValue; - - for (let t = 0, v = arr.length; t < v; ++t) { - e = fn(e, arr[t], t); - } - - return e; -}; - -export const intersperse = (arr: readonly A[], delimiter: A) => { - // eslint-disable-next-line functional/prefer-readonly-type - return reduceWithIndex(arr, [] as A[], function (acc, element, index) { - if (((arr.length - 1) | 0) === index) { - acc.push(element); - } else { - acc.push(element, delimiter); - } - return acc; - }); -}; - -export const getBreakpoints = (): ReadonlyArray => { - return Object.entries(UnistylesRuntime.breakpoints).sort((a, b) => { - return (b[1] - a[1]) | 0; - }) as unknown as readonly (readonly [Breakpoint, number])[]; -}; - -const compareBreakpoints = ( - mapFn: (currentBreakpointIndex: number, breakpointIndex: number) => boolean, -) => { - return (currentBreakpoint: Breakpoint, breakpoint: Breakpoint | undefined) => { - if (breakpoint) { - const breakpoints = getBreakpoints(); - const currentBreakpointIndex = breakpoints.findIndex(value => { - return value[0] === currentBreakpoint; - }); - - if (currentBreakpointIndex > -1) { - const boundBreakpointIndex = breakpoints.findIndex(value => { - return value[0] === breakpoint; - }); - - if (boundBreakpointIndex > -1) { - return mapFn(currentBreakpointIndex, boundBreakpointIndex); - } - } - } - - return false; - }; -}; - -export const isBreakpointBelow = compareBreakpoints( - (currentBreakpointIndex, boundBreakpointIndex) => { - return currentBreakpointIndex > boundBreakpointIndex; - }, -); - -export const isBreakpointAbove = compareBreakpoints( - (currentBreakpointIndex, boundBreakpointIndex) => { - return currentBreakpointIndex < boundBreakpointIndex; - }, -);