sa2kit 1.6.78 → 1.6.80

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.
Files changed (107) hide show
  1. package/dist/ai/llm/electron/index.js +2 -2
  2. package/dist/ai/llm/electron/index.js.map +1 -1
  3. package/dist/ai/llm/electron/index.mjs +2 -2
  4. package/dist/ai/llm/electron/index.mjs.map +1 -1
  5. package/dist/ai/llm/ui/electron/index.js +2 -2
  6. package/dist/ai/llm/ui/electron/index.js.map +1 -1
  7. package/dist/ai/llm/ui/electron/index.mjs +2 -2
  8. package/dist/ai/llm/ui/electron/index.mjs.map +1 -1
  9. package/dist/ai/llm/ui/web/index.js +2 -2
  10. package/dist/ai/llm/ui/web/index.js.map +1 -1
  11. package/dist/ai/llm/ui/web/index.mjs +2 -2
  12. package/dist/ai/llm/ui/web/index.mjs.map +1 -1
  13. package/dist/ai/llm/web/index.js +2 -2
  14. package/dist/ai/llm/web/index.js.map +1 -1
  15. package/dist/ai/llm/web/index.mjs +2 -2
  16. package/dist/ai/llm/web/index.mjs.map +1 -1
  17. package/dist/ar/index.d.mts +2 -2
  18. package/dist/ar/index.d.ts +2 -2
  19. package/dist/ar/index.js +43 -4
  20. package/dist/ar/index.js.map +1 -1
  21. package/dist/ar/index.mjs +43 -4
  22. package/dist/ar/index.mjs.map +1 -1
  23. package/dist/{booking-BX_0AXU6.d.mts → booking-473Db8Bo.d.mts} +6 -0
  24. package/dist/{booking-BX_0AXU6.d.ts → booking-473Db8Bo.d.ts} +6 -0
  25. package/dist/{bookingAdminService-ChzuoCUx.d.ts → bookingAdminService-DqQ7hEGw.d.ts} +1 -1
  26. package/dist/{bookingAdminService-B_D_Jq1W.d.mts → bookingAdminService-SBX4JA_U.d.mts} +1 -1
  27. package/dist/calendar/index.js +8 -4
  28. package/dist/calendar/index.js.map +1 -1
  29. package/dist/calendar/index.mjs +8 -4
  30. package/dist/calendar/index.mjs.map +1 -1
  31. package/dist/calendar/web/index.js +8 -4
  32. package/dist/calendar/web/index.js.map +1 -1
  33. package/dist/calendar/web/index.mjs +8 -4
  34. package/dist/calendar/web/index.mjs.map +1 -1
  35. package/dist/{client-B6JtOkEq.d.ts → client-Bkn6mRI7.d.ts} +1 -1
  36. package/dist/{client-DkSveTk-.d.mts → client-exYn2Qla.d.mts} +1 -1
  37. package/dist/components/index.d.mts +2 -0
  38. package/dist/components/index.d.ts +2 -0
  39. package/dist/components/index.js +8 -4
  40. package/dist/components/index.js.map +1 -1
  41. package/dist/components/index.mjs +8 -4
  42. package/dist/components/index.mjs.map +1 -1
  43. package/dist/{index-B9vIHUEv.d.ts → index-BJpxvH7X.d.ts} +1 -1
  44. package/dist/{index-C3_UPPdv.d.ts → index-CdTIsNsy.d.ts} +2 -2
  45. package/dist/{index-DDuTPOHu.d.mts → index-Cum2EknK.d.mts} +1 -1
  46. package/dist/{index-D6ZIkvt-.d.mts → index-DyxLpkmm.d.mts} +2 -2
  47. package/dist/{index-BjYZSfZa.d.ts → index-XTV6IU-M.d.ts} +2 -2
  48. package/dist/{index-3qQN9Lh_.d.mts → index-z15F7afa.d.mts} +2 -2
  49. package/dist/index.js +8 -4
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.mjs +8 -4
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/mmd/index.d.mts +9 -3
  54. package/dist/mmd/index.d.ts +9 -3
  55. package/dist/mmd/index.js +95 -13
  56. package/dist/mmd/index.js.map +1 -1
  57. package/dist/mmd/index.mjs +95 -13
  58. package/dist/mmd/index.mjs.map +1 -1
  59. package/dist/portfolio/index.js +2 -2
  60. package/dist/portfolio/index.js.map +1 -1
  61. package/dist/portfolio/index.mjs +2 -2
  62. package/dist/portfolio/index.mjs.map +1 -1
  63. package/dist/showmasterpiece/core.d.mts +3 -3
  64. package/dist/showmasterpiece/core.d.ts +3 -3
  65. package/dist/showmasterpiece/db.d.mts +25 -0
  66. package/dist/showmasterpiece/db.d.ts +25 -0
  67. package/dist/showmasterpiece/db.js +35 -0
  68. package/dist/showmasterpiece/db.js.map +1 -1
  69. package/dist/showmasterpiece/db.mjs +35 -0
  70. package/dist/showmasterpiece/db.mjs.map +1 -1
  71. package/dist/showmasterpiece/index.js +279 -226
  72. package/dist/showmasterpiece/index.js.map +1 -1
  73. package/dist/showmasterpiece/index.mjs +279 -226
  74. package/dist/showmasterpiece/index.mjs.map +1 -1
  75. package/dist/showmasterpiece/logic/index.d.mts +2 -2
  76. package/dist/showmasterpiece/logic/index.d.ts +2 -2
  77. package/dist/showmasterpiece/server/index.js +35 -0
  78. package/dist/showmasterpiece/server/index.js.map +1 -1
  79. package/dist/showmasterpiece/server/index.mjs +35 -0
  80. package/dist/showmasterpiece/server/index.mjs.map +1 -1
  81. package/dist/showmasterpiece/service/api/index.d.mts +1 -1
  82. package/dist/showmasterpiece/service/api/index.d.ts +1 -1
  83. package/dist/showmasterpiece/service/client-business/index.d.mts +3 -3
  84. package/dist/showmasterpiece/service/client-business/index.d.ts +3 -3
  85. package/dist/showmasterpiece/service/index.d.mts +6 -6
  86. package/dist/showmasterpiece/service/index.d.ts +6 -6
  87. package/dist/showmasterpiece/service/miniapp/index.d.mts +2 -2
  88. package/dist/showmasterpiece/service/miniapp/index.d.ts +2 -2
  89. package/dist/showmasterpiece/service/web/index.d.mts +4 -4
  90. package/dist/showmasterpiece/service/web/index.d.ts +4 -4
  91. package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -2
  92. package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -2
  93. package/dist/showmasterpiece/ui/miniapp/index.js +38 -8
  94. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
  95. package/dist/showmasterpiece/ui/miniapp/index.mjs +38 -8
  96. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
  97. package/dist/showmasterpiece/ui/web/index.js +279 -226
  98. package/dist/showmasterpiece/ui/web/index.js.map +1 -1
  99. package/dist/showmasterpiece/ui/web/index.mjs +279 -226
  100. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
  101. package/dist/showmasterpiece/web/index.js +279 -226
  102. package/dist/showmasterpiece/web/index.js.map +1 -1
  103. package/dist/showmasterpiece/web/index.mjs +279 -226
  104. package/dist/showmasterpiece/web/index.mjs.map +1 -1
  105. package/dist/{types-CvKvpyN8.d.mts → types-D4vSK3AJ.d.mts} +2 -1
  106. package/dist/{types-CvKvpyN8.d.ts → types-D4vSK3AJ.d.ts} +2 -1
  107. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  import { e as MMDPlayerBaseProps, f as MMDPlayerBaseRef, g as MMDPlayerEnhancedProps, h as MMDPlaylistProps, b as MMDPlaylistNode, d as MMDResources, i as MMDStage, j as MobileOptimization } from '../types-HorDyIRv.mjs';
