@base2datadesign/viewer-react 0.1.7 → 0.1.9

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.
@@ -12,6 +12,7 @@ export type AssetUploadCardProps = {
12
12
  className?: string;
13
13
  title?: string;
14
14
  description?: string;
15
+ minimal?: boolean;
15
16
  };
16
- export default function AssetUploadCard({ disabled, apiRoute, rhinoApiRoute, maxBytes, timeoutMs, preview, accept, onSolved, onClear, className, title, description, }: AssetUploadCardProps): import("react/jsx-runtime").JSX.Element;
17
+ export default function AssetUploadCard({ disabled, apiRoute, rhinoApiRoute, maxBytes, timeoutMs, preview, accept, onSolved, onClear, className, title, description, minimal, }: AssetUploadCardProps): import("react/jsx-runtime").JSX.Element;
17
18
  //# sourceMappingURL=AssetUploadCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssetUploadCard.d.ts","sourceRoot":"","sources":["../src/AssetUploadCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAUF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,QAAQ,EACR,QAA0B,EAC1B,aAAgC,EAChC,QAAyC,EACzC,SAA2C,EAC3C,OAAO,EACP,MAAuB,EACvB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,KAAsB,EACtB,WAAsF,GACvF,EAAE,oBAAoB,2CAqKtB"}
