@opsydyn/effect-three-foldkit 0.2.0 → 0.4.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/dist/index.js CHANGED
@@ -1,3 +1,86 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __returnValue = (v) => v;
3
+ function __exportSetter(name, newValue) {
4
+ this[name] = __returnValue.bind(null, newValue);
5
+ }
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true,
11
+ configurable: true,
12
+ set: __exportSetter.bind(all, name)
13
+ });
14
+ };
15
+
16
+ // src/boxSelect.ts
17
+ var exports_boxSelect = {};
18
+ __export(exports_boxSelect, {
19
+ Box: () => Box,
20
+ Message: () => Message,
21
+ Model: () => Model,
22
+ OutMessage: () => OutMessage,
23
+ claims: () => claims,
24
+ dragOf: () => dragOf,
25
+ drawing: () => drawing2,
26
+ init: () => init,
27
+ inside: () => inside,
28
+ rectangle: () => rectangle,
29
+ update: () => update
30
+ });
31
+
32
+ // src/measuringTape.ts
33
+ var exports_measuringTape = {};
34
+ __export(exports_measuringTape, {
35
+ Message: () => Message2,
36
+ Model: () => Model2,
37
+ OutMessage: () => OutMessage2,
38
+ init: () => init2,
39
+ label: () => label,
40
+ length: () => length,
41
+ nodes: () => nodes,
42
+ update: () => update2
43
+ });
44
+
45
+ // src/pivotControls.ts
46
+ var exports_pivotControls = {};
47
+ __export(exports_pivotControls, {
48
+ Message: () => Message3,
49
+ Model: () => Model3,
50
+ OutMessage: () => OutMessage3,
51
+ handleOf: () => handleOf,
52
+ held: () => held,
53
+ init: () => init3,
54
+ nodes: () => nodes2,
55
+ update: () => update3
56
+ });
57
+
58
+ // src/transformGizmo.ts
59
+ var exports_transformGizmo = {};
60
+ __export(exports_transformGizmo, {
61
+ Message: () => Message4,
62
+ Model: () => Model4,
63
+ OutMessage: () => OutMessage4,
64
+ handleOf: () => handleOf2,
65
+ held: () => held2,
66
+ init: () => init4,
67
+ nodes: () => nodes3,
68
+ update: () => update4
69
+ });
70
+
71
+ // src/viewportGizmo.ts
72
+ var exports_viewportGizmo = {};
73
+ __export(exports_viewportGizmo, {
74
+ Message: () => Message5,
75
+ Model: () => Model5,
76
+ OutMessage: () => OutMessage5,
77
+ axisOf: () => axisOf,
78
+ hud: () => hud,
79
+ init: () => init5,
80
+ nodes: () => nodes4,
81
+ update: () => update5
82
+ });
83
+
1
84
  // src/assets.ts
2
85
  import { Data, Effect } from "effect";