2
2
  export { M as MMDPlaylistConfig, a as MMDResourceItem, c as MMDResourceOptions, O as OutlineOptions, R as ResourceOption } from '../types-HorDyIRv.mjs';
3
3
  import * as React$1 from 'react';
4
- import React__default from 'react';
4
+ import React__default, { CSSProperties } from 'react';
5
5
  import * as THREE from 'three';
6
6
  import { a as UploadFileInfo, c as UploadProgress, F as FileMetadata, A as AccessPermission } from '../types-CK4We_aI.mjs';
7
- import { d as ARMarkerConfig } from '../types-CvKvpyN8.mjs';
7
+ import { d as ARMarkerConfig } from '../types-D4vSK3AJ.mjs';
8
8
 
9
9
  /**
10
10
  * PMX模型解析器类型定义
@@ -1562,6 +1562,12 @@ interface MMDARPlayerProps {
1562
1562
  cameraParametersUrl?: string;
1563
1563
  /** Marker 配置 */
1564
1564
  markerConfig?: ARMarkerConfig;
1565
+ /**
1566
+ * Marker 放置模式
1567
+ * - manual: 识别到 marker 后仍需点击按钮手动放置(默认)
1568
+ * - follow-marker: 识别到 marker 自动显示并跟随 marker
1569
+ */
1570
+ markerPlacementMode?: 'manual' | 'follow-marker';
1565
1571
  /** 是否开启镜像显示 (通常前置摄像头需要开启) */
