onejs-react 0.1.4 → 0.1.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onejs-react",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "React 19 renderer for OneJS (Unity UI Toolkit)",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
@@ -3,7 +3,7 @@ import type {BaseProps, ViewStyle, VisualElement, GenerateVisualContentCallback}
3
3
  import {parseStyleValue, parseColor} from './style-parser';
4
4
 
5
5
  // CSObject is an alias for VisualElement - they represent the same C# objects
6
- type CSObject = VisualElement;
6
+ type CSObject = VisualElement & { pickingMode?: number };
7
7
 
8
8
  // Global declarations for QuickJS environment
9
9
  declare function setTimeout(callback: () => void, ms?: number): number;
@@ -54,6 +54,7 @@ declare const CS: {
54
54
  AlternatingRowBackground: CSEnum;
55
55
  CollectionVirtualizationMethod: CSEnum;
56
56
  DisplayStyle: CSEnum;
57
+ PickingMode: CSEnum;
57
58
  };
58
59
  };
59
60
  OneJS: {
@@ -70,6 +71,8 @@ declare const __eventAPI: {
70
71
  addEventListener: (element: CSObject, eventType: string, callback: Function) => void;
71
72
  removeEventListener: (element: CSObject, eventType: string, callback: Function) => void;
72
73
  removeAllEventListeners: (element: CSObject) => void;
74
+ setParent: (childHandle: number, parentHandle: number) => void;
75
+ removeParent: (childHandle: number) => void;
73
76
  };
74
77
 
75
78
  interface CSStyle {
@@ -416,6 +419,22 @@ function updateClassNames(element: CSObject, oldClassName: string | undefined, n
416
419
  }
417
420
  }
418
421
 
422
+ // Track parent-child relationships for event bubbling
423
+ function trackParent(child: CSObject, parent: CSObject) {
424
+ const childHandle = (child as unknown as { __csHandle: number }).__csHandle;
425
+ const parentHandle = (parent as unknown as { __csHandle: number }).__csHandle;
426
+ if (childHandle > 0 && parentHandle > 0) {
427
+ __eventAPI.setParent(childHandle, parentHandle);
428
+ }
429
+ }
430
+
431
+ function untrackParent(child: CSObject) {
432
+ const childHandle = (child as unknown as { __csHandle: number }).__csHandle;
433
+ if (childHandle > 0) {
434
+ __eventAPI.removeParent(childHandle);
435
+ }
436
+ }
437
+
419
438
  // Apply event handlers
420
439
  function applyEvents(instance: Instance, props: BaseProps) {
421
440
  for (const [propName, eventType] of Object.entries(EVENT_PROPS)) {
@@ -778,6 +797,11 @@ function createInstance(type: string, props: BaseProps): Instance {
778
797
  applyVisualContentCallback(instance, props);
779
798
  applyComponentProps(element, type, props as Record<string, unknown>);
780
799
 
800
+ // Apply pickingMode
801
+ if (props.pickingMode !== undefined) {
802
+ element.pickingMode = CS.UnityEngine.UIElements.PickingMode[props.pickingMode];
803
+ }
804
+
781
805
  return instance;
782
806
  }
783
807
 
@@ -806,6 +830,16 @@ function updateInstance(instance: Instance, oldProps: BaseProps, newProps: BaseP
806
830
  // Update component-specific props
807
831
  applyComponentProps(element, instance.type, newProps as Record<string, unknown>);
808
832
 
833
+ // Update pickingMode
834
+ if (oldProps.pickingMode !== newProps.pickingMode) {
835
+ if (newProps.pickingMode !== undefined) {
836
+ element.pickingMode = CS.UnityEngine.UIElements.PickingMode[newProps.pickingMode];
837
+ } else {
838
+ // Reset to default (Position)
839
+ element.pickingMode = CS.UnityEngine.UIElements.PickingMode.Position;
840
+ }
841
+ }
842
+
809
843
  instance.props = newProps;
810
844
  }
811
845
 
@@ -862,31 +896,31 @@ export const hostConfig = {
862
896
  if (shouldMergeText(parentInstance, child)) {
863
897
  appendMergedTextChild(parentInstance, child);
864
898
  } else {
865
- // Non-text child - unmerge any previously merged text first
866
899
  handleNonTextChild(parentInstance);
867
900
  parentInstance.element.Add(child.element);
868
901
  }
902
+ trackParent(child.element, parentInstance.element);
869
903
  },
870
904
 
871
905
  appendChild(parentInstance: Instance, child: Instance) {
872
906
  if (shouldMergeText(parentInstance, child)) {
873
907
  appendMergedTextChild(parentInstance, child);
874
908
  } else {
875
- // Non-text child - unmerge any previously merged text first
876
909
  handleNonTextChild(parentInstance);
877
910
  parentInstance.element.Add(child.element);
878
911
  }
912
+ trackParent(child.element, parentInstance.element);
879
913
  },
880
914
 
881
915
  appendChildToContainer(container: Container, child: Instance) {
882
916
  container.Add(child.element);
917
+ // Container is the root - no parent to track
883
918
  },
884
919
 
885
920
  insertBefore(parentInstance: Instance, child: Instance, beforeChild: Instance) {
886
921
  if (shouldMergeText(parentInstance, child)) {
887
922
  insertMergedTextChild(parentInstance, child, beforeChild);
888
923
  } else {
889
- // Non-text child - unmerge any previously merged text first
890
924
  handleNonTextChild(parentInstance);
891
925
  const index = parentInstance.element.IndexOf(beforeChild.element);
892
926
  if (index >= 0) {
@@ -895,6 +929,7 @@ export const hostConfig = {
895
929
  parentInstance.element.Add(child.element);
896
930
  }
897
931
  }
932
+ trackParent(child.element, parentInstance.element);
898
933
  },
899
934
 
900
935
  insertInContainerBefore(container: Container, child: Instance, beforeChild: Instance) {
@@ -904,21 +939,23 @@ export const hostConfig = {
904
939
  } else {
905
940
  container.Add(child.element);
906
941
  }
942
+ // Container is the root - no parent to track
907
943
  },
908
944
 
909
945
  removeChild(parentInstance: Instance, child: Instance) {
910
946
  if (child.mergedInto === parentInstance) {
911
- // Child was merged into parent's text - remove from merged children
912
947
  removeMergedTextChild(parentInstance, child);
913
948
  } else {
914
949
  __eventAPI.removeAllEventListeners(child.element);
915
950
  parentInstance.element.Remove(child.element);
916
951
  }
952
+ untrackParent(child.element);
917
953
  },
918
954
 
919
955
  removeChildFromContainer(container: Container, child: Instance) {
920
956
  __eventAPI.removeAllEventListeners(child.element);
921
957
  container.Remove(child.element);
958
+ untrackParent(child.element);
922
959
  },
923
960
 
924
961
  prepareUpdate(_instance: Instance, _type: string, oldProps: BaseProps, newProps: BaseProps) {
package/src/types.ts CHANGED
@@ -331,6 +331,14 @@ export interface BaseProps {
331
331
  onTransitionEnd?: TransitionEventHandler;
332
332
  onTransitionCancel?: TransitionEventHandler;
333
333
 
334
+ // Picking mode - controls whether the element receives pointer events
335
+ /**
336
+ * Controls whether this element is pickable by pointer events.
337
+ * - "Position" (default): Element receives pointer events based on its rectangle
338
+ * - "Ignore": Element is transparent to pointer events (clicks pass through)
339
+ */
340
+ pickingMode?: 'Position' | 'Ignore';
341
+
334
342
  // Vector drawing
335
343
  /**
336
344
  * Callback for custom vector drawing via Unity's generateVisualContent.