create-jilatax 0.0.8 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/bin.cjs +1 -1
- package/dist/bin.js +1 -1
- package/dist/{cli-DtDXFiYr.cjs → cli-DD2gvmMZ.cjs} +4 -8
- package/dist/{cli-CcoP3IQU.js → cli-DLBJ0XnY.js} +4 -8
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/template/README.md.tmpl +12 -9
- package/template/public/assets/splash-icon.png +0 -0
- package/template/public/fonts/JilataX.otf +0 -0
- package/template/src/app/App.tsx +18 -0
- package/template/src/app/navigation.ts +1 -0
- package/template/src/components/navigation/BottomBar.tsx +36 -0
- package/template/src/components/ui/Brand.tsx +19 -0
- package/template/src/index.tsx +1 -1
- package/template/src/screens/AboutScreen.tsx +37 -0
- package/template/src/screens/HomeScreen.tsx +45 -0
- package/template/src/styles/global.css +400 -0
- package/template/src/App.css +0 -95
- package/template/src/App.tsx.tmpl +0 -23
- /package/template/{assets → public/assets}/icon.png +0 -0
- /package/template/{assets/splash-icon.png → public/assets/jilatax-icon.png} +0 -0
package/README.md
CHANGED
|
@@ -33,7 +33,8 @@ Generated projects include:
|
|
|
33
33
|
- a Lynx and Rspeedy application;
|
|
34
34
|
- `app.json` as the Jilatax application configuration;
|
|
35
35
|
- an Android Gradle project linked to `jilatax/android`;
|
|
36
|
-
- `bun run run:android` for development on a connected device;
|
|
36
|
+
- `bun run run:android` for development on a connected device; the generated
|
|
37
|
+
APK is located at `android/app/build/outputs/apk/debug/app-debug.apk`;
|
|
37
38
|
- `bun run create:aab` for a Play Store Android App Bundle.
|
|
38
39
|
|
|
39
40
|
The creator only writes the project and can run `bun install`. Device, Gradle,
|
package/dist/bin.cjs
CHANGED
package/dist/bin.js
CHANGED
|
@@ -37,11 +37,7 @@ const LYNX_REACT_VERSION = "^0.116.2";
|
|
|
37
37
|
const LYNX_TYPES_VERSION = "^3.7.0";
|
|
38
38
|
const REACT_PLUGIN_VERSION = "^0.12.7";
|
|
39
39
|
const RSPEEDY_VERSION = "^0.13.3";
|
|
40
|
-
const TEXT_TEMPLATE_FILES = /* @__PURE__ */ new Set([
|
|
41
|
-
"README.md.tmpl",
|
|
42
|
-
"android/settings.gradle.kts.tmpl",
|
|
43
|
-
"src/App.tsx.tmpl"
|
|
44
|
-
]);
|
|
40
|
+
const TEXT_TEMPLATE_FILES = /* @__PURE__ */ new Set(["README.md.tmpl", "android/settings.gradle.kts.tmpl"]);
|
|
45
41
|
async function createProject(options) {
|
|
46
42
|
const projectDirectory = node_path.default.resolve(options.targetDirectory);
|
|
47
43
|
const projectName = normalizeProjectName(node_path.default.basename(projectDirectory));
|
|
@@ -188,20 +184,20 @@ function createInitialConfig(displayName, projectName, packageId) {
|
|
|
188
184
|
android: {
|
|
189
185
|
adaptiveIcon: {
|
|
190
186
|
backgroundColor: "#E8FFF2",
|
|
191
|
-
foregroundImage: "./assets/icon.png"
|
|
187
|
+
foregroundImage: "./public/assets/icon.png"
|
|
192
188
|
},
|
|
193
189
|
package: packageId,
|
|
194
190
|
predictiveBackGestureEnabled: false,
|
|
195
191
|
versionCode: 1
|
|
196
192
|
},
|
|
197
|
-
icon: "./assets/icon.png",
|
|
193
|
+
icon: "./public/assets/icon.png",
|
|
198
194
|
name: displayName,
|
|
199
195
|
orientation: "portrait",
|
|
200
196
|
scheme: schemeBase || "jilatax-app",
|
|
201
197
|
slug,
|
|
202
198
|
splash: {
|
|
203
199
|
backgroundColor: "#041A17",
|
|
204
|
-
image: "./assets/splash-icon.png",
|
|
200
|
+
image: "./public/assets/splash-icon.png",
|
|
205
201
|
imageWidth: 96,
|
|
206
202
|
resizeMode: "contain"
|
|
207
203
|
},
|
|
@@ -13,11 +13,7 @@ const LYNX_REACT_VERSION = "^0.116.2";
|
|
|
13
13
|
const LYNX_TYPES_VERSION = "^3.7.0";
|
|
14
14
|
const REACT_PLUGIN_VERSION = "^0.12.7";
|
|
15
15
|
const RSPEEDY_VERSION = "^0.13.3";
|
|
16
|
-
const TEXT_TEMPLATE_FILES = /* @__PURE__ */ new Set([
|
|
17
|
-
"README.md.tmpl",
|
|
18
|
-
"android/settings.gradle.kts.tmpl",
|
|
19
|
-
"src/App.tsx.tmpl"
|
|
20
|
-
]);
|
|
16
|
+
const TEXT_TEMPLATE_FILES = /* @__PURE__ */ new Set(["README.md.tmpl", "android/settings.gradle.kts.tmpl"]);
|
|
21
17
|
async function createProject(options) {
|
|
22
18
|
const projectDirectory = path.resolve(options.targetDirectory);
|
|
23
19
|
const projectName = normalizeProjectName(path.basename(projectDirectory));
|
|
@@ -164,20 +160,20 @@ function createInitialConfig(displayName, projectName, packageId) {
|
|
|
164
160
|
android: {
|
|
165
161
|
adaptiveIcon: {
|
|
166
162
|
backgroundColor: "#E8FFF2",
|
|
167
|
-
foregroundImage: "./assets/icon.png"
|
|
163
|
+
foregroundImage: "./public/assets/icon.png"
|
|
168
164
|
},
|
|
169
165
|
package: packageId,
|
|
170
166
|
predictiveBackGestureEnabled: false,
|
|
171
167
|
versionCode: 1
|
|
172
168
|
},
|
|
173
|
-
icon: "./assets/icon.png",
|
|
169
|
+
icon: "./public/assets/icon.png",
|
|
174
170
|
name: displayName,
|
|
175
171
|
orientation: "portrait",
|
|
176
172
|
scheme: schemeBase || "jilatax-app",
|
|
177
173
|
slug,
|
|
178
174
|
splash: {
|
|
179
175
|
backgroundColor: "#041A17",
|
|
180
|
-
image: "./assets/splash-icon.png",
|
|
176
|
+
image: "./public/assets/splash-icon.png",
|
|
181
177
|
imageWidth: 96,
|
|
182
178
|
resizeMode: "contain"
|
|
183
179
|
},
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_cli = require("./cli-
|
|
2
|
+
const require_cli = require("./cli-DD2gvmMZ.cjs");
|
|
3
3
|
exports.createHelpText = require_cli.createHelpText;
|
|
4
4
|
exports.createProject = require_cli.createProject;
|
|
5
5
|
exports.defaultPackageId = require_cli.defaultPackageId;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as normalizeDisplayName, i as defaultPackageId, n as runCreateCli, o as normalizeProjectName, r as createProject, s as validatePackageId, t as createHelpText } from "./cli-
|
|
1
|
+
import { a as normalizeDisplayName, i as defaultPackageId, n as runCreateCli, o as normalizeProjectName, r as createProject, s as validatePackageId, t as createHelpText } from "./cli-DLBJ0XnY.js";
|
|
2
2
|
export { createHelpText, createProject, defaultPackageId, normalizeDisplayName, normalizeProjectName, runCreateCli, validatePackageId };
|
package/package.json
CHANGED
package/template/README.md.tmpl
CHANGED
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
Android-first Lynx application created with Jilatax.
|
|
4
4
|
|
|
5
|
-
## Development
|
|
5
|
+
## Development (QR)
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
bun
|
|
9
|
-
bun run
|
|
8
|
+
bun i
|
|
9
|
+
bun run dev
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
The Android command starts Rspeedy, builds and installs the debug APK, verifies
|
|
13
|
-
the ADB reverse tunnel, and launches the app once.
|
|
13
|
+
the ADB reverse tunnel, and launches the app once. The generated APK is located
|
|
14
|
+
at `android/app/build/outputs/apk/debug/app-debug.apk`.
|
|
14
15
|
|
|
15
|
-
To run only the Lynx development
|
|
16
|
+
To run only the Lynx development APK (Real Mobile):
|
|
16
17
|
|
|
17
18
|
```bash
|
|
18
|
-
bun run
|
|
19
|
+
bun run run:android
|
|
19
20
|
```
|
|
20
21
|
|
|
21
22
|
When the build is ready, scan the printed QR code with the Lynx application on
|
|
@@ -33,6 +34,8 @@ Play Store release. Never commit signing credentials.
|
|
|
33
34
|
Application metadata lives in `app.json`. Android is the only supported native
|
|
34
35
|
platform in this phase.
|
|
35
36
|
|
|
36
|
-
Default launcher and splash artwork lives in `assets/`.
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
Default launcher and splash artwork lives in `public/assets/`. Additional local
|
|
38
|
+
fonts can be stored in `public/fonts/`; the included JilataX font is applied to
|
|
39
|
+
the `LYNX TO ANDROID` brand caption. Update the image paths, background colors,
|
|
40
|
+
or splash width in `app.json`; Jilatax synchronizes those resources before each
|
|
41
|
+
Android build.
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useState } from '@lynx-js/react';
|
|
2
|
+
|
|
3
|
+
import { BottomBar } from '../components/navigation/BottomBar.js';
|
|
4
|
+
import { AboutScreen } from '../screens/AboutScreen.js';
|
|
5
|
+
import { HomeScreen } from '../screens/HomeScreen.js';
|
|
6
|
+
import '../styles/global.css';
|
|
7
|
+
import type { AppTab } from './navigation.js';
|
|
8
|
+
|
|
9
|
+
export function App() {
|
|
10
|
+
const [activeTab, setActiveTab] = useState<AppTab>('home');
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<view className="app-shell">
|
|
14
|
+
{activeTab === 'home' ? <HomeScreen /> : <AboutScreen />}
|
|
15
|
+
<BottomBar activeTab={activeTab} onSelect={setActiveTab} />
|
|
16
|
+
</view>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type AppTab = 'home' | 'about';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AppTab } from '../../app/navigation.js';
|
|
2
|
+
|
|
3
|
+
interface BottomBarProps {
|
|
4
|
+
activeTab: AppTab;
|
|
5
|
+
onSelect: (tab: AppTab) => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const tabs: ReadonlyArray<{ id: AppTab; label: string }> = [
|
|
9
|
+
{ id: 'home', label: 'Home' },
|
|
10
|
+
{ id: 'about', label: 'About' },
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
export function BottomBar({ activeTab, onSelect }: BottomBarProps) {
|
|
14
|
+
return (
|
|
15
|
+
<view className="bottom-bar-wrap">
|
|
16
|
+
<view className="bottom-bar">
|
|
17
|
+
{tabs.map((tab) => {
|
|
18
|
+
const isActive = activeTab === tab.id;
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<view
|
|
22
|
+
className={`bottom-bar__button${isActive ? ' bottom-bar__button--active' : ''}`}
|
|
23
|
+
bindtap={() => onSelect(tab.id)}
|
|
24
|
+
key={tab.id}
|
|
25
|
+
>
|
|
26
|
+
<view className={`bottom-bar__mark${isActive ? ' bottom-bar__mark--active' : ''}`} />
|
|
27
|
+
<text className={`bottom-bar__label${isActive ? ' bottom-bar__label--active' : ''}`}>
|
|
28
|
+
{tab.label}
|
|
29
|
+
</text>
|
|
30
|
+
</view>
|
|
31
|
+
);
|
|
32
|
+
})}
|
|
33
|
+
</view>
|
|
34
|
+
</view>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import jilataxIcon from '../../../public/assets/jilatax-icon.png';
|
|
2
|
+
|
|
3
|
+
interface BrandProps {
|
|
4
|
+
compact?: boolean;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function Brand({ compact = false }: BrandProps) {
|
|
8
|
+
return (
|
|
9
|
+
<view className={`brand${compact ? ' brand--compact' : ''}`}>
|
|
10
|
+
<view className="brand__icon-wrap">
|
|
11
|
+
<image className="brand__icon" mode="aspectFit" src={jilataxIcon} />
|
|
12
|
+
</view>
|
|
13
|
+
<view className="brand__copy">
|
|
14
|
+
<text className="brand__name">JILATAX</text>
|
|
15
|
+
<text className="brand__caption">LYNX TO ANDROID</text>
|
|
16
|
+
</view>
|
|
17
|
+
</view>
|
|
18
|
+
);
|
|
19
|
+
}
|
package/template/src/index.tsx
CHANGED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Brand } from '../components/ui/Brand.js';
|
|
2
|
+
|
|
3
|
+
const principles = [
|
|
4
|
+
{ number: '01', title: 'Simple by default', detail: 'A small structure that stays easy to evolve.' },
|
|
5
|
+
{ number: '02', title: 'Native in the end', detail: 'A direct path from Lynx UI to Android.' },
|
|
6
|
+
{ number: '03', title: 'Built with intent', detail: 'Clear hierarchy, spacing, and interaction.' },
|
|
7
|
+
] as const;
|
|
8
|
+
|
|
9
|
+
export function AboutScreen() {
|
|
10
|
+
return (
|
|
11
|
+
<scroll-view className="screen" scroll-orientation="vertical">
|
|
12
|
+
<view className="screen__content">
|
|
13
|
+
<Brand compact />
|
|
14
|
+
|
|
15
|
+
<view className="about-heading">
|
|
16
|
+
<text className="about-heading__label">THE FOUNDATION</text>
|
|
17
|
+
<text className="about-heading__title">Small core.{`\n`}Native result.</text>
|
|
18
|
+
<text className="about-heading__description">
|
|
19
|
+
JILATAX keeps the route from idea to Android direct and understandable.
|
|
20
|
+
</text>
|
|
21
|
+
</view>
|
|
22
|
+
|
|
23
|
+
<view className="principles">
|
|
24
|
+
{principles.map((principle) => (
|
|
25
|
+
<view className="principle" key={principle.number}>
|
|
26
|
+
<text className="principle__number">{principle.number}</text>
|
|
27
|
+
<view className="principle__copy">
|
|
28
|
+
<text className="principle__title">{principle.title}</text>
|
|
29
|
+
<text className="principle__detail">{principle.detail}</text>
|
|
30
|
+
</view>
|
|
31
|
+
</view>
|
|
32
|
+
))}
|
|
33
|
+
</view>
|
|
34
|
+
</view>
|
|
35
|
+
</scroll-view>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Brand } from '../components/ui/Brand.js';
|
|
2
|
+
|
|
3
|
+
export function HomeScreen() {
|
|
4
|
+
return (
|
|
5
|
+
<scroll-view className="screen" scroll-orientation="vertical">
|
|
6
|
+
<view className="screen__content">
|
|
7
|
+
<Brand />
|
|
8
|
+
|
|
9
|
+
<view className="hero">
|
|
10
|
+
<view className="eyebrow">
|
|
11
|
+
<view className="eyebrow__dot" />
|
|
12
|
+
<text className="eyebrow__text">ANDROID READY</text>
|
|
13
|
+
</view>
|
|
14
|
+
<text className="hero__title">Build clean.{`\n`}Ship native.</text>
|
|
15
|
+
<text className="hero__description">
|
|
16
|
+
A focused foundation for fast Lynx experiences on Android.
|
|
17
|
+
</text>
|
|
18
|
+
</view>
|
|
19
|
+
|
|
20
|
+
<view className="workspace-card">
|
|
21
|
+
<view className="workspace-card__glow" />
|
|
22
|
+
<view className="workspace-card__top">
|
|
23
|
+
<text className="workspace-card__label">YOUR WORKSPACE</text>
|
|
24
|
+
<view className="workspace-card__status">
|
|
25
|
+
<view className="workspace-card__status-dot" />
|
|
26
|
+
<text className="workspace-card__status-text">LIVE</text>
|
|
27
|
+
</view>
|
|
28
|
+
</view>
|
|
29
|
+
<text className="workspace-card__title">Ready for what comes next.</text>
|
|
30
|
+
<text className="workspace-card__description">
|
|
31
|
+
One clear interface, powered by Lynx and prepared for Android.
|
|
32
|
+
</text>
|
|
33
|
+
<view className="workspace-card__footer">
|
|
34
|
+
<view className="tech-pill">
|
|
35
|
+
<text className="tech-pill__text">LYNX</text>
|
|
36
|
+
</view>
|
|
37
|
+
<view className="tech-pill tech-pill--accent">
|
|
38
|
+
<text className="tech-pill__text tech-pill__text--accent">JILATAX</text>
|
|
39
|
+
</view>
|
|
40
|
+
</view>
|
|
41
|
+
</view>
|
|
42
|
+
</view>
|
|
43
|
+
</scroll-view>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: JilataX;
|
|
3
|
+
src: url('../../public/fonts/JilataX.otf');
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
:root {
|
|
7
|
+
background-color: #f3f7f5;
|
|
8
|
+
color: #10241d;
|
|
9
|
+
font-family: system-ui, sans-serif;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.app-shell {
|
|
13
|
+
background-color: #f3f7f5;
|
|
14
|
+
height: 100vh;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
position: relative;
|
|
17
|
+
width: 100%;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.screen {
|
|
21
|
+
height: 100%;
|
|
22
|
+
width: 100%;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.screen__content {
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
padding: 48px 22px 124px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.brand {
|
|
32
|
+
align-items: center;
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: row;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.brand--compact {
|
|
38
|
+
margin-bottom: 38px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.brand__icon-wrap {
|
|
42
|
+
align-items: center;
|
|
43
|
+
background-color: #e3eee9;
|
|
44
|
+
border-radius: 15px;
|
|
45
|
+
display: flex;
|
|
46
|
+
height: 48px;
|
|
47
|
+
justify-content: center;
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
width: 48px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.brand__icon {
|
|
53
|
+
height: 82%;
|
|
54
|
+
width: 82%;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.brand__copy {
|
|
58
|
+
display: flex;
|
|
59
|
+
flex-direction: column;
|
|
60
|
+
margin-left: 13px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.brand__name {
|
|
64
|
+
color: #10241d;
|
|
65
|
+
font-size: 18px;
|
|
66
|
+
font-weight: 800;
|
|
67
|
+
letter-spacing: 2px;
|
|
68
|
+
line-height: 22px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.brand__caption {
|
|
72
|
+
color: #688078;
|
|
73
|
+
font-family: JilataX;
|
|
74
|
+
font-size: 9px;
|
|
75
|
+
letter-spacing: 1.5px;
|
|
76
|
+
line-height: 14px;
|
|
77
|
+
margin-top: 2px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.hero {
|
|
81
|
+
display: flex;
|
|
82
|
+
flex-direction: column;
|
|
83
|
+
margin-top: 50px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.eyebrow {
|
|
87
|
+
align-items: center;
|
|
88
|
+
display: flex;
|
|
89
|
+
flex-direction: row;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.eyebrow__dot {
|
|
93
|
+
background-color: #0abf78;
|
|
94
|
+
border-radius: 999px;
|
|
95
|
+
height: 7px;
|
|
96
|
+
margin-right: 8px;
|
|
97
|
+
width: 7px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.eyebrow__text,
|
|
101
|
+
.about-heading__label {
|
|
102
|
+
color: #008f5a;
|
|
103
|
+
font-size: 11px;
|
|
104
|
+
font-weight: 800;
|
|
105
|
+
letter-spacing: 1.8px;
|
|
106
|
+
line-height: 16px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.hero__title,
|
|
110
|
+
.about-heading__title {
|
|
111
|
+
color: #10241d;
|
|
112
|
+
font-size: 42px;
|
|
113
|
+
font-weight: 800;
|
|
114
|
+
letter-spacing: -1.5px;
|
|
115
|
+
line-height: 46px;
|
|
116
|
+
margin-top: 14px;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.hero__description,
|
|
120
|
+
.about-heading__description {
|
|
121
|
+
color: #5c726a;
|
|
122
|
+
font-size: 16px;
|
|
123
|
+
line-height: 24px;
|
|
124
|
+
margin-top: 16px;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.workspace-card {
|
|
128
|
+
background-color: #10241d;
|
|
129
|
+
border-radius: 26px;
|
|
130
|
+
display: flex;
|
|
131
|
+
flex-direction: column;
|
|
132
|
+
margin-top: 38px;
|
|
133
|
+
overflow: hidden;
|
|
134
|
+
padding: 24px;
|
|
135
|
+
position: relative;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.workspace-card__glow {
|
|
139
|
+
background: linear-gradient(135deg, #c7ff36, #00b879);
|
|
140
|
+
border-radius: 999px;
|
|
141
|
+
height: 150px;
|
|
142
|
+
opacity: 0.14;
|
|
143
|
+
position: absolute;
|
|
144
|
+
right: -64px;
|
|
145
|
+
top: -76px;
|
|
146
|
+
width: 150px;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.workspace-card__top {
|
|
150
|
+
align-items: center;
|
|
151
|
+
display: flex;
|
|
152
|
+
flex-direction: row;
|
|
153
|
+
justify-content: space-between;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.workspace-card__label {
|
|
157
|
+
color: #a8bbb4;
|
|
158
|
+
font-size: 10px;
|
|
159
|
+
font-weight: 800;
|
|
160
|
+
letter-spacing: 1.6px;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.workspace-card__status {
|
|
164
|
+
align-items: center;
|
|
165
|
+
background-color: #1b382e;
|
|
166
|
+
border-radius: 999px;
|
|
167
|
+
display: flex;
|
|
168
|
+
flex-direction: row;
|
|
169
|
+
padding: 6px 10px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.workspace-card__status-dot {
|
|
173
|
+
background-color: #b7ff33;
|
|
174
|
+
border-radius: 999px;
|
|
175
|
+
height: 6px;
|
|
176
|
+
margin-right: 6px;
|
|
177
|
+
width: 6px;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.workspace-card__status-text {
|
|
181
|
+
color: #d9ff9c;
|
|
182
|
+
font-size: 9px;
|
|
183
|
+
font-weight: 800;
|
|
184
|
+
letter-spacing: 1px;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.workspace-card__title {
|
|
188
|
+
color: #f5fff9;
|
|
189
|
+
font-size: 24px;
|
|
190
|
+
font-weight: 750;
|
|
191
|
+
line-height: 30px;
|
|
192
|
+
margin-top: 28px;
|
|
193
|
+
max-width: 250px;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.workspace-card__description {
|
|
197
|
+
color: #a8bbb4;
|
|
198
|
+
font-size: 14px;
|
|
199
|
+
line-height: 21px;
|
|
200
|
+
margin-top: 10px;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.workspace-card__footer {
|
|
204
|
+
display: flex;
|
|
205
|
+
flex-direction: row;
|
|
206
|
+
margin-top: 24px;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.tech-pill {
|
|
210
|
+
border-color: #395248;
|
|
211
|
+
border-radius: 999px;
|
|
212
|
+
border-style: solid;
|
|
213
|
+
border-width: 1px;
|
|
214
|
+
padding: 7px 11px;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.tech-pill--accent {
|
|
218
|
+
border-color: #377b5f;
|
|
219
|
+
margin-left: 8px;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.tech-pill__text {
|
|
223
|
+
color: #9eb1aa;
|
|
224
|
+
font-size: 9px;
|
|
225
|
+
font-weight: 800;
|
|
226
|
+
letter-spacing: 1.1px;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.tech-pill__text--accent {
|
|
230
|
+
color: #8ee3b7;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.about-heading {
|
|
234
|
+
display: flex;
|
|
235
|
+
flex-direction: column;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.principles {
|
|
239
|
+
display: flex;
|
|
240
|
+
flex-direction: column;
|
|
241
|
+
margin-top: 34px;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.principle {
|
|
245
|
+
align-items: flex-start;
|
|
246
|
+
background-color: #ffffff;
|
|
247
|
+
border-color: #dfe9e5;
|
|
248
|
+
border-radius: 20px;
|
|
249
|
+
border-style: solid;
|
|
250
|
+
border-width: 1px;
|
|
251
|
+
display: flex;
|
|
252
|
+
flex-direction: row;
|
|
253
|
+
margin-bottom: 12px;
|
|
254
|
+
padding: 18px;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.principle__number {
|
|
258
|
+
color: #00a969;
|
|
259
|
+
font-size: 11px;
|
|
260
|
+
font-weight: 800;
|
|
261
|
+
letter-spacing: 1px;
|
|
262
|
+
line-height: 18px;
|
|
263
|
+
width: 36px;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.principle__copy {
|
|
267
|
+
display: flex;
|
|
268
|
+
flex: 1;
|
|
269
|
+
flex-direction: column;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.principle__title {
|
|
273
|
+
color: #10241d;
|
|
274
|
+
font-size: 15px;
|
|
275
|
+
font-weight: 750;
|
|
276
|
+
line-height: 20px;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.principle__detail {
|
|
280
|
+
color: #647970;
|
|
281
|
+
font-size: 13px;
|
|
282
|
+
line-height: 19px;
|
|
283
|
+
margin-top: 4px;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.bottom-bar-wrap {
|
|
287
|
+
bottom: 22px;
|
|
288
|
+
left: 0;
|
|
289
|
+
padding: 0 22px;
|
|
290
|
+
position: absolute;
|
|
291
|
+
width: 100%;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.bottom-bar {
|
|
295
|
+
background-color: #ffffff;
|
|
296
|
+
border-color: #dfe9e5;
|
|
297
|
+
border-radius: 22px;
|
|
298
|
+
border-style: solid;
|
|
299
|
+
border-width: 1px;
|
|
300
|
+
display: flex;
|
|
301
|
+
flex-direction: row;
|
|
302
|
+
padding: 7px;
|
|
303
|
+
width: 100%;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.bottom-bar__button {
|
|
307
|
+
align-items: center;
|
|
308
|
+
border-radius: 16px;
|
|
309
|
+
display: flex;
|
|
310
|
+
flex: 1;
|
|
311
|
+
flex-direction: row;
|
|
312
|
+
height: 54px;
|
|
313
|
+
justify-content: center;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.bottom-bar__button--active {
|
|
317
|
+
background-color: #e8f7ef;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.bottom-bar__mark {
|
|
321
|
+
border-color: #879990;
|
|
322
|
+
border-radius: 999px;
|
|
323
|
+
border-style: solid;
|
|
324
|
+
border-width: 2px;
|
|
325
|
+
height: 10px;
|
|
326
|
+
margin-right: 8px;
|
|
327
|
+
width: 10px;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.bottom-bar__mark--active {
|
|
331
|
+
background-color: #00aa6b;
|
|
332
|
+
border-color: #00aa6b;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.bottom-bar__label {
|
|
336
|
+
color: #72847c;
|
|
337
|
+
font-size: 13px;
|
|
338
|
+
font-weight: 650;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.bottom-bar__label--active {
|
|
342
|
+
color: #08774f;
|
|
343
|
+
font-weight: 800;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
@media (prefers-color-scheme: dark) {
|
|
347
|
+
:root,
|
|
348
|
+
.app-shell {
|
|
349
|
+
background-color: #071510;
|
|
350
|
+
color: #f3fff8;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.brand__icon-wrap {
|
|
354
|
+
background-color: #102b21;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.brand__name,
|
|
358
|
+
.hero__title,
|
|
359
|
+
.about-heading__title,
|
|
360
|
+
.principle__title {
|
|
361
|
+
color: #f3fff8;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.brand__caption,
|
|
365
|
+
.hero__description,
|
|
366
|
+
.about-heading__description,
|
|
367
|
+
.principle__detail {
|
|
368
|
+
color: #8ca198;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.eyebrow__text,
|
|
372
|
+
.about-heading__label {
|
|
373
|
+
color: #5ce7a6;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.workspace-card {
|
|
377
|
+
background-color: #0e251c;
|
|
378
|
+
border-color: #1a392d;
|
|
379
|
+
border-style: solid;
|
|
380
|
+
border-width: 1px;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.principle,
|
|
384
|
+
.bottom-bar {
|
|
385
|
+
background-color: #0d2119;
|
|
386
|
+
border-color: #1b382d;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.bottom-bar__button--active {
|
|
390
|
+
background-color: #15392b;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.bottom-bar__label {
|
|
394
|
+
color: #82978e;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
.bottom-bar__label--active {
|
|
398
|
+
color: #79efb5;
|
|
399
|
+
}
|
|
400
|
+
}
|
package/template/src/App.css
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
background-color: #0f172a;
|
|
3
|
-
color: #f8fafc;
|
|
4
|
-
font-family: system-ui, sans-serif;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
.page {
|
|
8
|
-
align-items: center;
|
|
9
|
-
background-color: #0f172a;
|
|
10
|
-
display: flex;
|
|
11
|
-
height: 100vh;
|
|
12
|
-
justify-content: center;
|
|
13
|
-
overflow: hidden;
|
|
14
|
-
padding: 24px;
|
|
15
|
-
position: relative;
|
|
16
|
-
width: 100%;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.orb {
|
|
20
|
-
border-radius: 999px;
|
|
21
|
-
opacity: 0.34;
|
|
22
|
-
position: absolute;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
.orb--top {
|
|
26
|
-
background-color: #38bdf8;
|
|
27
|
-
height: 240px;
|
|
28
|
-
right: -100px;
|
|
29
|
-
top: -110px;
|
|
30
|
-
width: 240px;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.orb--bottom {
|
|
34
|
-
background-color: #8b5cf6;
|
|
35
|
-
bottom: -130px;
|
|
36
|
-
height: 280px;
|
|
37
|
-
left: -120px;
|
|
38
|
-
width: 280px;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.card {
|
|
42
|
-
background-color: #1e293b;
|
|
43
|
-
border-color: #334155;
|
|
44
|
-
border-radius: 24px;
|
|
45
|
-
border-style: solid;
|
|
46
|
-
border-width: 1px;
|
|
47
|
-
display: flex;
|
|
48
|
-
flex-direction: column;
|
|
49
|
-
padding: 30px 26px;
|
|
50
|
-
position: relative;
|
|
51
|
-
width: 100%;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
.label {
|
|
55
|
-
color: #38bdf8;
|
|
56
|
-
font-size: 13px;
|
|
57
|
-
font-weight: 700;
|
|
58
|
-
letter-spacing: 2px;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.title {
|
|
62
|
-
color: #f8fafc;
|
|
63
|
-
font-size: 32px;
|
|
64
|
-
font-weight: 800;
|
|
65
|
-
line-height: 40px;
|
|
66
|
-
margin-top: 14px;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
.description {
|
|
70
|
-
color: #cbd5e1;
|
|
71
|
-
font-size: 16px;
|
|
72
|
-
line-height: 24px;
|
|
73
|
-
margin-top: 14px;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.status {
|
|
77
|
-
align-items: center;
|
|
78
|
-
display: flex;
|
|
79
|
-
flex-direction: row;
|
|
80
|
-
margin-top: 24px;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.status__dot {
|
|
84
|
-
background-color: #22c55e;
|
|
85
|
-
border-radius: 999px;
|
|
86
|
-
height: 10px;
|
|
87
|
-
margin-right: 10px;
|
|
88
|
-
width: 10px;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
.status__text {
|
|
92
|
-
color: #e2e8f0;
|
|
93
|
-
font-size: 14px;
|
|
94
|
-
font-weight: 600;
|
|
95
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import './App.css';
|
|
2
|
-
|
|
3
|
-
const applicationName = {{displayNameJson}};
|
|
4
|
-
|
|
5
|
-
export function App() {
|
|
6
|
-
return (
|
|
7
|
-
<view className="page">
|
|
8
|
-
<view className="orb orb--top" />
|
|
9
|
-
<view className="orb orb--bottom" />
|
|
10
|
-
<view className="card">
|
|
11
|
-
<text className="label">JILATAX · ANDROID</text>
|
|
12
|
-
<text className="title">{applicationName}</text>
|
|
13
|
-
<text className="description">
|
|
14
|
-
Your Lynx app is ready. Edit src/App.tsx and save to see changes.
|
|
15
|
-
</text>
|
|
16
|
-
<view className="status">
|
|
17
|
-
<view className="status__dot" />
|
|
18
|
-
<text className="status__text">Rspeedy development ready</text>
|
|
19
|
-
</view>
|
|
20
|
-
</view>
|
|
21
|
-
</view>
|
|
22
|
-
);
|
|
23
|
-
}
|
|
File without changes
|
|
File without changes
|