1
+ {"version":3,"file":"AssetUploadCard.d.ts","sourceRoot":"","sources":["../src/AssetUploadCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAUF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,QAAQ,EACR,QAA0B,EAC1B,aAAgC,EAChC,QAAyC,EACzC,SAA2C,EAC3C,OAAO,EACP,MAAuB,EACvB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,KAAsB,EACtB,WAAsF,EACtF,OAAe,GAChB,EAAE,oBAAoB,2CAyKtB"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useMemo, useState } from "react";
3
3
  import { DEFAULT_UPLOAD_LIMITS, detectUploadKind, loadMeshFile, solveGrasshopperFile, solveRhino3dmFile, } from "@base2datadesign/viewer-kit";
4
4
  const DEFAULT_ACCEPT = ".gh,.ghx,.3dm,.obj,.fbx,.gltf,.glb,.stl,.ply";
@@ -8,7 +8,7 @@ const formatBytes = (bytes) => {
8
8
  const mb = bytes / (1024 * 1024);
9
9
  return `${mb.toFixed(0)}MB`;
10
10
  };
11
- export default function AssetUploadCard({ disabled, apiRoute = "/api/gh-solve", rhinoApiRoute = "/api/rhino-3dm", maxBytes = DEFAULT_UPLOAD_LIMITS.maxBytes, timeoutMs = DEFAULT_UPLOAD_LIMITS.timeoutMs, preview, accept = DEFAULT_ACCEPT, onSolved, onClear, className, title = "Asset Upload", description = "Upload .gh/.ghx/.3dm or mesh assets (OBJ/FBX/GLTF/STL/PLY) to preview.", }) {
11
+ export default function AssetUploadCard({ disabled, apiRoute = "/api/gh-solve", rhinoApiRoute = "/api/rhino-3dm", maxBytes = DEFAULT_UPLOAD_LIMITS.maxBytes, timeoutMs = DEFAULT_UPLOAD_LIMITS.timeoutMs, preview, accept = DEFAULT_ACCEPT, onSolved, onClear, className, title = "Asset Upload", description = "Upload .gh/.ghx/.3dm or mesh assets (OBJ/FBX/GLTF/STL/PLY) to preview.", minimal = false, }) {
12
12
  const [busy, setBusy] = useState(false);
13
13
  const [lastFileName, setLastFileName] = useState(null);
14
14
  const [error, setError] = useState(null);
@@ -16,7 +16,6 @@ export default function AssetUploadCard({ disabled, apiRoute = "/api/gh-solve",
16
16
  const [statusLine, setStatusLine] = useState("ready");
17
17
  const [statusTone, setStatusTone] = useState("muted");
18
18
  const statusText = useMemo(() => (busy ? "processing..." : statusLine), [busy, statusLine]);
19
- const maxLabel = formatBytes(maxBytes);
20
19
  const updateStatus = (fileName, detail, tone = "muted") => {
21
20
  setStatusLine(`${fileName} · ${detail}`);
22
21
  setStatusTone(tone);
@@ -75,7 +74,8 @@ export default function AssetUploadCard({ disabled, apiRoute = "/api/gh-solve",
75
74
  }
76
75
  };
77
76
  const inputId = "asset-upload-input";
78
- return (_jsxs("section", { className: className, style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [_jsxs("div", { style: { display: "flex", justifyContent: "space-between", gap: "12px" }, children: [_jsxs("div", { children: [_jsx("h3", { style: { fontSize: "12px", fontWeight: 600, letterSpacing: "0.08em", textTransform: "uppercase" }, children: title }), _jsx("p", { style: { marginTop: "6px", fontSize: "12px", lineHeight: 1.5 }, children: description }), _jsxs("p", { style: { marginTop: "4px", fontSize: "11px", opacity: 0.7 }, children: ["limits: ", maxLabel, ", timeout ", timeoutMs, "ms"] })] }), onClear ? (_jsx("button", { type: "button", onClick: onClear, disabled: disabled || busy, style: { height: "32px" }, children: "clear" })) : null] }), _jsxs("div", { role: "button", tabIndex: 0, onDragEnter: (event) => {
77
+ const typesLabel = accept.replace(/\./g, "").toUpperCase();
78
+ return (_jsxs("section", { className: className, style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [!minimal ? (_jsxs("div", { style: { display: "flex", justifyContent: "space-between", gap: "12px" }, children: [_jsxs("div", { children: [_jsx("h3", { style: { fontSize: "12px", fontWeight: 600, letterSpacing: "0.08em", textTransform: "uppercase" }, children: title }), _jsx("p", { style: { marginTop: "6px", fontSize: "12px", lineHeight: 1.5 }, children: description })] }), onClear ? (_jsx("button", { type: "button", onClick: onClear, disabled: disabled || busy, style: { height: "32px" }, children: "clear" })) : null] })) : null, _jsxs("div", { role: "button", tabIndex: 0, onDragEnter: (event) => {
79
79
  event.preventDefault();
80
80
  event.stopPropagation();
81
81
  if (disabled || busy)
@@ -105,18 +105,15 @@ export default function AssetUploadCard({ disabled, apiRoute = "/api/gh-solve",
105
105
  const input = document.getElementById(inputId);
106
106
  input?.click();
107
107
  }, style: {
108
- borderRadius: "12px",
109
- border: "1px dashed #94a3b8",
110
- padding: "14px",
111
- background: dragActive ? "rgba(16, 185, 129, 0.08)" : "rgba(255,255,255,0.85)",
108
+ borderRadius: "18px",
109
+ border: "1px dashed rgba(49, 143, 78, 0.45)",
110
+ padding: "18px 18px",
111
+ minHeight: "92px",
112
+ background: dragActive ? "rgba(49, 143, 78, 0.08)" : "rgba(255,255,255,0.9)",
112
113
  cursor: disabled || busy ? "not-allowed" : "pointer",
113
114
  opacity: disabled || busy ? 0.6 : 1,
114
- }, children: [_jsx("div", { style: { fontSize: "12px", textTransform: "lowercase" }, children: lastFileName ? `loaded ${lastFileName}` : "drop asset file" }), _jsx("div", { style: { marginTop: "6px", fontSize: "11px", opacity: 0.7 }, children: statusText }), error ? (_jsx("div", { style: { marginTop: "6px", fontSize: "11px", color: "#b91c1c" }, children: error })) : null] }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: "10px", flexWrap: "wrap" }, children: [_jsx("button", { type: "button", onClick: () => {
115
- if (disabled || busy)
116
- return;
117
- const input = document.getElementById(inputId);
118
- input?.click();
119
- }, children: "select file" }), _jsx("span", { style: { fontSize: "11px", opacity: 0.7 }, children: accept.replace(/\./g, "").toUpperCase() })] }), _jsx("input", { id: inputId, type: "file", accept: accept, style: { display: "none" }, onChange: (event) => {
115
+ boxShadow: "0 10px 24px rgba(15, 23, 42, 0.06)",
116
+ }, children: [minimal ? (_jsx("div", { style: { fontSize: "12px", fontWeight: 600, color: "#64748b" }, children: typesLabel })) : (_jsxs(_Fragment, { children: [_jsx("div", { style: { fontSize: "13px", fontWeight: 600, color: "#0f172a" }, children: lastFileName ? `Loaded ${lastFileName}` : "Drop a file to upload" }), _jsx("div", { style: { marginTop: "6px", fontSize: "12px", color: "#64748b" }, children: ".gh \u00B7 .ghx \u00B7 .3dm \u00B7 OBJ \u00B7 FBX \u00B7 GLTF \u00B7 STL \u00B7 PLY" }), _jsx("div", { style: { marginTop: "8px", fontSize: "11px", opacity: 0.7, textTransform: "lowercase" }, children: statusText })] })), error ? (_jsx("div", { style: { marginTop: "6px", fontSize: "11px", color: "#b91c1c" }, children: error })) : null] }), _jsx("input", { id: inputId, type: "file", accept: accept, style: { display: "none" }, onChange: (event) => {
120
117
  const file = event.target.files?.[0];
121
118
  if (!file)
122
119
  return;
@@ -27,6 +27,7 @@ export type ViewControlsProps = {
27
27
  lightingOptions: LightingOption[];
28
28
  veilsEnabled?: boolean;
29
29
  onToggleVeils?: () => void;
30
+ onResetRender?: () => void;
30
31
  };
31
- export default function ViewControls({ activeLightingPreset, onLightingChange, materialOptions, activeMaterialPreset, onMaterialChange, onCameraViewChange, skyOptions, activeSkyId, onSkyChange, lightingOptions, veilsEnabled, onToggleVeils, }: ViewControlsProps): import("react/jsx-runtime").JSX.Element;
32
+ export default function ViewControls({ activeLightingPreset, onLightingChange, materialOptions, activeMaterialPreset, onMaterialChange, onCameraViewChange, skyOptions, activeSkyId, onSkyChange, lightingOptions, veilsEnabled, onToggleVeils, onResetRender, }: ViewControlsProps): import("react/jsx-runtime").JSX.Element;
32
33
  //# sourceMappingURL=ViewControls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewControls.d.ts","sourceRoot":"","sources":["../src/ViewControls.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B,CAAC;AAyDF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EACX,eAAe,EACf,YAAmB,EACnB,aAAa,GACd,EAAE,iBAAiB,2CAqXnB"}
1
+ {"version":3,"file":"ViewControls.d.ts","sourceRoot":"","sources":["../src/ViewControls.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B,CAAC;AAyDF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EACX,eAAe,EACf,YAAmB,EACnB,aAAa,EACb,aAAa,GACd,EAAE,iBAAiB,2CAwYnB"}
@@ -49,7 +49,7 @@ const swatchStyle = (color) => ({
49
49
  background: color,
50
50
  border: "1px solid rgba(15,23,42,0.1)",
51
51
  });
52
- export default function ViewControls({ activeLightingPreset, onLightingChange, materialOptions, activeMaterialPreset, onMaterialChange, onCameraViewChange, skyOptions, activeSkyId, onSkyChange, lightingOptions, veilsEnabled = true, onToggleVeils, }) {
52
+ export default function ViewControls({ activeLightingPreset, onLightingChange, materialOptions, activeMaterialPreset, onMaterialChange, onCameraViewChange, skyOptions, activeSkyId, onSkyChange, lightingOptions, veilsEnabled = true, onToggleVeils, onResetRender, }) {
53
53
  const lightingMenuRef = useRef(null);
54
54
  const materialMenuRef = useRef(null);
55
55
  const skyMenuRef = useRef(null);
@@ -230,14 +230,21 @@ export default function ViewControls({ activeLightingPreset, onLightingChange, m
230
230
  color: "#64748b",
231
231
  opacity: !veilsEnabled || skyExpanded || skyHover ? 1 : 0,
232
232
  transition: "opacity 0.2s ease",
233
- }, children: skyExpanded ? "▼" : "▲" })] }), veilsEnabled && !skyExpanded && !skyHover ? _jsx("div", { style: veilStyle, children: "BACKGROUND" }) : null] }) })) : null, onToggleVeils ? (_jsx("button", { type: "button", onClick: onToggleVeils, "aria-label": "Toggle veils", style: {
234
- alignSelf: "stretch",
235
- border: "none",
236
- background: "transparent",
237
- fontSize: "11px",
238
- textTransform: "uppercase",
239
- letterSpacing: "0.14em",
240
- color: "#64748b",
241
- cursor: "pointer",
242
- }, children: "VEILS" })) : null] }));
233
+ }, children: skyExpanded ? "▼" : "▲" })] }), veilsEnabled && !skyExpanded && !skyHover ? _jsx("div", { style: veilStyle, children: "BACKGROUND" }) : null] }) })) : null, onToggleVeils ? (_jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "6px", alignSelf: "stretch" }, children: [onResetRender ? (_jsx("button", { type: "button", onClick: onResetRender, "aria-label": "Reset render settings", style: {
234
+ border: "none",
235
+ background: "transparent",
236
+ fontSize: "11px",
237
+ textTransform: "uppercase",
238
+ letterSpacing: "0.12em",
239
+ color: "#64748b",
240
+ cursor: "pointer",
241
+ }, children: "RESET" })) : null, _jsx("button", { type: "button", onClick: onToggleVeils, "aria-label": "Toggle veils", style: {
242
+ border: "none",
243
+ background: "transparent",
244
+ fontSize: "11px",
245
+ textTransform: "uppercase",
246
+ letterSpacing: "0.14em",
247
+ color: "#64748b",
248
+ cursor: "pointer",
249
+ }, children: "VEILS" })] })) : null] }));
243
250
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base2datadesign/viewer-react",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "type": "module",
5
5
  "license": "UNLICENSED",
6
6
  "main": "./dist/index.js",
@@ -18,7 +18,7 @@
18
18
  "access": "public"
19
19
  },
20
20
  "dependencies": {
21
- "@base2datadesign/viewer-kit": "^0.2.0"
21
+ "@base2datadesign/viewer-kit": "^0.2.29"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": ">=18"