onejs-react 0.1.0 → 0.1.2
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 +265 -0
- package/package.json +3 -1
- package/src/__tests__/components.test.tsx +36 -0
- package/src/__tests__/host-config.test.ts +141 -99
- package/src/__tests__/mocks.ts +17 -1
- package/src/__tests__/setup.ts +23 -11
- package/src/components.tsx +77 -48
- package/src/error-boundary.tsx +175 -0
- package/src/host-config.ts +503 -162
- package/src/index.ts +46 -2
- package/src/renderer.ts +50 -23
- package/src/screen.tsx +1 -1
- package/src/style-parser.ts +171 -79
- package/src/types.ts +326 -8
- package/src/vector.ts +312 -0
package/src/types.ts
CHANGED
|
@@ -81,6 +81,15 @@ export interface ViewStyle {
|
|
|
81
81
|
// Background
|
|
82
82
|
/** Background color. Examples: "#3498db", "rgba(0,0,0,0.5)", "red" */
|
|
83
83
|
backgroundColor?: StyleColor;
|
|
84
|
+
/**
|
|
85
|
+
* Background image - accepts a Texture2D, RenderTexture, or RenderTexture object from GPU compute.
|
|
86
|
+
*
|
|
87
|
+
* For GPU compute RenderTextures, you can pass the RenderTexture object directly:
|
|
88
|
+
* @example
|
|
89
|
+
* const rt = compute.renderTexture({ width: 100, height: 100 })
|
|
90
|
+
* <View style={{ backgroundImage: rt }} />
|
|
91
|
+
*/
|
|
92
|
+
backgroundImage?: object | null;
|
|
84
93
|
|
|
85
94
|
// Border
|
|
86
95
|
/** Border color for all sides. Examples: "#ccc", "rgba(0,0,0,0.1)" */
|
|
@@ -115,7 +124,7 @@ export interface ViewStyle {
|
|
|
115
124
|
color?: StyleColor;
|
|
116
125
|
/** Font size in pixels. Examples: 16, "16px" */
|
|
117
126
|
fontSize?: StyleLength;
|
|
118
|
-
|
|
127
|
+
/** Text alignment. Note: Use USS class or stylesheet for -unity-font-style (italic/bold) */
|
|
119
128
|
unityTextAlign?: 'upper-left' | 'upper-center' | 'upper-right' | 'middle-left' | 'middle-center' | 'middle-right' | 'lower-left' | 'lower-center' | 'lower-right';
|
|
120
129
|
whiteSpace?: 'normal' | 'nowrap';
|
|
121
130
|
}
|
|
@@ -127,6 +136,23 @@ export interface PointerEventData {
|
|
|
127
136
|
y: number;
|
|
128
137
|
button: number;
|
|
129
138
|
pointerId: number;
|
|
139
|
+
modifiers?: number;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface MouseEventData {
|
|
143
|
+
type: string;
|
|
144
|
+
x: number;
|
|
145
|
+
y: number;
|
|
146
|
+
button: number;
|
|
147
|
+
modifiers?: number;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export interface WheelEventData {
|
|
151
|
+
type: string;
|
|
152
|
+
x: number;
|
|
153
|
+
y: number;
|
|
154
|
+
delta: { x: number; y: number };
|
|
155
|
+
modifiers?: number;
|
|
130
156
|
}
|
|
131
157
|
|
|
132
158
|
export interface KeyEventData {
|
|
@@ -145,10 +171,96 @@ export interface ChangeEventData<T = unknown> {
|
|
|
145
171
|
value: T;
|
|
146
172
|
}
|
|
147
173
|
|
|
174
|
+
export interface FocusEventData {
|
|
175
|
+
type: string;
|
|
176
|
+
relatedTarget?: unknown;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export interface DragEventData {
|
|
180
|
+
type: string;
|
|
181
|
+
x: number;
|
|
182
|
+
y: number;
|
|
183
|
+
// Drag-specific properties
|
|
184
|
+
getData?: (type: string) => unknown;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export interface GeometryEventData {
|
|
188
|
+
type: string;
|
|
189
|
+
oldRect: { x: number; y: number; width: number; height: number };
|
|
190
|
+
newRect: { x: number; y: number; width: number; height: number };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export interface NavigationEventData {
|
|
194
|
+
type: string;
|
|
195
|
+
direction?: string;
|
|
196
|
+
modifiers?: number;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export interface TransitionEventData {
|
|
200
|
+
type: string;
|
|
201
|
+
styleProperty: string;
|
|
202
|
+
elapsedTime: number;
|
|
203
|
+
}
|
|
204
|
+
|
|
148
205
|
export type PointerEventHandler = (event: PointerEventData) => void;
|
|
206
|
+
export type MouseEventHandler = (event: MouseEventData) => void;
|
|
207
|
+
export type WheelEventHandler = (event: WheelEventData) => void;
|
|
149
208
|
export type KeyEventHandler = (event: KeyEventData) => void;
|
|
150
209
|
export type ChangeEventHandler<T = unknown> = (event: ChangeEventData<T>) => void;
|
|
151
|
-
export type FocusEventHandler = () => void;
|
|
210
|
+
export type FocusEventHandler = (event?: FocusEventData) => void;
|
|
211
|
+
export type DragEventHandler = (event: DragEventData) => void;
|
|
212
|
+
export type GeometryEventHandler = (event: GeometryEventData) => void;
|
|
213
|
+
export type NavigationEventHandler = (event: NavigationEventData) => void;
|
|
214
|
+
export type TransitionEventHandler = (event: TransitionEventData) => void;
|
|
215
|
+
|
|
216
|
+
// Vector Drawing Types - Re-export from unity-types (CS.* namespace)
|
|
217
|
+
// These types are provided by the unity-types package and represent Unity's actual API
|
|
218
|
+
|
|
219
|
+
/** Unity Vector2 - 2D point/vector. Use CS.UnityEngine.Vector2 at runtime. */
|
|
220
|
+
export type Vector2 = CS.UnityEngine.Vector2;
|
|
221
|
+
|
|
222
|
+
/** Unity Color - RGBA color. Use CS.UnityEngine.Color at runtime. */
|
|
223
|
+
export type Color = CS.UnityEngine.Color;
|
|
224
|
+
|
|
225
|
+
/** Unity Angle - Represents an angle with unit. Use CS.UnityEngine.UIElements.Angle at runtime. */
|
|
226
|
+
export type Angle = CS.UnityEngine.UIElements.Angle;
|
|
227
|
+
|
|
228
|
+
/** Unity ArcDirection - Direction for arc drawing. Use CS.UnityEngine.UIElements.ArcDirection at runtime. */
|
|
229
|
+
export type ArcDirection = CS.UnityEngine.UIElements.ArcDirection;
|
|
230
|
+
|
|
231
|
+
/** Unity Painter2D - Vector drawing API. Accessed via mgc.painter2D in generateVisualContent. */
|
|
232
|
+
export type Painter2D = CS.UnityEngine.UIElements.Painter2D;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Unity MeshGenerationContext - Provides rendering context within generateVisualContent callback.
|
|
236
|
+
*
|
|
237
|
+
* Access painter2D for vector drawing, or use DrawText/DrawVectorImage for other content.
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* <View
|
|
241
|
+
* style={{ width: 200, height: 200 }}
|
|
242
|
+
* onGenerateVisualContent={(mgc) => {
|
|
243
|
+
* const p = mgc.painter2D
|
|
244
|
+
*
|
|
245
|
+
* p.fillColor = new CS.UnityEngine.Color(0, 0.5, 1, 1)
|
|
246
|
+
* p.BeginPath()
|
|
247
|
+
* p.Arc(
|
|
248
|
+
* new CS.UnityEngine.Vector2(100, 100),
|
|
249
|
+
* 80,
|
|
250
|
+
* CS.UnityEngine.UIElements.Angle.Degrees(0),
|
|
251
|
+
* CS.UnityEngine.UIElements.Angle.Degrees(360),
|
|
252
|
+
* CS.UnityEngine.UIElements.ArcDirection.Clockwise
|
|
253
|
+
* )
|
|
254
|
+
* p.Fill()
|
|
255
|
+
* }}
|
|
256
|
+
* />
|
|
257
|
+
*/
|
|
258
|
+
export type MeshGenerationContext = CS.UnityEngine.UIElements.MeshGenerationContext;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Callback type for generateVisualContent
|
|
262
|
+
*/
|
|
263
|
+
export type GenerateVisualContentCallback = (context: MeshGenerationContext) => void;
|
|
152
264
|
|
|
153
265
|
// Base props for all components
|
|
154
266
|
export interface BaseProps {
|
|
@@ -157,26 +269,105 @@ export interface BaseProps {
|
|
|
157
269
|
style?: ViewStyle;
|
|
158
270
|
className?: string;
|
|
159
271
|
|
|
160
|
-
//
|
|
272
|
+
// Click
|
|
161
273
|
onClick?: PointerEventHandler;
|
|
274
|
+
|
|
275
|
+
// Pointer events
|
|
162
276
|
onPointerDown?: PointerEventHandler;
|
|
163
277
|
onPointerUp?: PointerEventHandler;
|
|
164
278
|
onPointerMove?: PointerEventHandler;
|
|
165
279
|
onPointerEnter?: PointerEventHandler;
|
|
166
280
|
onPointerLeave?: PointerEventHandler;
|
|
281
|
+
onPointerCancel?: PointerEventHandler;
|
|
282
|
+
onPointerCapture?: PointerEventHandler;
|
|
283
|
+
onPointerCaptureOut?: PointerEventHandler;
|
|
284
|
+
onPointerStationary?: PointerEventHandler;
|
|
285
|
+
|
|
286
|
+
// Mouse events
|
|
287
|
+
onMouseDown?: MouseEventHandler;
|
|
288
|
+
onMouseUp?: MouseEventHandler;
|
|
289
|
+
onMouseMove?: MouseEventHandler;
|
|
290
|
+
onMouseEnter?: MouseEventHandler;
|
|
291
|
+
onMouseLeave?: MouseEventHandler;
|
|
292
|
+
onMouseOver?: MouseEventHandler;
|
|
293
|
+
onMouseOut?: MouseEventHandler;
|
|
294
|
+
onWheel?: WheelEventHandler;
|
|
295
|
+
onContextClick?: MouseEventHandler;
|
|
167
296
|
|
|
168
297
|
// Focus events
|
|
169
298
|
onFocus?: FocusEventHandler;
|
|
170
299
|
onBlur?: FocusEventHandler;
|
|
300
|
+
onFocusIn?: FocusEventHandler;
|
|
301
|
+
onFocusOut?: FocusEventHandler;
|
|
171
302
|
|
|
172
303
|
// Keyboard events
|
|
173
304
|
onKeyDown?: KeyEventHandler;
|
|
174
305
|
onKeyUp?: KeyEventHandler;
|
|
306
|
+
|
|
307
|
+
// Input events
|
|
308
|
+
onInput?: ChangeEventHandler;
|
|
309
|
+
|
|
310
|
+
// Drag events
|
|
311
|
+
onDragEnter?: DragEventHandler;
|
|
312
|
+
onDragLeave?: DragEventHandler;
|
|
313
|
+
onDragUpdated?: DragEventHandler;
|
|
314
|
+
onDragPerform?: DragEventHandler;
|
|
315
|
+
onDragExited?: DragEventHandler;
|
|
316
|
+
|
|
317
|
+
// Geometry events
|
|
318
|
+
onGeometryChanged?: GeometryEventHandler;
|
|
319
|
+
|
|
320
|
+
// Navigation events
|
|
321
|
+
onNavigationMove?: NavigationEventHandler;
|
|
322
|
+
onNavigationSubmit?: NavigationEventHandler;
|
|
323
|
+
onNavigationCancel?: NavigationEventHandler;
|
|
324
|
+
|
|
325
|
+
// Tooltip
|
|
326
|
+
onTooltip?: () => void;
|
|
327
|
+
|
|
328
|
+
// Transition events
|
|
329
|
+
onTransitionRun?: TransitionEventHandler;
|
|
330
|
+
onTransitionStart?: TransitionEventHandler;
|
|
331
|
+
onTransitionEnd?: TransitionEventHandler;
|
|
332
|
+
onTransitionCancel?: TransitionEventHandler;
|
|
333
|
+
|
|
334
|
+
// Vector drawing
|
|
335
|
+
/**
|
|
336
|
+
* Callback for custom vector drawing via Unity's generateVisualContent.
|
|
337
|
+
* Called when the element needs to repaint its visual content.
|
|
338
|
+
*
|
|
339
|
+
* Use element.MarkDirtyRepaint() to trigger a repaint when your drawing state changes.
|
|
340
|
+
*
|
|
341
|
+
* @example
|
|
342
|
+
* <View
|
|
343
|
+
* style={{ width: 200, height: 200 }}
|
|
344
|
+
* onGenerateVisualContent={(mgc) => {
|
|
345
|
+
* const p = mgc.painter2D
|
|
346
|
+
* const Angle = CS.UnityEngine.UIElements.Angle
|
|
347
|
+
*
|
|
348
|
+
* p.fillColor = new CS.UnityEngine.Color(0, 0.5, 1, 1)
|
|
349
|
+
* p.BeginPath()
|
|
350
|
+
* p.Arc(
|
|
351
|
+
* new CS.UnityEngine.Vector2(100, 100),
|
|
352
|
+
* 80,
|
|
353
|
+
* Angle.Degrees(0),
|
|
354
|
+
* Angle.Degrees(360),
|
|
355
|
+
* CS.UnityEngine.UIElements.ArcDirection.Clockwise
|
|
356
|
+
* )
|
|
357
|
+
* p.Fill()
|
|
358
|
+
* }}
|
|
359
|
+
* />
|
|
360
|
+
*/
|
|
361
|
+
onGenerateVisualContent?: GenerateVisualContentCallback;
|
|
175
362
|
}
|
|
176
363
|
|
|
177
364
|
// Component-specific props
|
|
178
365
|
export interface ViewProps extends BaseProps {}
|
|
179
366
|
|
|
367
|
+
export interface TextProps extends BaseProps {
|
|
368
|
+
text?: string;
|
|
369
|
+
}
|
|
370
|
+
|
|
180
371
|
export interface LabelProps extends BaseProps {
|
|
181
372
|
text?: string;
|
|
182
373
|
}
|
|
@@ -187,23 +378,39 @@ export interface ButtonProps extends BaseProps {
|
|
|
187
378
|
|
|
188
379
|
export interface TextFieldProps extends BaseProps {
|
|
189
380
|
value?: string;
|
|
381
|
+
label?: string;
|
|
190
382
|
placeholder?: string;
|
|
191
383
|
multiline?: boolean;
|
|
192
384
|
readOnly?: boolean;
|
|
193
385
|
maxLength?: number;
|
|
386
|
+
isPasswordField?: boolean;
|
|
387
|
+
maskChar?: string;
|
|
388
|
+
isDelayed?: boolean;
|
|
389
|
+
selectAllOnFocus?: boolean;
|
|
390
|
+
selectAllOnMouseUp?: boolean;
|
|
391
|
+
hideMobileInput?: boolean;
|
|
392
|
+
autoCorrection?: boolean;
|
|
194
393
|
onChange?: ChangeEventHandler<string>;
|
|
195
394
|
}
|
|
196
395
|
|
|
197
396
|
export interface ToggleProps extends BaseProps {
|
|
198
397
|
value?: boolean;
|
|
199
398
|
label?: string;
|
|
399
|
+
text?: string;
|
|
400
|
+
toggleOnLabelClick?: boolean;
|
|
200
401
|
onChange?: ChangeEventHandler<boolean>;
|
|
201
402
|
}
|
|
202
403
|
|
|
203
404
|
export interface SliderProps extends BaseProps {
|
|
204
405
|
value?: number;
|
|
406
|
+
label?: string;
|
|
205
407
|
lowValue?: number;
|
|
206
408
|
highValue?: number;
|
|
409
|
+
direction?: 'Horizontal' | 'Vertical';
|
|
410
|
+
pageSize?: number;
|
|
411
|
+
showInputField?: boolean;
|
|
412
|
+
inverted?: boolean;
|
|
413
|
+
fill?: boolean;
|
|
207
414
|
onChange?: ChangeEventHandler<number>;
|
|
208
415
|
}
|
|
209
416
|
|
|
@@ -231,22 +438,133 @@ export interface ScrollViewProps extends BaseProps {
|
|
|
231
438
|
}
|
|
232
439
|
|
|
233
440
|
export interface ImageProps extends BaseProps {
|
|
234
|
-
|
|
235
|
-
|
|
441
|
+
/** Image source - can be a Texture2D, Sprite, or path string */
|
|
442
|
+
image?: object;
|
|
443
|
+
/** Sprite to display (alternative to image) */
|
|
444
|
+
sprite?: object;
|
|
445
|
+
/** Vector image to display */
|
|
446
|
+
vectorImage?: object;
|
|
447
|
+
/** How the image scales to fit the element */
|
|
448
|
+
scaleMode?: 'StretchToFill' | 'ScaleAndCrop' | 'ScaleToFit';
|
|
449
|
+
/** Tint color applied to the image */
|
|
450
|
+
tintColor?: string;
|
|
451
|
+
/** Source rectangle within the texture (normalized 0-1 coordinates) */
|
|
452
|
+
sourceRect?: { x: number; y: number; width: number; height: number };
|
|
453
|
+
/** UV coordinates for the image */
|
|
454
|
+
uv?: { x: number; y: number; width: number; height: number };
|
|
236
455
|
}
|
|
237
456
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
457
|
+
/**
|
|
458
|
+
* Minimal container type for render() function.
|
|
459
|
+
* Accepts any Unity VisualElement (CS.UnityEngine.UIElements.VisualElement)
|
|
460
|
+
* or the detailed VisualElement interface below.
|
|
461
|
+
*/
|
|
462
|
+
export interface RenderContainer {
|
|
241
463
|
__csHandle: number;
|
|
242
464
|
__csType: string;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// VisualElement - base type for all UI Toolkit elements
|
|
468
|
+
// This is the C# VisualElement exposed to JS via refs
|
|
469
|
+
// Note: This interface represents the JS-side view of Unity's VisualElement
|
|
470
|
+
export interface VisualElement extends RenderContainer {
|
|
243
471
|
style: Record<string, unknown>;
|
|
472
|
+
name: string;
|
|
473
|
+
visible: boolean;
|
|
474
|
+
enabledSelf: boolean;
|
|
475
|
+
enabledInHierarchy: boolean;
|
|
476
|
+
|
|
477
|
+
// Text content (for TextElement-derived types)
|
|
244
478
|
text?: string;
|
|
479
|
+
|
|
480
|
+
// Label (for labeled controls like Toggle)
|
|
481
|
+
label?: string;
|
|
482
|
+
|
|
483
|
+
// Value (for input controls)
|
|
245
484
|
value?: unknown;
|
|
485
|
+
|
|
486
|
+
// Hierarchy
|
|
246
487
|
Add: (child: VisualElement) => void;
|
|
488
|
+
Insert: (index: number, child: VisualElement) => void;
|
|
247
489
|
Remove: (child: VisualElement) => void;
|
|
490
|
+
RemoveAt: (index: number) => void;
|
|
491
|
+
Clear: () => void;
|
|
492
|
+
IndexOf: (child: VisualElement) => number;
|
|
493
|
+
childCount: number;
|
|
494
|
+
parent: VisualElement | null;
|
|
495
|
+
|
|
496
|
+
// Classes
|
|
248
497
|
AddToClassList: (className: string) => void;
|
|
249
498
|
RemoveFromClassList: (className: string) => void;
|
|
499
|
+
ClearClassList: () => void;
|
|
500
|
+
ClassListContains: (className: string) => boolean;
|
|
501
|
+
|
|
502
|
+
// Focus
|
|
503
|
+
Focus: () => void;
|
|
504
|
+
Blur: () => void;
|
|
505
|
+
focusable: boolean;
|
|
506
|
+
|
|
507
|
+
// Layout
|
|
508
|
+
MarkDirtyRepaint: () => void;
|
|
509
|
+
|
|
510
|
+
// Vector drawing
|
|
511
|
+
/**
|
|
512
|
+
* Callback delegate for custom visual content generation.
|
|
513
|
+
* Can be used via ref for raw access to Unity's generateVisualContent.
|
|
514
|
+
*
|
|
515
|
+
* @example
|
|
516
|
+
* useEffect(() => {
|
|
517
|
+
* const ve = ref.current
|
|
518
|
+
* const draw = (mgc) => { ... }
|
|
519
|
+
* ve.generateVisualContent += draw
|
|
520
|
+
* return () => { ve.generateVisualContent -= draw }
|
|
521
|
+
* }, [])
|
|
522
|
+
*/
|
|
523
|
+
generateVisualContent: {
|
|
524
|
+
(callback: GenerateVisualContentCallback): void;
|
|
525
|
+
} & {
|
|
526
|
+
// Delegate operators (C# interop)
|
|
527
|
+
'+='?: (callback: GenerateVisualContentCallback) => void;
|
|
528
|
+
'-='?: (callback: GenerateVisualContentCallback) => void;
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// Specific element types for better ref typing
|
|
533
|
+
export interface TextElement extends VisualElement {
|
|
534
|
+
text: string;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
export interface LabelElement extends TextElement {}
|
|
538
|
+
|
|
539
|
+
export interface ButtonElement extends TextElement {}
|
|
540
|
+
|
|
541
|
+
export interface TextFieldElement extends VisualElement {
|
|
542
|
+
value: string;
|
|
543
|
+
text: string;
|
|
544
|
+
isReadOnly: boolean;
|
|
545
|
+
isPasswordField: boolean;
|
|
546
|
+
maxLength: number;
|
|
547
|
+
SelectAll: () => void;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
export interface ToggleElement extends VisualElement {
|
|
551
|
+
value: boolean;
|
|
552
|
+
text: string;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
export interface SliderElement extends VisualElement {
|
|
556
|
+
value: number;
|
|
557
|
+
lowValue: number;
|
|
558
|
+
highValue: number;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
export interface ScrollViewElement extends VisualElement {
|
|
562
|
+
scrollOffset: { x: number; y: number };
|
|
563
|
+
ScrollTo: (child: VisualElement) => void;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
export interface ImageElement extends VisualElement {
|
|
567
|
+
// Image-specific properties handled via style.backgroundImage
|
|
250
568
|
}
|
|
251
569
|
|
|
252
570
|
// ListView uses Unity's virtualization callbacks directly
|