1566
1572
  mirrored?: boolean;
1567
1573
  /** 是否显示设置按钮 */
@@ -1611,7 +1617,7 @@ interface MMDARPlayerProps {
1611
1617
  onError?: (error: Error) => void;
1612
1618
  /** 样式 */
1613
1619
  className?: string;
1614
- style?: React.CSSProperties;
1620
+ style?: CSSProperties;
1615
1621
  }
1616
1622
  interface MMDARPlayerRef {
1617
1623
  /** 开启摄像头 */
@@ -1,10 +1,10 @@
1
1
  import { e as MMDPlayerBaseProps, f as MMDPlayerBaseRef, g as MMDPlayerEnhancedProps, h as MMDPlaylistProps, b as MMDPlaylistNode, d as MMDResources, i as MMDStage, j as MobileOptimization } from '../types-HorDyIRv.js';
2
2
  export { M as MMDPlaylistConfig, a as MMDResourceItem, c as MMDResourceOptions, O as OutlineOptions, R as ResourceOption } from '../types-HorDyIRv.js';
3
3
  import * as React$1 from 'react';
4
- import React__default from 'react';
4
+ import React__default, { CSSProperties } from 'react';
5
5
  import * as THREE from 'three';
6
6
  import { a as UploadFileInfo, c as UploadProgress, F as FileMetadata, A as AccessPermission } from '../types-CK4We_aI.js';
7
- import { d as ARMarkerConfig } from '../types-CvKvpyN8.js';
7
+ import { d as ARMarkerConfig } from '../types-D4vSK3AJ.js';
8
8
 
9
9
  /**
10
10
  * PMX模型解析器类型定义
@@ -1562,6 +1562,12 @@ interface MMDARPlayerProps {
1562
1562
  cameraParametersUrl?: string;
1563
1563
  /** Marker 配置 */
1564
1564
  markerConfig?: ARMarkerConfig;
1565
+ /**
1566
+ * Marker 放置模式
1567
+ * - manual: 识别到 marker 后仍需点击按钮手动放置(默认)
1568
+ * - follow-marker: 识别到 marker 自动显示并跟随 marker
1569
+ */
1570
+ markerPlacementMode?: 'manual' | 'follow-marker';
1565
1571
  /** 是否开启镜像显示 (通常前置摄像头需要开启) */
1566
1572
  mirrored?: boolean;
1567
1573
  /** 是否显示设置按钮 */
@@ -1611,7 +1617,7 @@ interface MMDARPlayerProps {
1611
1617
  onError?: (error: Error) => void;
1612
1618
  /** 样式 */
1613
1619
  className?: string;
1614
- style?: React.CSSProperties;
1620
+ style?: CSSProperties;
1615
1621
  }
1616
1622
  interface MMDARPlayerRef {
1617
1623
  /** 开启摄像头 */
package/dist/mmd/index.js CHANGED
@@ -7132,6 +7132,42 @@ var DEFAULT_AR_ASSETS = {
7132
7132
 
7133
7133
  // src/ar/load-arjs.ts
7134
7134
  var loadPromise = null;
7135
+ function isTHREExNamespace(value) {
7136
+ if (!value || typeof value !== "object") return false;
7137
+ const candidate = value;
7138
+ return typeof candidate.ArToolkitSource === "function" && typeof candidate.ArToolkitContext === "function" && typeof candidate.ArMarkerControls === "function";
7139
+ }
7140
+ function resolveTHREExNamespace(moduleExports) {
7141
+ const arWindow = window;
7142
+ const globalTHREEx = arWindow.THREEx;
7143
+ if (isTHREExNamespace(globalTHREEx)) {
7144
+ return globalTHREEx;
7145
+ }
7146
+ if (isTHREExNamespace(moduleExports)) {
7147
+ return moduleExports;
7148
+ }
7149
+ const record = moduleExports;
7150
+ const defaultExport = record?.default;
7151
+ if (isTHREExNamespace(defaultExport)) {
7152
+ return defaultExport;
7153
+ }
7154
+ if (isTHREExNamespace(record?.THREEx)) {
7155
+ return record?.THREEx;
7156
+ }
7157
+ const arjsCandidate = record?.ARjs ?? defaultExport ?? record ?? arWindow.ARjs;
7158
+ const arjsRecord = arjsCandidate;
7159
+ const source = arjsRecord?.Source;
7160
+ const context = arjsRecord?.Context;
7161
+ const markerControls = arjsRecord?.MarkerControls;
7162
+ if (typeof source === "function" && typeof context === "function" && typeof markerControls === "function") {
7163
+ return {
7164
+ ArToolkitSource: source,
7165
+ ArToolkitContext: context,
7166
+ ArMarkerControls: markerControls
7167
+ };
7168
+ }
7169
+ return void 0;
7170
+ }
7135
7171
  async function loadARJS(options = {}) {
7136
7172
  if (typeof window === "undefined") {
7137
7173
  throw new Error("AR.js can only be loaded in a browser environment.");
@@ -7141,15 +7177,18 @@ async function loadARJS(options = {}) {
7141
7177
  }
7142
7178
  const existing = window.THREEx;
7143
7179
  if (existing && !options.forceReload) {
7144
- return existing;
7180
+ if (isTHREExNamespace(existing)) {
7181
+ return existing;
7182
+ }
7145
7183
  }
7146
7184
  if (!loadPromise || options.forceReload) {
7147
7185
  const importPromise = options.locationOnly ? import('@ar-js-org/ar.js/three.js/build/ar-threex-location-only.js') : import('@ar-js-org/ar.js/three.js/build/ar-threex.js');
7148
- loadPromise = importPromise.then(() => {
7149
- const THREEx = window.THREEx;
7186
+ loadPromise = importPromise.then((loadedModule) => {
7187
+ const THREEx = resolveTHREExNamespace(loadedModule);
7150
7188
  if (!THREEx) {
7151
- throw new Error("AR.js loaded, but THREEx namespace was not found.");
7189
+ throw new Error("AR.js loaded, but THREEx namespace was not found in module exports or window.");
7152
7190
  }
7191
+ window.THREEx = THREEx;
7153
7192
  return THREEx;
7154
7193
  });
7155
7194
  }
@@ -7192,6 +7231,7 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7192
7231
  cameraConfig,
7193
7232
  cameraParametersUrl,
7194
7233
  markerConfig,
7234
+ markerPlacementMode = "manual",
7195
7235
  mirrored = false,
7196
7236
  showSettings,
7197
7237
  modelPresets,
@@ -7233,6 +7273,7 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7233
7273
  const mmdMeshRef = React10.useRef(null);
7234
7274
  const animationFrameRef = React10.useRef(null);
7235
7275
  const markerDetectedRef = React10.useRef(false);
7276
+ const markerPlacedOnceRef = React10.useRef(false);
7236
7277
  const audioRef = React10.useRef(null);
7237
7278
  const autoPlayRef = React10.useRef(autoPlay);
7238
7279
  const [isLoading, setIsLoading] = React10.useState(true);
@@ -7263,6 +7304,7 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7263
7304
  return {
7264
7305
  type: markerConfig?.type ?? "pattern",
7265
7306
  patternUrl: markerConfig?.patternUrl ?? DEFAULT_AR_ASSETS.patternUrl,
7307
+ descriptorsUrl: markerConfig?.descriptorsUrl,
7266
7308
  barcodeValue: markerConfig?.barcodeValue ?? 0,
7267
7309
  changeMatrixMode: markerConfig?.changeMatrixMode ?? "modelViewMatrix"
7268
7310
  };
@@ -7335,14 +7377,24 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7335
7377
  modelRootRef.current.quaternion.identity();
7336
7378
  updateModelPlacement(true);
7337
7379
  } else {
7338
- if (modelRootRef.current.parent !== sceneRef.current) {
7339
- modelRootRef.current.parent?.remove(modelRootRef.current);
7340
- sceneRef.current.add(modelRootRef.current);
7380
+ if (markerPlacementMode === "follow-marker" && markerRootRef.current) {
7381
+ if (modelRootRef.current.parent !== markerRootRef.current) {
7382
+ modelRootRef.current.parent?.remove(modelRootRef.current);
7383
+ markerRootRef.current.add(modelRootRef.current);
7384
+ }
7385
+ modelRootRef.current.position.set(0, 0, 0);
7386
+ modelRootRef.current.quaternion.identity();
7387
+ updateModelPlacement(markerDetectedRef.current);
7388
+ } else {
7389
+ if (modelRootRef.current.parent !== sceneRef.current) {
7390
+ modelRootRef.current.parent?.remove(modelRootRef.current);
7391
+ sceneRef.current.add(modelRootRef.current);
7392
+ }
7393
+ updateModelPlacement(initialModelVisible);
7341
7394
  }
7342
- updateModelPlacement(initialModelVisible);
7343
7395
  }
7344
7396
  },
7345
- [initialModelVisible, updateModelPlacement]
7397
+ [initialModelVisible, markerPlacementMode, updateModelPlacement]
7346
7398
  );
7347
7399
  const stopCameraStream = React10.useCallback(() => {
7348
7400
  const source = arToolkitSourceRef.current;
@@ -7369,6 +7421,7 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7369
7421
  arToolkitSourceRef.current = null;
7370
7422
  arToolkitContextRef.current = null;
7371
7423
  markerDetectedRef.current = false;
7424
+ markerPlacedOnceRef.current = false;
7372
7425
  setMarkerDetected(false);
7373
7426
  setCameraReady(false);
7374
7427
  setArReady(false);
@@ -7444,6 +7497,13 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7444
7497
  if (isVisible !== markerDetectedRef.current) {
7445
7498
  markerDetectedRef.current = isVisible;
7446
7499
  setMarkerDetected(isVisible);
7500
+ if (resolvedARMode !== "overlay" /* Overlay */ && markerPlacementMode === "follow-marker") {
7501
+ updateModelPlacement(isVisible);
7502
+ if (isVisible && !markerPlacedOnceRef.current) {
7503
+ markerPlacedOnceRef.current = true;
7504
+ onModelPlaced?.();
7505
+ }
7506
+ }
7447
7507
  }
7448
7508
  }
7449
7509
  }
@@ -7454,10 +7514,15 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7454
7514
  renderer.render(scene, camera);
7455
7515
  };
7456
7516
  render();
7457
- }, []);
7517
+ }, [markerPlacementMode, onModelPlaced, resolvedARMode, updateModelPlacement]);
7458
7518
  const setupAR = React10.useCallback(async (facingOverride) => {
7459
7519
  if (!sceneRef.current || !cameraRef.current) return;
7460
7520
  const THREEx = await loadARJS({ three: THREE2__namespace });
7521
+ if (resolvedMarkerConfig.type === "nft" && !resolvedMarkerConfig.descriptorsUrl) {
7522
+ throw new Error(
7523
+ 'markerConfig.descriptorsUrl is required when markerConfig.type is "nft".'
7524
+ );
7525
+ }
7461
7526
  const facingMode = facingOverride ?? cameraFacing;
7462
7527
  const sourceWidth = typeof cameraConfig?.width === "number" ? cameraConfig.width : cameraConfig?.width?.ideal;
7463
7528
  const sourceHeight = typeof cameraConfig?.height === "number" ? cameraConfig.height : cameraConfig?.height?.ideal;
@@ -7477,6 +7542,7 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7477
7542
  const markerRoot = new THREE2__namespace.Group();
7478
7543
  markerRootRef.current = markerRoot;
7479
7544
  sceneRef.current.add(markerRoot);
7545
+ attachModelRoot(resolvedARMode);
7480
7546
  markerControlsRef.current = new THREEx.ArMarkerControls(
7481
7547
  arToolkitContext,
7482
7548
  markerRoot,
@@ -7517,6 +7583,8 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7517
7583
  mirrored,
7518
7584
  onCameraReady,
7519
7585
  resize,
7586
+ attachModelRoot,
7587
+ resolvedARMode,
7520
7588
  resolvedMarkerConfig
7521
7589
  ]);
7522
7590
  const loadMMDResources = React10.useCallback(async () => {
@@ -7610,12 +7678,19 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7610
7678
  onModelPlaced?.();
7611
7679
  return;
7612
7680
  }
7681
+ if (markerPlacementMode === "follow-marker") {
7682
+ updateModelPlacement(markerDetectedRef.current);
7683
+ if (markerDetectedRef.current) {
7684
+ onModelPlaced?.();
7685
+ }
7686
+ return;
7687
+ }
7613
7688
  if (!markerRootRef.current) return;
7614
7689
  modelRootRef.current.position.copy(markerRootRef.current.position);
7615
7690
  modelRootRef.current.quaternion.copy(markerRootRef.current.quaternion);
7616
7691
  updateModelPlacement(true);
7617
7692
  onModelPlaced?.();
7618
- }, [onModelPlaced, resolvedARMode, updateModelPlacement]);
7693
+ }, [markerPlacementMode, onModelPlaced, resolvedARMode, updateModelPlacement]);
7619
7694
  const removeModel = React10.useCallback(() => {
7620
7695
  updateModelPlacement(false);
7621
7696
  }, [updateModelPlacement]);
