├── templates ├── vanilla │ ├── template │ │ ├── .node-version │ │ ├── .watchmanconfig │ │ ├── .ruby-version │ │ ├── public │ │ │ ├── robots.txt │ │ │ ├── favicon.png │ │ │ └── images │ │ │ │ ├── logo_dark.png │ │ │ │ ├── logo_light.png │ │ │ │ └── luna_cover.jpeg │ │ ├── src │ │ │ ├── components │ │ │ │ ├── index.ts │ │ │ │ ├── Logo.tsx │ │ │ │ └── Layout.tsx │ │ │ ├── features │ │ │ │ ├── Home │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Home.tsx │ │ │ │ └── DetailScreen │ │ │ │ │ ├── index.ts │ │ │ │ │ └── DetailScreen.tsx │ │ │ ├── pages │ │ │ │ ├── index.tsx │ │ │ │ ├── user │ │ │ │ │ └── [id].tsx │ │ │ │ ├── _document.tsx │ │ │ │ └── _app.tsx │ │ │ ├── __tests__ │ │ │ │ └── App-test.tsx │ │ │ └── App.tsx │ │ ├── app.json │ │ ├── tamagui │ │ │ ├── index.ts │ │ │ ├── global.ts │ │ │ ├── animations.web.ts │ │ │ ├── animations.ts │ │ │ ├── tamagui.config.ts │ │ │ ├── mediaQueries.ts │ │ │ └── fonts.ts │ │ ├── android │ │ │ ├── app │ │ │ │ ├── src │ │ │ │ │ ├── main │ │ │ │ │ │ ├── res │ │ │ │ │ │ │ ├── values │ │ │ │ │ │ │ │ ├── strings.xml │ │ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ │ │ └── drawable │ │ │ │ │ │ │ │ └── rn_edit_text_material.xml │ │ │ │ │ │ ├── assets │ │ │ │ │ │ │ ├── fonts │ │ │ │ │ │ │ │ ├── Inter-Black.otf │ │ │ │ │ │ │ │ ├── Inter-Bold.otf │ │ │ │ │ │ │ │ ├── Inter-Light.otf │ │ │ │ │ │ │ │ ├── Inter-Thin.otf │ │ │ │ │ │ │ │ ├── Silkscreen.ttf │ │ │ │ │ │ │ │ ├── Inter-Italic.otf │ │ │ │ │ │ │ │ ├── Inter-Medium.otf │ │ │ │ │ │ │ │ ├── Inter-SemiBold.otf │ │ │ │ │ │ │ │ ├── Inter-BoldItalic.otf │ │ │ │ │ │ │ │ ├── Inter-ExtraBold.otf │ │ │ │ │ │ │ │ ├── Inter-ExtraLight.otf │ │ │ │ │ │ │ │ ├── Inter-ThinItalic.otf │ │ │ │ │ │ │ │ ├── Silkscreen-bold.ttf │ │ │ │ │ │ │ │ ├── Inter-BlackItalic.otf │ │ │ │ │ │ │ │ ├── Inter-LightItalic.otf │ │ │ │ │ │ │ │ ├── Inter-MediumItalic.otf │ │ │ │ │ │ │ │ ├── Inter-ExtraBoldItalic.otf │ │ │ │ │ │ │ │ ├── Inter-SemiBoldItalic.otf │ │ │ │ │ │ │ │ └── Inter-ExtraLightItalic.otf │ │ │ │ │ │ │ └── custom │ │ │ │ │ │ │ │ └── Silkscreen.woff │ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ │ └── java │ │ │ │ │ │ │ └── com │ │ │ │ │ │ │ └── projectname │ │ │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ │ │ └── MainApplication.java │ │ │ │ │ ├── debug │ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ │ └── java │ │ │ │ │ │ │ └── com │ │ │ │ │ │ │ └── projectname │ │ │ │ │ │ │ └── ReactNativeFlipper.java │ │ │ │ │ └── release │ │ │ │ │ │ └── java │ │ │ │ │ │ └── com │ │ │ │ │ │ └── projectname │ │ │ │ │ │ └── ReactNativeFlipper.java │ │ │ │ ├── debug.keystore │ │ │ │ ├── proguard-rules.pro │ │ │ │ └── build.gradle │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── settings.gradle │ │ │ ├── build.gradle │ │ │ ├── gradle.properties │ │ │ ├── gradlew.bat │ │ │ ├── link-assets-manifest.json │ │ │ └── gradlew │ │ ├── ios │ │ │ ├── ProjectName │ │ │ │ ├── Images.xcassets │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── AppIcon.appiconset │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── AppDelegate.h │ │ │ │ ├── main.m │ │ │ │ ├── AppDelegate.mm │ │ │ │ ├── Info.plist │ │ │ │ └── LaunchScreen.storyboard │ │ │ ├── ProjectName.xcworkspace │ │ │ │ └── contents.xcworkspacedata │ │ │ ├── .xcode.env │ │ │ ├── ProjectNameTests │ │ │ │ ├── Info.plist │ │ │ │ └── ProjectNameTests.m │ │ │ ├── link-assets-manifest.json │ │ │ ├── Podfile │ │ │ └── ProjectName.xcodeproj │ │ │ │ └── xcshareddata │ │ │ │ └── xcschemes │ │ │ │ └── ProjectName.xcscheme │ │ ├── .prettierrc.js │ │ ├── .eslintrc.js │ │ ├── next-env.d.ts │ │ ├── Gemfile │ │ ├── react-native.config.js │ │ ├── index.js │ │ ├── metro.config.js │ │ ├── tsconfig.json │ │ ├── babel.config.js │ │ ├── patches │ │ │ └── @tamagui+font-silkscreen+1.5.3.patch │ │ ├── next.config.js │ │ ├── _gitignore │ │ ├── README.md │ │ ├── package.json │ │ └── react-native-web.d.ts │ ├── template.config.js │ ├── package.json │ └── README.md └── expo │ ├── public │ ├── robots.txt │ ├── favicon.png │ └── images │ │ ├── logo_dark.png │ │ ├── logo_light.png │ │ └── luna_cover.jpeg │ ├── src │ ├── components │ │ ├── index.ts │ │ ├── Logo.tsx │ │ └── Layout.tsx │ ├── features │ │ ├── Home │ │ │ ├── index.ts │ │ │ └── Home.tsx │ │ └── DetailScreen │ │ │ ├── index.ts │ │ │ └── DetailScreen.tsx │ ├── pages │ │ ├── index.tsx │ │ ├── user │ │ │ └── [id].tsx │ │ ├── _document.tsx │ │ └── _app.tsx │ ├── __tests__ │ │ └── App-test.tsx │ └── App.tsx │ ├── tamagui │ ├── index.ts │ ├── global.ts │ ├── animations.web.ts │ ├── animations.ts │ ├── tamagui.config.ts │ ├── mediaQueries.ts │ ├── tamaguiFonts.native.ts │ └── fonts.ts │ ├── assets │ ├── icon.png │ ├── favicon.png │ ├── splash.png │ └── adaptive-icon.png │ ├── next-env.d.ts │ ├── index.js │ ├── tsconfig.json │ ├── babel.config.js │ ├── app.json │ ├── .gitignore │ ├── next.config.js │ ├── README.md │ ├── package.json │ └── react-native-web.d.ts ├── packages └── create-luna-app │ ├── src │ ├── types.ts │ ├── templates │ │ └── model.ts.ejs │ ├── commands │ │ ├── generate.ts │ │ └── create-luna-app.ts │ ├── extensions │ │ └── cli-extension.ts │ └── cli.ts │ ├── .gitignore │ ├── .eslintrc.js │ ├── tsconfig.json │ ├── bin │ └── create-luna-app │ ├── __tests__ │ └── cli-integration.test.ts │ ├── package.json │ └── README.md ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── workflows │ ├── tests_jest.yml │ ├── linting.yml │ └── codeql-analysis.yml ├── turbo.json ├── LICENSE ├── .gitignore ├── package.json └── README.md /templates/vanilla/template/.node-version: -------------------------------------------------------------------------------- 1 | 18 2 | -------------------------------------------------------------------------------- /templates/vanilla/template/.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /templates/vanilla/template/.ruby-version: -------------------------------------------------------------------------------- 1 | 2.7.6 2 | -------------------------------------------------------------------------------- /packages/create-luna-app/src/types.ts: -------------------------------------------------------------------------------- 1 | // export types 2 | -------------------------------------------------------------------------------- /templates/expo/public/robots.txt: -------------------------------------------------------------------------------- 1 | user-agent: * 2 | Allow: * 3 | -------------------------------------------------------------------------------- /templates/expo/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Layout'; 2 | -------------------------------------------------------------------------------- /templates/expo/src/features/Home/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Home'; 2 | -------------------------------------------------------------------------------- /templates/vanilla/template/public/robots.txt: -------------------------------------------------------------------------------- 1 | user-agent: * 2 | Allow: * 3 | -------------------------------------------------------------------------------- /templates/vanilla/template/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Layout'; 2 | -------------------------------------------------------------------------------- /templates/vanilla/template/src/features/Home/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Home'; 2 | -------------------------------------------------------------------------------- /templates/expo/src/features/DetailScreen/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DetailScreen'; 2 | -------------------------------------------------------------------------------- /templates/vanilla/template/src/features/DetailScreen/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DetailScreen'; 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [LunatiqueCoder] 4 | -------------------------------------------------------------------------------- /templates/expo/tamagui/index.ts: -------------------------------------------------------------------------------- 1 | import appConfig from './tamagui.config'; 2 | export default appConfig; 3 | -------------------------------------------------------------------------------- /packages/create-luna-app/src/templates/model.ts.ejs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: '<%= props.name %>' 3 | } 4 | -------------------------------------------------------------------------------- /templates/vanilla/template/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ProjectName", 3 | "displayName": "ProjectName" 4 | } 5 | -------------------------------------------------------------------------------- /templates/expo/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/assets/icon.png -------------------------------------------------------------------------------- /templates/expo/assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/assets/favicon.png -------------------------------------------------------------------------------- /templates/expo/assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/assets/splash.png -------------------------------------------------------------------------------- /templates/expo/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/public/favicon.png -------------------------------------------------------------------------------- /templates/vanilla/template/tamagui/index.ts: -------------------------------------------------------------------------------- 1 | import appConfig from './tamagui.config'; 2 | export default appConfig; 3 | -------------------------------------------------------------------------------- /templates/expo/assets/adaptive-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/assets/adaptive-icon.png -------------------------------------------------------------------------------- /templates/expo/public/images/logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/public/images/logo_dark.png -------------------------------------------------------------------------------- /templates/expo/public/images/logo_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/public/images/logo_light.png -------------------------------------------------------------------------------- /templates/expo/public/images/luna_cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/expo/public/images/luna_cover.jpeg -------------------------------------------------------------------------------- /packages/create-luna-app/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | npm-debug.log 4 | coverage 5 | .nyc_output 6 | dist 7 | build 8 | .vscode 9 | -------------------------------------------------------------------------------- /templates/vanilla/template/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/public/favicon.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ProjectName 3 | 4 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/debug.keystore -------------------------------------------------------------------------------- /templates/vanilla/template/ios/ProjectName/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /templates/vanilla/template/public/images/logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/public/images/logo_dark.png -------------------------------------------------------------------------------- /templates/vanilla/template/public/images/logo_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/public/images/logo_light.png -------------------------------------------------------------------------------- /templates/vanilla/template/public/images/luna_cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/public/images/luna_cover.jpeg -------------------------------------------------------------------------------- /templates/vanilla/template/ios/ProjectName/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : RCTAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /templates/expo/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | // NOTE: This file should not be edited 4 | // see https://nextjs.org/docs/basic-features/typescript for more information. 5 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Black.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Bold.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Light.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Thin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Thin.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Silkscreen.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Silkscreen.ttf -------------------------------------------------------------------------------- /templates/expo/tamagui/global.ts: -------------------------------------------------------------------------------- 1 | import {AppConfig} from './tamagui.config'; 2 | 3 | declare module 'tamagui' { 4 | interface TamaguiCustomConfig extends AppConfig {} 5 | } 6 | 7 | export * from 'tamagui'; 8 | -------------------------------------------------------------------------------- /templates/vanilla/template/.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: 'avoid', 3 | bracketSameLine: true, 4 | bracketSpacing: false, 5 | singleQuote: true, 6 | trailingComma: 'all', 7 | }; 8 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/custom/Silkscreen.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/custom/Silkscreen.woff -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Italic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-Medium.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-SemiBold.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-BoldItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraBold.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraLight.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ThinItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ThinItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Silkscreen-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Silkscreen-bold.ttf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-BlackItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-LightItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-MediumItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /templates/vanilla/template/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['@react-native-community', 'next/core-web-vitals'], 4 | rules: { 5 | 'react-native/no-inline-styles': 'off', 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraBoldItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-SemiBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-SemiBoldItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /templates/vanilla/template/tamagui/global.ts: -------------------------------------------------------------------------------- 1 | import {AppConfig} from './tamagui.config'; 2 | 3 | declare module 'tamagui' { 4 | interface TamaguiCustomConfig extends AppConfig {} 5 | } 6 | 7 | export * from 'tamagui'; 8 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraLightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/assets/fonts/Inter-ExtraLightItalic.otf -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunatiqueCoder/luna/HEAD/templates/vanilla/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /templates/expo/src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import {Home} from '../features/Home'; 2 | import {Layout} from '../components'; 3 | 4 | const HomePage = () => ( 5 | 6 | 7 | 8 | ); 9 | 10 | export default HomePage; 11 | -------------------------------------------------------------------------------- /templates/vanilla/template/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /templates/vanilla/template/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version 4 | ruby File.read(File.join(__dir__, '.ruby-version')).strip 5 | gem 'cocoapods', '~> 1.11', '>= 1.11.3' 6 | -------------------------------------------------------------------------------- /templates/vanilla/template/src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import {Home} from '../features/Home'; 2 | import {Layout} from '../components'; 3 | 4 | const HomePage = () => ( 5 | 6 | 7 | 8 | ); 9 | 10 | export default HomePage; 11 | -------------------------------------------------------------------------------- /templates/vanilla/template.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // Placeholder used to rename and replace in files 3 | // package.json, index.json, android/, ios/ 4 | placeholderName: "ProjectName", 5 | 6 | // Directory with template 7 | templateDir: "./template", 8 | }; 9 | -------------------------------------------------------------------------------- /templates/vanilla/template/react-native.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | project: { 3 | ios: {}, 4 | android: {}, 5 | }, 6 | assets: [ 7 | './node_modules/@tamagui/font-inter/otf', 8 | './node_modules/@tamagui/font-silkscreen/files', 9 | ], 10 | }; 11 | -------------------------------------------------------------------------------- /templates/expo/src/pages/user/[id].tsx: -------------------------------------------------------------------------------- 1 | import {UserDetailScreen} from '../../features/DetailScreen'; 2 | import {Layout} from '../../components'; 3 | 4 | const HomePage = () => ( 5 | 6 | 7 | 8 | ); 9 | 10 | export default HomePage; 11 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /templates/vanilla/template/ios/ProjectName/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | @autoreleasepool { 8 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /templates/vanilla/template/src/pages/user/[id].tsx: -------------------------------------------------------------------------------- 1 | import {UserDetailScreen} from '../../features/DetailScreen'; 2 | import {Layout} from '../../components'; 3 | 4 | const HomePage = () => ( 5 | 6 | 7 | 8 | ); 9 | 10 | export default HomePage; 11 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ProjectName' 2 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) 3 | include ':app' 4 | includeBuild('../node_modules/react-native-gradle-plugin') 5 | -------------------------------------------------------------------------------- /templates/expo/src/__tests__/App-test.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @format 3 | */ 4 | 5 | import 'react-native'; 6 | import App from '../App'; 7 | 8 | // Note: test renderer must be required after react-native. 9 | import renderer from 'react-test-renderer'; 10 | 11 | it('renders correctly', () => { 12 | renderer.create(); 13 | }); 14 | -------------------------------------------------------------------------------- /templates/expo/index.js: -------------------------------------------------------------------------------- 1 | import { registerRootComponent } from 'expo' 2 | 3 | import App from './src/App' 4 | 5 | // registerRootComponent calls AppRegistry.registerComponent('main', () => App); 6 | // It also ensures that whether you load the app in Expo Go or in a native build, 7 | // the environment is set up appropriately 8 | registerRootComponent(App) 9 | -------------------------------------------------------------------------------- /templates/vanilla/template/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * When compiling for mobile, it will search for index.js on root. 3 | */ 4 | import 'react-native-gesture-handler'; 5 | import {AppRegistry} from 'react-native'; 6 | import App from './src/App'; 7 | import {name as appName} from './app.json'; 8 | 9 | AppRegistry.registerComponent(appName, () => App); 10 | -------------------------------------------------------------------------------- /templates/vanilla/template/ios/ProjectName.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /templates/expo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "expo/tsconfig.base", 3 | "compilerOptions": { 4 | "strict": true, 5 | "forceConsistentCasingInFileNames": true, 6 | "incremental": true, 7 | "module": "esnext", 8 | "isolatedModules": true, 9 | "jsx": "preserve" 10 | }, 11 | "include": [ 12 | "next-env.d.ts", 13 | "**/*.ts", 14 | "**/*.tsx" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /packages/create-luna-app/.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import("eslint").Linter.Config} 3 | */ 4 | module.exports = { 5 | parser: '@typescript-eslint/parser', 6 | 7 | parserOptions: { 8 | ecmaVersion: 2020, 9 | sourceType: 'module', 10 | }, 11 | extends: [ 12 | 'plugin:@typescript-eslint/recommended', 13 | 14 | 'prettier', 15 | 'plugin:prettier/recommended', 16 | ], 17 | rules: {}, 18 | } 19 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "globalDependencies": ["**/.env.*local"], 4 | "pipeline": { 5 | "build": { 6 | "outputs": ["dist/**", ".next/**", "!.next/cache/**"], 7 | "dependsOn": ["^build"] 8 | }, 9 | "dev": { 10 | "cache": false, 11 | "persistent": true 12 | }, 13 | "lint": {}, 14 | "clean": { 15 | "cache": false 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /templates/vanilla/template/src/__tests__/App-test.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @format 3 | */ 4 | 5 | import 'react-native'; 6 | import App from '../App'; 7 | 8 | // Note: test renderer must be required after react-native. 9 | import renderer from 'react-test-renderer'; 10 | 11 | jest.mock('react-native-reanimated', () => 12 | require('react-native-reanimated/mock'), 13 | ); 14 | 15 | it('renders correctly', () => { 16 | renderer.create(); 17 | }); 18 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /templates/vanilla/template/ios/.xcode.env: -------------------------------------------------------------------------------- 1 | # This `.xcode.env` file is versioned and is used to source the environment 2 | # used when running script phases inside Xcode. 3 | # To customize your local environment, you can create an `.xcode.env.local` 4 | # file that is not versioned. 5 | 6 | # NODE_BINARY variable contains the PATH to the node executable. 7 | # 8 | # Customize the NODE_BINARY variable here. 9 | # For example, to use nvm with brew, add the following line 10 | # . "$(brew --prefix nvm)/nvm.sh" --no-use 11 | export NODE_BINARY=$(command -v node) 12 | -------------------------------------------------------------------------------- /templates/expo/tamagui/animations.web.ts: -------------------------------------------------------------------------------- 1 | import {createAnimations} from '@tamagui/animations-react-native'; 2 | 3 | export const animations = createAnimations({ 4 | bouncy: { 5 | damping: 9, 6 | mass: 0.9, 7 | stiffness: 150, 8 | }, 9 | lazy: { 10 | damping: 18, 11 | stiffness: 50, 12 | }, 13 | slow: { 14 | damping: 15, 15 | stiffness: 40, 16 | }, 17 | quick: { 18 | damping: 20, 19 | mass: 1.2, 20 | stiffness: 250, 21 | }, 22 | tooltip: { 23 | damping: 10, 24 | mass: 0.9, 25 | stiffness: 100, 26 | }, 27 | }); 28 | -------------------------------------------------------------------------------- /templates/vanilla/template/tamagui/animations.web.ts: -------------------------------------------------------------------------------- 1 | import {createAnimations} from '@tamagui/animations-react-native'; 2 | 3 | export const animations = createAnimations({ 4 | bouncy: { 5 | damping: 9, 6 | mass: 0.9, 7 | stiffness: 150, 8 | }, 9 | lazy: { 10 | damping: 18, 11 | stiffness: 50, 12 | }, 13 | slow: { 14 | damping: 15, 15 | stiffness: 40, 16 | }, 17 | quick: { 18 | damping: 20, 19 | mass: 1.2, 20 | stiffness: 250, 21 | }, 22 | tooltip: { 23 | damping: 10, 24 | mass: 0.9, 25 | stiffness: 100, 26 | }, 27 | }); 28 | -------------------------------------------------------------------------------- /packages/create-luna-app/src/commands/generate.ts: -------------------------------------------------------------------------------- 1 | import { GluegunToolbox } from 'gluegun' 2 | 3 | module.exports = { 4 | name: 'generate', 5 | alias: ['g'], 6 | run: async (toolbox: GluegunToolbox) => { 7 | const { 8 | parameters, 9 | template: { generate }, 10 | print: { info }, 11 | } = toolbox 12 | 13 | const name = parameters.first 14 | 15 | await generate({ 16 | template: 'model.ts.ejs', 17 | target: `models/${name}-model.ts`, 18 | props: { name }, 19 | }) 20 | 21 | info(`Generated file at models/${name}-model.ts`) 22 | }, 23 | } 24 | -------------------------------------------------------------------------------- /templates/vanilla/template/metro.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Metro configuration for React Native 3 | * https://github.com/facebook/react-native 4 | * 5 | * @format 6 | */ 7 | 8 | module.exports = { 9 | transformer: { 10 | getTransformOptions: async () => ({ 11 | transform: { 12 | experimentalImportSupport: false, 13 | inlineRequires: true, 14 | }, 15 | }), 16 | }, 17 | serializer: { 18 | processModuleFilter: module => 19 | !module.path.match( 20 | '/node_modules/(((react-native-)?web|reanimated-swc-plugin)|react-dom|sharp)/', 21 | ), 22 | }, 23 | }; 24 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /templates/vanilla/template/tsconfig.json: -------------------------------------------------------------------------------- 1 | // prettier-ignore 2 | { 3 | "extends": "@tsconfig/react-native/tsconfig.json", /* Recommended React Native TSConfig base */ 4 | "compilerOptions": { 5 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 6 | "lib": [ 7 | "es5", 8 | "es6", 9 | "dom" 10 | ], 11 | /* Completeness */ 12 | "skipLibCheck": true /* Skip type checking all .d.ts files. */, 13 | "incremental": true, 14 | "jsx": "preserve" 15 | }, 16 | "include": [ 17 | "next-env.d.ts", 18 | "**/*.ts", 19 | "**/*.tsx" 20 | ], 21 | "exclude": [ 22 | "node_modules" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /packages/create-luna-app/src/extensions/cli-extension.ts: -------------------------------------------------------------------------------- 1 | import { GluegunToolbox } from 'gluegun' 2 | 3 | // add your CLI-specific functionality here, which will then be accessible 4 | // to your commands 5 | module.exports = (toolbox: GluegunToolbox) => { 6 | toolbox.foo = () => { 7 | toolbox.print.info('called foo extension') 8 | } 9 | 10 | // enable this if you want to read configuration in from 11 | // the current folder's package.json (in a "create-luna-app" property), 12 | // create-luna-app.config.json, etc. 13 | // toolbox.config = { 14 | // ...toolbox.config, 15 | // ...toolbox.config.loadConfig("create-luna-app", process.cwd()) 16 | // } 17 | } 18 | -------------------------------------------------------------------------------- /templates/expo/tamagui/animations.ts: -------------------------------------------------------------------------------- 1 | import {createAnimations} from '@tamagui/animations-reanimated'; 2 | 3 | export const animations = createAnimations({ 4 | bouncy: { 5 | type: 'spring', 6 | damping: 9, 7 | mass: 0.9, 8 | stiffness: 150, 9 | }, 10 | lazy: { 11 | type: 'spring', 12 | damping: 18, 13 | stiffness: 50, 14 | }, 15 | slow: { 16 | type: 'spring', 17 | damping: 15, 18 | stiffness: 40, 19 | }, 20 | quick: { 21 | type: 'spring', 22 | damping: 20, 23 | mass: 1.2, 24 | stiffness: 250, 25 | }, 26 | tooltip: { 27 | type: 'spring', 28 | damping: 10, 29 | mass: 0.9, 30 | stiffness: 100, 31 | }, 32 | }); 33 | -------------------------------------------------------------------------------- /templates/vanilla/template/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:metro-react-native-babel-preset'], 3 | plugins: [ 4 | [ 5 | 'module-resolver', 6 | { 7 | root: ['./'], 8 | alias: { 9 | 'solito/image': 'solito/image/react-native-fast-image', 10 | }, 11 | }, 12 | ], 13 | [ 14 | '@tamagui/babel-plugin', 15 | { 16 | components: ['tamagui'], 17 | config: './tamagui', 18 | }, 19 | ], 20 | [ 21 | 'transform-inline-environment-variables', 22 | { 23 | include: 'TAMAGUI_TARGET', 24 | }, 25 | ], 26 | 27 | 'react-native-reanimated/plugin', 28 | ], 29 | }; 30 | -------------------------------------------------------------------------------- /templates/vanilla/template/tamagui/animations.ts: -------------------------------------------------------------------------------- 1 | import {createAnimations} from '@tamagui/animations-reanimated'; 2 | 3 | export const animations = createAnimations({ 4 | bouncy: { 5 | type: 'spring', 6 | damping: 9, 7 | mass: 0.9, 8 | stiffness: 150, 9 | }, 10 | lazy: { 11 | type: 'spring', 12 | damping: 18, 13 | stiffness: 50, 14 | }, 15 | slow: { 16 | type: 'spring', 17 | damping: 15, 18 | stiffness: 40, 19 | }, 20 | quick: { 21 | type: 'spring', 22 | damping: 20, 23 | mass: 1.2, 24 | stiffness: 250, 25 | }, 26 | tooltip: { 27 | type: 'spring', 28 | damping: 10, 29 | mass: 0.9, 30 | stiffness: 100, 31 | }, 32 | }); 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /templates/expo/tamagui/tamagui.config.ts: -------------------------------------------------------------------------------- 1 | import {createTamagui} from 'tamagui'; 2 | import {shorthands} from '@tamagui/shorthands'; 3 | import {themes, tokens} from '@tamagui/themes'; 4 | import {media, mediaQueryDefaultActive} from './mediaQueries'; 5 | import {animations} from './animations'; 6 | import fonts from './fonts'; 7 | 8 | const appConfig = createTamagui({ 9 | shouldAddPrefersColorThemes: true, 10 | // themeClassNameOnRoot: true, 11 | animations, 12 | fonts, 13 | shorthands, 14 | themes, 15 | tokens, 16 | media, 17 | }); 18 | 19 | //@ts-ignore 20 | appConfig.mediaQueryDefaultActive = mediaQueryDefaultActive; 21 | 22 | export type AppConfig = typeof appConfig; 23 | export default appConfig; 24 | -------------------------------------------------------------------------------- /templates/expo/src/features/DetailScreen/DetailScreen.tsx: -------------------------------------------------------------------------------- 1 | import {Button, Paragraph, YStack} from 'tamagui'; 2 | import {ChevronLeft} from '@tamagui/lucide-icons'; 3 | import React from 'react'; 4 | import {createParam} from 'solito'; 5 | import {useLink} from 'solito/link'; 6 | 7 | const {useParam} = createParam<{id: string}>(); 8 | 9 | export function UserDetailScreen() { 10 | const [id] = useParam('id'); 11 | const linkProps = useLink({href: '/'}); 12 | 13 | return ( 14 | 15 | {`User ID: ${id}`} 16 | 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /templates/vanilla/template/tamagui/tamagui.config.ts: -------------------------------------------------------------------------------- 1 | import {createTamagui} from 'tamagui'; 2 | import {shorthands} from '@tamagui/shorthands'; 3 | import {themes, tokens} from '@tamagui/themes'; 4 | import {media, mediaQueryDefaultActive} from './mediaQueries'; 5 | import {animations} from './animations'; 6 | import fonts from './fonts'; 7 | 8 | const appConfig = createTamagui({ 9 | shouldAddPrefersColorThemes: true, 10 | // themeClassNameOnRoot: true, 11 | animations, 12 | fonts, 13 | shorthands, 14 | themes, 15 | tokens, 16 | media, 17 | }); 18 | 19 | //@ts-ignore 20 | appConfig.mediaQueryDefaultActive = mediaQueryDefaultActive; 21 | 22 | export type AppConfig = typeof appConfig; 23 | export default appConfig; 24 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = "33.0.0" 6 | minSdkVersion = 21 7 | compileSdkVersion = 33 8 | targetSdkVersion = 33 9 | 10 | // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. 11 | ndkVersion = "23.1.7779620" 12 | } 13 | repositories { 14 | google() 15 | mavenCentral() 16 | } 17 | dependencies { 18 | classpath("com.android.tools.build:gradle:7.3.1") 19 | classpath("com.facebook.react:react-native-gradle-plugin") 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /templates/vanilla/template/src/features/DetailScreen/DetailScreen.tsx: -------------------------------------------------------------------------------- 1 | import {Button, Paragraph, YStack} from 'tamagui'; 2 | import {ChevronLeft} from '@tamagui/lucide-icons'; 3 | import React from 'react'; 4 | import {createParam} from 'solito'; 5 | import {useLink} from 'solito/link'; 6 | 7 | const {useParam} = createParam<{id: string}>(); 8 | 9 | export function UserDetailScreen() { 10 | const [id] = useParam('id'); 11 | const linkProps = useLink({href: '/'}); 12 | 13 | return ( 14 | 15 | {`User ID: ${id}`} 16 | 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /templates/expo/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function (api) { 2 | api.cache(true) 3 | return { 4 | presets: [['babel-preset-expo', { jsxRuntime: 'automatic' }]], 5 | plugins: [ 6 | // if you want reanimated support 7 | 'react-native-reanimated/plugin', 8 | ...(process.env.EAS_BUILD_PLATFORM === 'android' 9 | ? [] 10 | : [ 11 | [ 12 | '@tamagui/babel-plugin', 13 | { 14 | config: './tamagui', 15 | components: ['tamagui'], 16 | }, 17 | ], 18 | ]), 19 | [ 20 | 'transform-inline-environment-variables', 21 | { 22 | include: 'TAMAGUI_TARGET', 23 | }, 24 | ], 25 | ], 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/create-luna-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": false, 4 | "experimentalDecorators": true, 5 | "lib": [ 6 | "es2015", 7 | "scripthost", 8 | "es2015.promise", 9 | "es2015.generator", 10 | "es2015.iterable", 11 | "dom" 12 | ], 13 | "module": "commonjs", 14 | "moduleResolution": "node", 15 | "noImplicitAny": false, 16 | "noImplicitThis": true, 17 | "noUnusedLocals": true, 18 | "sourceMap": false, 19 | "inlineSourceMap": true, 20 | "outDir": "build", 21 | "strict": false, 22 | "target": "es5", 23 | "declaration": true, 24 | "declarationDir": "build/types" 25 | }, 26 | "include": ["src/**/*"], 27 | "exclude": ["node_modules"] 28 | } 29 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/release/java/com/projectname/ReactNativeFlipper.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | *

