gea-lib 1.0.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 +100 -0
- package/bin/index.js +214 -0
- package/package.json +38 -0
- package/templates/js/README.md +39 -0
- package/templates/js/_gitignore +42 -0
- package/templates/js/package.json +32 -0
- package/templates/js/playground/app.jsx +80 -0
- package/templates/js/playground/index.html +15 -0
- package/templates/js/playground/main.js +5 -0
- package/templates/js/playground/style.css +49 -0
- package/templates/js/src/components/Button.css +74 -0
- package/templates/js/src/components/Button.jsx +20 -0
- package/templates/js/src/components/Card.css +44 -0
- package/templates/js/src/components/Card.jsx +27 -0
- package/templates/js/src/index.js +3 -0
- package/templates/js/src/stores/counter.js +21 -0
- package/templates/js/vite.config.js +23 -0
- package/templates/ts/README.md +40 -0
- package/templates/ts/_gitignore +42 -0
- package/templates/ts/package.json +35 -0
- package/templates/ts/playground/app.tsx +80 -0
- package/templates/ts/playground/index.html +15 -0
- package/templates/ts/playground/main.ts +5 -0
- package/templates/ts/playground/style.css +49 -0
- package/templates/ts/src/components/Button.css +74 -0
- package/templates/ts/src/components/Button.tsx +26 -0
- package/templates/ts/src/components/Card.css +44 -0
- package/templates/ts/src/components/Card.tsx +32 -0
- package/templates/ts/src/index.ts +3 -0
- package/templates/ts/src/stores/counter.ts +21 -0
- package/templates/ts/tsconfig.build.json +10 -0
- package/templates/ts/tsconfig.json +21 -0
- package/templates/ts/vite.config.ts +23 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Component } from '@geajs/core';
|
|
2
|
+
import './Button.css';
|
|
3
|
+
|
|
4
|
+
export default class Button extends Component {
|
|
5
|
+
template() {
|
|
6
|
+
const variant = this.props?.variant || 'primary';
|
|
7
|
+
const disabled = this.props?.disabled || false;
|
|
8
|
+
const click = this.props?.click;
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<button
|
|
12
|
+
class={`gea-btn gea-btn-${variant}`}
|
|
13
|
+
disabled={disabled}
|
|
14
|
+
click={click}
|
|
15
|
+
>
|
|
16
|
+
{this.props?.children}
|
|
17
|
+
</button>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
.gea-card {
|
|
2
|
+
background: rgba(255, 255, 255, 0.03);
|
|
3
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
4
|
+
border-radius: 24px;
|
|
5
|
+
padding: 2rem;
|
|
6
|
+
backdrop-filter: blur(16px);
|
|
7
|
+
-webkit-backdrop-filter: blur(16px);
|
|
8
|
+
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.3);
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: 1.5rem;
|
|
12
|
+
transition: border-color 0.3s ease, box-shadow 0.3s ease;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.gea-card:hover {
|
|
16
|
+
border-color: rgba(124, 58, 237, 0.2);
|
|
17
|
+
box-shadow: 0 8px 32px 0 rgba(124, 58, 237, 0.08);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.gea-card-header {
|
|
21
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
|
22
|
+
padding-bottom: 1rem;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.gea-card-title {
|
|
26
|
+
font-size: 1.5rem;
|
|
27
|
+
font-weight: 800;
|
|
28
|
+
background: linear-gradient(135deg, #ffffff 0%, #a78bfa 100%);
|
|
29
|
+
-webkit-background-clip: text;
|
|
30
|
+
-webkit-text-fill-color: transparent;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.gea-card-body {
|
|
34
|
+
color: var(--text-secondary, #9ca3af);
|
|
35
|
+
line-height: 1.6;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.gea-card-footer {
|
|
39
|
+
border-top: 1px solid rgba(255, 255, 255, 0.05);
|
|
40
|
+
padding-top: 1rem;
|
|
41
|
+
display: flex;
|
|
42
|
+
justify-content: flex-end;
|
|
43
|
+
gap: 1rem;
|
|
44
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Component } from '@geajs/core';
|
|
2
|
+
import './Card.css';
|
|
3
|
+
|
|
4
|
+
export default class Card extends Component {
|
|
5
|
+
template() {
|
|
6
|
+
const title = this.props?.title;
|
|
7
|
+
const footer = this.props?.footer;
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div class="gea-card">
|
|
11
|
+
{title && (
|
|
12
|
+
<div class="gea-card-header">
|
|
13
|
+
<h3 class="gea-card-title">{title}</h3>
|
|
14
|
+
</div>
|
|
15
|
+
)}
|
|
16
|
+
<div class="gea-card-body">
|
|
17
|
+
{this.props?.children}
|
|
18
|
+
</div>
|
|
19
|
+
{footer && (
|
|
20
|
+
<div class="gea-card-footer">
|
|
21
|
+
{footer}
|
|
22
|
+
</div>
|
|
23
|
+
)}
|
|
24
|
+
</div>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Store } from '@geajs/core';
|
|
2
|
+
|
|
3
|
+
class CounterStore extends Store {
|
|
4
|
+
count = 0;
|
|
5
|
+
|
|
6
|
+
increment() {
|
|
7
|
+
this.count++;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
decrement() {
|
|
11
|
+
if (this.count > 0) {
|
|
12
|
+
this.count--;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
reset() {
|
|
17
|
+
this.count = 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default new CounterStore();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import { geaPlugin } from '@geajs/vite-plugin';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [geaPlugin()],
|
|
7
|
+
build: {
|
|
8
|
+
lib: {
|
|
9
|
+
entry: resolve(__dirname, 'src/index.js'),
|
|
10
|
+
name: '<% libraryName %>',
|
|
11
|
+
fileName: 'index',
|
|
12
|
+
formats: ['es']
|
|
13
|
+
},
|
|
14
|
+
rollupOptions: {
|
|
15
|
+
external: ['@geajs/core'],
|
|
16
|
+
output: {
|
|
17
|
+
globals: {
|
|
18
|
+
'@geajs/core': 'Gea'
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# <% projectName %>
|
|
2
|
+
|
|
3
|
+
A modern, high-performance, and reactive component library for **GeaJS**.
|
|
4
|
+
|
|
5
|
+
Built with compiler-first reactivity, proxy-based state management, and modern glassmorphic designs.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- ⚡ **No Virtual DOM**: Built on GeaJS, compile-time JSX transformations for surgical DOM patching.
|
|
10
|
+
- 🎨 **Premium Styling**: Pre-configured responsive styles, micro-animations, and glassmorphic designs.
|
|
11
|
+
- 🛠️ **Playground Included**: An interactive visual sandbox to test and showcase your components in real-time.
|
|
12
|
+
- ⚙️ **TypeScript Ready**: Full type checking, autocompletions, and type declarations bundle.
|
|
13
|
+
|
|
14
|
+
## Development
|
|
15
|
+
|
|
16
|
+
To start the interactive playground:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install
|
|
20
|
+
npm run dev
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Production Build
|
|
24
|
+
|
|
25
|
+
To build your library for distribution:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run build
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The build process bundles your components into `dist/index.js` (ES Modules) and generates type declarations in `dist/index.d.ts`.
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
Register components in your main application:
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
import { Button, Card, counterStore } from '<% projectName %>';
|
|
39
|
+
import '<% projectName %>/style.css';
|
|
40
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Logs
|
|
2
|
+
logs
|
|
3
|
+
*.log
|
|
4
|
+
npm-debug.log*
|
|
5
|
+
yarn-debug.log*
|
|
6
|
+
yarn-error.log*
|
|
7
|
+
pnpm-debug.log*
|
|
8
|
+
lerna-debug.log*
|
|
9
|
+
|
|
10
|
+
# Dependency directories
|
|
11
|
+
node_modules/
|
|
12
|
+
jspm_packages/
|
|
13
|
+
|
|
14
|
+
# Compiler outputs
|
|
15
|
+
dist/
|
|
16
|
+
tmp/
|
|
17
|
+
out/
|
|
18
|
+
.docusaurus/
|
|
19
|
+
|
|
20
|
+
# IDEs and editors
|
|
21
|
+
.idea/
|
|
22
|
+
.vscode/
|
|
23
|
+
*.suo
|
|
24
|
+
*.ntvs*
|
|
25
|
+
*.njsproj
|
|
26
|
+
*.sln
|
|
27
|
+
*.sw?
|
|
28
|
+
|
|
29
|
+
# OS files
|
|
30
|
+
.DS_Store
|
|
31
|
+
Thumbs.db
|
|
32
|
+
|
|
33
|
+
# Test coverage
|
|
34
|
+
coverage/
|
|
35
|
+
.nyc_output/
|
|
36
|
+
|
|
37
|
+
# Build environment
|
|
38
|
+
.env
|
|
39
|
+
.env.local
|
|
40
|
+
.env.development.local
|
|
41
|
+
.env.test.local
|
|
42
|
+
.env.production.local
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "<% projectName %>",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./style.css": "./dist/style.css"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"dev": "vite",
|
|
20
|
+
"build": "tsc -p tsconfig.build.json && vite build",
|
|
21
|
+
"preview": "vite preview",
|
|
22
|
+
"test": "vitest run"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@geajs/core": "^1.0.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@geajs/core": "^1.0.0",
|
|
29
|
+
"@geajs/vite-plugin": "^1.0.0",
|
|
30
|
+
"typescript": "^5.4.5",
|
|
31
|
+
"vite": "^8.0.0",
|
|
32
|
+
"vitest": "^2.0.0",
|
|
33
|
+
"jsdom": "^24.1.0"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Component } from '@geajs/core';
|
|
2
|
+
import { Button, Card, counterStore } from '../src';
|
|
3
|
+
|
|
4
|
+
export default class App extends Component {
|
|
5
|
+
template() {
|
|
6
|
+
return (
|
|
7
|
+
<div style="max-width: 800px; width: 100%; padding: 2rem;">
|
|
8
|
+
<div style="text-align: center; margin-bottom: 3rem;">
|
|
9
|
+
<h1 style="font-size: 3rem; font-weight: 800; background: linear-gradient(135deg, #a78bfa 0%, #ec4899 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 0.5rem; letter-spacing: -0.05em;">
|
|
10
|
+
GeaJS Library Playground
|
|
11
|
+
</h1>
|
|
12
|
+
<p style="color: var(--text-secondary); font-size: 1.1rem;">
|
|
13
|
+
Interactive sandbox demonstrating your reactive components
|
|
14
|
+
</p>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div style="display: grid; grid-template-columns: 1fr; gap: 2rem;">
|
|
18
|
+
|
|
19
|
+
{/* Reactive Counter Card */}
|
|
20
|
+
<Card
|
|
21
|
+
title="Reactive State Demo"
|
|
22
|
+
footer={
|
|
23
|
+
<Button variant="glass" click={() => counterStore.reset()}>
|
|
24
|
+
Reset Counter
|
|
25
|
+
</Button>
|
|
26
|
+
}
|
|
27
|
+
>
|
|
28
|
+
<p style="margin-bottom: 1.5rem;">
|
|
29
|
+
GeaJS utilizes deep proxies to surgically update the DOM. Click the buttons below to see the reactivity in action.
|
|
30
|
+
</p>
|
|
31
|
+
|
|
32
|
+
<div style="display: flex; align-items: center; justify-content: center; gap: 2rem; margin: 2rem 0; padding: 1.5rem; background: rgba(255,255,255,0.02); border-radius: 16px; border: 1px dashed rgba(255,255,255,0.08);">
|
|
33
|
+
<Button variant="secondary" click={() => counterStore.decrement()}>-</Button>
|
|
34
|
+
<span style="font-family: var(--font-mono); font-size: 3rem; font-weight: bold; min-width: 80px; text-align: center; color: #ffffff;">
|
|
35
|
+
{counterStore.count}
|
|
36
|
+
</span>
|
|
37
|
+
<Button variant="primary" click={() => counterStore.increment()}>+</Button>
|
|
38
|
+
</div>
|
|
39
|
+
</Card>
|
|
40
|
+
|
|
41
|
+
{/* Button Variant Showcase */}
|
|
42
|
+
<Card title="Button Variants">
|
|
43
|
+
<p style="margin-bottom: 1.5rem;">
|
|
44
|
+
Beautiful styled buttons with hover glows and tap micro-animations.
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
<div style="display: flex; flex-wrap: wrap; gap: 1rem; justify-content: center;">
|
|
48
|
+
<Button variant="primary" click={() => alert('Primary clicked!')}>
|
|
49
|
+
Primary Glow
|
|
50
|
+
</Button>
|
|
51
|
+
<Button variant="secondary" click={() => alert('Secondary clicked!')}>
|
|
52
|
+
Secondary Glow
|
|
53
|
+
</Button>
|
|
54
|
+
<Button variant="glass" click={() => alert('Glass clicked!')}>
|
|
55
|
+
Glassmorphic
|
|
56
|
+
</Button>
|
|
57
|
+
<Button variant="primary" disabled={true}>
|
|
58
|
+
Disabled
|
|
59
|
+
</Button>
|
|
60
|
+
</div>
|
|
61
|
+
</Card>
|
|
62
|
+
|
|
63
|
+
{/* Integration Guide */}
|
|
64
|
+
<Card title="How to Import">
|
|
65
|
+
<p style="margin-bottom: 1rem;">Import components directly into your GeaJS project:</p>
|
|
66
|
+
<pre style="background: rgba(0,0,0,0.3); padding: 1rem; border-radius: 12px; border: 1px solid rgba(255,255,255,0.05); font-family: var(--font-mono); font-size: 0.9rem; color: #a78bfa; overflow-x: auto; white-space: pre-wrap;">
|
|
67
|
+
{`import { Button, Card } from 'your-library-name';
|
|
68
|
+
|
|
69
|
+
// In template:
|
|
70
|
+
<Card title="My Card">
|
|
71
|
+
<Button click={() => doSomething()}>Click Me</Button>
|
|
72
|
+
</Card>`}
|
|
73
|
+
</pre>
|
|
74
|
+
</Card>
|
|
75
|
+
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title><% projectName %> - Component Library Playground</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;800&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="app"></div>
|
|
13
|
+
<script type="module" src="/playground/main.ts"></script>
|
|
14
|
+
</body>
|
|
15
|
+
</html>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--bg-color: #030014;
|
|
3
|
+
--panel-bg: rgba(255, 255, 255, 0.03);
|
|
4
|
+
--panel-border: rgba(255, 255, 255, 0.08);
|
|
5
|
+
--primary-color: #7c3aed;
|
|
6
|
+
--primary-glow: rgba(124, 58, 237, 0.3);
|
|
7
|
+
--secondary-color: #06b6d4;
|
|
8
|
+
--secondary-glow: rgba(6, 182, 212, 0.3);
|
|
9
|
+
--accent-color: #ec4899;
|
|
10
|
+
--text-primary: #f3f4f6;
|
|
11
|
+
--text-secondary: #9ca3af;
|
|
12
|
+
--font-sans: 'Outfit', sans-serif;
|
|
13
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
* {
|
|
17
|
+
box-sizing: border-box;
|
|
18
|
+
margin: 0;
|
|
19
|
+
padding: 0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
body {
|
|
23
|
+
background-color: var(--bg-color);
|
|
24
|
+
color: var(--text-primary);
|
|
25
|
+
font-family: var(--font-sans);
|
|
26
|
+
min-height: 100vh;
|
|
27
|
+
display: flex;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
align-items: center;
|
|
30
|
+
overflow-x: hidden;
|
|
31
|
+
background-image:
|
|
32
|
+
radial-gradient(circle at 10% 20%, rgba(124, 58, 237, 0.15) 0%, transparent 40%),
|
|
33
|
+
radial-gradient(circle at 90% 80%, rgba(6, 182, 212, 0.15) 0%, transparent 40%);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Scrollbar styles */
|
|
37
|
+
::-webkit-scrollbar {
|
|
38
|
+
width: 8px;
|
|
39
|
+
}
|
|
40
|
+
::-webkit-scrollbar-track {
|
|
41
|
+
background: var(--bg-color);
|
|
42
|
+
}
|
|
43
|
+
::-webkit-scrollbar-thumb {
|
|
44
|
+
background: var(--panel-border);
|
|
45
|
+
border-radius: 4px;
|
|
46
|
+
}
|
|
47
|
+
::-webkit-scrollbar-thumb:hover {
|
|
48
|
+
background: var(--primary-color);
|
|
49
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
.gea-btn {
|
|
2
|
+
font-family: var(--font-sans, 'Outfit', sans-serif);
|
|
3
|
+
font-weight: 600;
|
|
4
|
+
font-size: 0.95rem;
|
|
5
|
+
padding: 0.75rem 1.5rem;
|
|
6
|
+
border-radius: 12px;
|
|
7
|
+
border: 1px solid transparent;
|
|
8
|
+
cursor: pointer;
|
|
9
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
10
|
+
display: inline-flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
justify-content: center;
|
|
13
|
+
gap: 0.5rem;
|
|
14
|
+
position: relative;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
color: #ffffff;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.gea-btn::after {
|
|
20
|
+
content: '';
|
|
21
|
+
position: absolute;
|
|
22
|
+
inset: 0;
|
|
23
|
+
background: rgba(255, 255, 255, 0.1);
|
|
24
|
+
opacity: 0;
|
|
25
|
+
transition: opacity 0.2s ease;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.gea-btn:hover::after {
|
|
29
|
+
opacity: 1;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.gea-btn:active {
|
|
33
|
+
transform: scale(0.97);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.gea-btn:disabled {
|
|
37
|
+
opacity: 0.5;
|
|
38
|
+
cursor: not-allowed;
|
|
39
|
+
transform: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Variants */
|
|
43
|
+
.gea-btn-primary {
|
|
44
|
+
background: linear-gradient(135deg, var(--primary-color, #7c3aed) 0%, #6d28d9 100%);
|
|
45
|
+
box-shadow: 0 4px 15px var(--primary-glow, rgba(124, 58, 237, 0.3));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.gea-btn-primary:hover {
|
|
49
|
+
box-shadow: 0 6px 20px var(--primary-glow, rgba(124, 58, 237, 0.5));
|
|
50
|
+
transform: translateY(-1px);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.gea-btn-secondary {
|
|
54
|
+
background: linear-gradient(135deg, var(--secondary-color, #06b6d4) 0%, #0891b2 100%);
|
|
55
|
+
box-shadow: 0 4px 15px var(--secondary-glow, rgba(6, 182, 212, 0.3));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.gea-btn-secondary:hover {
|
|
59
|
+
box-shadow: 0 6px 20px var(--secondary-glow, rgba(6, 182, 212, 0.5));
|
|
60
|
+
transform: translateY(-1px);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.gea-btn-glass {
|
|
64
|
+
background: rgba(255, 255, 255, 0.05);
|
|
65
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
66
|
+
backdrop-filter: blur(10px);
|
|
67
|
+
-webkit-backdrop-filter: blur(10px);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.gea-btn-glass:hover {
|
|
71
|
+
background: rgba(255, 255, 255, 0.1);
|
|
72
|
+
border-color: rgba(255, 255, 255, 0.2);
|
|
73
|
+
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
|
|
74
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Component } from '@geajs/core';
|
|
2
|
+
import './Button.css';
|
|
3
|
+
|
|
4
|
+
export interface ButtonProps {
|
|
5
|
+
variant?: 'primary' | 'secondary' | 'glass';
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
click?: (e: MouseEvent) => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default class Button extends Component {
|
|
11
|
+
template() {
|
|
12
|
+
const variant = this.props?.variant || 'primary';
|
|
13
|
+
const disabled = this.props?.disabled || false;
|
|
14
|
+
const click = this.props?.click;
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<button
|
|
18
|
+
class={`gea-btn gea-btn-${variant}`}
|
|
19
|
+
disabled={disabled}
|
|
20
|
+
click={click}
|
|
21
|
+
>
|
|
22
|
+
{this.props?.children}
|
|
23
|
+
</button>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
.gea-card {
|
|
2
|
+
background: rgba(255, 255, 255, 0.03);
|
|
3
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
4
|
+
border-radius: 24px;
|
|
5
|
+
padding: 2rem;
|
|
6
|
+
backdrop-filter: blur(16px);
|
|
7
|
+
-webkit-backdrop-filter: blur(16px);
|
|
8
|
+
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.3);
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: 1.5rem;
|
|
12
|
+
transition: border-color 0.3s ease, box-shadow 0.3s ease;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.gea-card:hover {
|
|
16
|
+
border-color: rgba(124, 58, 237, 0.2);
|
|
17
|
+
box-shadow: 0 8px 32px 0 rgba(124, 58, 237, 0.08);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.gea-card-header {
|
|
21
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
|
22
|
+
padding-bottom: 1rem;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.gea-card-title {
|
|
26
|
+
font-size: 1.5rem;
|
|
27
|
+
font-weight: 800;
|
|
28
|
+
background: linear-gradient(135deg, #ffffff 0%, #a78bfa 100%);
|
|
29
|
+
-webkit-background-clip: text;
|
|
30
|
+
-webkit-text-fill-color: transparent;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.gea-card-body {
|
|
34
|
+
color: var(--text-secondary, #9ca3af);
|
|
35
|
+
line-height: 1.6;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.gea-card-footer {
|
|
39
|
+
border-top: 1px solid rgba(255, 255, 255, 0.05);
|
|
40
|
+
padding-top: 1rem;
|
|
41
|
+
display: flex;
|
|
42
|
+
justify-content: flex-end;
|
|
43
|
+
gap: 1rem;
|
|
44
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Component } from '@geajs/core';
|
|
2
|
+
import './Card.css';
|
|
3
|
+
|
|
4
|
+
export interface CardProps {
|
|
5
|
+
title?: string;
|
|
6
|
+
footer?: any;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default class Card extends Component {
|
|
10
|
+
template() {
|
|
11
|
+
const title = this.props?.title;
|
|
12
|
+
const footer = this.props?.footer;
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<div class="gea-card">
|
|
16
|
+
{title && (
|
|
17
|
+
<div class="gea-card-header">
|
|
18
|
+
<h3 class="gea-card-title">{title}</h3>
|
|
19
|
+
</div>
|
|
20
|
+
)}
|
|
21
|
+
<div class="gea-card-body">
|
|
22
|
+
{this.props?.children}
|
|
23
|
+
</div>
|
|
24
|
+
{footer && (
|
|
25
|
+
<div class="gea-card-footer">
|
|
26
|
+
{footer}
|
|
27
|
+
</div>
|
|
28
|
+
)}
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Store } from '@geajs/core';
|
|
2
|
+
|
|
3
|
+
class CounterStore extends Store {
|
|
4
|
+
count = 0;
|
|
5
|
+
|
|
6
|
+
increment() {
|
|
7
|
+
this.count++;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
decrement() {
|
|
11
|
+
if (this.count > 0) {
|
|
12
|
+
this.count--;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
reset() {
|
|
17
|
+
this.count = 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default new CounterStore();
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ESNext", "DOM", "DOM.Iterable"],
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"allowImportingTsExtensions": true,
|
|
9
|
+
"resolveJsonModule": true,
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"jsx": "react-jsx",
|
|
13
|
+
"jsxImportSource": "@geajs/core",
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"noImplicitReturns": true,
|
|
18
|
+
"skipLibCheck": true
|
|
19
|
+
},
|
|
20
|
+
"include": ["src", "playground"]
|
|
21
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import { geaPlugin } from '@geajs/vite-plugin';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [geaPlugin()],
|
|
7
|
+
build: {
|
|
8
|
+
lib: {
|
|
9
|
+
entry: resolve(__dirname, 'src/index.ts'),
|
|
10
|
+
name: '<% libraryName %>',
|
|
11
|
+
fileName: 'index',
|
|
12
|
+
formats: ['es']
|
|
13
|
+
},
|
|
14
|
+
rollupOptions: {
|
|
15
|
+
external: ['@geajs/core'],
|
|
16
|
+
output: {
|
|
17
|
+
globals: {
|
|
18
|
+
'@geajs/core': 'Gea'
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|