@@ -7768,7 +7843,7 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7768
7843
  /* @__PURE__ */ React10__default.default.createElement("canvas", { ref: canvasRef, className: "absolute inset-0 w-full h-full", style: mirroredStyle }),
7769
7844
  isLoading && /* @__PURE__ */ React10__default.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center bg-black/70 text-white z-20" }, /* @__PURE__ */ React10__default.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React10__default.default.createElement("div", { className: "h-10 w-10 animate-spin rounded-full border-b-2 border-white mx-auto mb-3" }), /* @__PURE__ */ React10__default.default.createElement("div", null, "Initializing AR..."))),
7770
7845
  error && /* @__PURE__ */ React10__default.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center bg-red-950/80 text-white z-20" }, /* @__PURE__ */ React10__default.default.createElement("div", { className: "text-center max-w-sm px-4" }, /* @__PURE__ */ React10__default.default.createElement("div", { className: "text-lg font-semibold mb-2" }, "AR Error"), /* @__PURE__ */ React10__default.default.createElement("div", { className: "text-sm text-red-200" }, error))),
7771
- arReady && !error && /* @__PURE__ */ React10__default.default.createElement(React10__default.default.Fragment, null, resolvedARMode !== "overlay" /* Overlay */ && !modelPlaced && /* @__PURE__ */ React10__default.default.createElement("div", { className: "absolute top-4 left-4 right-4 bg-black/70 text-white p-3 rounded-lg text-sm z-10" }, /* @__PURE__ */ React10__default.default.createElement("div", { className: "font-semibold mb-1" }, "Marker Placement"), /* @__PURE__ */ React10__default.default.createElement("div", { className: "text-gray-200" }, 'Align the marker in view, then tap "', placementText, '" to place the model.'), /* @__PURE__ */ React10__default.default.createElement("div", { className: "mt-2" }, markerDetected ? /* @__PURE__ */ React10__default.default.createElement("span", { className: "text-green-400" }, "Marker detected") : /* @__PURE__ */ React10__default.default.createElement("span", { className: "text-yellow-400" }, "Waiting for marker..."))), /* @__PURE__ */ React10__default.default.createElement("div", { className: "absolute top-4 right-4 flex items-center space-x-2 z-10" }, /* @__PURE__ */ React10__default.default.createElement(
7846
+ arReady && !error && /* @__PURE__ */ React10__default.default.createElement(React10__default.default.Fragment, null, resolvedARMode !== "overlay" /* Overlay */ && !modelPlaced && /* @__PURE__ */ React10__default.default.createElement("div", { className: "absolute top-4 left-4 right-4 bg-black/70 text-white p-3 rounded-lg text-sm z-10" }, /* @__PURE__ */ React10__default.default.createElement("div", { className: "font-semibold mb-1" }, "Marker Placement"), /* @__PURE__ */ React10__default.default.createElement("div", { className: "text-gray-200" }, markerPlacementMode === "follow-marker" ? "Align the marker in view, model will be placed automatically." : `Align the marker in view, then tap "${placementText}" to place the model.`), /* @__PURE__ */ React10__default.default.createElement("div", { className: "mt-2" }, markerDetected ? /* @__PURE__ */ React10__default.default.createElement("span", { className: "text-green-400" }, "Marker detected") : /* @__PURE__ */ React10__default.default.createElement("span", { className: "text-yellow-400" }, "Waiting for marker..."))), /* @__PURE__ */ React10__default.default.createElement("div", { className: "absolute top-4 right-4 flex items-center space-x-2 z-10" }, /* @__PURE__ */ React10__default.default.createElement(
7772
7847
  "span",
7773
7848
  {
7774
7849
  className: clsx.clsx("h-2.5 w-2.5 rounded-full", cameraReady ? "bg-green-400" : "bg-red-400"),
@@ -7793,7 +7868,7 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7793
7868
  className: "px-4 py-2 rounded-lg bg-gray-700 text-white hover:bg-gray-600"
7794
7869
  },
7795
7870
  "Settings"
7796
- ), resolvedARMode !== "overlay" /* Overlay */ && !modelPlaced && /* @__PURE__ */ React10__default.default.createElement(
7871
+ ), resolvedARMode !== "overlay" /* Overlay */ && markerPlacementMode === "manual" && !modelPlaced && /* @__PURE__ */ React10__default.default.createElement(
7797
7872
  "button",
7798
7873
  {
7799
7874
  onClick: placeModel,
@@ -7860,6 +7935,13 @@ var MMDARApp = React10.forwardRef((props, ref) => {
7860
7935
  },
7861
7936
  /* @__PURE__ */ React10__default.default.createElement("option", { value: "overlay" /* Overlay */ }, "Overlay"),
7862
7937
  /* @__PURE__ */ React10__default.default.createElement("option", { value: "world-fixed" /* WorldFixed */ }, "World Fixed")
7938
+ )), /* @__PURE__ */ React10__default.default.createElement("label", { className: "block text-xs text-gray-300" }, "Marker Placement", /* @__PURE__ */ React10__default.default.createElement(
7939
+ "input",
7940
+ {
7941
+ value: markerPlacementMode === "follow-marker" ? "Auto Follow" : "Manual Place",
7942
+ readOnly: true,
7943
+ className: "mt-1 w-full bg-gray-700 text-white text-sm rounded px-2 py-1 opacity-70"
7944
+ }
7863
7945
  )), /* @__PURE__ */ React10__default.default.createElement("label", { className: "block text-xs text-gray-300" }, "Camera", /* @__PURE__ */ React10__default.default.createElement(
7864
7946
  "select",
7865
7947
  {