flexium 0.8.14
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 +219 -0
- package/dist/DrawText-CeXBL8Ev.d.ts +309 -0
- package/dist/DrawText-JB58mpQT.d.cts +309 -0
- package/dist/Motion-BrOAJzgH.d.cts +87 -0
- package/dist/Motion-BrOAJzgH.d.ts +87 -0
- package/dist/advanced.d.cts +30 -0
- package/dist/advanced.d.ts +30 -0
- package/dist/advanced.js +2 -0
- package/dist/advanced.js.map +1 -0
- package/dist/advanced.mjs +2 -0
- package/dist/advanced.mjs.map +1 -0
- package/dist/canvas.d.cts +22 -0
- package/dist/canvas.d.ts +22 -0
- package/dist/canvas.js +2 -0
- package/dist/canvas.js.map +1 -0
- package/dist/canvas.mjs +2 -0
- package/dist/canvas.mjs.map +1 -0
- package/dist/chunk-2MVKTSFR.mjs +3 -0
- package/dist/chunk-2MVKTSFR.mjs.map +1 -0
- package/dist/chunk-2U4DW375.mjs +2 -0
- package/dist/chunk-2U4DW375.mjs.map +1 -0
- package/dist/chunk-3P6DMEGB.js +2 -0
- package/dist/chunk-3P6DMEGB.js.map +1 -0
- package/dist/chunk-5S3ZQ2LB.mjs +3 -0
- package/dist/chunk-5S3ZQ2LB.mjs.map +1 -0
- package/dist/chunk-CNY6FPKJ.js +2 -0
- package/dist/chunk-CNY6FPKJ.js.map +1 -0
- package/dist/chunk-CZYIK6FD.mjs +2 -0
- package/dist/chunk-CZYIK6FD.mjs.map +1 -0
- package/dist/chunk-DOGIWSDA.js +2 -0
- package/dist/chunk-DOGIWSDA.js.map +1 -0
- package/dist/chunk-EX2GURH5.mjs +3 -0
- package/dist/chunk-EX2GURH5.mjs.map +1 -0
- package/dist/chunk-GDBJ322I.js +2 -0
- package/dist/chunk-GDBJ322I.js.map +1 -0
- package/dist/chunk-I7UCVARB.js +2 -0
- package/dist/chunk-I7UCVARB.js.map +1 -0
- package/dist/chunk-KNF5ERPK.mjs +2 -0
- package/dist/chunk-KNF5ERPK.mjs.map +1 -0
- package/dist/chunk-MLZTCKTH.mjs +2 -0
- package/dist/chunk-MLZTCKTH.mjs.map +1 -0
- package/dist/chunk-OPAQ4R4M.mjs +2 -0
- package/dist/chunk-OPAQ4R4M.mjs.map +1 -0
- package/dist/chunk-Q7IWDVJ4.js +2 -0
- package/dist/chunk-Q7IWDVJ4.js.map +1 -0
- package/dist/chunk-R5CS7UZG.mjs +2 -0
- package/dist/chunk-R5CS7UZG.mjs.map +1 -0
- package/dist/chunk-REETNY2Z.js +3 -0
- package/dist/chunk-REETNY2Z.js.map +1 -0
- package/dist/chunk-ROYFUJN5.js +3 -0
- package/dist/chunk-ROYFUJN5.js.map +1 -0
- package/dist/chunk-U6C6VDVZ.js +2 -0
- package/dist/chunk-U6C6VDVZ.js.map +1 -0
- package/dist/chunk-V4K6WOXN.js +3 -0
- package/dist/chunk-V4K6WOXN.js.map +1 -0
- package/dist/chunk-WQFQO5LK.js +2 -0
- package/dist/chunk-WQFQO5LK.js.map +1 -0
- package/dist/chunk-WVEJT7HD.mjs +2 -0
- package/dist/chunk-WVEJT7HD.mjs.map +1 -0
- package/dist/chunk-ZNPYN2TZ.mjs +2 -0
- package/dist/chunk-ZNPYN2TZ.mjs.map +1 -0
- package/dist/core.d.cts +24 -0
- package/dist/core.d.ts +24 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +2 -0
- package/dist/core.mjs.map +1 -0
- package/dist/dom.d.cts +36 -0
- package/dist/dom.d.ts +36 -0
- package/dist/dom.js +2 -0
- package/dist/dom.js.map +1 -0
- package/dist/dom.mjs +2 -0
- package/dist/dom.mjs.map +1 -0
- package/dist/index.d.cts +26 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/interactive.d.cts +161 -0
- package/dist/interactive.d.ts +161 -0
- package/dist/interactive.js +2 -0
- package/dist/interactive.js.map +1 -0
- package/dist/interactive.mjs +2 -0
- package/dist/interactive.mjs.map +1 -0
- package/dist/jsx-dev-runtime.d.cts +2 -0
- package/dist/jsx-dev-runtime.d.ts +2 -0
- package/dist/jsx-dev-runtime.js +2 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-dev-runtime.mjs +2 -0
- package/dist/jsx-dev-runtime.mjs.map +1 -0
- package/dist/jsx-runtime.d.cts +78 -0
- package/dist/jsx-runtime.d.ts +78 -0
- package/dist/jsx-runtime.js +2 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/jsx-runtime.mjs +2 -0
- package/dist/jsx-runtime.mjs.map +1 -0
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/portal-BpcIlK9y.d.cts +206 -0
- package/dist/portal-DBwz7gD0.d.ts +206 -0
- package/dist/primitives/layout.d.cts +295 -0
- package/dist/primitives/layout.d.ts +295 -0
- package/dist/primitives/layout.js +2 -0
- package/dist/primitives/layout.js.map +1 -0
- package/dist/primitives/layout.mjs +2 -0
- package/dist/primitives/layout.mjs.map +1 -0
- package/dist/primitives/motion.d.cts +230 -0
- package/dist/primitives/motion.d.ts +230 -0
- package/dist/primitives/motion.js +2 -0
- package/dist/primitives/motion.js.map +1 -0
- package/dist/primitives/motion.mjs +2 -0
- package/dist/primitives/motion.mjs.map +1 -0
- package/dist/primitives/ui.d.cts +81 -0
- package/dist/primitives/ui.d.ts +81 -0
- package/dist/primitives/ui.js +2 -0
- package/dist/primitives/ui.js.map +1 -0
- package/dist/primitives/ui.mjs +2 -0
- package/dist/primitives/ui.mjs.map +1 -0
- package/dist/primitives.d.cts +92 -0
- package/dist/primitives.d.ts +92 -0
- package/dist/primitives.js +2 -0
- package/dist/primitives.js.map +1 -0
- package/dist/primitives.mjs +2 -0
- package/dist/primitives.mjs.map +1 -0
- package/dist/renderer-DSLb-FGg.d.cts +135 -0
- package/dist/renderer-DSLb-FGg.d.ts +135 -0
- package/dist/router.d.cts +126 -0
- package/dist/router.d.ts +126 -0
- package/dist/router.js +2 -0
- package/dist/router.js.map +1 -0
- package/dist/router.mjs +2 -0
- package/dist/router.mjs.map +1 -0
- package/dist/server.d.cts +3 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +2 -0
- package/dist/server.mjs.map +1 -0
- package/dist/signal-PWBIM6JV.mjs +2 -0
- package/dist/signal-PWBIM6JV.mjs.map +1 -0
- package/dist/signal-XZXQ4VYQ.js +2 -0
- package/dist/signal-XZXQ4VYQ.js.map +1 -0
- package/dist/signal-mNtlF8-v.d.cts +158 -0
- package/dist/signal-mNtlF8-v.d.ts +158 -0
- package/dist/state-kK9sQh9s.d.cts +73 -0
- package/dist/state-kK9sQh9s.d.ts +73 -0
- package/dist/test-exports.d.cts +17 -0
- package/dist/test-exports.d.ts +17 -0
- package/dist/test-exports.js +2 -0
- package/dist/test-exports.js.map +1 -0
- package/dist/test-exports.mjs +2 -0
- package/dist/test-exports.mjs.map +1 -0
- package/package.json +173 -0
package/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Flexium
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/flexium)
|
|
4
|
+
[](https://www.npmjs.com/package/flexium)
|
|
5
|
+
[](https://github.com/Wick-Lim/flexium.js/blob/main/LICENSE)
|
|
6
|
+
|
|
7
|
+
**Simpler, Faster, Unified.**
|
|
8
|
+
|
|
9
|
+
Flexium is a next-generation UI framework that unifies state management, async data fetching, and global state into a single, powerful API: `state()`.
|
|
10
|
+
|
|
11
|
+
## Key Features
|
|
12
|
+
|
|
13
|
+
- **Unified State API** - No more `useState`, `useRecoil`, `useQuery` separation. Just `state()`.
|
|
14
|
+
- **No Virtual DOM** - Direct DOM updates for maximum performance and minimal memory usage.
|
|
15
|
+
- **Tiny Bundle** - ~8KB (min+gzip) including Router and Motion.
|
|
16
|
+
- **Cross-Platform** - DOM, Canvas, and SSR renderers included.
|
|
17
|
+
- **TypeScript First** - Full type inference out of the box.
|
|
18
|
+
- **Zero-Config JSX** - Works with standard tooling.
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install flexium
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Quick Start
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm create flexium@latest my-app
|
|
30
|
+
cd my-app
|
|
31
|
+
npm install
|
|
32
|
+
npm run dev
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## The Only API You Need: `state()`
|
|
36
|
+
|
|
37
|
+
Flexium unifies all state concepts into one function.
|
|
38
|
+
|
|
39
|
+
### Local State
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
import { state } from 'flexium/core';
|
|
43
|
+
import { render } from 'flexium/dom';
|
|
44
|
+
|
|
45
|
+
function Counter() {
|
|
46
|
+
const [count, setCount] = state(0);
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<button onclick={() => setCount(c => c + 1)}>
|
|
50
|
+
Count: {count}
|
|
51
|
+
</button>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
render(<Counter />, document.getElementById('app'));
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Global State
|
|
59
|
+
|
|
60
|
+
Just add a `key` to share state across components. Keys can be strings or arrays.
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
// Define global state with array key
|
|
64
|
+
const [theme, setTheme] = state('light', { key: ['app', 'theme'] });
|
|
65
|
+
|
|
66
|
+
function ThemeToggle() {
|
|
67
|
+
const [theme, setTheme] = state(undefined, { key: ['app', 'theme'] });
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<button onclick={() => setTheme(t => t === 'light' ? 'dark' : 'light')}>
|
|
71
|
+
Theme: {theme}
|
|
72
|
+
</button>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Async Resources
|
|
78
|
+
|
|
79
|
+
Pass an async function to handle data fetching automatically.
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
function UserProfile({ id }) {
|
|
83
|
+
const [user, refetch, isLoading, error] = state(async () => {
|
|
84
|
+
const res = await fetch(`/api/users/${id}`);
|
|
85
|
+
return res.json();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
if (isLoading) return <div>Loading...</div>;
|
|
89
|
+
if (error) return <div>Error!</div>;
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<div>
|
|
93
|
+
<h1>{user.name}</h1>
|
|
94
|
+
<button onclick={() => refetch()}>Reload</button>
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Derived State
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
const [count, setCount] = state(1);
|
|
104
|
+
const [double] = state(() => count * 2);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Array Keys & Params
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
// Array keys for dynamic caching (like TanStack Query)
|
|
111
|
+
const [user] = state(fetchUser, { key: ['user', userId] });
|
|
112
|
+
|
|
113
|
+
// Explicit params for better DX
|
|
114
|
+
const [data] = state(
|
|
115
|
+
async ({ userId, postId }) => fetchPost(userId, postId),
|
|
116
|
+
{
|
|
117
|
+
key: ['posts', userId, postId],
|
|
118
|
+
params: { userId, postId }
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Package Structure
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
flexium
|
|
127
|
+
├── /core # Core reactivity: state(), effect(), batch()
|
|
128
|
+
├── /dom # DOM renderer: render(), Portal
|
|
129
|
+
├── /canvas # Canvas renderer: Canvas, Rect, Circle, Text
|
|
130
|
+
├── /primitives # Cross-platform components: Row, Column, Stack
|
|
131
|
+
├── /router # SPA routing: Router, Route, Link
|
|
132
|
+
└── /server # SSR utilities
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Control Flow
|
|
136
|
+
|
|
137
|
+
Use native JavaScript for control flow - no special components needed:
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
// Conditional rendering
|
|
141
|
+
{isLoggedIn ? <Dashboard /> : <Login />}
|
|
142
|
+
|
|
143
|
+
// Short-circuit for simple conditions
|
|
144
|
+
{isAdmin && <AdminPanel />}
|
|
145
|
+
|
|
146
|
+
// List rendering with optimized reconciliation
|
|
147
|
+
{items.map(item => <Item key={item.id} data={item} />)}
|
|
148
|
+
|
|
149
|
+
// Pattern matching with ternary chains
|
|
150
|
+
{status === 'loading' ? <Loading /> :
|
|
151
|
+
status === 'error' ? <Error /> :
|
|
152
|
+
status === 'success' ? <Success /> :
|
|
153
|
+
<Default />}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Canvas Rendering
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import { Canvas, Rect, Circle, Text } from 'flexium/canvas';
|
|
160
|
+
|
|
161
|
+
function App() {
|
|
162
|
+
const [x, setX] = state(100);
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<Canvas width={400} height={300}>
|
|
166
|
+
<Rect x={0} y={0} width={400} height={300} fill="#1a1a2e" />
|
|
167
|
+
<Circle x={x} y={150} radius={30} fill="#e94560" />
|
|
168
|
+
<Text x={200} y={50} text="Hello Canvas!" fill="white" />
|
|
169
|
+
</Canvas>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Cross-Platform Primitives
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
import { Row, Column, Text, Pressable } from 'flexium/primitives';
|
|
178
|
+
|
|
179
|
+
function App() {
|
|
180
|
+
return (
|
|
181
|
+
<Column gap={16} padding={20}>
|
|
182
|
+
<Text size="xl" weight="bold">Welcome</Text>
|
|
183
|
+
<Row gap={8}>
|
|
184
|
+
<Pressable onPress={() => console.log('clicked')}>
|
|
185
|
+
<Text>Click me</Text>
|
|
186
|
+
</Pressable>
|
|
187
|
+
</Row>
|
|
188
|
+
</Column>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Routing
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
import { Router, Route, Link } from 'flexium/router';
|
|
197
|
+
|
|
198
|
+
function App() {
|
|
199
|
+
return (
|
|
200
|
+
<Router>
|
|
201
|
+
<nav>
|
|
202
|
+
<Link href="/">Home</Link>
|
|
203
|
+
<Link href="/about">About</Link>
|
|
204
|
+
</nav>
|
|
205
|
+
<Route path="/" component={Home} />
|
|
206
|
+
<Route path="/about" component={About} />
|
|
207
|
+
<Route path="/users/:id" component={UserProfile} />
|
|
208
|
+
</Router>
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Documentation
|
|
214
|
+
|
|
215
|
+
Full documentation available at [https://flexium.junhyuk.im](https://flexium.junhyuk.im)
|
|
216
|
+
|
|
217
|
+
## License
|
|
218
|
+
|
|
219
|
+
MIT
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { S as Signal } from './signal-mNtlF8-v.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Core Flexium types
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Flexium Node - internal representation of UI elements
|
|
8
|
+
*/
|
|
9
|
+
interface FNode {
|
|
10
|
+
type: string;
|
|
11
|
+
props: Record<string, any>;
|
|
12
|
+
children: FNode[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Cross-platform Primitives Type Definitions
|
|
17
|
+
*
|
|
18
|
+
* These types work across web (DOM) and React Native
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Common style properties that work on both web and React Native
|
|
23
|
+
* Based on Flexbox layout model
|
|
24
|
+
*/
|
|
25
|
+
interface CommonStyle {
|
|
26
|
+
display?: 'flex' | 'none';
|
|
27
|
+
flex?: number;
|
|
28
|
+
flexDirection?: 'row' | 'column' | 'row-reverse' | 'column-reverse';
|
|
29
|
+
flexWrap?: 'nowrap' | 'wrap' | 'wrap-reverse';
|
|
30
|
+
justifyContent?: 'flex-start' | 'center' | 'flex-end' | 'space-between' | 'space-around' | 'space-evenly';
|
|
31
|
+
alignItems?: 'flex-start' | 'center' | 'flex-end' | 'stretch' | 'baseline';
|
|
32
|
+
alignSelf?: 'auto' | 'flex-start' | 'center' | 'flex-end' | 'stretch';
|
|
33
|
+
gap?: number;
|
|
34
|
+
padding?: number;
|
|
35
|
+
paddingTop?: number;
|
|
36
|
+
paddingRight?: number;
|
|
37
|
+
paddingBottom?: number;
|
|
38
|
+
paddingLeft?: number;
|
|
39
|
+
paddingHorizontal?: number;
|
|
40
|
+
paddingVertical?: number;
|
|
41
|
+
margin?: number;
|
|
42
|
+
marginTop?: number;
|
|
43
|
+
marginRight?: number;
|
|
44
|
+
marginBottom?: number;
|
|
45
|
+
marginLeft?: number;
|
|
46
|
+
marginHorizontal?: number;
|
|
47
|
+
marginVertical?: number;
|
|
48
|
+
width?: number | string;
|
|
49
|
+
height?: number | string;
|
|
50
|
+
minWidth?: number;
|
|
51
|
+
maxWidth?: number;
|
|
52
|
+
minHeight?: number;
|
|
53
|
+
maxHeight?: number;
|
|
54
|
+
backgroundColor?: string;
|
|
55
|
+
borderRadius?: number;
|
|
56
|
+
borderTopLeftRadius?: number;
|
|
57
|
+
borderTopRightRadius?: number;
|
|
58
|
+
borderBottomLeftRadius?: number;
|
|
59
|
+
borderBottomRightRadius?: number;
|
|
60
|
+
opacity?: number;
|
|
61
|
+
borderWidth?: number;
|
|
62
|
+
borderColor?: string;
|
|
63
|
+
borderTopWidth?: number;
|
|
64
|
+
borderRightWidth?: number;
|
|
65
|
+
borderBottomWidth?: number;
|
|
66
|
+
borderLeftWidth?: number;
|
|
67
|
+
position?: 'relative' | 'absolute';
|
|
68
|
+
top?: number;
|
|
69
|
+
right?: number;
|
|
70
|
+
bottom?: number;
|
|
71
|
+
left?: number;
|
|
72
|
+
zIndex?: number;
|
|
73
|
+
transform?: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Text-specific style properties
|
|
77
|
+
*/
|
|
78
|
+
interface TextStyle extends CommonStyle {
|
|
79
|
+
color?: string;
|
|
80
|
+
fontSize?: number;
|
|
81
|
+
fontWeight?: 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;
|
|
82
|
+
fontFamily?: string;
|
|
83
|
+
fontStyle?: 'normal' | 'italic';
|
|
84
|
+
textAlign?: 'left' | 'center' | 'right' | 'justify';
|
|
85
|
+
textDecoration?: 'none' | 'underline' | 'line-through';
|
|
86
|
+
lineHeight?: number;
|
|
87
|
+
letterSpacing?: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Text component props
|
|
91
|
+
* Universal text display
|
|
92
|
+
*/
|
|
93
|
+
interface TextProps {
|
|
94
|
+
children?: any;
|
|
95
|
+
style?: TextStyle;
|
|
96
|
+
/** Press/click handler (unified API for web and mobile) */
|
|
97
|
+
onPress?: () => void;
|
|
98
|
+
/** CSS class name */
|
|
99
|
+
class?: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Image component props
|
|
103
|
+
*/
|
|
104
|
+
interface ImageProps {
|
|
105
|
+
src: string;
|
|
106
|
+
alt?: string;
|
|
107
|
+
width?: number;
|
|
108
|
+
height?: number;
|
|
109
|
+
style?: CommonStyle;
|
|
110
|
+
onLoad?: () => void;
|
|
111
|
+
onError?: () => void;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Pressable component props
|
|
115
|
+
* Universal touchable/clickable element
|
|
116
|
+
*/
|
|
117
|
+
interface PressableProps {
|
|
118
|
+
children?: any;
|
|
119
|
+
onPress: () => void;
|
|
120
|
+
onPressIn?: () => void;
|
|
121
|
+
onPressOut?: () => void;
|
|
122
|
+
disabled?: boolean;
|
|
123
|
+
style?: CommonStyle;
|
|
124
|
+
activeOpacity?: number;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* ScrollView component props
|
|
128
|
+
*/
|
|
129
|
+
interface ScrollViewProps {
|
|
130
|
+
children?: any;
|
|
131
|
+
style?: CommonStyle;
|
|
132
|
+
horizontal?: boolean;
|
|
133
|
+
/** Show horizontal scrollbar (default: true) */
|
|
134
|
+
showScrollbarX?: boolean;
|
|
135
|
+
/** Show vertical scrollbar (default: true) */
|
|
136
|
+
showScrollbarY?: boolean;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Canvas container props
|
|
140
|
+
*/
|
|
141
|
+
interface CanvasProps {
|
|
142
|
+
width: number;
|
|
143
|
+
height: number;
|
|
144
|
+
children?: any;
|
|
145
|
+
style?: CommonStyle;
|
|
146
|
+
id?: string;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Rectangle drawing props
|
|
150
|
+
*/
|
|
151
|
+
interface DrawRectProps {
|
|
152
|
+
x: number | Signal<number>;
|
|
153
|
+
y: number | Signal<number>;
|
|
154
|
+
width: number | Signal<number>;
|
|
155
|
+
height: number | Signal<number>;
|
|
156
|
+
fill?: string | Signal<string>;
|
|
157
|
+
stroke?: string | Signal<string>;
|
|
158
|
+
strokeWidth?: number | Signal<number>;
|
|
159
|
+
opacity?: number | Signal<number>;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Circle drawing props
|
|
163
|
+
*/
|
|
164
|
+
interface DrawCircleProps {
|
|
165
|
+
x: number | Signal<number>;
|
|
166
|
+
y: number | Signal<number>;
|
|
167
|
+
radius: number | Signal<number>;
|
|
168
|
+
fill?: string | Signal<string>;
|
|
169
|
+
stroke?: string | Signal<string>;
|
|
170
|
+
strokeWidth?: number | Signal<number>;
|
|
171
|
+
opacity?: number | Signal<number>;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Path drawing props
|
|
175
|
+
*/
|
|
176
|
+
interface DrawPathProps {
|
|
177
|
+
d: string | Signal<string>;
|
|
178
|
+
fill?: string | Signal<string>;
|
|
179
|
+
stroke?: string | Signal<string>;
|
|
180
|
+
strokeWidth?: number | Signal<number>;
|
|
181
|
+
opacity?: number | Signal<number>;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Canvas text drawing props
|
|
185
|
+
*/
|
|
186
|
+
interface DrawTextProps {
|
|
187
|
+
x: number | Signal<number>;
|
|
188
|
+
y: number | Signal<number>;
|
|
189
|
+
text: string | Signal<string>;
|
|
190
|
+
fill?: string | Signal<string>;
|
|
191
|
+
fontSize?: number | Signal<number>;
|
|
192
|
+
fontFamily?: string;
|
|
193
|
+
fontWeight?: 'normal' | 'bold' | number;
|
|
194
|
+
textAlign?: 'left' | 'center' | 'right';
|
|
195
|
+
textBaseline?: 'top' | 'middle' | 'bottom' | 'alphabetic';
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Line drawing props
|
|
199
|
+
*/
|
|
200
|
+
interface DrawLineProps {
|
|
201
|
+
x1: number | Signal<number>;
|
|
202
|
+
y1: number | Signal<number>;
|
|
203
|
+
x2: number | Signal<number>;
|
|
204
|
+
y2: number | Signal<number>;
|
|
205
|
+
stroke?: string | Signal<string>;
|
|
206
|
+
strokeWidth?: number | Signal<number>;
|
|
207
|
+
opacity?: number | Signal<number>;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Arc drawing props
|
|
211
|
+
*/
|
|
212
|
+
interface DrawArcProps {
|
|
213
|
+
x: number | Signal<number>;
|
|
214
|
+
y: number | Signal<number>;
|
|
215
|
+
radius: number | Signal<number>;
|
|
216
|
+
startAngle: number | Signal<number>;
|
|
217
|
+
endAngle: number | Signal<number>;
|
|
218
|
+
counterclockwise?: boolean;
|
|
219
|
+
fill?: string | Signal<string>;
|
|
220
|
+
stroke?: string | Signal<string>;
|
|
221
|
+
strokeWidth?: number | Signal<number>;
|
|
222
|
+
opacity?: number | Signal<number>;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Canvas - Declarative canvas container with JSX drawing
|
|
227
|
+
*
|
|
228
|
+
* Supports Signal-based reactive rendering
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```tsx
|
|
232
|
+
* const x = signal(50)
|
|
233
|
+
*
|
|
234
|
+
* <Canvas width={300} height={200}>
|
|
235
|
+
* <Rect x={x} y={50} width={100} height={50} fill="blue" />
|
|
236
|
+
* <Circle x={150} y={100} radius={30} fill="red" />
|
|
237
|
+
* </Canvas>
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
|
|
241
|
+
declare function Canvas(props: CanvasProps): FNode;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* DrawRect - Canvas rectangle primitive
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* ```tsx
|
|
248
|
+
* <DrawRect x={10} y={10} width={100} height={50} fill="blue" />
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
|
|
252
|
+
declare function DrawRect(props: DrawRectProps): FNode;
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* DrawCircle - Canvas circle primitive
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* ```tsx
|
|
259
|
+
* <DrawCircle x={100} y={100} radius={50} fill="red" />
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
|
|
263
|
+
declare function DrawCircle(props: DrawCircleProps): FNode;
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* DrawArc - Canvas arc primitive
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```tsx
|
|
270
|
+
* <DrawArc x={100} y={100} radius={50} startAngle={0} endAngle={Math.PI} fill="green" />
|
|
271
|
+
* ```
|
|
272
|
+
*/
|
|
273
|
+
|
|
274
|
+
declare function DrawArc(props: DrawArcProps): FNode;
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* DrawLine - Canvas line primitive
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```tsx
|
|
281
|
+
* <DrawLine x1={10} y1={10} x2={100} y2={100} stroke="black" strokeWidth={2} />
|
|
282
|
+
* ```
|
|
283
|
+
*/
|
|
284
|
+
|
|
285
|
+
declare function DrawLine(props: DrawLineProps): FNode;
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* DrawPath - Canvas path primitive
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```tsx
|
|
292
|
+
* <DrawPath d="M 10 10 L 100 100" stroke="black" strokeWidth={2} />
|
|
293
|
+
* ```
|
|
294
|
+
*/
|
|
295
|
+
|
|
296
|
+
declare function DrawPath(props: DrawPathProps): FNode;
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* DrawText - Canvas text primitive
|
|
300
|
+
*
|
|
301
|
+
* @example
|
|
302
|
+
* ```tsx
|
|
303
|
+
* <DrawText x={50} y={50} text="Hello Canvas" fontSize={20} fill="black" />
|
|
304
|
+
* ```
|
|
305
|
+
*/
|
|
306
|
+
|
|
307
|
+
declare function DrawText(props: DrawTextProps): FNode;
|
|
308
|
+
|
|
309
|
+
export { Canvas as C, DrawRect as D, type FNode as F, type ImageProps as I, type PressableProps as P, type ScrollViewProps as S, type TextProps as T, DrawCircle as a, DrawArc as b, DrawLine as c, DrawPath as d, DrawText as e, type CanvasProps as f, type DrawRectProps as g, type DrawCircleProps as h, type DrawArcProps as i, type DrawLineProps as j, type DrawPathProps as k, type DrawTextProps as l, type CommonStyle as m, type TextStyle as n };
|