3
86
  import {
@@ -556,6 +639,21 @@ var webglRendererFactory = (canvas, options = {}) => ({
556
639
  scissored = true;
557
640
  renderer.render(scene, camera);
558
641
  },
642
+ renderOver: (scene, camera) => {
643
+ if (renderer.xr.isPresenting)
644
+ return;
645
+ if (scissored) {
646
+ const { width, height } = renderer.getSize(drawingSize);
647
+ renderer.setScissorTest(false);
648
+ renderer.setViewport(0, 0, width, height);
649
+ scissored = false;
650
+ }
651
+ const autoClear = renderer.autoClear;
652
+ renderer.autoClear = false;
653
+ renderer.clearDepth();
654
+ renderer.render(scene, camera);
655
+ renderer.autoClear = autoClear;
656
+ },
559
657
  createTarget: (width, height) => createTarget(targets, width, height),
560
658
  createEnvironment: () => createRoom(renderer),
561
659
  configure: (settings) => {
@@ -783,6 +881,21 @@ var webgpuRendererFactory = (canvas, options = {}) => ({
783
881
  scissored = true;
784
882
  renderer.render(scene, camera);
785
883
  },
884
+ renderOver: (scene, camera) => {
885
+ if (renderer.xr.isPresenting)
886
+ return;
887
+ if (scissored) {
888
+ const { width, height } = renderer.getSize(drawingSize2);
889
+ renderer.setScissorTest(false);
890
+ renderer.setViewport(0, 0, width, height);
891
+ scissored = false;
892
+ }
893
+ const autoClear = renderer.autoClear;
894
+ renderer.autoClear = false;
895
+ renderer.clearDepth();
896
+ renderer.render(scene, camera);
897
+ renderer.autoClear = autoClear;
898
+ },
786
899
  createTarget: (width, height) => createTarget2(targets, width, height),
787
900
  createEnvironment: () => createRoom2(renderer),
788
901
  configure: (settings) => {
@@ -852,6 +965,7 @@ var sceneElement = CustomElement.define({
852
965
  "scene-drag": SceneSchema.DragDetail,
853
966
  "scene-drag-end": SceneSchema.DragDetail,
854
967
  "scene-gesture": SceneSchema.GestureDetail,
968
+ "scene-gesture-end": SceneSchema.GestureEndDetail,
855
969
  "scene-auto-rotated": SceneSchema.AutoRotatedDetail,
856
970
  "scene-collision": SceneSchema.CollisionDetail,
857
971
  "scene-contact-force": SceneSchema.ContactForceDetail,
@@ -883,6 +997,7 @@ var domEventName = {
883
997
  Drag: "scene-drag",
884
998
  DragEnd: "scene-drag-end",
885
999
  Gesture: "scene-gesture",
1000
+ GestureEnd: "scene-gesture-end",
886
1001
  AutoRotated: "scene-auto-rotated",
887
1002
  Collision: "scene-collision",
888
1003
  ContactForce: "scene-contact-force",
@@ -1633,6 +1748,52 @@ var makeEnvironment = (host, options = {}) => {
1633
1748
  }
1634
1749
  };
1635
1750
  };
1751
+ // src/inspector.ts
1752
+ var axisNames = ["x", "y", "z"];
1753
+ var nameOf = (field) => field.path.filter((part) => typeof part === "string").join(" ") || field.label;
1754
+ var hex = (colour) => `#${colour.toString(16).padStart(6, "0")}`;
1755
+ var numberInput = (h, label, value, report) => h.input([
1756
+ h.Type("number"),
1757
+ h.Step("any"),
1758
+ h.Value(String(value)),
1759
+ h.AriaLabel(label),
1760
+ h.OnChange(report)
1761
+ ]);
1762
+ var controlOf = (h, field, onEdit) => {
1763
+ const name = nameOf(field);
1764
+ switch (field._tag) {
1765
+ case "Number":
1766
+ return numberInput(h, name, field.value, (raw) => onEdit(field.path, Number(raw)));
1767
+ case "Text":
1768
+ return h.input([
1769
+ h.Type("text"),
1770
+ h.Value(field.value),
1771
+ h.AriaLabel(name),
1772
+ h.OnChange((raw) => onEdit(field.path, raw))
1773
+ ]);
1774
+ case "Toggle":
1775
+ return h.input([
1776
+ h.Type("checkbox"),
1777
+ h.Checked(field.value),
1778
+ h.AriaLabel(name),
1779
+ h.OnClick(onEdit(field.path, !field.value))
1780
+ ]);
1781
+ case "Choice":
1782
+ return h.select([h.AriaLabel(name), h.OnChange((raw) => onEdit(field.path, raw))], field.options.map((option) => h.option([h.Value(option), h.Selected(option === field.value)], [option])));
1783
+ case "Colour":
1784
+ return h.input([
1785
+ h.Type("color"),
1786
+ h.Value(hex(field.value)),
1787
+ h.AriaLabel(name),
1788
+ h.OnInput((raw) => onEdit(field.path, Number.parseInt(raw.slice(1), 16)))
1789
+ ]);
1790
+ case "Vector":
1791
+ return h.span([h.Class("e3-inspector-vector")], field.value.map((component, index) => numberInput(h, `${name} ${axisNames[index] ?? index}`, component, (raw) => onEdit([...field.path, index], Number(raw)))));
1792
+ case "Fixed":
1793
+ return h.span([h.Class("e3-inspector-fixed")], [field.text]);
1794
+ }
1795
+ };
1796
+ var inspectorView = (h, fields, onEdit) => h.div([h.Class("e3-inspector")], fields.map((field) => h.keyed("label")(field.path.join("."), [h.Class("e3-inspector-row")], [h.span([h.Class("e3-inspector-name")], [nameOf(field)]), controlOf(h, field, onEdit)])));
1636
1797
  // src/mount.ts
1637
1798
  import {
1638
1799
  createGatedFrames,
@@ -1945,8 +2106,343 @@ var makeSceneMount = (environment) => Mount.define("EffectThreeScene", {
1945
2106
  messages: [SceneLifecycle.StartedScene, SceneLifecycle.FailedScene],
1946
2107
  execute: mountScene(environment)
1947
2108
  });
2109
+ // src/boxSelect.ts
2110
+ import { boxSelect, SceneSchema as SceneSchema3 } from "@opsydyn/effect-three";
2111
+ import { Option as Option2, Schema as Schema3 } from "effect";
2112
+ import { defineMessageUnion as defineMessageUnion2 } from "foldkit/message";
2113
+ var Corner = Schema3.Struct({ x: Schema3.Finite, y: Schema3.Finite });
2114
+ var Selectable = Schema3.Struct({ key: Schema3.String, at: SceneSchema3.Vec3 });
2115
+ var Box = Schema3.Struct({
2116
+ from: Corner,
2117
+ to: Corner,
2118
+ width: Schema3.Finite,
2119
+ height: Schema3.Finite
2120
+ });
2121
+ var Model = Schema3.Struct({ box: Schema3.Option(Box) });
2122
+ var Message = defineMessageUnion2({
2123
+ Dragged: {
2124
+ x: Schema3.Finite,
2125
+ y: Schema3.Finite,
2126
+ deltaX: Schema3.Finite,
2127
+ deltaY: Schema3.Finite,
2128
+ width: Schema3.Finite,
2129
+ height: Schema3.Finite
2130
+ },
2131
+ Ended: { camera: SceneSchema3.Camera, selectable: Schema3.Array(Selectable) },
2132
+ Cancelled: {}
2133
+ });
2134
+ var OutMessage = defineMessageUnion2({
2135
+ Selected: { keys: Schema3.Array(Schema3.String) }
2136
+ });
2137
+ var init = () => ({ box: Option2.none() });
2138
+ var moved = (box, deltaX, deltaY) => ({
2139
+ ...box,
2140
+ to: { x: box.to.x + deltaX * 2 / box.width, y: box.to.y - deltaY * 2 / box.height }
2141
+ });
2142
+ var dragged = (model, message) => {
2143
+ const { x, y, deltaX, deltaY, width, height } = message;
2144
+ const start = { from: { x, y }, to: { x, y }, width, height };
2145
+ const box = Option2.getOrElse(model.box, () => start);
2146
+ return { box: Option2.some(moved(box, deltaX, deltaY)) };
2147
+ };
2148
+ var keysIn = (box, camera, selectable) => boxSelect(camera, box, box.from, box.to, selectable);
2149
+ var ended = (model, camera, selectable) => Option2.match(model.box, {
2150
+ onNone: () => ({ model }),
2151
+ onSome: (box) => ({
2152
+ model: init(),
2153
+ outMessage: OutMessage.Selected({ keys: keysIn(box, camera, selectable) })
2154
+ })
2155
+ });
2156
+ var update = (model, message) => Message.match(message, {
2157
+ Dragged: (drag) => ({ model: dragged(model, drag) }),
2158
+ Ended: ({ camera, selectable }) => ended(model, camera, selectable),
2159
+ Cancelled: () => ({ model: init() })
2160
+ });
2161
+ var drawing2 = (model) => Option2.isSome(model.box);
2162
+ var primaryButton = 0;
2163
+ var startsBox = (drag) => drag.button === primaryButton && drag.modifiers.shift && drag.key === undefined;
2164
+ var claims = (model, drag) => drawing2(model) || startsBox(drag);
2165
+ var dragOf = (gesture) => Message.Dragged({
2166
+ x: gesture.x,
2167
+ y: gesture.y,
2168
+ deltaX: gesture.deltaX,
2169
+ deltaY: gesture.deltaY,
2170
+ width: gesture.width,
2171
+ height: gesture.height
2172
+ });
2173
+ var inside = (model, camera, selectable) => Option2.match(model.box, {
2174
+ onNone: () => [],
2175
+ onSome: (box) => keysIn(box, camera, selectable)
2176
+ });
2177
+ var onCanvas = (box) => {
2178
+ const left = (Math.min(box.from.x, box.to.x) + 1) / 2 * box.width;
2179
+ const right = (Math.max(box.from.x, box.to.x) + 1) / 2 * box.width;
2180
+ const top = (1 - Math.max(box.from.y, box.to.y)) / 2 * box.height;
2181
+ const bottom = (1 - Math.min(box.from.y, box.to.y)) / 2 * box.height;
2182
+ return { left, top, width: right - left, height: bottom - top };
2183
+ };
2184
+ var rectangle = (model) => Option2.map(model.box, onCanvas);
2185
+ // src/measuringTape.ts
2186
+ import {
2187
+ clearTape,
2188
+ overlay,
2189
+ placeTapeEnd,
2190
+ pointTape,
2191
+ SceneSchema as SceneSchema4,
2192
+ tape,
2193
+ tapeLength,
2194
+ tapeMiddle,
2195
+ tapeNodes
2196
+ } from "@opsydyn/effect-three";
2197
+ import { Option as Option3, Schema as Schema4 } from "effect";
2198
+ import { defineMessageUnion as defineMessageUnion3 } from "foldkit/message";
2199
+ var Model2 = Schema4.Struct({
2200
+ key: Schema4.String,
2201
+ tape: SceneSchema4.Tape
2202
+ });
2203
+ var Message2 = defineMessageUnion3({
2204
+ Placed: { point: SceneSchema4.Vec3 },
2205
+ Pointed: { point: Schema4.NullOr(SceneSchema4.Vec3) },
2206
+ Cleared: {},
2207
+ ChoseSnap: { snap: SceneSchema4.Tape.fields.snap }
2208
+ });
2209
+ var OutMessage2 = defineMessageUnion3({
2210
+ Measured: { from: SceneSchema4.Vec3, to: SceneSchema4.Vec3, length: Schema4.Finite }
2211
+ });
2212
+ var init2 = (key, options = {}) => ({
2213
+ key,
2214
+ tape: tape(options)
2215
+ });
2216
+ var measured = (next) => Option3.match(Option3.all([Option3.fromNullishOr(next.tape.from), Option3.fromNullishOr(next.tape.to)]), {
2217
+ onNone: () => ({ model: next }),
2218
+ onSome: ([from, to]) => ({
2219
+ model: next,
2220
+ outMessage: OutMessage2.Measured({ from, to, length: tapeLength(next.tape) ?? 0 })
2221
+ })
2222
+ });
2223
+ var update2 = (model, message) => Message2.match(message, {
2224
+ Placed: ({ point }) => measured({ ...model, tape: placeTapeEnd(model.tape, point) }),
2225
+ Pointed: ({ point }) => ({ model: { ...model, tape: pointTape(model.tape, point) } }),
2226
+ Cleared: () => ({ model: { ...model, tape: clearTape(model.tape) } }),
2227
+ ChoseSnap: ({ snap }) => ({ model: { ...model, tape: { ...model.tape, snap } } })
2228
+ });
2229
+ var length = (model) => Option3.fromNullishOr(tapeLength(model.tape));
2230
+ var nodes = (model, look = {}) => tapeNodes(model.key, model.tape, look);
2231
+ var classOf = (h, className) => Option3.match(Option3.fromNullishOr(className), {
2232
+ onNone: () => [],
2233
+ onSome: (name) => [h.Class(name)]
2234
+ });
2235
+ var label = (model, h, options = {}) => Option3.match(Option3.all([length(model), Option3.fromNullishOr(tapeMiddle(model.tape))]), {
2236
+ onNone: () => [],
2237
+ onSome: ([measuredLength, middle]) => [
2238
+ {
2239
+ overlay: overlay({ key: `${model.key}:label`, position: middle, center: true }),
2240
+ content: h.span(classOf(h, options.className), [
2241
+ `${measuredLength.toFixed(2)} ${options.unit ?? "m"}`
2242
+ ]),
2243
+ pointerEvents: "none"
2244
+ }
2245
+ ]
2246
+ });
2247
+ // src/pivotControls.ts
2248
+ import {
2249
+ dragPivot,
2250
+ hoverPivot,
2251
+ pivot,
2252
+ pivotHandleOf,
2253
+ pivotNodes,
2254
+ pressPivot,
2255
+ releasePivot,
2256
+ SceneSchema as SceneSchema5
2257
+ } from "@opsydyn/effect-three";
2258
+ import { Option as Option4, Schema as Schema5 } from "effect";
2259
+ import { defineMessageUnion as defineMessageUnion4 } from "foldkit/message";
2260
+ var Model3 = Schema5.Struct({
2261
+ key: Schema5.String,
2262
+ pivot: SceneSchema5.Pivot,
2263
+ last: Schema5.Option(SceneSchema5.Placement)
2264
+ });
2265
+ var Handle = SceneSchema5.PivotHandle;
2266
+ var Message3 = defineMessageUnion4({
2267
+ Pressed: { handle: Handle, point: SceneSchema5.Vec3, placement: SceneSchema5.Placement },
2268
+ Dragged: { origin: SceneSchema5.Vec3, direction: SceneSchema5.Vec3, snap: Schema5.Boolean },
2269
+ Released: {},
2270
+ Hovered: { handle: Schema5.NullOr(Handle) }
2271
+ });
2272
+ var OutMessage3 = defineMessageUnion4({
2273
+ Moved: { placement: SceneSchema5.Placement },
2274
+ Finished: { placement: SceneSchema5.Placement }
2275
+ });
2276
+ var init3 = (key, options = {}) => ({
2277
+ key,
2278
+ pivot: pivot(options),
2279
+ last: Option4.none()
2280
+ });
2281
+ var withPivot = (model, next) => ({ ...model, pivot: next });
2282
+ var finished = (model) => ({
2283
+ model: { ...withPivot(model, releasePivot(model.pivot)), last: Option4.none() },
2284
+ ...Option4.match(model.last, {
2285
+ onNone: () => ({}),
2286
+ onSome: (placement) => ({ outMessage: OutMessage3.Finished({ placement }) })
2287
+ })
2288
+ });
2289
+ var dragged2 = (model, origin, direction, snap) => {
2290
+ const placement = Option4.fromNullishOr(dragPivot(model.pivot, { origin, direction }, { snap }));
2291
+ return Option4.match(placement, {
2292
+ onNone: () => ({ model }),
2293
+ onSome: (placement) => ({
2294
+ model: { ...model, last: Option4.some(placement) },
2295
+ outMessage: OutMessage3.Moved({ placement })
2296
+ })
2297
+ });
2298
+ };
2299
+ var update3 = (model, message) => Message3.match(message, {
2300
+ Pressed: ({ handle, point, placement }) => ({
2301
+ model: {
2302
+ ...withPivot(model, pressPivot(model.pivot, placement, handle, point)),
2303
+ last: Option4.none()
2304
+ }
2305
+ }),
2306
+ Dragged: ({ origin, direction, snap }) => dragged2(model, origin, direction, snap),
2307
+ Released: () => finished(model),
2308
+ Hovered: ({ handle }) => ({ model: withPivot(model, hoverPivot(model.pivot, handle)) })
2309
+ });
2310
+ var handleOf = (model, key) => Option4.fromNullishOr(pivotHandleOf(model.key, key));
2311
+ var held = (model) => model.pivot.grab !== null;
2312
+ var nodes2 = (model, placement) => pivotNodes(model.key, model.pivot, placement);
2313
+ // src/transformGizmo.ts
2314
+ import {
2315
+ dragGizmo,
2316
+ gizmo,
2317
+ gizmoHandleOf,
2318
+ gizmoNodes,
2319
+ hoverGizmo,
2320
+ pressGizmo,
2321
+ releaseGizmo,
2322
+ SceneSchema as SceneSchema6
2323
+ } from "@opsydyn/effect-three";
2324
+ import { Option as Option5, Schema as Schema6 } from "effect";
2325
+ import { defineMessageUnion as defineMessageUnion5 } from "foldkit/message";
2326
+ var Model4 = Schema6.Struct({
2327
+ key: Schema6.String,
2328
+ gizmo: SceneSchema6.Gizmo,
2329
+ last: Schema6.Option(SceneSchema6.Placement)
2330
+ });
2331
+ var Handle2 = Schema6.Literals(["x", "y", "z", "xy", "yz", "xz", "xyz"]);
2332
+ var Message4 = defineMessageUnion5({
2333
+ Pressed: {
2334
+ handle: Handle2,
2335
+ origin: SceneSchema6.Vec3,
2336
+ direction: SceneSchema6.Vec3,
2337
+ placement: SceneSchema6.Placement,
2338
+ camera: SceneSchema6.Camera
2339
+ },
2340
+ Dragged: { origin: SceneSchema6.Vec3, direction: SceneSchema6.Vec3 },
2341
+ Released: {},
2342
+ Hovered: { handle: Schema6.NullOr(Handle2) },
2343
+ ChoseMode: { mode: Schema6.Literals(["translate", "rotate", "scale"]) },
2344
+ ChoseSpace: { space: Schema6.Literals(["world", "local"]) }
2345
+ });
2346
+ var OutMessage4 = defineMessageUnion5({
2347
+ Moved: { placement: SceneSchema6.Placement },
2348
+ Finished: { placement: SceneSchema6.Placement }
2349
+ });
2350
+ var init4 = (key, options = {}) => ({
2351
+ key,
2352
+ gizmo: gizmo(options),
2353
+ last: Option5.none()
2354
+ });
2355
+ var withGizmo = (model, next) => ({ ...model, gizmo: next });
2356
+ var finished2 = (model) => ({
2357
+ model: { ...withGizmo(model, releaseGizmo(model.gizmo)), last: Option5.none() },
2358
+ ...Option5.match(model.last, {
2359
+ onNone: () => ({}),
2360
+ onSome: (placement) => ({ outMessage: OutMessage4.Finished({ placement }) })
2361
+ })
2362
+ });
2363
+ var dragged3 = (model, origin, direction) => {
2364
+ const placement = Option5.fromNullishOr(dragGizmo(model.gizmo, { origin, direction }));
2365
+ return Option5.match(placement, {
2366
+ onNone: () => ({ model }),
2367
+ onSome: (placement) => ({
2368
+ model: { ...model, last: Option5.some(placement) },
2369
+ outMessage: OutMessage4.Moved({ placement })
2370
+ })
2371
+ });
2372
+ };
2373
+ var update4 = (model, message) => Message4.match(message, {
2374
+ Pressed: ({ handle, origin, direction, placement, camera }) => ({
2375
+ model: {
2376
+ ...withGizmo(model, pressGizmo(model.gizmo, placement, handle, { origin, direction }, camera)),
2377
+ last: Option5.none()
2378
+ }
2379
+ }),
2380
+ Dragged: ({ origin, direction }) => dragged3(model, origin, direction),
2381
+ Released: () => finished2(model),
2382
+ Hovered: ({ handle }) => ({ model: withGizmo(model, hoverGizmo(model.gizmo, handle)) }),
2383
+ ChoseMode: ({ mode }) => ({ model: withGizmo(model, { ...model.gizmo, mode }) }),
2384
+ ChoseSpace: ({ space }) => ({ model: withGizmo(model, { ...model.gizmo, space }) })
2385
+ });
2386
+ var handleOf2 = (model, key) => Option5.fromNullishOr(gizmoHandleOf(model.key, key));
2387
+ var held2 = (model) => model.gizmo.grab !== null;
2388
+ var nodes3 = (model, placement, camera) => gizmoNodes(model.key, model.gizmo, placement, camera);
2389
+ // src/viewportGizmo.ts
2390
+ import {
2391
+ cameraAlong,
2392
+ hud as describeHud,
2393
+ SceneSchema as SceneSchema7,
2394
+ viewportAxisOf,
2395
+ viewportGizmoNodes
2396
+ } from "@opsydyn/effect-three";
2397
+ import { Option as Option6, Schema as Schema7 } from "effect";
2398
+ import { defineMessageUnion as defineMessageUnion6 } from "foldkit/message";
2399
+ var Axis = Schema7.Literals(["x", "y", "z", "-x", "-y", "-z"]);
2400
+ var Model5 = Schema7.Struct({
2401
+ key: Schema7.String,
2402
+ hovered: Schema7.NullOr(Axis),
2403
+ hideNegativeAxes: Schema7.Boolean
2404
+ });
2405
+ var Message5 = defineMessageUnion6({
2406
+ Entered: { key: Schema7.String },
2407
+ Left: { key: Schema7.String },
2408
+ Pressed: { key: Schema7.String, camera: SceneSchema7.Camera }
2409
+ });
2410
+ var OutMessage5 = defineMessageUnion6({
2411
+ Turned: { camera: SceneSchema7.Camera }
2412
+ });
2413
+ var init5 = (key, options = {}) => ({
2414
+ key,
2415
+ hovered: null,
2416
+ hideNegativeAxes: options.hideNegativeAxes ?? false
2417
+ });
2418
+ var axisOf = (model, key) => Option6.fromNullishOr(viewportAxisOf(model.key, key));
2419
+ var entered = (model, key) => Option6.match(axisOf(model, key), {
2420
+ onNone: () => model,
2421
+ onSome: (axis) => ({ ...model, hovered: axis })
2422
+ });
2423
+ var left = (model, key) => Option6.match(axisOf(model, key), {
2424
+ onNone: () => model,
2425
+ onSome: () => ({ ...model, hovered: null })
2426
+ });
2427
+ var pressed = (model, key, camera) => Option6.match(axisOf(model, key), {
2428
+ onNone: () => ({ model }),
2429
+ onSome: (axis) => ({
2430
+ model,
2431
+ outMessage: OutMessage5.Turned({ camera: cameraAlong(camera, axis) })
2432
+ })
2433
+ });
2434
+ var update5 = (model, message) => Message5.match(message, {
2435
+ Entered: ({ key }) => ({ model: entered(model, key) }),
2436
+ Left: ({ key }) => ({ model: left(model, key) }),
2437
+ Pressed: ({ key, camera }) => pressed(model, key, camera)
2438
+ });
2439
+ var nodes4 = (model, camera) => viewportGizmoNodes(model.key, camera, {
2440
+ hovered: model.hovered,
2441
+ hideNegativeAxes: model.hideNegativeAxes
2442
+ });
2443
+ var hud = (model, camera, placement = {}) => describeHud({ ...placement, children: [nodes4(model, camera)] });
1948
2444
  // src/view.ts
1949
- import { Array as Arr, Option as Option2 } from "effect";
2445
+ import { Array as Arr, Option as Option7 } from "effect";
1950
2446
  import { Mount as Mount2 } from "foldkit";
1951
2447
 
1952
2448
  // src/overlayView.ts
@@ -1973,39 +2469,40 @@ var overlayLayer = (h, overlays) => overlays.length === 0 ? [] : [
1973
2469
  ];
1974
2470
 
1975
2471
  // src/view.ts
1976
- var given = Option2.fromNullishOr;
2472
+ var given = Option7.fromNullishOr;
1977
2473
  var view = (config, h) => {
1978
2474
  const element = sceneElement.withMessage(h);
1979
2475
  const optional = Arr.getSomes([
1980
- Option2.map(given(config.onClick), element.OnSceneClick),
1981
- Option2.map(given(config.onDoubleClick), element.OnSceneDoubleClick),
1982
- Option2.map(given(config.onContextMenu), element.OnSceneContextMenu),
1983
- Option2.map(given(config.onPointerDown), element.OnScenePointerDown),
1984
- Option2.map(given(config.onPointerUp), element.OnScenePointerUp),
1985
- Option2.map(given(config.onPointerEnter), element.OnScenePointerEnter),
1986
- Option2.map(given(config.onPointerMove), element.OnScenePointerMove),
1987
- Option2.map(given(config.onPointerLeave), element.OnScenePointerLeave),
1988
- Option2.map(given(config.onPointerMissed), element.OnScenePointerMissed),
1989
- Option2.map(given(config.onWheel), element.OnSceneWheel),
1990
- Option2.map(given(config.onDrag), element.OnSceneDrag),
1991
- Option2.map(given(config.onDragEnd), element.OnSceneDragEnd),
1992
- Option2.map(given(config.onCollision), element.OnSceneCollision),
1993
- Option2.map(given(config.onContactForce), element.OnSceneContactForce),
1994
- Option2.map(given(config.onMeasured), element.OnSceneMeasured),
1995
- Option2.map(given(config.onLabelMeasured), element.OnSceneLabelMeasured),
1996
- Option2.map(given(config.onXRSession), element.OnSceneXr),
1997
- Option2.map(given(config.onXRStick), element.OnSceneXrStick),
1998
- Option2.map(given(config.onXRButton), element.OnSceneXrButton),
1999
- Option2.map(given(config.onXRSurface), element.OnSceneXrSurface),
2000
- Option2.map(given(config.onXRMoved), element.OnSceneXrMoved),
2001
- Option2.map(given(config.onXRPlanes), element.OnSceneXrPlanes),
2002
- Option2.map(given(config.onXRMeshes), element.OnSceneXrMeshes),
2003
- Option2.map(given(config.onAutoRotated), element.OnSceneAutoRotated),
2004
- Option2.map(given(config.onGesture), (toMessage) => element.OnSceneGesture((detail) => toMessage(detail.gesture))),
2005
- Option2.map(given(config.onPerformanceChange), element.OnScenePerformance),
2006
- Option2.map(given(config.onError), element.OnSceneError),
2007
- Option2.map(given(config.onReconciled), element.OnSceneReconciled),
2008
- Option2.map(given(config.className), h.Class)
2476
+ Option7.map(given(config.onClick), element.OnSceneClick),
2477
+ Option7.map(given(config.onDoubleClick), element.OnSceneDoubleClick),
2478
+ Option7.map(given(config.onContextMenu), element.OnSceneContextMenu),
2479
+ Option7.map(given(config.onPointerDown), element.OnScenePointerDown),
2480
+ Option7.map(given(config.onPointerUp), element.OnScenePointerUp),
2481
+ Option7.map(given(config.onPointerEnter), element.OnScenePointerEnter),
2482
+ Option7.map(given(config.onPointerMove), element.OnScenePointerMove),
2483
+ Option7.map(given(config.onPointerLeave), element.OnScenePointerLeave),
2484
+ Option7.map(given(config.onPointerMissed), element.OnScenePointerMissed),
2485
+ Option7.map(given(config.onWheel), element.OnSceneWheel),
2486
+ Option7.map(given(config.onDrag), element.OnSceneDrag),
2487
+ Option7.map(given(config.onDragEnd), element.OnSceneDragEnd),
2488
+ Option7.map(given(config.onCollision), element.OnSceneCollision),
2489
+ Option7.map(given(config.onContactForce), element.OnSceneContactForce),
2490
+ Option7.map(given(config.onMeasured), element.OnSceneMeasured),
2491
+ Option7.map(given(config.onLabelMeasured), element.OnSceneLabelMeasured),
2492
+ Option7.map(given(config.onXRSession), element.OnSceneXr),
2493
+ Option7.map(given(config.onXRStick), element.OnSceneXrStick),
2494
+ Option7.map(given(config.onXRButton), element.OnSceneXrButton),
2495
+ Option7.map(given(config.onXRSurface), element.OnSceneXrSurface),
2496
+ Option7.map(given(config.onXRMoved), element.OnSceneXrMoved),
2497
+ Option7.map(given(config.onXRPlanes), element.OnSceneXrPlanes),
2498
+ Option7.map(given(config.onXRMeshes), element.OnSceneXrMeshes),
2499
+ Option7.map(given(config.onAutoRotated), element.OnSceneAutoRotated),
2500
+ Option7.map(given(config.onGesture), (toMessage) => element.OnSceneGesture((detail) => toMessage(detail.gesture))),
2501
+ Option7.map(given(config.onGestureEnd), element.OnSceneGestureEnd),
2502
+ Option7.map(given(config.onPerformanceChange), element.OnScenePerformance),
2503
+ Option7.map(given(config.onError), element.OnSceneError),
2504
+ Option7.map(given(config.onReconciled), element.OnSceneReconciled),
2505
+ Option7.map(given(config.className), h.Class)
2009
2506
  ]);
2010
2507
  const lifecycle = Mount2.mapMessage(config.mount(), config.onLifecycle);
2011
2508
  const overlays = config.overlays ?? [];
@@ -2014,9 +2511,14 @@ var view = (config, h) => {
2014
2511
  };
2015
2512
  export {
2016
2513
  AssetLoadError,
2514
+ exports_boxSelect as BoxSelect,
2515
+ exports_measuringTape as MeasuringTape,
2516
+ exports_pivotControls as PivotControls,
2017
2517
  ReconciledDetail,
2018
2518
  SceneError,
2019
2519
  SceneLifecycle,
2520
+ exports_transformGizmo as TransformGizmo,
2521
+ exports_viewportGizmo as ViewportGizmo,
2020
2522
  XrSessionDetail,
2021
2523
  XrUnavailable,
2022
2524
  animationFrameScheduler,
@@ -2024,6 +2526,7 @@ export {
2024
2526
  claimsContextMenu,
2025
2527
  defaultPixelRatio,
2026
2528
  domEventName,
2529
+ inspectorView,
2027
2530
  makeAssets,
2028
2531
  makeEnvironment,
2029
2532
  makeSceneMount,
@@ -2037,5 +2540,5 @@ export {
2037
2540
  webgpuRendererFactory
2038
2541
  };
2039
2542
 
2040
- //# debugId=4118984BABDF337D64756E2164756E21
2543
+ //# debugId=B27477F988FB686A64756E2164756E21
2041
2544
  //# sourceMappingURL=index.js.map