This source code is licensed under the MIT license found in the LICENSE file in the root 5 | * directory of this source tree. 6 | */ 7 | package com.projectname; 8 | 9 | import android.content.Context; 10 | import com.facebook.react.ReactInstanceManager; 11 | 12 | /** 13 | * Class responsible of loading Flipper inside your React Native application. This is the release 14 | * flavor of it so it's empty as we don't want to load Flipper. 15 | */ 16 | public class ReactNativeFlipper { 17 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 18 | // Do nothing as we don't want to initialize Flipper on Release. 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/create-luna-app/bin/create-luna-app: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 4 | /* tslint:disable */ 5 | // check if we're running in dev mode 6 | var devMode = require('fs').existsSync(`${__dirname}/../src`) 7 | // or want to "force" running the compiled version with --compiled-build 8 | var wantsCompiled = process.argv.indexOf('--compiled-build') >= 0 9 | 10 | if (wantsCompiled || !devMode) { 11 | // this runs from the compiled javascript source 12 | require(`${__dirname}/../build/cli`).run(process.argv) 13 | } else { 14 | // this runs from the typescript source (for dev only) 15 | // hook into ts-node so we can run typescript on the fly 16 | require('ts-node').register({ project: `${__dirname}/../tsconfig.json` }) 17 | // run the CLI with the current process arguments 18 | require(`${__dirname}/../src/cli`).run(process.argv) 19 | } 20 | 21 | 22 | -------------------------------------------------------------------------------- /templates/expo/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "@create-luna-app/expo", 4 | "slug": "@create-luna-app/expo", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/icon.png", 8 | "scheme": "myapp", 9 | "userInterfaceStyle": "automatic", 10 | "splash": { 11 | "image": "./assets/splash.png", 12 | "resizeMode": "contain", 13 | "backgroundColor": "#ffffff" 14 | }, 15 | "assetBundlePatterns": [ 16 | "**/*" 17 | ], 18 | "ios": { 19 | "supportsTablet": true 20 | }, 21 | "android": { 22 | "adaptiveIcon": { 23 | "foregroundImage": "./assets/adaptive-icon.png", 24 | "backgroundColor": "#ffffff" 25 | } 26 | }, 27 | "web": { 28 | "bundler": "metro", 29 | "favicon": "./assets/favicon.png" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /templates/vanilla/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@criszz77/luna", 3 | "version": "3.0.3", 4 | "description": "🌘Luna is a React Native and Next.js boilerplate so your app can run on Android, IOS and Web concurrently.", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/LunatiqueCoder/luna.git" 8 | }, 9 | "author": "Ovidiu Cristescu ", 10 | "license": "MIT", 11 | "bugs": { 12 | "url": "https://github.com/LunatiqueCoder/luna/issues" 13 | }, 14 | "homepage": "https://github.com/LunatiqueCoder/luna/tree/master/templates/vanilla/template", 15 | "keywords": [ 16 | "react", 17 | "native", 18 | "boilerplate", 19 | "template", 20 | "luna", 21 | "react-native", 22 | "web", 23 | "react-native-web", 24 | "next", 25 | "nextjs", 26 | "solito", 27 | "tamagui" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /templates/vanilla/template/ios/ProjectNameTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /templates/expo/tamagui/mediaQueries.ts: -------------------------------------------------------------------------------- 1 | import {createMedia} from '@tamagui/react-native-media-driver'; 2 | 3 | export const media = createMedia({ 4 | // for site 5 | xl: {maxWidth: 1650}, 6 | lg: {maxWidth: 1280}, 7 | md: {maxWidth: 1020}, 8 | sm: {maxWidth: 800}, 9 | xs: {maxWidth: 660}, 10 | xxs: {maxWidth: 390}, 11 | gtXs: {minWidth: 660 + 1}, 12 | gtSm: {minWidth: 800 + 1}, 13 | gtMd: {minWidth: 1020 + 1}, 14 | gtLg: {minWidth: 1280 + 1}, 15 | gtXl: {minWidth: 1650 + 1}, 16 | hoverNone: {hover: 'none'}, 17 | pointerCoarse: {pointer: 'coarse'}, 18 | }); 19 | 20 | // note all the non "gt" ones should be true to start to match mobile-first 21 | // were aiming for "xs" to be the default to "gtXs" true too 22 | export const mediaQueryDefaultActive = { 23 | xl: true, 24 | lg: true, 25 | md: true, 26 | sm: true, 27 | xs: true, 28 | // false 29 | xxs: false, 30 | }; 31 | -------------------------------------------------------------------------------- /templates/vanilla/template/tamagui/mediaQueries.ts: -------------------------------------------------------------------------------- 1 | import {createMedia} from '@tamagui/react-native-media-driver'; 2 | 3 | export const media = createMedia({ 4 | // for site 5 | xl: {maxWidth: 1650}, 6 | lg: {maxWidth: 1280}, 7 | md: {maxWidth: 1020}, 8 | sm: {maxWidth: 800}, 9 | xs: {maxWidth: 660}, 10 | xxs: {maxWidth: 390}, 11 | gtXs: {minWidth: 660 + 1}, 12 | gtSm: {minWidth: 800 + 1}, 13 | gtMd: {minWidth: 1020 + 1}, 14 | gtLg: {minWidth: 1280 + 1}, 15 | gtXl: {minWidth: 1650 + 1}, 16 | hoverNone: {hover: 'none'}, 17 | pointerCoarse: {pointer: 'coarse'}, 18 | }); 19 | 20 | // note all the non "gt" ones should be true to start to match mobile-first 21 | // were aiming for "xs" to be the default to "gtXs" true too 22 | export const mediaQueryDefaultActive = { 23 | xl: true, 24 | lg: true, 25 | md: true, 26 | sm: true, 27 | xs: true, 28 | // false 29 | xxs: false, 30 | }; 31 | -------------------------------------------------------------------------------- /templates/vanilla/template/patches/@tamagui+font-silkscreen+1.5.3.patch: -------------------------------------------------------------------------------- 1 | diff --git a/node_modules/@tamagui/font-silkscreen/files/slkscrb.ttf b/node_modules/@tamagui/font-silkscreen/files/Silkscreen-bold.ttf 2 | similarity index 100% 3 | rename from node_modules/@tamagui/font-silkscreen/files/slkscrb.ttf 4 | rename to node_modules/@tamagui/font-silkscreen/files/Silkscreen-bold.ttf 5 | diff --git a/node_modules/@tamagui/font-silkscreen/files/slkscr.ttf b/node_modules/@tamagui/font-silkscreen/files/Silkscreen.ttf 6 | similarity index 100% 7 | rename from node_modules/@tamagui/font-silkscreen/files/slkscr.ttf 8 | rename to node_modules/@tamagui/font-silkscreen/files/Silkscreen.ttf 9 | diff --git a/node_modules/@tamagui/font-silkscreen/files/slkscr.woff b/node_modules/@tamagui/font-silkscreen/files/Silkscreen.woff 10 | similarity index 100% 11 | rename from node_modules/@tamagui/font-silkscreen/files/slkscr.woff 12 | rename to node_modules/@tamagui/font-silkscreen/files/Silkscreen.woff 13 | -------------------------------------------------------------------------------- /packages/create-luna-app/__tests__/cli-integration.test.ts: -------------------------------------------------------------------------------- 1 | import { system, filesystem } from 'gluegun' 2 | 3 | const src = filesystem.path(__dirname, '..') 4 | 5 | const cli = async (cmd) => 6 | system.run( 7 | 'node ' + filesystem.path(src, 'bin', 'create-luna-app') + ` ${cmd}` 8 | ) 9 | 10 | test('outputs version', async () => { 11 | const output = await cli('--version') 12 | expect(output).toContain('0.0.1') 13 | }) 14 | 15 | test('outputs help', async () => { 16 | const output = await cli('--help') 17 | expect(output).toContain('0.0.1') 18 | }) 19 | 20 | test('generates file', async () => { 21 | const output = await cli('generate foo') 22 | 23 | expect(output).toContain('Generated file at models/foo-model.ts') 24 | const foomodel = filesystem.read('models/foo-model.ts') 25 | 26 | expect(foomodel).toContain(`module.exports = {`) 27 | expect(foomodel).toContain(`name: 'foo'`) 28 | 29 | // cleanup artifact 30 | filesystem.remove('models') 31 | }) 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /templates/vanilla/template/next.config.js: -------------------------------------------------------------------------------- 1 | const {withTamagui} = require('@tamagui/next-plugin'); 2 | 3 | /** @type {import('next').NextConfig.transpilePackages} */ 4 | const transpilePackages = [ 5 | 'solito', 6 | 'react-native-safe-area-context', 7 | 'react-native-reanimated', 8 | 'react-native-gesture-handler', 9 | ]; 10 | 11 | const plugins = [ 12 | withTamagui({ 13 | config: './tamagui', 14 | components: ['tamagui'], 15 | excludeReactNativeWebExports: [ 16 | 'Switch', 17 | 'ProgressBar', 18 | 'Picker', 19 | 'CheckBox', 20 | 'Touchable', 21 | ], 22 | }), 23 | ]; 24 | 25 | module.exports = function () { 26 | /** @type {import('next').NextConfig} */ 27 | let config = { 28 | transpilePackages, 29 | experimental: { 30 | forceSwcTransforms: true, 31 | // swcPlugins: [['react-native-reanimated-swc-plugin']], 32 | }, 33 | }; 34 | 35 | for (const plugin of plugins) { 36 | config = { 37 | ...config, 38 | ...plugin(config), 39 | }; 40 | } 41 | 42 | return config; 43 | }; 44 | -------------------------------------------------------------------------------- /templates/vanilla/template/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Ovidiu Cristescu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/create-luna-app/src/cli.ts: -------------------------------------------------------------------------------- 1 | import { build } from 'gluegun' 2 | 3 | /** 4 | * Create the cli and kick it off 5 | */ 6 | async function run(argv) { 7 | // create a CLI runtime 8 | const cli = build() 9 | .brand('create-luna-app') 10 | .src(__dirname) 11 | .plugins('./node_modules', { matching: 'create-luna-app-*', hidden: true }) 12 | .help() // provides default for help, h, --help, -h 13 | .version() // provides default for version, v, --version, -v 14 | // enable the following method if you'd like to skip loading one of these core extensions 15 | // this can improve performance if they're not necessary for your project: 16 | // .exclude([ 17 | // 'meta', 18 | // 'strings', 19 | // 'print', 20 | // 'filesystem', 21 | // 'semver', 22 | // 'system', 23 | // 'prompt', 24 | // 'http', 25 | // 'template', 26 | // 'patching', 27 | // 'package-manager', 28 | // ]) 29 | .create() 30 | // and run it 31 | const toolbox = await cli.run(argv) 32 | 33 | // send it back (for testing, mostly) 34 | return toolbox 35 | } 36 | 37 | module.exports = { run } 38 | -------------------------------------------------------------------------------- /templates/vanilla/template/ios/ProjectName/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "scale" : "1x", 46 | "size" : "1024x1024" 47 | } 48 | ], 49 | "info" : { 50 | "author" : "xcode", 51 | "version" : 1 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /templates/expo/src/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import {Children} from 'react'; 2 | import { 3 | Html, 4 | Head, 5 | Main, 6 | NextScript, 7 | DocumentContext, 8 | DocumentInitialProps, 9 | } from 'next/document'; 10 | import {AppRegistry} from 'react-native'; 11 | import config from '../../app.json'; 12 | import Tamagui from '../../tamagui'; 13 | 14 | function MyDocument() { 15 | return ( 16 | 17 | 18 | 19 |

20 | 21 | 22 | 23 | ); 24 | } 25 | 26 | MyDocument.getInitialProps = async ({ 27 | renderPage, 28 | }: DocumentContext): Promise => { 29 | AppRegistry.registerComponent(config.expo.name, () => Main); 30 | const {getStyleElement} = AppRegistry.getApplication(config.expo.name); 31 | const page = await renderPage(); 32 | const styles = [ 33 | getStyleElement(), 34 |