@deck.gl/widgets 9.3.7 → 9.4.0-alpha.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/dist/index.cjs CHANGED
@@ -53,7 +53,8 @@ __export(dist_exports, {
53
53
  _SimpleMenu: () => SimpleMenu,
54
54
  _SplitterWidget: () => SplitterWidget,
55
55
  _StatsWidget: () => StatsWidget,
56
- _TimelineWidget: () => TimelineWidget
56
+ _TimelineWidget: () => TimelineWidget,
57
+ buildViewsFromViewLayout: () => buildViewsFromViewLayout
57
58
  });
58
59
  module.exports = __toCommonJS(dist_exports);
59
60
 
@@ -170,12 +171,12 @@ var ZoomWidget = class extends import_core.Widget {
170
171
  }
171
172
  handleZoomIn() {
172
173
  for (const viewId of this.viewIds) {
173
- this.handleZoom(viewId, 1);
174
+ this.handleZoom(viewId, this.props.zoomStep);
174
175
  }
175
176
  }
176
177
  handleZoomOut() {
177
178
  for (const viewId of this.viewIds) {
178
- this.handleZoom(viewId, -1);
179
+ this.handleZoom(viewId, -this.props.zoomStep);
179
180
  }
180
181
  }
181
182
  };
@@ -185,6 +186,7 @@ ZoomWidget.defaultProps = {
185
186
  placement: "top-left",
186
187
  orientation: "vertical",
187
188
  transitionDuration: 200,
189
+ zoomStep: 1,
188
190
  zoomInLabel: "Zoom In",
189
191
  zoomOutLabel: "Zoom Out",
190
192
  zoomAxis: "all",
@@ -1002,17 +1004,506 @@ FullscreenWidget.defaultProps = {
1002
1004
  var import_jsx_runtime11 = require("preact/jsx-runtime");
1003
1005
  var import_preact8 = require("preact");
1004
1006
  var import_hooks3 = require("preact/hooks");
1007
+ var import_core10 = require("@deck.gl/core");
1008
+
1009
+ // dist/view-layout/view-layout.js
1005
1010
  var import_core9 = require("@deck.gl/core");
1006
- function parseViewLayout(root) {
1011
+ var VIEW_LAYOUT_TYPES = /* @__PURE__ */ new Set(["row", "column", "overlay", "spacer"]);
1012
+ var VIEW_LAYOUT_ORIENTATIONS = /* @__PURE__ */ new Set(["horizontal", "vertical"]);
1013
+ function isViewLayout(child) {
1014
+ return Boolean(child && typeof child === "object" && !(child instanceof import_core9.View) && ("type" in child && VIEW_LAYOUT_TYPES.has(String(child.type)) || "orientation" in child && VIEW_LAYOUT_ORIENTATIONS.has(String(child.orientation))));
1015
+ }
1016
+ function getViewLayoutType(item) {
1017
+ if ("orientation" in item) {
1018
+ return item.orientation === "horizontal" ? "row" : "column";
1019
+ }
1020
+ return item.type;
1021
+ }
1022
+ function getViewLayoutChildren(item) {
1023
+ return "views" in item ? item.views : item.children;
1024
+ }
1025
+ function assertViewLayout(item) {
1026
+ if (!item || typeof item !== "object") {
1027
+ throw new Error("ViewLayout must be an object.");
1028
+ }
1029
+ const type = getViewLayoutType(item);
1030
+ switch (type) {
1031
+ case "row":
1032
+ case "column":
1033
+ case "overlay": {
1034
+ const children = getViewLayoutChildren(item);
1035
+ if (!Array.isArray(children)) {
1036
+ throw new Error("ViewLayout requires a children or views array.");
1037
+ }
1038
+ if (isSplitLayoutItem(item) && item.splitId) {
1039
+ if (children.filter(Boolean).length < 2) {
1040
+ throw new Error("ViewLayout with splitId requires at least two children.");
1041
+ }
1042
+ }
1043
+ children.forEach(assertViewLayoutChild);
1044
+ break;
1045
+ }
1046
+ case "spacer":
1047
+ break;
1048
+ default:
1049
+ throw new Error(`Unsupported view layout item: ${String(type)}`);
1050
+ }
1051
+ }
1052
+ function isSplitLayoutItem(item) {
1053
+ const type = getViewLayoutType(item);
1054
+ return type === "row" || type === "column";
1055
+ }
1056
+ function assertViewLayoutChild(child) {
1057
+ if (!child) {
1058
+ return;
1059
+ }
1060
+ if (isViewLayout(child)) {
1061
+ assertViewLayout(child);
1062
+ return;
1063
+ }
1064
+ if (child instanceof import_core9.View) {
1065
+ return;
1066
+ }
1067
+ throw new Error("ViewLayout children must be deck.gl View instances or layout objects.");
1068
+ }
1069
+
1070
+ // dist/view-layout/build-views-from-view-layout.js
1071
+ function buildViewsFromViewLayout(args) {
1072
+ var _a;
1073
+ assertViewLayout(args.layout);
1074
+ const rootRect = {
1075
+ x: 0,
1076
+ y: 0,
1077
+ width: Math.max(1, args.width),
1078
+ height: Math.max(1, args.height)
1079
+ };
1080
+ const previousViewsById = new Map((((_a = args.previous) == null ? void 0 : _a.views) ?? []).map((view) => [getViewId(view), view]).filter((entry) => Boolean(entry[0])));
1081
+ const outputViews = [];
1082
+ const rectsById = {};
1083
+ const splittersById = {};
1084
+ compileLayoutItem({
1085
+ item: args.layout,
1086
+ rect: rootRect,
1087
+ rootRect,
1088
+ outputViews,
1089
+ rectsById,
1090
+ splittersById,
1091
+ previousViewsById,
1092
+ splitValues: args.splitValues ?? {},
1093
+ viewPropsById: args.viewPropsById ?? {}
1094
+ });
1095
+ return {
1096
+ views: outputViews,
1097
+ rectsById,
1098
+ splittersById
1099
+ };
1100
+ }
1101
+ function compileLayoutItem(args) {
1102
+ const { item } = args;
1103
+ const type = getViewLayoutType(item);
1104
+ switch (type) {
1105
+ case "row":
1106
+ compileStackLayout({
1107
+ ...args,
1108
+ item,
1109
+ orientation: "row",
1110
+ children: getViewLayoutChildren(item)
1111
+ });
1112
+ return;
1113
+ case "column":
1114
+ compileStackLayout({
1115
+ ...args,
1116
+ item,
1117
+ orientation: "column",
1118
+ children: getViewLayoutChildren(item)
1119
+ });
1120
+ return;
1121
+ case "overlay":
1122
+ compileOverlayLayout({
1123
+ ...args,
1124
+ item,
1125
+ children: getViewLayoutChildren(item)
1126
+ });
1127
+ return;
1128
+ case "spacer":
1129
+ return;
1130
+ default:
1131
+ throw new Error(`Unsupported view layout item: ${String(type)}`);
1132
+ }
1133
+ }
1134
+ function compileStackLayout(args) {
1135
+ const containerRect = applyInsets(args.rect, args.item.inset);
1136
+ const children = args.children.filter(isPresentChild);
1137
+ if (children.length === 0) {
1138
+ return;
1139
+ }
1140
+ const containerAxisLength = args.orientation === "row" ? containerRect.width : containerRect.height;
1141
+ const stackAxisConfig = getStackAxisConfig({
1142
+ children,
1143
+ containerAxisLength,
1144
+ item: args.item,
1145
+ orientation: args.orientation,
1146
+ splitValues: args.splitValues
1147
+ });
1148
+ let cursor = args.orientation === "row" ? containerRect.x : containerRect.y;
1149
+ for (const splitConfig of stackAxisConfig.splitConfigs) {
1150
+ args.splittersById[splitConfig.splitId] = {
1151
+ id: splitConfig.splitId,
1152
+ orientation: args.orientation === "row" ? "horizontal" : "vertical",
1153
+ x: containerRect.x / args.rootRect.width * 100,
1154
+ y: containerRect.y / args.rootRect.height * 100,
1155
+ width: containerRect.width / args.rootRect.width * 100,
1156
+ height: containerRect.height / args.rootRect.height * 100,
1157
+ split: splitConfig.split,
1158
+ minSplit: splitConfig.minSplit,
1159
+ maxSplit: splitConfig.maxSplit
1160
+ };
1161
+ }
1162
+ children.forEach((child, index) => {
1163
+ const childAxisLength = stackAxisConfig.childAxisLengths[index];
1164
+ const childRect = args.orientation === "row" ? {
1165
+ x: cursor,
1166
+ y: containerRect.y,
1167
+ width: childAxisLength,
1168
+ height: containerRect.height
1169
+ } : {
1170
+ x: containerRect.x,
1171
+ y: cursor,
1172
+ width: containerRect.width,
1173
+ height: childAxisLength
1174
+ };
1175
+ cursor += childAxisLength;
1176
+ compileLayoutChild({
1177
+ child,
1178
+ rect: childRect,
1179
+ rootRect: args.rootRect,
1180
+ outputViews: args.outputViews,
1181
+ rectsById: args.rectsById,
1182
+ splittersById: args.splittersById,
1183
+ previousViewsById: args.previousViewsById,
1184
+ splitValues: args.splitValues,
1185
+ viewPropsById: args.viewPropsById
1186
+ });
1187
+ });
1188
+ }
1189
+ function compileOverlayLayout(args) {
1190
+ const containerRect = applyInsets(args.rect, args.item.inset);
1191
+ args.children.filter(isPresentChild).forEach((child) => compileLayoutChild({
1192
+ child,
1193
+ rect: containerRect,
1194
+ rootRect: args.rootRect,
1195
+ outputViews: args.outputViews,
1196
+ rectsById: args.rectsById,
1197
+ splittersById: args.splittersById,
1198
+ previousViewsById: args.previousViewsById,
1199
+ splitValues: args.splitValues,
1200
+ viewPropsById: args.viewPropsById
1201
+ }));
1202
+ }
1203
+ function compileLayoutChild(args) {
1204
+ if (isViewLayout(args.child)) {
1205
+ compileLayoutItem({
1206
+ item: args.child,
1207
+ rect: args.rect,
1208
+ rootRect: args.rootRect,
1209
+ outputViews: args.outputViews,
1210
+ rectsById: args.rectsById,
1211
+ splittersById: args.splittersById,
1212
+ previousViewsById: args.previousViewsById,
1213
+ splitValues: args.splitValues,
1214
+ viewPropsById: args.viewPropsById
1215
+ });
1216
+ return;
1217
+ }
1218
+ compileResolvedView({
1219
+ view: args.child,
1220
+ rect: args.rect,
1221
+ outputViews: args.outputViews,
1222
+ rectsById: args.rectsById,
1223
+ previousViewsById: args.previousViewsById,
1224
+ viewPropsById: args.viewPropsById
1225
+ });
1226
+ }
1227
+ function getStackAxisConfig(args) {
1228
+ const constraints = args.children.map((child) => getStackChildAxisConstraints(child, args.orientation, args.containerAxisLength));
1229
+ if (args.item.splitId) {
1230
+ return getSplitStackAxisConfig({ ...args, constraints });
1231
+ }
1232
+ return {
1233
+ childAxisLengths: getConstrainedStackChildAxisLengths(args.containerAxisLength, constraints),
1234
+ splitConfigs: []
1235
+ };
1236
+ }
1237
+ function getSplitStackAxisConfig(args) {
1238
+ const axisLength = Math.max(args.containerAxisLength, 1);
1239
+ const boundaries = getDefaultSplitBoundaries(args);
1240
+ const splitConfigs = [];
1241
+ for (let index = 0; index < boundaries.length; index++) {
1242
+ const splitId = getSplitId(args.item.splitId, args.children.length, index);
1243
+ const desiredSplit = args.splitValues[splitId] ?? (args.children.length === 2 ? args.item.initialSplit : void 0) ?? boundaries[index];
1244
+ const { minSplit, maxSplit } = getSplitBoundaryLimits({
1245
+ index,
1246
+ boundaries,
1247
+ constraints: args.constraints,
1248
+ axisLength,
1249
+ item: args.item
1250
+ });
1251
+ const split = Math.min(Math.max(desiredSplit, minSplit), maxSplit);
1252
+ boundaries[index] = split;
1253
+ splitConfigs.push({ splitId, split, minSplit, maxSplit });
1254
+ }
1255
+ return {
1256
+ childAxisLengths: getStackAxisLengthsFromBoundaries(args.containerAxisLength, boundaries),
1257
+ splitConfigs
1258
+ };
1259
+ }
1260
+ function getDefaultSplitBoundaries(args) {
1261
+ const childAxisLengths = getConstrainedStackChildAxisLengths(args.containerAxisLength, args.constraints);
1262
+ const totalLength = childAxisLengths.reduce((sum, length) => sum + length, 0);
1263
+ if (totalLength <= 0) {
1264
+ return args.children.slice(1).map((_, index) => (index + 1) / args.children.length);
1265
+ }
1266
+ let cursor = 0;
1267
+ return childAxisLengths.slice(0, -1).map((length) => {
1268
+ cursor += length;
1269
+ return cursor / totalLength;
1270
+ });
1271
+ }
1272
+ function getSplitBoundaryLimits(args) {
1273
+ const previousSplit = args.index === 0 ? 0 : args.boundaries[args.index - 1];
1274
+ const nextSplit = args.index === args.boundaries.length - 1 ? 1 : args.boundaries[args.index + 1];
1275
+ const leftConstraints = args.constraints[args.index];
1276
+ const rightConstraints = args.constraints[args.index + 1];
1277
+ const leftMaxSplit = Number.isFinite(leftConstraints.maxPixels) ? previousSplit + leftConstraints.maxPixels / args.axisLength : 1;
1278
+ const rightMaxSplit = Number.isFinite(rightConstraints.maxPixels) ? nextSplit - rightConstraints.maxPixels / args.axisLength : 0;
1279
+ const minSplit = Math.max(args.item.minSplit ?? 0.05, previousSplit + leftConstraints.minPixels / args.axisLength, rightMaxSplit);
1280
+ const maxSplit = Math.max(minSplit, Math.min(args.item.maxSplit ?? 0.95, nextSplit - rightConstraints.minPixels / args.axisLength, leftMaxSplit));
1281
+ return { minSplit, maxSplit };
1282
+ }
1283
+ function getSplitId(splitId, childCount, index) {
1284
+ return childCount === 2 ? splitId : `${splitId}-${index}`;
1285
+ }
1286
+ function getStackAxisLengthsFromBoundaries(containerAxisLength, boundaries) {
1287
+ let previousBoundary = 0;
1288
+ const childAxisLengths = boundaries.map((boundary) => {
1289
+ const length = containerAxisLength * (boundary - previousBoundary);
1290
+ previousBoundary = boundary;
1291
+ return length;
1292
+ });
1293
+ childAxisLengths.push(containerAxisLength * (1 - previousBoundary));
1294
+ return childAxisLengths;
1295
+ }
1296
+ function getConstrainedStackChildAxisLengths(containerAxisLength, constraints) {
1297
+ const { childAxisLengths, flexibleChildIndexes, fixedLength } = getInitialStackChildAxisLengths(constraints);
1298
+ let remainingLength = Math.max(containerAxisLength - fixedLength, 0);
1299
+ let unsettledIndexes = flexibleChildIndexes;
1300
+ while (unsettledIndexes.length > 0) {
1301
+ const sharedLength = remainingLength / unsettledIndexes.length;
1302
+ const nextIndexes = [];
1303
+ let didClamp = false;
1304
+ for (const index of unsettledIndexes) {
1305
+ const { minPixels, maxPixels } = constraints[index];
1306
+ if (sharedLength < minPixels) {
1307
+ childAxisLengths[index] = minPixels;
1308
+ remainingLength -= minPixels;
1309
+ didClamp = true;
1310
+ } else if (sharedLength > maxPixels) {
1311
+ childAxisLengths[index] = maxPixels;
1312
+ remainingLength -= maxPixels;
1313
+ didClamp = true;
1314
+ } else {
1315
+ nextIndexes.push(index);
1316
+ }
1317
+ }
1318
+ if (!didClamp) {
1319
+ for (const index of unsettledIndexes) {
1320
+ childAxisLengths[index] = sharedLength;
1321
+ }
1322
+ break;
1323
+ }
1324
+ unsettledIndexes = nextIndexes;
1325
+ }
1326
+ return childAxisLengths.map((length) => length ?? 0);
1327
+ }
1328
+ function getInitialStackChildAxisLengths(constraints) {
1329
+ const childAxisLengths = constraints.map(({ explicitLength }) => explicitLength);
1330
+ const flexibleChildIndexes = [];
1331
+ let fixedLength = 0;
1332
+ childAxisLengths.forEach((length, index) => {
1333
+ if (length === void 0) {
1334
+ flexibleChildIndexes.push(index);
1335
+ } else {
1336
+ fixedLength += length;
1337
+ }
1338
+ });
1339
+ return { childAxisLengths, flexibleChildIndexes, fixedLength };
1340
+ }
1341
+ function compileResolvedView(args) {
1342
+ const viewId = getRequiredViewId(args.view);
1343
+ const resolvedRect = resolveViewRectWithinParent(args.view, args.rect, args.viewPropsById[viewId]);
1344
+ args.rectsById[viewId] = resolvedRect;
1345
+ const nextProps = {
1346
+ ...args.view.props,
1347
+ x: resolvedRect.x,
1348
+ y: resolvedRect.y,
1349
+ width: resolvedRect.width,
1350
+ height: resolvedRect.height
1351
+ };
1352
+ const previousView = args.previousViewsById.get(viewId);
1353
+ const nextView = previousView && previousView.constructor === args.view.constructor && arePropsEqual(previousView.props, nextProps) ? previousView : instantiateView(args.view, nextProps);
1354
+ args.outputViews.push(nextView);
1355
+ }
1356
+ function getStackChildAxisConstraints(child, orientation, parentAxisLength) {
1357
+ const axisValue = getAxisLengthValue(child, orientation);
1358
+ const minPixels = getPixelConstraintValue(child, "minPixels") ?? 0;
1359
+ const maxPixels = getPixelConstraintValue(child, "maxPixels") ?? Number.POSITIVE_INFINITY;
1360
+ if (axisValue === void 0) {
1361
+ return { minPixels, maxPixels };
1362
+ }
1363
+ const explicitLength = Math.min(Math.max(resolveLength(axisValue, parentAxisLength), minPixels), maxPixels);
1364
+ return { explicitLength, minPixels, maxPixels };
1365
+ }
1366
+ function resolveViewRectWithinParent(view, parentRect, overrides) {
1367
+ const props = { ...view.props, ...overrides };
1368
+ const x = parentRect.x + resolveOffset(props.x, parentRect.width);
1369
+ const y = parentRect.y + resolveOffset(props.y, parentRect.height);
1370
+ const width = resolveDimension(props.width, parentRect.width, parentRect.width);
1371
+ const height = resolveDimension(props.height, parentRect.height, parentRect.height);
1372
+ return {
1373
+ x,
1374
+ y,
1375
+ width,
1376
+ height
1377
+ };
1378
+ }
1379
+ function instantiateView(view, props) {
1380
+ const ViewConstructor = view.constructor;
1381
+ return new ViewConstructor(props);
1382
+ }
1383
+ function getAxisLengthValue(child, orientation) {
1384
+ if (isViewLayout(child)) {
1385
+ return orientation === "row" ? child.width : child.height;
1386
+ }
1387
+ const props = child.props;
1388
+ return orientation === "row" ? props.width : props.height;
1389
+ }
1390
+ function getPixelConstraintValue(child, propName) {
1391
+ const value = isViewLayout(child) ? child[propName] : child.props[propName];
1392
+ return typeof value === "number" ? value : void 0;
1393
+ }
1394
+ function applyInsets(rect, inset) {
1395
+ if (!inset) {
1396
+ return rect;
1397
+ }
1398
+ const top = inset.top ?? 0;
1399
+ const right = inset.right ?? 0;
1400
+ const bottom = inset.bottom ?? 0;
1401
+ const left = inset.left ?? 0;
1402
+ return {
1403
+ x: rect.x + left,
1404
+ y: rect.y + top,
1405
+ width: Math.max(0, rect.width - left - right),
1406
+ height: Math.max(0, rect.height - top - bottom)
1407
+ };
1408
+ }
1409
+ function resolveOffset(value, parentLength) {
1410
+ if (value === void 0 || value === null) {
1411
+ return 0;
1412
+ }
1413
+ return resolveLength(value, parentLength);
1414
+ }
1415
+ function resolveDimension(value, parentLength, fallback) {
1416
+ if (value === void 0 || value === null) {
1417
+ return fallback;
1418
+ }
1419
+ return resolveLength(value, parentLength);
1420
+ }
1421
+ function resolveLength(value, parentLength) {
1422
+ if (typeof value === "number") {
1423
+ return value;
1424
+ }
1425
+ const normalized = value.trim();
1426
+ if (normalized.length === 0) {
1427
+ throw new Error("View layout length must not be empty.");
1428
+ }
1429
+ if (normalized.startsWith("calc(") && normalized.endsWith(")")) {
1430
+ return resolveCalcExpression(normalized.slice(5, -1), parentLength);
1431
+ }
1432
+ return resolveLengthTerm(normalized, parentLength);
1433
+ }
1434
+ function resolveCalcExpression(expression, parentLength) {
1435
+ const sanitized = expression.replace(/\s+/g, "");
1436
+ const terms = sanitized.match(/[+-]?[^+-]+/g);
1437
+ if (!terms) {
1438
+ throw new Error(`Unsupported calc expression: calc(${expression})`);
1439
+ }
1440
+ return terms.reduce((sum, term) => sum + resolveLengthTerm(term, parentLength), 0);
1441
+ }
1442
+ function resolveLengthTerm(term, parentLength) {
1443
+ if (term.endsWith("%")) {
1444
+ return Number.parseFloat(term.slice(0, -1)) / 100 * parentLength;
1445
+ }
1446
+ if (term.endsWith("px")) {
1447
+ return Number.parseFloat(term.slice(0, -2));
1448
+ }
1449
+ return Number.parseFloat(term);
1450
+ }
1451
+ function getViewId(view) {
1452
+ const viewId = view.props.id;
1453
+ return typeof viewId === "string" && viewId.length > 0 ? viewId : null;
1454
+ }
1455
+ function getRequiredViewId(view) {
1456
+ const viewId = getViewId(view);
1457
+ if (!viewId) {
1458
+ throw new Error("Every compiled deck view must have a string id.");
1459
+ }
1460
+ return viewId;
1461
+ }
1462
+ function arePropsEqual(left, right) {
1463
+ if (left === right) {
1464
+ return true;
1465
+ }
1466
+ const leftKeys = Object.keys(left);
1467
+ const rightKeys = Object.keys(right);
1468
+ if (leftKeys.length !== rightKeys.length) {
1469
+ return false;
1470
+ }
1471
+ return leftKeys.every((key) => areValuesEqual(left[key], right[key]));
1472
+ }
1473
+ function areValuesEqual(left, right) {
1474
+ if (Object.is(left, right)) {
1475
+ return true;
1476
+ }
1477
+ if (Array.isArray(left) && Array.isArray(right)) {
1478
+ return left.length === right.length && left.every((value, index) => areValuesEqual(value, right[index]));
1479
+ }
1480
+ if (isPlainObject(left) && isPlainObject(right)) {
1481
+ const leftEntries = Object.keys(left);
1482
+ const rightEntries = Object.keys(right);
1483
+ return leftEntries.length === rightEntries.length && leftEntries.every((key) => areValuesEqual(left[key], right[key]));
1484
+ }
1485
+ return false;
1486
+ }
1487
+ function isPlainObject(value) {
1488
+ return Boolean(value) && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype;
1489
+ }
1490
+ function isPresentChild(child) {
1491
+ return Boolean(child);
1492
+ }
1493
+
1494
+ // dist/splitter-widget.js
1495
+ function adaptViewLayout(root) {
1007
1496
  const layoutsById = [];
1008
- const isViewLayout = (v) => "views" in v;
1009
- function createManagedViewLayout(l) {
1497
+ const isViewLayout2 = (v) => "views" in v;
1498
+ function adaptLayout(l) {
1010
1499
  const id = layoutsById.length;
1500
+ const splitId = `splitter-${id}`;
1011
1501
  const minSplit = l.minSplit ?? 0.05;
1012
1502
  const maxSplit = l.maxSplit ?? 0.95;
1013
1503
  const split = Math.min(Math.max(l.initialSplit ?? 0.5, minSplit), maxSplit);
1014
1504
  const managed = {
1015
1505
  id,
1506
+ splitId,
1016
1507
  orientation: l.orientation,
1017
1508
  views: l.views,
1018
1509
  split,
@@ -1025,79 +1516,75 @@ function parseViewLayout(root) {
1025
1516
  height: 0
1026
1517
  };
1027
1518
  layoutsById.push(managed);
1028
- managed.views = [
1029
- isViewLayout(l.views[0]) ? createManagedViewLayout(l.views[0]) : l.views[0],
1030
- isViewLayout(l.views[1]) ? createManagedViewLayout(l.views[1]) : l.views[1]
1031
- ];
1032
- return managed;
1033
- }
1034
- createManagedViewLayout(root);
1035
- return layoutsById;
1036
- }
1037
- function evaluateViews(root) {
1038
- const views = [];
1039
- function evaluateViewLayout(l, x, y, width, height) {
1040
- l.x = x;
1041
- l.y = y;
1042
- l.width = width;
1043
- l.height = height;
1044
- const child1X = x;
1045
- const child1Y = y;
1046
- let child1Width = width;
1047
- let child1Height = height;
1048
- let child2X = x;
1049
- let child2Y = y;
1050
- let child2Width = width;
1051
- let child2Height = height;
1052
- if (l.orientation === "horizontal") {
1053
- child1Width = width * l.split;
1054
- child2X = x + child1Width;
1055
- child2Width = width - child1Width;
1056
- } else {
1057
- child1Height = height * l.split;
1058
- child2Y = y + child1Height;
1059
- child2Height = height - child1Height;
1060
- }
1061
- const [view1, view2] = l.views;
1062
- if ("views" in view1) {
1063
- evaluateViewLayout(view1, child1X, child1Y, child1Width, child1Height);
1064
- } else {
1065
- views.push(view1.clone({
1066
- x: `${child1X}%`,
1067
- y: `${child1Y}%`,
1068
- width: `${child1Width}%`,
1069
- height: `${child1Height}%`
1070
- }));
1071
- }
1072
- if ("views" in view2) {
1073
- evaluateViewLayout(view2, child2X, child2Y, child2Width, child2Height);
1074
- } else {
1075
- views.push(view2.clone({
1076
- x: `${child2X}%`,
1077
- y: `${child2Y}%`,
1078
- width: `${child2Width}%`,
1079
- height: `${child2Height}%`
1080
- }));
1081
- }
1519
+ const childEntries = l.views.map((view) => {
1520
+ if (!isViewLayout2(view)) {
1521
+ return { layout: view, managed: view };
1522
+ }
1523
+ const adapted = adaptLayout(view);
1524
+ return { layout: adapted.layout, managed: adapted.managed };
1525
+ });
1526
+ managed.views = [childEntries[0].managed, childEntries[1].managed];
1527
+ const layout2 = {
1528
+ orientation: l.orientation,
1529
+ splitId,
1530
+ initialSplit: split,
1531
+ minSplit,
1532
+ maxSplit,
1533
+ views: [childEntries[0].layout, childEntries[1].layout]
1534
+ };
1535
+ return { layout: layout2, managed };
1082
1536
  }
1083
- evaluateViewLayout(root, 0, 0, 100, 100);
1084
- return views;
1537
+ const { layout } = adaptLayout(root);
1538
+ return { layout, viewLayouts: layoutsById };
1085
1539
  }
1086
- var SplitterWidget = class extends import_core9.Widget {
1540
+ function evaluateViews(layout, viewLayouts, splitValues) {
1541
+ const compiled = buildViewsFromViewLayout({
1542
+ layout,
1543
+ width: 100,
1544
+ height: 100,
1545
+ splitValues
1546
+ });
1547
+ for (const viewLayout of viewLayouts) {
1548
+ const splitter = compiled.splittersById[viewLayout.splitId];
1549
+ if (splitter) {
1550
+ viewLayout.x = splitter.x;
1551
+ viewLayout.y = splitter.y;
1552
+ viewLayout.width = splitter.width;
1553
+ viewLayout.height = splitter.height;
1554
+ viewLayout.split = splitter.split;
1555
+ viewLayout.minSplit = splitter.minSplit;
1556
+ viewLayout.maxSplit = splitter.maxSplit;
1557
+ }
1558
+ }
1559
+ return compiled.views.map((view) => view.clone({
1560
+ x: `${view.props.x}%`,
1561
+ y: `${view.props.y}%`,
1562
+ width: `${view.props.width}%`,
1563
+ height: `${view.props.height}%`
1564
+ }));
1565
+ }
1566
+ var SplitterWidget = class extends import_core10.Widget {
1087
1567
  constructor(props) {
1088
1568
  super(props);
1089
1569
  this.className = "deck-widget-splitter";
1090
1570
  this.placement = "fill";
1571
+ this.splitValues = {};
1091
1572
  this.needsUpdate = true;
1092
- this.viewLayouts = parseViewLayout(this.props.viewLayout);
1573
+ this.updateViewLayout(this.props.viewLayout);
1093
1574
  }
1094
1575
  setProps(props) {
1095
- if (props.viewLayout && !(0, import_core9._deepEqual)(props.viewLayout, this.props.viewLayout, -1)) {
1096
- this.viewLayouts = parseViewLayout(props.viewLayout);
1576
+ if (props.viewLayout && !(0, import_core10._deepEqual)(props.viewLayout, this.props.viewLayout, -1)) {
1577
+ this.updateViewLayout(props.viewLayout);
1097
1578
  this.views = void 0;
1098
1579
  }
1099
1580
  super.setProps(props);
1100
1581
  }
1582
+ updateViewLayout(viewLayout) {
1583
+ const adapted = adaptViewLayout(viewLayout);
1584
+ this.viewLayout = adapted.layout;
1585
+ this.viewLayouts = adapted.viewLayouts;
1586
+ this.splitValues = {};
1587
+ }
1101
1588
  onRedraw() {
1102
1589
  super.updateHTML();
1103
1590
  }
@@ -1106,7 +1593,7 @@ var SplitterWidget = class extends import_core9.Widget {
1106
1593
  // so we update deck props here and rerender DOM in the next onRedraw
1107
1594
  updateHTML() {
1108
1595
  if (!this.views) {
1109
- this.views = evaluateViews(this.viewLayouts[0]);
1596
+ this.views = evaluateViews(this.viewLayout, this.viewLayouts, this.splitValues);
1110
1597
  this.props.onChange(this.views.slice());
1111
1598
  }
1112
1599
  requestAnimationFrame(() => {
@@ -1128,8 +1615,8 @@ var SplitterWidget = class extends import_core9.Widget {
1128
1615
  }
1129
1616
  }
1130
1617
  onChange(newSplit, layout) {
1131
- layout.split = newSplit;
1132
- this.views = evaluateViews(this.viewLayouts[0]);
1618
+ this.splitValues = { ...this.splitValues, [layout.splitId]: newSplit };
1619
+ this.views = evaluateViews(this.viewLayout, this.viewLayouts, this.splitValues);
1133
1620
  this.props.onChange(this.views.slice());
1134
1621
  this.doUpdate();
1135
1622
  }
@@ -1138,7 +1625,7 @@ var SplitterWidget = class extends import_core9.Widget {
1138
1625
  }
1139
1626
  };
1140
1627
  SplitterWidget.defaultProps = {
1141
- ...import_core9.Widget.defaultProps,
1628
+ ...import_core10.Widget.defaultProps,
1142
1629
  id: "splitter-widget",
1143
1630
  viewLayout: void 0,
1144
1631
  onChange: () => {
@@ -1199,7 +1686,7 @@ function Splitter({ orientation, x, y, width, height, split, minSplit, maxSplit,
1199
1686
 
1200
1687
  // dist/info-widget.js
1201
1688
  var import_jsx_runtime14 = require("preact/jsx-runtime");
1202
- var import_core10 = require("@deck.gl/core");
1689
+ var import_core11 = require("@deck.gl/core");
1203
1690
  var import_preact9 = require("preact");
1204
1691
 
1205
1692
  // dist/lib/components/popover.js
@@ -1314,7 +1801,7 @@ var UserContent = ({ text, html, element, ...props }) => {
1314
1801
  };
1315
1802
 
1316
1803
  // dist/info-widget.js
1317
- var InfoWidget = class extends import_core10.Widget {
1804
+ var InfoWidget = class extends import_core11.Widget {
1318
1805
  constructor(props) {
1319
1806
  super(props);
1320
1807
  this.className = "deck-widget-info";
@@ -1385,7 +1872,7 @@ var InfoWidget = class extends import_core10.Widget {
1385
1872
  }
1386
1873
  };
1387
1874
  InfoWidget.defaultProps = {
1388
- ...import_core10.Widget.defaultProps,
1875
+ ...import_core11.Widget.defaultProps,
1389
1876
  id: "info",
1390
1877
  viewId: null,
1391
1878
  mode: "hover",
@@ -1397,9 +1884,9 @@ InfoWidget.defaultProps = {
1397
1884
 
1398
1885
  // dist/popup-widget.js
1399
1886
  var import_jsx_runtime15 = require("preact/jsx-runtime");
1400
- var import_core11 = require("@deck.gl/core");
1887
+ var import_core12 = require("@deck.gl/core");
1401
1888
  var import_preact10 = require("preact");
1402
- var PopupWidget = class extends import_core11.Widget {
1889
+ var PopupWidget = class extends import_core12.Widget {
1403
1890
  constructor(props) {
1404
1891
  super(props);
1405
1892
  this.className = "deck-widget-popup";
@@ -1448,7 +1935,7 @@ var PopupWidget = class extends import_core11.Widget {
1448
1935
  }
1449
1936
  };
1450
1937
  PopupWidget.defaultProps = {
1451
- ...import_core11.Widget.defaultProps,
1938
+ ...import_core12.Widget.defaultProps,
1452
1939
  id: "info",
1453
1940
  viewId: null,
1454
1941
  position: [0, 0],
@@ -1466,9 +1953,9 @@ PopupWidget.defaultProps = {
1466
1953
 
1467
1954
  // dist/context-menu-widget.js
1468
1955
  var import_jsx_runtime16 = require("preact/jsx-runtime");
1469
- var import_core12 = require("@deck.gl/core");
1956
+ var import_core13 = require("@deck.gl/core");
1470
1957
  var import_preact11 = require("preact");
1471
- var ContextMenuWidget = class extends import_core12.Widget {
1958
+ var ContextMenuWidget = class extends import_core13.Widget {
1472
1959
  constructor(props) {
1473
1960
  super(props);
1474
1961
  this.className = "deck-widget-context-menu";
@@ -1522,7 +2009,7 @@ var ContextMenuWidget = class extends import_core12.Widget {
1522
2009
  }
1523
2010
  };
1524
2011
  ContextMenuWidget.defaultProps = {
1525
- ...import_core12.Widget.defaultProps,
2012
+ ...import_core13.Widget.defaultProps,
1526
2013
  id: "context",
1527
2014
  viewId: null,
1528
2015
  menuItems: [],
@@ -1536,7 +2023,7 @@ ContextMenuWidget.defaultProps = {
1536
2023
 
1537
2024
  // dist/scrollbar-widget.js
1538
2025
  var import_jsx_runtime18 = require("preact/jsx-runtime");
1539
- var import_core13 = require("@deck.gl/core");
2026
+ var import_core14 = require("@deck.gl/core");
1540
2027
  var import_preact12 = require("preact");
1541
2028
 
1542
2029
  // dist/lib/components/range-input.js
@@ -1806,7 +2293,7 @@ var clamp3 = (value, min, max) => {
1806
2293
  }
1807
2294
  return value;
1808
2295
  };
1809
- var ScrollbarWidget = class extends import_core13.Widget {
2296
+ var ScrollbarWidget = class extends import_core14.Widget {
1810
2297
  constructor(props) {
1811
2298
  const resolved = {
1812
2299
  ...ScrollbarWidget.defaultProps,
@@ -1954,7 +2441,7 @@ var ScrollbarWidget = class extends import_core13.Widget {
1954
2441
  }
1955
2442
  };
1956
2443
  ScrollbarWidget.defaultProps = {
1957
- ...import_core13.Widget.defaultProps,
2444
+ ...import_core14.Widget.defaultProps,
1958
2445
  contentBounds: null,
1959
2446
  placement: "top-right",
1960
2447
  viewId: null,
@@ -1978,8 +2465,8 @@ function projectBounds(bounds, viewport, isVertical) {
1978
2465
  // dist/icon-widget.js
1979
2466
  var import_jsx_runtime19 = require("preact/jsx-runtime");
1980
2467
  var import_preact13 = require("preact");
1981
- var import_core14 = require("@deck.gl/core");
1982
- var IconWidget = class extends import_core14.Widget {
2468
+ var import_core15 = require("@deck.gl/core");
2469
+ var IconWidget = class extends import_core15.Widget {
1983
2470
  constructor(props) {
1984
2471
  super(props);
1985
2472
  this.className = "";
@@ -1997,7 +2484,7 @@ var IconWidget = class extends import_core14.Widget {
1997
2484
  }
1998
2485
  };
1999
2486
  IconWidget.defaultProps = {
2000
- ...import_core14.Widget.defaultProps,
2487
+ ...import_core15.Widget.defaultProps,
2001
2488
  id: "icon",
2002
2489
  placement: "top-left",
2003
2490
  viewId: null,
@@ -2010,8 +2497,8 @@ IconWidget.defaultProps = {
2010
2497
  // dist/toggle-widget.js
2011
2498
  var import_jsx_runtime20 = require("preact/jsx-runtime");
2012
2499
  var import_preact14 = require("preact");
2013
- var import_core15 = require("@deck.gl/core");
2014
- var ToggleWidget = class extends import_core15.Widget {
2500
+ var import_core16 = require("@deck.gl/core");
2501
+ var ToggleWidget = class extends import_core16.Widget {
2015
2502
  constructor(props) {
2016
2503
  super(props);
2017
2504
  this.className = "deck-widget-toggle";
@@ -2038,7 +2525,7 @@ var ToggleWidget = class extends import_core15.Widget {
2038
2525
  }
2039
2526
  };
2040
2527
  ToggleWidget.defaultProps = {
2041
- ...import_core15.Widget.defaultProps,
2528
+ ...import_core16.Widget.defaultProps,
2042
2529
  id: "icon",
2043
2530
  placement: "top-left",
2044
2531
  viewId: null,
@@ -2055,8 +2542,8 @@ ToggleWidget.defaultProps = {
2055
2542
  // dist/selector-widget.js
2056
2543
  var import_jsx_runtime21 = require("preact/jsx-runtime");
2057
2544
  var import_preact15 = require("preact");
2058
- var import_core16 = require("@deck.gl/core");
2059
- var SelectorWidget = class extends import_core16.Widget {
2545
+ var import_core17 = require("@deck.gl/core");
2546
+ var SelectorWidget = class extends import_core17.Widget {
2060
2547
  constructor(props) {
2061
2548
  super(props);
2062
2549
  this.className = "deck-widget-selector";
@@ -2093,7 +2580,7 @@ var SelectorWidget = class extends import_core16.Widget {
2093
2580
  }
2094
2581
  };
2095
2582
  SelectorWidget.defaultProps = {
2096
- ...import_core16.Widget.defaultProps,
2583
+ ...import_core17.Widget.defaultProps,
2097
2584
  id: "view-selector",
2098
2585
  placement: "top-left",
2099
2586
  viewId: null,
@@ -2105,9 +2592,9 @@ SelectorWidget.defaultProps = {
2105
2592
 
2106
2593
  // dist/timeline-widget.js
2107
2594
  var import_jsx_runtime22 = require("preact/jsx-runtime");
2108
- var import_core17 = require("@deck.gl/core");
2595
+ var import_core18 = require("@deck.gl/core");
2109
2596
  var import_preact16 = require("preact");
2110
- var TimelineWidget = class extends import_core17.Widget {
2597
+ var TimelineWidget = class extends import_core18.Widget {
2111
2598
  /**
2112
2599
  * Returns the current time value.
2113
2600
  * In controlled mode, returns the time prop.
@@ -2263,7 +2750,7 @@ var TimelineWidget = class extends import_core17.Widget {
2263
2750
  }
2264
2751
  };
2265
2752
  TimelineWidget.defaultProps = {
2266
- ...import_core17.Widget.defaultProps,
2753
+ ...import_core18.Widget.defaultProps,
2267
2754
  id: "timeline",
2268
2755
  placement: "bottom-left",
2269
2756
  viewId: null,
@@ -2286,8 +2773,8 @@ TimelineWidget.defaultProps = {
2286
2773
  // dist/screenshot-widget.js
2287
2774
  var import_jsx_runtime23 = require("preact/jsx-runtime");
2288
2775
  var import_preact17 = require("preact");
2289
- var import_core18 = require("@deck.gl/core");
2290
- var ScreenshotWidget = class extends import_core18.Widget {
2776
+ var import_core19 = require("@deck.gl/core");
2777
+ var ScreenshotWidget = class extends import_core19.Widget {
2291
2778
  constructor(props = {}) {
2292
2779
  super(props);
2293
2780
  this.className = "deck-widget-screenshot";
@@ -2327,7 +2814,7 @@ var ScreenshotWidget = class extends import_core18.Widget {
2327
2814
  }
2328
2815
  };
2329
2816
  ScreenshotWidget.defaultProps = {
2330
- ...import_core18.Widget.defaultProps,
2817
+ ...import_core19.Widget.defaultProps,
2331
2818
  id: "screenshot",
2332
2819
  placement: "top-left",
2333
2820
  viewId: null,
@@ -2339,8 +2826,8 @@ ScreenshotWidget.defaultProps = {
2339
2826
 
2340
2827
  // dist/theme-widget.js
2341
2828
  var import_jsx_runtime24 = require("preact/jsx-runtime");
2342
- var import_core19 = require("@deck.gl/core");
2343
2829
  var import_core20 = require("@deck.gl/core");
2830
+ var import_core21 = require("@deck.gl/core");
2344
2831
  var import_preact18 = require("preact");
2345
2832
 
2346
2833
  // dist/themes.js
@@ -2458,7 +2945,7 @@ var DarkGlassTheme = {
2458
2945
  };
2459
2946
 
2460
2947
  // dist/theme-widget.js
2461
- var ThemeWidget = class extends import_core20.Widget {
2948
+ var ThemeWidget = class extends import_core21.Widget {
2462
2949
  constructor(props = {}) {
2463
2950
  super(props);
2464
2951
  this.className = "deck-widget-theme";
@@ -2501,16 +2988,16 @@ var ThemeWidget = class extends import_core20.Widget {
2501
2988
  /** Apply theme styling without changing internal state */
2502
2989
  _applyTheme(themeMode, rootElement) {
2503
2990
  const themeStyle = themeMode === "dark" ? this.props.darkModeTheme : this.props.lightModeTheme;
2504
- if ((0, import_core19._deepEqual)(themeStyle, this.appliedTheme, 1)) {
2991
+ if ((0, import_core20._deepEqual)(themeStyle, this.appliedTheme, 1)) {
2505
2992
  return;
2506
2993
  }
2507
2994
  const container = rootElement.closest(".deck-widget-container");
2508
2995
  if (!container)
2509
2996
  return;
2510
- (0, import_core19._applyStyles)(container, themeStyle);
2997
+ (0, import_core20._applyStyles)(container, themeStyle);
2511
2998
  this.appliedTheme = themeStyle;
2512
2999
  const label = themeMode === "dark" ? this.props.darkModeLabel : this.props.lightModeLabel;
2513
- import_core19.log.log(1, `Switched theme to ${label}`, themeStyle)();
3000
+ import_core20.log.log(1, `Switched theme to ${label}`, themeStyle)();
2514
3001
  }
2515
3002
  /** Read browser preference */
2516
3003
  _getInitialThemeMode() {
@@ -2525,7 +3012,7 @@ var ThemeWidget = class extends import_core20.Widget {
2525
3012
  }
2526
3013
  };
2527
3014
  ThemeWidget.defaultProps = {
2528
- ...import_core20.Widget.defaultProps,
3015
+ ...import_core21.Widget.defaultProps,
2529
3016
  id: "theme",
2530
3017
  placement: "top-left",
2531
3018
  viewId: null,
@@ -2542,8 +3029,8 @@ ThemeWidget.defaultProps = {
2542
3029
  // dist/loading-widget.js
2543
3030
  var import_jsx_runtime25 = require("preact/jsx-runtime");
2544
3031
  var import_preact19 = require("preact");
2545
- var import_core21 = require("@deck.gl/core");
2546
- var LoadingWidget = class extends import_core21.Widget {
3032
+ var import_core22 = require("@deck.gl/core");
3033
+ var LoadingWidget = class extends import_core22.Widget {
2547
3034
  constructor(props = {}) {
2548
3035
  super(props);
2549
3036
  this.className = "deck-widget-loading";
@@ -2577,7 +3064,7 @@ var LoadingWidget = class extends import_core21.Widget {
2577
3064
  }
2578
3065
  };
2579
3066
  LoadingWidget.defaultProps = {
2580
- ...import_core21.Widget.defaultProps,
3067
+ ...import_core22.Widget.defaultProps,
2581
3068
  id: "loading",
2582
3069
  placement: "top-left",
2583
3070
  viewId: null,
@@ -2588,8 +3075,8 @@ LoadingWidget.defaultProps = {
2588
3075
 
2589
3076
  // dist/stats-widget.js
2590
3077
  var import_jsx_runtime26 = require("preact/jsx-runtime");
2591
- var import_core22 = require("@deck.gl/core");
2592
- var import_core23 = require("@luma.gl/core");
3078
+ var import_core23 = require("@deck.gl/core");
3079
+ var import_core24 = require("@luma.gl/core");
2593
3080
  var import_preact20 = require("preact");
2594
3081
  var import_hooks7 = require("preact/hooks");
2595
3082
  var DEFAULT_COUNT_FORMATTER = (stat) => `${stat.name}: ${stat.count}`;
@@ -2607,7 +3094,7 @@ var DEFAULT_FORMATTERS = {
2607
3094
  fps: (stat) => `${stat.name}: ${Math.round(stat.getHz())}fps`,
2608
3095
  memory: (stat) => `${stat.name}: ${formatMemory(stat.count)}`
2609
3096
  };
2610
- var StatsWidget = class extends import_core22.Widget {
3097
+ var StatsWidget = class extends import_core23.Widget {
2611
3098
  /**
2612
3099
  * Returns the current expanded state.
2613
3100
  * In controlled mode, returns the expanded prop.
@@ -2697,7 +3184,7 @@ var StatsWidget = class extends import_core22.Widget {
2697
3184
  const metrics = ((_a = this.deck) == null ? void 0 : _a.metrics) ?? {};
2698
3185
  return Object.entries(metrics);
2699
3186
  case "luma":
2700
- return Array.from(import_core23.luma.stats.stats.values())[0];
3187
+ return Array.from(import_core24.luma.stats.stats.values())[0];
2701
3188
  case "device":
2702
3189
  const device = (_b = this.deck) == null ? void 0 : _b.device;
2703
3190
  const stats = device == null ? void 0 : device.statsManager.stats.values();
@@ -2734,7 +3221,7 @@ var StatsWidget = class extends import_core22.Widget {
2734
3221
  }
2735
3222
  };
2736
3223
  StatsWidget.defaultProps = {
2737
- ...import_core22.Widget.defaultProps,
3224
+ ...import_core23.Widget.defaultProps,
2738
3225
  type: "deck",
2739
3226
  placement: "top-left",
2740
3227
  viewId: null,